Problem mit Atmega 168 USART erhält Interrupt während der Kommunikation mit Xbee

Bevor Sie meinen Ruf mindern, teilen Sie mir bitte mit, was ich falsch gemacht habe. Geduld mit mir, da ich ein Neuling bin.

Ich habe ein Programm geschrieben, so dass ein Empfänger-Funkmodul eine 1 sendet, wenn es eine 1 von einem Sendermodul empfängt. Ich verwende XCTU mit einem Xbee als Sender. Hier ist der Code.

#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);
}

Jetzt ist das Problem, dass wir keine Antwort vom Empfänger erhalten, wenn ich eine 1 sende. Wir haben dasselbe mit einem Atmega 2560-basierten Devboard als Empfänger versucht, und das Programm funktionierte wie ein Zauber. Aber wenn wir es mit Atmega 168 versuchen, passiert nichts. Nun, mit Atmega 168 verwenden wir einen internen Kristall von 8 MHz mit 8 Prescaler, dh 1 MHz Systemtakt, den ich verwendet habe

 UBRR0L = 0x06; //set baud rate lo

Wird für Entwicklungsboards verwendet

 UBRR0L = 0x5F; //set baud rate lo

9600 Baud zu bekommen. Aber egal was ich tue, der Interrupt funktioniert einfach nicht. Wir haben versucht, im Hauptprogramm einen Umschaltzyklus auszuführen, um zu sehen, ob es funktioniert oder nicht, und das hat auch funktioniert. Aber immer wenn ich ein Signal über XCTU (Terminalsoftware) sende, geht der Empfänger nicht wie vorgesehen auf ISR.

Bitte helfen Sie. Fragen Sie mich zurück, wenn ich etwas klären muss.

Antworten (2)

Sie verwenden das alte Format für Interrupts, ich frage mich, ob dies die Ursache des Problems ist.

Siehe avr/interrupt.h

Der Interrupt-Handler sollte wie folgt aussehen

ISR(USART0_RX_vect)
{

}

Für Atmega 168 mussten wir verwenden

ISR(USART_RX_vect)
{

}