Przerwania od przepełnienia timerów ATMega16 - problem

Feb 16, 2005 11 Replies

Witam!



Problem tego typu, że po przepełnieniu licznika (T0 lub T1) procesor resetuje się zamiast wykonać instrukcje umieszczone w swojej funkcji. Przerwania od przetwornika ADC działają poprawnie. Oto kawałek programu:



#include <avr/io.h>



#include <avr/pgmspace.h>



#include <stdlib.h>



#include <avr/interrupt.h>



#include <avr/signal.h>



INTERRUPT (SIG_OVERFLOW0) { cbi(TIFR,TOV0); cli(); /* + pare prostych instrukcji */ sei(); }



void Timer0Init() { TCNT0=0; //wartość początkowa timera TCCR0=4; //preskaler CK/256 sbi(TIMSK, TOIE0); // zezwolenie na przerw. od przepełnienia }



void main(void) //program główny { DDRB=0xF1; //konfiguraja portów DDRD=0xFF; DDRC=0xFF; PORTD=0xFF; PORTB=0xF1; PORTC=0x00; Timer1Init(); //inicjuje timer



while(1) { sei(); /* + pare prostych instrukcji bez większego znaczenia */ } } Nie ma znaczenia czy zadeklaruje INTERRUPT (SIG_OVERFLOW0) czy też SIGNAL (SIG_OVERFLOW0). Nie ma znaczenia czy w podprogramie przerwania znajdują się (lub nie) instrukcje: cbi(TIFR,TOV0);cli();sei; nie ma też znaczenia stopień preskalera. Reakcja zawsze ta sama: w momencie wystapienia przerwania-> reset procka. O czym zapomniałem? Co robie źle?



Pozdrawiam. dielektrykus


Użytkownik "dielektrykus" snipped-for-privacy@poczta.onet.pl> napisał w wiadomości news:opsmai8cauqfyyhy@pervolt...

nie wnikalem zbytnio w kod

to co mi sie na szybko kojarzy to moze masz procedure obslugi przerwania od T0 a zainicjowales T1

Sprawdź, czy aby na pewno sbi(TIMSK, T0IE0) ustawia ten bit co trzeba. Gdy wywołuesz przerwanie, do którego nie ma procedury obsługi program leci do resetu. Poza tym mam nadzieję, że te głupie błędy w kodzie (widzisz je?) powstały przy przepisywaniu i skracaniu na potrzeby posta.

^^^^^ sam też popełniam...

dlaczego nie SIGNAL?

po wejsciu w obsluge przerwania flaga sie sama resetuje z tego co pamietam ....

Wed, 16 Feb 2005 13:49:14 +0100, na pl.misc.elektronika, dielektrykus napisał(a):

Zobacz jeszcze czy jest wstawiony dobry typ uP w opcjach (-mmcu=). Jeśli wektor jest pod innym adresem to właśnie tak zadziała - reset ( domyślna obsługa błędnego przerwania ).

Dnia Wed, 16 Feb 2005 13:07:33 +0000 (UTC), bartek snipped-for-privacy@gazeta.pl napisał:

Witam!

sbi(TIFR,TOV0); /* w środku jest duże_o ( kiedy patrze na swój post widze zero, ale kiedy kopiuje ten fragment i wklejam gdzieś indziej to widze duże_o */ Po kompilacji wygląda tak (wycięte z pliku *.lst): sbi(TIMSK, TOIE1); ac: 89 b7 in r24, 0x39 ; 57 ae: 84 60 ori r24, 0x04 ; 4 b0: 89 bf out 0x39, r24 ; 57 więc chyba działa.

Każde wytknięcie błędów będzie mile widziane. Jestem początkujący więc z wielu rzeczy nie zdaję sobie sprawy.

Pozdrawiam. dielektrykus

Dnia Wed, 16 Feb 2005 16:16:37 +0100, Pawel Kurzawa snipped-for-privacy@kpw.qs.pl> napisał:

Próbowałem obu - bez pozytywnego rezutatu.

Tak podaje manual, poprostu dla pewności wklepałem. Rezultaty podobne, czyli nie takie jakbym chciał (z i bez tej instrukcji).

Dnia Wed, 16 Feb 2005 16:50:50 +0100, Jurek Szczesiul snipped-for-privacy@wycin.ep.com.pl> napisał:

Witam! Używam środowiska AVRSide już od 2 m-cy i tylko do procka ATMega16. Jakież było moje zdziwienie gdy w ustawieniach procka znalazłem ATMega8!! Nie mam pojęcia w jaki sposób się to zmieniło. Ale nareszcie działa!!! (po dwóch dniach kombinatoryki) :-)

Dziękuję Tobie Jurku i wszystkim, którzy odpowiedzieli na moje zapytanie.

Pozdrawiam. dielektrykus

Wed, 16 Feb 2005 18:21:47 +0100, na pl.misc.elektronika, dielektrykus napisał(a):

Może nie przestawiłeś przy zakładaniu nowego projektu ? W nowym zawsze jest domyślna Atmega8.

Dnia Wed, 16 Feb 2005 19:56:20 +0100, Jurek Szczesiul snipped-for-privacy@wycin.ep.com.pl> napisał:

Dzięki wielkie. Nie miałem o tym pojęcia. Informacja została zapamiętana :-)

Pozdrawiam. dielektrykus

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required