Witam Rozpoczynam moja przygode z AVR i mam problem z przerwaniami. Robie ksiazkowo SIGNAL(SIG_OVERFLOW0) {...}, ustawiam tryb pracy timera, wlaczam przerwania i przy pierwszym wywolaniu przerwania program idzie w krzaki. SIGNAL(__vector_default) tez nie daje informacji, co dzieje sie z procesorem i dlaczego przerwania nie dzialaja poprawnie. Wyglada na to, ze procek ma niewlasciwy poczatkowy wekor przerwan. Probowalem ustawiac fusebity na rozne sposoby i nic nie pomaga. Moze ktos mial podobny problem z ATMega16L ??? Pozdrawiam Tomek
ATMega16L - problem z przerwaniami - avr-gcc + ponyprog
Nov 15, 2004
12 Replies
A doda³e¶
#include <avr/signal.h>
#include <avr/interrupt.h>
?U¿ytkownik "Tomasz Sliwa" snipped-for-privacy@XXXsys.net.pl> napisa³ w wiadomo¶ci news:cna3ot$hvo$ snipped-for-privacy@nemesis.news.tpi.pl...
Tak Program kompiluje sie bez ostrzezen. Jesli nie uzywam przerwan wszystko jest OK. Deasemblowalem binarke i tez wydaje sie byc OK. Podejrzewam, ze cos z fusebitami jest nie tak i przy wywolaniu przerwania program skacze mi w zly obszar pamieci. Nie mam doswiadczenia z AVR i pytam, bo moze szukam nie tam gdzie trzeba.
Pozdrawiam Tomek
Jeste¶ pewien, ¿e b³±d wystêpuje przy wywo³aniu tego przerwania? A mo¿e po restarcie skacze odrazu w zly obszar? Dzia³o by sie tak przy zaprogramowanym fusie Boot Reset, wtedy po restarcie program skacze pod adres Boot Loadera. Byæ mo¿e masz te¿ ¿le ustawione fusy zegara.
To jest mozliwe. Program inicjuje sie dobrze, bo USART dziala poprawnie. Kombinowalem i z zaprogramowanym i niezaprogramowanym fusie BOOTRST i nie dziala
A maja one znaczenie?? Procek dziala na kwarcu 7.316 MHz. Generator dziala poprawnie, bo USART generuje wlasciwa transmisje.
Pozdrawiam Tomek
No to sam ju¿ nie wiem. Jedyne co mi jeszcze przychodzi do g³owy to mo¿e nie ten procesor w makefilu. Mo¿e pode¶lij trochê kodu do obejrzenia.
Nie mam go teraz pod reka. Jesli dzis nie uruchomie przerwac, jutro rzuce kodem
Pozdrawiam Tomek
U¿ytkownik "Tomasz Sliwa" snipped-for-privacy@XXXsys.net.pl> napisa³ w wiadomoœci news:cna4l6$nb9$ snipped-for-privacy@nemesis.news.tpi.pl...
Moze to problem ze stosem ? Jak duzo RAM-u wykorzystujesz ? O ile mi wiadomo, avr-gcc umieszcza stos na koncu pamieci RAM procesora. Jesli program uzywa duzo RAM-u to na stos pozostaje niewiele.
Pozdr AK
[ciach]
Sądzę że to faktycznie za mało miejsca na stos. U mnie występował ten sam problem, ale po zadeklarowaniu stosu wszystko zaczeło działać. W moim programie dla ATMega8515 (piszę w avrgcc) zrobiłem to tak: SPH = RAMEND >> 8; SPL = RAMEND & 0xff; Pozdrawiam
/* Kod programu
Pomozcie w znalezieniu bledu. Moze cos jeszcze trzeba ustawic. Fusebit BOOTRST jest niezaprogramowany.
*/ #define __AVR_ATmega16__ #include <string.h>#include "avr/eeprom.h" #include "avr/io.h" #include "avr/signal.h" #include "avr/interrupt.h"
typedef unsigned char BYTE; typedef unsigned int WORD;
BYTE a = 'a'; BYTE b = ' ' ; BYTE c = 'c'; int count = 0; void rs_init() { outp(0, UBRRH ); outp(47, UBRRL); outp(BV(RXEN)|BV(TXEN), UCSRB); //outp(BV(RXCIE)|BV(TXCIE)|BV(URSEL)|BV(UCSZ0)|BV(UCSZ1), UCSRC); outp((BV(URSEL)|BV(UCSZ0)|BV(UCSZ1)) ,UCSRC);; }
void rs_putch(BYTE c) { outp(c, UDR); loop_until_bit_is_set(UCSRA,TXC); sbi(UCSRA, TXC); } void rs_puts(char *str) { while (*str != 0) { rs_putch(*str); str++; } } BYTE rs_getch() { BYTE c = 0; loop_until_bit_is_set(UCSRA, RXC); c = inp(UDR); return c; } SIGNAL(SIG_OVERFLOW0) { count++; if(count > 100) { count = 0; if(a < 'w') a++; else a = '0'; } } SIGNAL(__vector_default) { rs_putch('d'); b = 'd'; }
int main() { outp((1<<TOIE0), TIMSK); /* enables the T/C0 overflow interrupt in the T/C interrupt mask register for */ outp(0, TCNT0); /* start value of T/C0 */ outp(5, TCCR0); /* prescale ck/1024 */ rs_init(); rs_puts("\n\rBefore sei"); sei(); rs_puts("\n\rReset"); for(;;) { if(a != c) { rs_puts("\n\ra = "); c = a; rs_putch(a); } if(b != ' ' ) { rs_puts("\n\rb = "); rs_putch(b); b = ' ' ; } } return 0; } /* A moze ktos moglby na szybko przepuscic przez avr-gcc i sprawdzic u siebie czy toto dziala. Jest moze jakis prosty symulator dla AVR pod linuxy??
Pozdrawiam Tomek
*/B³êdu ¿adnego nie ma. Sprawdzi³em i dzia³a zarówno na symulatorze (AVR Studio) jak i na rzeczywistym procku. Napisz dok³adnie jakie fusy ustawi³e¶ i na czym to testujesz.
Pozdrawiam, Piotrek.
Dzieki.
Z fusow ustawione mam jedynie SPIEN i CKOPT. Testuje na wlasnej plytce uruchomieniowej. Na niej mam mostek+stabilizator+ATMega16L + kwarc + MAX232
- goldpiny do IO.
Kiedys do goldpinow przylutowalem kilka kabelkow transformatorowka i fusebity mi sie zresetowaly. Moze cos w procku uwalilem??
Pozdrawiam Tomek
Witam Zadzialalo. Zgodnie z sugestiami max'a sprawdzilem Makefile. moj Makefile wygladal tak ( zly makefile):
all: avr-gcc -g -O3 -Wall -Wa -o librs.elf librs.c avr-objcopy -I elf32-avr -O ihex librs.elf librs.hex
A powinien przynajmniej tak:
all: avr-gcc -g -Os -Wall -Wa -mmcu=atmega16 -o librs.elf librs.c avr-objcopy -I elf32-avr -O ihex librs.elf librs.hex
Nie ustawialem a Makefile'u opcji mmcu tylko rodzaj procesora ustalalem w kodzie dyrektywa #define __ATmega16_ co bylo bledem i kompilowalo sie bez bledow a dzialalo zle.
Dodatkowo zle w moim oryginalnym Makefile'u dzialala opcja O3. Pomogla zamiana na Os.
Dzieki wszytkim za pomoc, a w szczegolnosci MAX'owi
Pozdrawiam Tomek
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required