чет вас понесло в какие то дали, нас тут более приземлённые вопросы интересуют. Например всё те же кнопки, опрос которых я тут выдумываю, вот код:
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#define RELE_5 PORTB3
#define BUTTON_4 PIND5
unsigned int flag_drebezg;
ISR (TIMER0_OVF_vect)
{
if ((PIND & (1<<BUTTON_4))&&(flag_drebezg==1))
flag_drebezg=0; //Флаг сбрасывается только при отжатой кнопке, т.е. при лог.1 на входе
int main(void)
TCCR0 = (1 << CS12)|(0 << CS11)|(1 << CS10); //делитель clk/1024
TIMSK |= (1 << TOIE0); // разрешение прерывания по переполнению таймера
sei(); // Разрешение прерываний
DDRB = 0xff; //Все пины B как выходы
PORTB = 0x00; //Во все пины B по нулям
DDRD = 0x00; //Все пины D как входы
while(1)
{
if (~PIND & (1<<BUTTON_4))&&(flag_drebezg == 0)) //Компенсация дребезга и частого срабатывания
((PORTB ^= (1<<RELE_3))&&(flag_drebezg=1));//включение реле, Флаг включен
}
return 0;
}
как я думал разобрался, но нет, проблема осталась. Идея опроса кнопки такова: при нажатии кнопку, т.е. перевод её в лог.0, в основной функции происходит сравнение flag_drebezg, сброшен ли он и, если он равен нулю, то происходит включение реле и устанавливает это флаг в единицу. Таймер же, каждые 260мс проверяет отжатие кнопки, т.е. лог.1 и если она есть, то flag_drebezg сбрасывает и основная функция готова к новой обработке нажатия. Проблема в том, что участок в основном коде отрабатывается единожды и больше нет никакой реакции на нажатие кнопки, т.е. похоже flag_drebezg не сбрасывается в 0. Если же я убираю из участка if (~PIND & (1<<BUTTON_4))
&&(flag_drebezg == 0)) выделенный фрагмент, то кнопка начинает почти норм отрабатывать, за исключением того, что требуется многократное нажатие на неё(иногда с одного раза срабатывает), причем время срабатывания её всегда разное, зависимости не выявил.
Симулятор же ведет себя совсем по другому, например, если кнопка зажата, то программа постоянно переключает ногу, в реале же, если я нажму и держу, о ничего не происходит.
Заранее спасибо!