Сравнение выходных данных не происходит - AVR Atmega32 - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь сосчитать свои клики на кнопке pu sh (Coun и имитирует ее на 4 светодиодах, она должна считать до 9, затем TCNT0 равен OCR0, поэтому прерывание срабатывает, и TCNT0 снова становится равным нулю и так далее. но он продолжается после 9 до 255. Флаг сравнения выходных данных не установлен. (Сравнение не происходит).

ISR(TIMER0_COMP_vect){

}

int main(){
    DDRC=0xff;          //configure PORTC leds
    CLEAR_BIT(DDRB,0);   //configure T0 Pin as input
    SET_BIT(PORTB,0);    //enable internal PULL-UP resistance
    TCCR0 = 0x4E;     //Counter mode(falling edge),CTC mode .
    TCNT0=0;        //timer register initial value
    OCR0=9;       //set MAX value as 9
    SET_BIT(TIMSK,OCIE0);  //Enable On compare interrupt

    SET_BIT(SREG,7);      //Enable All-interrupts
    while (1){
        PORTC=TCNT0;           //Let Leds simulates the value of TCNT0
                    }
    }

1 Ответ

1 голос
/ 24 марта 2020

Лучше избегать "волхвов c цифр":

TCCR0 = 0x4E;     //Counter mode(falling edge),CTC mode .

Для установки CT C бит # 6 WGM00 должен быть 0, а бит # 3 WGMM01 должен быть 1 (см. таблица данных , таблица 38 на стр. 80).

У вас установлены оба бита на 1, поэтому счетчик работает в режиме FastPWM.

Используйте макросы с именами битов:

TCCR0 = (1 << WGM01) | (1 << CS02) | (1 << CS01); // = 0x0E
...