Таймер обратного отсчета на AVR язык Си

Обсуждаем контроллеры компании Atmel.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

aleksei18rus писал(а):Как смог так и написал не пинайте за код
Никто Вас за это пинать не будет.

Вопрос то в чем у Вас??? Не работать таймер может по всякому. Я так понимаю Вы выложили почти полный код, удалив лишь код таймера?
----
З.Ы. Длинные коды прячьте под спойлер.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Поумничаю немного, люблю я это дело.

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

Судя по коду у вас есть какие-то кнопки. Давайте возложим работу с кнопками на функцию, допустим, get_key_pressed(), которая будет нам возвращать 0, если ни одна кнопка не нажата или номер нажатой кнопки. для номеров кнопок введем константы типа KEY_xxxx. Как она будет оределять нажатие - пока оставляем за кадром. в итоге главый цикл у нас превращается в такое:

Код: Выделить всё

while (1) {
   vremya();  // вывели время
   timer();    // вывели таймер
   switch(get_key_pressed()){
   case KEY_START: // выполним, что необходимо для старта таймера
                             break;
   case KEY_STOP:  // выполним, что необходимо для остановки таймера
                             break;
   // если есть другие кнопки - аналогично обработаем их
   }
}
у нас получился понятный, легко читаемый и легко изменяемый код.

состояние таймера у вас хранится в переменных sec1 и min1. про неудачные названия я промолчу.
чтобы таймер считал, надо в обработчике прерываний проверить значение этих переменных на 0 и, если они не равны нулю, произвести их уменьшение, т.е. выполнить обратный счет.
это означает добавление в обработчик таймера вместо "бла бла бла" примерно такого кода:

Код: Выделить всё

if((sec1+min1) != 0){
   if(sec1 == 0){
      sec1 = 59;
      min1--;
   } else {
      sec1--;
   }
}
надеюсь, вы понимаете, что этот код будет каждую секунду уменьшать время таймера, если оно не обнулено. что делать (и в каком месте делать), когда таймер обнулится - это решать вам.

остается написать функцию работы с кнопками. в сущности, она будет простой: опросили все пины, к которым подключены кнопки, подождали 15 мс, опросили второй раз и сравнили с результатом предыдущего опроса. если оба раза получилось одно и то же - это есть зафиксированное состояние кнопок без дребезга, надо его проанализировать: если все не нажаты, вернуть 0, а если нажаты - выдать номер нажатой в виде константы KEY_xxxx, как договорились.

я рассказал о том, как решать придуманную мной задачу с обратным счетом таймера. она может не совпасть с вашей задумкой - надеюсь, вы это понимаете и не ждете от меня готового решения ВАШЕЙ задачи. я даю намеки, советы, а вы с их помощью решаете свои задачи. в частности, вам давали совет про флаг "активности таймера" - это в моем коде никак не учтено, но может быть учтено очень просто.

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн ноя 21, 2011 13:03:33

Сообщение aleksei18rus »

Согласен переменные ужас, но я только учусь. Пишу пока как могу.
Спасибо за код, работает

Код: Выделить всё

 
 if (start==1)
 if((sec1+min1) != 0){
   if(sec1 == 0){
      sec1 = 59;
      min1--;
   } else {
      sec1--;
   }
  if (min1==60) {min1=0;}
 }

а этим

Код: Выделить всё

switch () {
    case :
    break;
    };
не пользовался
Последний раз редактировалось aleksei18rus Чт фев 11, 2016 10:09:48, всего редактировалось 1 раз.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Учитесь сразу правильно, ибо переучиваться будет мучительно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Ср янв 06, 2010 10:01:46

Сообщение metan »

aleksei18rus писал(а):Нет все нормально она отрабатывала
То, что ошибочно выбранный оператор случайно работал как надо, это вовсе не означает, что ошибки нет
Должно быть вот так

Код: Выделить всё

if (PIND.0==0 && stop==0) {start=1;}
Реклама
Ответить

Вернуться в «AVR»