ATmega, RXC interrupt
Beregnyei Balazs
bereg at impulzus.sch.bme.hu
Sat Dec 25 23:33:36 CET 2004
Sziasztok,
Miert "fagy le" az AVR egyetlen byte fogadasatol is, ha be van kapcsolva az RXC
interrupt? Az interrupt rutinban semmi mast nem csinalok, csak kiolvasom az
UDR-t. ATmega32-n es 128-on is probaltam. A TXC interrupt (es altalaban semmi
mas) nem csinal ilyet, ertetlenul allok a jelenseg elott... Gcc-vel forditok,
es igy nez ki egy minimalis kod:
#define __AVR_ATmega32__
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/io.h>
unsigned char c;
INTERRUPT(SIG_UART_RECV)
{
c = UDR;
}
int main()
{
unsigned int i;
sei();
UBRRH = 0; UBRRL = 103; // 9600 baud
UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE); // | (1 << TXCIE);
UCSRC = (1<<URSEL) | (1 << USBS) | (3 << UCSZ0);
DDRD = 0x80; // LED
while(1)
{
PORTD = 0x80; // villogtat
for (i=0; i<65500; i++);
PORTD = 0;
for (i=0; i<65500; i++);
}
}
A fenti program addig villogtatja a LED-et, amig soros porton nem kuldok
egy akarmilyen karaktert: ekkor leall a villogas.
Az interrupt rutin meg sem hivodik (LED-del tesztelve).
A folyamatos reset lehetosege is kizarva.
Igy forditom le: avr-gcc -Wall -O1 -mmcu=atmega32 *.c
Kaptam egy ASM forrast, ami teljesen ugyanezt csinalja, es az jol mukodik,
nem all le a LED villogasa. Hiaba nezem a Gcc altal generalt ASM fajlt,
nem latom a kulonbseget, ami miatt fagy...
Elore is kosz a tippeket, udv,
BB
More information about the Elektro
mailing list