Изменение кода для счетчика

Та же шляпа что и с теорией. Здесь можно найти ответы даже на идиотские вопросы.
Ответить
mnirti
Сообщения: 1
Зарегистрирован: 02 июн 2017, 11:37

Изменение кода для счетчика

Сообщение mnirti » 08 июн 2017, 13:11

Здравствуйте. Помогите, пожалуйста.

Нужно дополнить код:

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

#include <avr/io.h>

#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>
//unsigned int i;???

//---------------------------------------------
void segchar (unsigned char seg)
{
   switch (seg)
   {
      case 1: PORTD = 0b11111001; break;
      case 2: PORTD = 0b10100100; break;
      case 3: PORTD = 0b10110000; break;
      case 4: PORTD = 0b10011001; break;
      case 5: PORTD = 0b10010010; break;
      case 6: PORTD = 0b10000010; break;
      case 7: PORTD = 0b11111000; break;
      case 8: PORTD = 0b10000000; break;
      case 9: PORTD = 0b10010000; break;
      case 0: PORTD = 0b11000000; break;
   }
}
//---------------------------------------------
int main(void)
{
   unsigned char i;
   unsigned butcount=0,butstate=0;
   DDRD = 0xFF;
   DDRB = 0x00;
   PORTD = 0b00000000;
   PORTB = 0b00000001; // Нулевой порт на вход, подано питание.
   while(1)
   {
      for (i=0;i<10;i++) // Начальное и конечное значения, шаг.
      {
         while(butstate==0)
         {
            if (!(PINB&0b00000001)){
               if (butcount < 5)
               {
                  butcount++;
               }
               else
               {
                  i=0;
                  butstate=1;
               }
            }
            else
            {
               if (butcount > 0)
               {
                  butcount--;
               }
               else
               {
                  butstate=1;
               }
            }
         }
         segchar(i);
         _delay_ms(1500); // Задержка 1,5 секунды
         butstate = 0;
      }

   }
}
В исходном виде он считает без нажатия кнопки и возвращается к нулю при ее нажатии. А нужно, чтобы отсчет начинался при нажатии кнопки и после остановки продолжался с той цифры, на которой отсчет был прерван, при этом не заменяя цикл for на таймер. Если правильно понимаю строка

butstate = 0; после строки со значением задержки отвечает за сбрасывание в ноль при остановке. На что ее заменить, чтобы отсчет продолжался не с нуля?

Как начать отсчет по нажатию кнопки при входе в программу (кнопка на нулевой ножке, при нажатии получается логический ноль)? В какую часть кода добавить эту новую строку? И нужно ли использовать переменную unsigned int i?

Аватара пользователя
gurvinok
Сообщения: 1471
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Изменение кода для счетчика

Сообщение gurvinok » 08 июн 2017, 17:28

Какая-то каша. Зачем нужна переменная int i?
Если нужно запоминать значения счета в памяти после отключения питания, то нужно работать с EEPROM, но при такой частоте перезаписи EEPROM быстро помрет. Поэтому нужно все сохранять в ОЗУ, а по питанию МК поставить кондер эдак на 1000мФд. Далее перед кондером поставить диод Шоттки для отсечки утечки при отключении питания. Перед диодом по плюсу питания подключить вывод МК и смотреть логическую единицу. Если появился ноль, значит питания нет. Лучше даже это повесить на ножку INT внешнего прерывания. а в обработчике прерывания уже сохранять значение в EEPROM. Ну а при старте программы вычитывать его.
Если долго мучиться, может быть получится.

Ответить