ATMega16L - problem z przerwaniami - avr-gcc + ponyprog

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

Reply to
Tomasz Sliwa
Loading thread data ...

[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

Reply to
Aeddin

/* 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

*/
Reply to
Tomasz Sliwa

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

Reply to
Tomasz Sliwa

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.