Problema con Atmega 168 USART recibe una interrupción, mientras se comunica con Xbee

3

Antes de disminuir mi reputación, hágame saber qué he hecho mal. Tengan paciencia ya que soy un novato.

He escrito un programa para que un módulo de radio receptor envíe 1 cuando reciba un 1 de un módulo de emisora. Estoy usando XCTU con un Xbee como emisora. Aquí está el código.

#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>

unsigned char data; //to store received data from UDR0



//Function To Initialize UART0
// desired baud rate:9600
// actual baud rate:
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
 UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C = 0x06;
 UBRR0L = 0x06; //set baud rate lo
 UBRR0H = 0x00; //set baud rate hi
 UCSR0B = 0x98;
}


SIGNAL(SIG_USART0_RECV)         // ISR for receive complete interrupt
{
    data = UDR0;  //making copy of data from UDR0 in 'data' variable 
    if(data == 0x31)
    UDR0 = data;                //echo data back to PC

}


//Function To Initialize all The Devices
void init_devices()
{
 cli(); //Clears the global interrupts
 uart0_init(); //Initailize UART1 for serial communiaction
 sei();   //Enables the global interrupts
}

//Main Function
int main(void)
{
init_devices();
    while(1);
}

Ahora el problema es que cuando envío un 1 no recibimos ninguna respuesta del receptor. Intentamos lo mismo con un devboard basado en Atmega 2560 como receptor y el programa funcionó a la perfección. Pero cuando lo intentamos con Atmega 168 no pasa nada. Bueno, con Atmega 168 usamos un cristal interno de 8MHz con 8 prescaler, es decir, un reloj del sistema de 1MHz, así que lo he usado

 UBRR0L = 0x06; //set baud rate lo

Se utiliza para dev-board

 UBRR0L = 0x5F; //set baud rate lo

para obtener 9600 baudios. Pero no importa lo que haga, la interrupción simplemente no funciona. Intentamos ejecutar un ciclo de conmutación en el programa principal para ver si está funcionando o no y que también funcionó. Pero cuando transmito una señal a través de XCTU (software de terminal), el receptor no va a ISR como se supone.

Por favor ayuda. Pregúntame si hay algo que necesite aclarar.

    
pregunta Rambo partyush

2 respuestas

4

Está utilizando el formato antiguo para las interrupciones, me pregunto si esta es la causa del problema.

Consulte avr / interrupt.h

El manejador de interrupciones debe ser como

ISR(USART0_RX_vect)
{

}
    
respondido por el alexan_e
1

Para Atmega 168 tuvimos que usar

ISR(USART_RX_vect)
{

}
    
respondido por el Rambo partyush

Lea otras preguntas en las etiquetas