logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Nie działają przerwania TMR0.

slaweks86 10 Lut 2010 01:14 1081 4
  • #1 7671304
    slaweks86
    Poziom 11  
    
    //dołączanie bibliotek
    #include ...
    
    volatile uint32_t overflow;
    
    ISR (TIMER0_OVF_vect) 
    {
         overflow++;
    }
    
    void funkcja()
    {
          uint32_t pom;
    
          overflow=0;
          ...
          ... //różne duperele związane z szyfrowaniem
          ...
          pom=overflow;
    }
    
    SIGNAL (SIG_INTERRUPT0)
    {
        funkcja();
    }
    
    SIGNAL (SIG_INTERRUPT1)
    {
        funkcja(); //w przypadku obu pinów INT0 oraz INT1 odpala funkcja();
    }
    
    int main()
    {
        SREG=0x80;
        GICR = _BV(INT0)|_BV(INT1); //włącz obsługę przerwań Int0 i Int1
        MCUCR = _BV(ISC01)|_BV(ISC11);
        
        //ustawienie obsługi przerwania z Tmr0
        TIMSK = _BV(TOIE0);
        TCCR0 = _BV(CS00);
        
        //włączenie wszystkich przerwań
        sei();
    
        while (1)
        {
        }
    
    



    Ten program jest tylko wzorem... Nie wyjaśniłem co dzieje się w funkcji fucnkja() bo to jest tylko operacja na zmiennych...

    Dlaczego do jasnej ch***ry zmienna "pom" zawsze wynosi zero (tzn. pom==0) ?

    Dzięki za pomoc...

    Dodano po 1 [minuty]:

    zapomniałem dodać: w Fusach ustawiłem na zegar 8MHz i jak widać działa bez żadnego prescalera...
  • #2 7671607
    michalko12
    Specjalista - Mikrokontrolery
    A jaki cel ma zmienna lokalna "pom"

    pom=overflow;

    Tylko taki żeby do niej coś przypisać? Bo z tego kodu tak wynika.

    Jeśli tak to kompilator ja wyciął podczas optymalizacji bo jest bezużyteczna,
    a jeżeli nie to wróżki tutaj nie znajdziesz.
  • Pomocny post
    #3 7671703
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Zmienna jest równa zero, bo przerwania nie wywołują się podczas innych przerwań "same z siebie" - to chyba oczywiste, że żaden układ nie obsługuje "sam z siebie" zagnieżdżonych przerwań - nie bez powodu zresztą.

    Zupełnie inną kwestią jest to, że optymalizacja na 99% wywali Ci zmienną pom, bo jest bezsensowna.

    4\/3!!
  • #4 7671821
    slaweks86
    Poziom 11  
    ok to z miłą chęcią wywalę tę zmienną... tylko jaki jest inny sposób na zmierzenie czasu albo przynajmniej liczby przepełnień licznika w czasie trwania funkcji funkcja(); ?
REKLAMA