Переменная сбрасывается при завершении функции C

#c #atmega

#c #atmega

Вопрос:

Я пытаюсь запустить таймер с CTC и внешними прерываниями, которые будут отсчитываться до 60 секунд, и использовать функцию для отображения выходных данных на светодиодах на ATmega128 . Функция, как показано ниже, будет считать вплоть до первой итерации места tens при отладке, но при следующем запуске переменная tens сбрасывается до нуля, и я не могу понять, почему она сбрасывается. Кто-нибудь может увидеть, где я мог допустить ошибку?

     #include <avr/io.h>
    #include <inttypes.h>
    #include <avr/interrupt.h>
    #include <util/delay_basic.h>

    volatile uint8_t passval = 0;

    void display(uint8_t value);

    int main(void)
    {
        DDRC = 0xFF;                                //PORTC output for two seven segment displays(tenths and ones place)
        DDRD = 0x0F;                                //PORTD output for one seven segment display(tens place)

        EICRA = ((1 << ISC01) | (1 << ISC00) | (1 << ISC11) | (1 << ISC10));        //Interrupt set to trigger on rising edge for PINA1...0
        TCCR1B |= (1 << WGM12);                     //Sets CTC Mode
        OCR1A = 24999;                              //Prescaler as 64 with a count of 25000
        TCNT1 = 0;                                  //Clears clock
        TIMSK |= (1 << OCIE1A);                     //Enables interrupt
        sei();                                      //Enable Global Interrupt

        while (1) 
        {   
            TCCR1B |= ((1 << CS11) | (1 << CS10));
            display(passval);
        }
        return 0;
    }

    void display(uint8_t value)
    {
        static uint8_t tenths, ones, tens;

        tenths = value;
        if (tenths > 0x09)                          //Rolls Over tenths place at 10
        {
            passval = 0x00;
            tenths = 0x00;
            ones  ;                                 //Advances ones place
            if (ones > 0x09)                        //Rolls over ones places at 10
            {
                ones = 0x00;
                tens  ;                             //Advances tens place

                if (tens > 0x06)                    //Rolls over tens place at 6
                {
                    tens = 0x00;
                }
            }
        }
        PORTC = ((ones << 4)   tenths);             //Display Output
        PORTD = tens;
    }

    ISR (TIMER1_COMPA_vect)                         //Timer ISR
    {
        passval  ;                                  //Advance tenths place
    }
  

Комментарии:

1. Возможно ли, что ISR срабатывает во время выполнения внутри display функции?

2. Возможно, но одиночное или многократное срабатывание ISR не должно так сильно влиять на переменную tens, что она сбрасывается до нуля