Обсуждаем контроллеры компании Atmel.
Ответить

Re: Как написать программу по алгоритму?

Ср мар 13, 2019 12:37:56

Ivanoff-iv писал(а):гдето здесь должна быть инверсия?
ага, спасибо, код подправил.
Ivanoff-iv писал(а):я не про майн, я про ф-ю static uint8_t get_button_num(void){ кейс ведь в ней...
ну а я об чем? и я об этой функции:
Код:
static uint8_t get_button_num(void){
   uint8_t btn;
   while(1){
      // опрашиваем кнопки
      btn = PIND;
      if(btn != 0xFF){
         // если хоть какая-то нажата
         _delay_ms(15);
         // после паузы для защиты от дребезга
         if(btn == PIND){
            // проверяем, что состояние кнопок не поменялось
            // а затем вычисляем номер кнопки
            switch(btn){
            case 0b11111110: return 1;
            case 0b11111101: return 2;
            case 0b11111011: return 3;
            case 0b11110111: return 4;
            case 0b11101111: return 5;
            case 0b11011111: return 6;
            case 0b10111111: return 7;
            case 0b01111111: return 8;
            default:
               // если нажато несколько кнопок - игнорируем
               break;
            }
         }
      }
   }
}
break - то из switch, а охватывающий его while(1) никто не трогает

Re: Как написать программу по алгоритму?

Ср мар 13, 2019 13:21:01

вайл(1) я проглядел...
_______________
2)После выполнения программы она останавливается и ждет следующее нажатие
ARV писал(а): 
Код:
// светодиоды горят еще 1 секунду, потом гаснут
      _delay_ms(1000);
      PORTB = 0;

неувязочка... :)

Re: Как написать программу по алгоритму?

Ср мар 13, 2019 13:39:59

вы о том, что ждет с погашенными светодиодами? ну так ТС ничего не сказал об этом, а мне представляется логичным, что они не горят в "нормальном" состоянии. иначе скачок от 8 светящихся к 1 светящемуся при нажатии кнопки 1 будт выглядеть уныло...

Re: Как написать программу по алгоритму?

Ср мар 13, 2019 13:49:37

у меня сначала все гаснут, уже потом по одному зажигаются...

Re: Как написать программу по алгоритму?

Ср мар 13, 2019 14:47:41

ОФФТОП:
@AVR,я прочел ваш меседж по поводу читабельности кода. Зато могу теперь успокоить себя т.к мой вариант легко читабелен.
Ну а многовато строк в нем, потому что я себе прививаю привычку делать код легко переносимым\расширяемым\универсальным.
@AVR и если не секрет в каком месте мой вариант вогнал вас в ступор ? (хочу сделать для себя выговор) .

И того две страницы форума исписано , а автор темы даже не удосужился зайти и выразить благодарность за предоставленные варианты.Хотя возможно он уже и забил на это задание и занялся физ подготовкой, т.к армия любит крепких мужчин XD )))

Re: Как написать программу по алгоритму?

Ср мар 13, 2019 15:13:05

у меня сначала все гаснут, уже потом по одному зажигаются...

а у меня по-вашему, как?

эх, видимо, все мои старания делать "легко читаемый код" напрасны... :(
7seg писал(а):в каком месте мой вариант вогнал вас в ступор ?
да в объеме писанины. ваш вариант не соответствует ни одному из трех моих принципов.

Re: Как написать программу по алгоритму?

Ср мар 13, 2019 15:20:04

не, я не про код, я про скачёк...

Re: Как написать программу по алгоритму?

Ср мар 13, 2019 15:26:10

если у вас ПОСЛЕ того, как все, что надо, зажглось, оно горит до очередного нажатия на кнопку, то скачок возникает как раз в момент нажатия. то есть при нажатии кнопки 1 произойдет мгновенное переключение из 8 в 1 горящий светодиод. сам процесс "загорания" будет как бы упущен.

7seg писал(а):хочу сделать для себя выговор
кстати, разглядел только сейчас: вы запрещаете прерывания на время от 500 до 4000 мс - это круто. за это можно и строгача влепить :)))

Re: Как написать программу по алгоритму?

Ср мар 13, 2019 15:39:06

я вот по другой теме немного в ступоре, я перенял у Вас некоторые тонкости программирования и считаю Вас хорошим кодером (наслышан и об умении при минимуме ресурсов получать хорошие результаты), но сам алгоритм программы у меня вызывает двойственные чувства, он понятен, это да, но написан так, что мне кажется, чтото ещё параллельное ему засунуть в мк будет трудно (код то ждет зажигания следующего светодиода, то нажатия кнопки) а часто приходится крутить несколько параллельных процессов и любой программист рано или поздно с этим столкнётся, кроме того работа кода косная (пока все требуемые светодиоды не зажгутся и через секунду не погаснут, кнопку жать бесполезно) да и с энергосбережением его подружить тоже трудно... (ИМХО)
_____
ПС: про скачек, у меня всё правильно: сначала гасим, потом ждём, потом зажигаем - 0 горящих светодиодов тоже бывают.

Добавлено after 3 minutes 20 seconds:
про косность конечно вопрос... мы ведь не знаем что автор задумывал...

Re: Как написать программу по алгоритму?

Ср мар 13, 2019 16:06:57

кстати, разглядел только сейчас: вы запрещаете прерывания на время от 500 до 4000 мс - это круто. за это можно и строгача влепить :)))


Это было сделано умышлено чтобы не лепить флаги, т.к у меня всего лишь одно прерывание которое обслуживает функцию обработки кнопок.
А в условии задачи сказано что мы не должны прервать последовательность действий до окончания выполнения в моем случае функции блинк . :)
Если выкинуть _делаймс(), то все станет нормально про что я вроде бы уже писал. 8)

Re: Как написать программу по алгоритму?

Ср мар 13, 2019 16:13:08

перечитал... действительно я не прав - написано что ждём кнопку после зажигания всех светодиодов... придется переписывать :( (ладно, хоть немного, 9 знаков всего :) )

Re: Как написать программу по алгоритму?

Ср мар 13, 2019 18:30:44

Ivanoff-iv писал(а):я перенял у Вас некоторые тонкости программирования и считаю Вас хорошим кодером
и вам спасибо :) но я только учусь. всю жизнь.
Ivanoff-iv писал(а):по другой теме немного в ступоре
проблема в том, что вы, решая конкретную задачу, зачем-то думаете о возможных вариантах развития... а я в конкретном случае ни о чем не думал, потому как задача явно "этюдная", полностью выдуманная, без цели и продолжения. и главная цель, что я преследовал - создать код, понятный неучу и не вызывающий у препода подозрений. и, как мне кажется, цели я достиг.
Ivanoff-iv писал(а):чтото ещё параллельное ему засунуть в мк будет трудно
вы не поверите, как много можно всунуть "паралельно", если не стараться думать об этом специально! и часто бывает наоборот: когда слишком много думаешь о параллельности, попадаешь в большие затруднения - моя тема о RTOS тому пример. буквально до последних дней я никогда не использовал работу с USART по прерываниям и с кольцевым буфером, все делал на тупейшем поллинге UCSRA - и, представьте себе, при этом и интерфейс не зависал, и что-то там регулировалось "параллельно" и т.п. фишки-пышки были.
Ivanoff-iv писал(а):и с энергосбережением его подружить тоже трудно...
наоборот, чрезвычайно легко: в функции определения номера кнопки всего лишь в случае, если ни одна кнопка не нажата, сразу уходить в глубокий сон (разумеется, заранее настроив способ пробуждения по прерыванию от порта кнопок или таймера или еще чего-либо).

Добавлено after 9 minutes 35 seconds:
7seg, кстати... раз уж вы юзаете avr-gcc, рекомендую пользоваться такой поддерживаемой этим компилятором фишкой, как "анонимные юнионы/структуры". у вас там многоступенчатая вложенность структур, что код не украшает. с анонимными структурами/юнионами это будет более красиво:
Код:
typedef union{
   uint8_t as_byte;
   struct{ // структура, под которую не выделено "поля" в union - безымянная или анонимная структура
      uint8_t bit0 : 1;
      uint8_t bit1 : 1;
      uint8_t bit2 : 1;
      uint8_t bit3 : 1;
      uint8_t bit4 : 1;
      uint8_t bit5 : 1;
      uint8_t bit6 : 1;
      uint8_t bit7 : 1;
   }; // вот тут бы идентификатор - а его нет!
} my_type_t;

my_type_t var;

var.bit7 = 1;
var.as_byte++;

Re: Как написать программу по алгоритму?

Чт мар 14, 2019 04:21:18

ARV писал(а):рекомендую пользоваться такой поддерживаемой этим компилятором фишкой, как "анонимные юнионы/структуры".

Хоть этот подход и более красив, но из-за завязке на компиляторе, и возможности возникновении проблем при дальнейшем сопровождении кода, все таки откажусь от данной рекомендации.

Re: Как написать программу по алгоритму?

Чт мар 14, 2019 07:13:12

дело-то ваше... вроде как в версии стандарта C11 это добавлено... MS VC как бы поддерживает...
лично меня проблема совместимости/переносимости мало беспокоит, поскольку для любительских целей это совершенно неакутально.
а GCC он везде одинаков...

Re: Как написать программу по алгоритму?

Чт мар 14, 2019 16:33:58

Вообще-то ТЗ такое, какая кнопка нажата, столько светодиодов загорается. Смущает: последовательно 1, 2. Если он имеет в виду, сразу, какая кнопка, столько светодиодов - это одно. Если же с задержкой, сначала 1, потом второй, то это уже совсем другое.

Re: Как написать программу по алгоритму?

Чт мар 14, 2019 17:09:45

А вот когда ТЗ ТАКОЕ, тот так и пишется от балды. Т.е., как проще. А потом уже утрясается, с доплатой.
Ответить