Пробую написать программу для обработки кнопок на Си и CVAVR. Микроконтроллер Attiny2313. При нажатии кнопки на PD.3 включаю таймер Т0 и в переменную k1 заношу значение TCNT0. При отпускании кнопки останавливаю таймер и заношу в k2 следующее значение TCNT0. По разнице хочу определить прошедшее время, поделив разницу на период Код (C++): while (1) { // Place your code here if(!PIND.3) { TCCR0B=0x05 ,k1=TCNT0,PORTB=k1; if(PIND.3) { TCCR0B=0x00, k2=TCNT0; /* if(TCNT0==20) { sec+=1;} else {sec+=10;}*/ } } } } При симуляции в Протеусе получаю одинаковые значения k1 и k2. Кто подскажет, почему?
Никакими cvavr лучше не пользоваться. В ней есть фичи, которые стандартом Си не поддерживаются. После перехода на нормальную иде могут ждать необъяснимые сюрпризы.
Кроме cvavr ни с какими компиляторами не знаком. Овладевать новыми, увы, возраст и состояние памяти не позволяют. Да и cvavr пользуюсь несколько лет и больших непоняток не было. Были ошибки по неграмотности, поэтому и сейчас жду, может кто и намекнёт, куда смотреть. С уважением.
Как сделать обработку нефиксируемой кнопки - нажал первый раз один, нажал во второй раз ноль? Без прерываний....
одна кнопка без фиксации Алгоритм - нажал в первый раз - переменная стала TRUE нажал в следующий раз - переменная FALSE и так по кругу
Кроме самих нажатий нужно подумать о такой вещи как *дребезг контактов кнопки* Как планируите давить дребезг , апаратно или программное ? а это два разных кода будет.
Н у я то понятно, конечно программно, и даже для одной кнопки вставил бы любимую функцию с вертикальными счетчиками. Зато потом, можно добавить еще 7 кнопок или входов , или смешанно. Без добавления чего либо в код, в плане обработки дребезга.
Так а в логике то какие вопросы? У меня есть флаг, который выставляется в 1 при нажатии; и флаг, который выставляется в 1 при отпускании. Если флаг перешел в 1 - делаем but=!but, и сбрасываем флаг. Флаг на отпускание тут и не нужен, можно не обрабатывать. Была же моя тема про устранение дребезга, там и другие варианты предлагали.
у меня на работе в ртосе просто рс-триггер стоит - там такой хвост куча переменных - да работает - но слишком много забивать а тут всего 1 флажок
Серьёзно? Я думал дребезг можно подавить периодом опроса...Даже у самой убитой кнопки дребезг не превышает 10-12 мс. Достаточно опрашивать её раз в 20мс и всё остальное получится автоматически. Оказывается библиотеки нужны. Ну я и лошара.
Код (C++): if (BTN) { if (oldBTN) { // какой-то код // взводим флаг // если флаг взведён, то инвертируем его oldBTN = false; // блокируем повторное выполнение кода, если состояние BTN не изменилось } } else { oldBTN = true; } сколько бы кнопку не держал, код выполнится всего один раз. Или я не понял вопроса?
Да это же какой то ЦЕРИТЕЛИзьм какой то.... ОДНОфлагизьм - вот наше всё ...!...))) Код (C++): //строки 5,8,12,нужны только для наглядности примера const int bip = 5 ; // ПИПИКАЛКА подключен к D5 const int but_plus = 2; // кнопка + boolean flag = false; // флаг кнопки плюс int Tmax=35; // НУ пусть будет - условная максимальная температура // void setup() {//**** pinMode(but_plus,INPUT); // пин кнопки плюс pinMode(bip,OUTPUT); //пин на ПИПИКАЛКУ }//**** // void loop() {//** // обработка кнопок // опрос кнопка плюс конечно в теле цикла таймера на милис ... if (digitalRead(but_plus) ==0 && flag == false){ flag=true;tone(bip,1300,200); } if (digitalRead(but_plus) ==1) { flag=false; } //тут куча всякого нужного кода // //тут неожидано нужно что то выполнить по нажатию кнопки + if(flag==true){Tmax++;delay(500); } //автоповтор 500 // // и увсё! // // кнопку быстро блимкаем - Tmax один раз добавится. Удержим - будет самоповтор. // // }//**END