ATmega, RXC interrupt

Fuzesi Arnold arno at externet.hu
Sun Dec 26 23:19:35 CET 2004


-Mert frame/overrun hiba van?
-Atmega32-re akarsz biztos forditani?
-baudrate jo?

AVR-re hirtelen nem emlekszem, de PIC kezeletlen overrun eseten tuti
'"lefagyott".
(Hiba miatt nem torolte a receive flag-et amiatt allando IT-ben maradt.
Lekezeled a hibakat rendesen? (Probald meg, hatha)

En ezt hasznalom IAR alatt , muxik rendesen.

#ifdef DEBUG
//UART init
 UBRRH=0;
 UBRRL=12;  //9600baud at 1MHz
 UCSRA=0x02;  //Double speed

// UCSRB=0xD8;  //RXC, TXC int. enable ;Rx,Tx enable
// UCSRB=0xD0;  //RXC, TXC int. enable ;Rx enable
 UCSRB=0x48;  //TXC int. enable ;Tx enable
// UCSRB=0xD8;  //RXC, TXC int. enable ;Rx,Tx enable

 UCSRC=0x80|0x06;//UCSRC gány+8 bit
#endif

#ifdef DEBUG
__interrupt void USART_RXC_handler(void)
{
 uchar temp;
 if(UCSRA_Bit4)       //framing error
 {
  while(UCSRA_Bit7) temp=UDR;
  return;
 }
 if(UCSRA_Bit3)       //overrun error
 {
  while(UCSRA_Bit7) temp=UDR;
  return;
 }

 temp=UDR;
 comm_ibyte0=temp;
 comm_newbyte0=1;
}
#endif

Arnold
----- Original Message ----- 
From: "Beregnyei Balazs" <bereg at impulzus.sch.bme.hu>
To: <elektro at tesla.hu>
Sent: Saturday, December 25, 2004 2:33 PM
Subject: ATmega, RXC interrupt


> 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
>
> -----------------------------------
>  Szponzorunk: http://tonerbolt.hu/




More information about the Elektro mailing list