Schnittstelle des XBee-Moduls mit ATMEGA 168

Ich habe 2 Module der xbee-Serie 1 so konfiguriert, dass eines serielle Daten von jedem anderen Modul mit derselben Pan-ID empfängt und das andere Daten an das zuvor erwähnte sendet.

Wenn ich jetzt eine Terminalsoftware (XCTU) verwende, um die Datenübertragung zu überprüfen, ist es in Ordnung. Ich möchte Daten seriell mit einem ATMEGA 168 mit xbee als Sender senden. Und ein weiterer xbee empfängt die Daten und sendet sie an eine auf ATMEGA 2560 basierende Plattform. Ich habe keine Plattform für Atmega 168, also habe ich irgendwie einen Brenner (Bootloader-Schaltung) gebaut. Der Bootloader funktioniert. Ich habe Pin 3 (TXD von USART0) von atmega 168 mit Daten in (Pin 3) des xbee-Moduls verbunden. Ich habe auch die notwendigen Stromanschlüsse hergestellt (Vcc = 3,3 V & GND). Aber der xbee scheint nichts zu senden. Gibt es etwas, das ich vermisse? Bitte helfen Sie, wie Sie vielleicht bereits herausgefunden haben, bin ich ein absoluter Neuling.

PS: Bevor Sie meinen Ruf reduzieren, lassen Sie mich bitte wissen, was ich falsch mache, damit ich das korrigieren kann.

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

void uart0_init(void)
{
 UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C = 0x06;
 UBRR0L = 0x5F; //set baud rate lo
 UBRR0H = 0x00; //set baud rate hi
 UCSR0B = 0x98;
}

void init_devices()
{
 cli();              
 uart0_init();  
 sei();              
}


 int main(void)
{
 unsigned char data; 
 init_devices();
 data =1;  

 while(1)
 {
     data =0x21;
     UDR0 = data;
    _delay_ms(2000);
    data =0x55;
     UDR0 = data;
    _delay_ms(2000);


 }

}
}

Dies ist der Code, den ich verwendet habe.

vielleicht auch deinen Code posten? Möglicherweise kommunizieren Sie mit der falschen Baudrate
@geometrisch danke für die Antwort. Ich habe den Code auch angehängt.
Es scheint, dass Sie nicht init_devices()von Ihrer mainRoutine aus anrufen, also wird der UART nicht eingerichtet. Ich habe dies im Internet gefunden, was nützlich sein könnte www2.ee.ic.ac.uk/t.clarke/projects/Resources/zigbee/AVR/… ... es enthält Beispielcode für eine serielle Schnittstelle. Haben Sie auch daran gedacht, den Arduino-Bootloader zu brennen und dann die Arduino IDE / Bibliotheken usw. zu verwenden?
Ich werde heute versuchen, das Programm auf einem anderen Gerät auszuführen. Ich habe zuvor ähnliche Programme geschrieben und sie haben auf anderen Plattformen funktioniert. Kann es zu Fehlern bei Spannungspegeln oder Hardwarekonfigurationen kommen?
XBee erfordert 3,3-V- und UART-Level-Signale. PS hast du versucht init_devicesin hinzuzufügen main?
Ich habe das versucht, aber mit dem gleichen Ergebnis. Das Programm lief auch nicht auf der 2560-Plattform, also habe ich mir die Baudrate angesehen und sie geändert. Danach hat es funktioniert, aber die 168-Schnittstelle funktioniert nicht, egal was passiert. Bei fehlender Baudrate sind nur Punkte in XCTU zu sehen, aber in diesem Fall erscheint nichts in der Terminalsoftware. Also meine Vermutung ist, dass mit der Hardwareeinstellung etwas nicht stimmt. @ geometrisch

Antworten (2)

Das Problem lag in der Programmierung. Sofern die Sicherungseinstellungen nicht geändert werden, verwendet der Mikrocontroller seinen standardmäßigen 8-MHz-Oszillator mit einem Vorteiler von 8. Sie sollten also effektiv eine Systemfrequenz von 1 MHz anstelle von 12 MHz haben. Für 9600 Baud müssen Sie also Folgendes eingeben:

UBRR0L = 0x06; //set baud rate lo

anstatt

UBRR0L = 0x5F; //set baud rate lo

Dies sollte das Problem beheben. Obwohl ich nicht weiß, wie ich die Sicherungen oder was auch immer konfigurieren soll.

Ein paar Probleme:

  • init_devices() muss von innen aufgerufen werden main(), sonst wird es nicht ausgeführt

  • data = 0;und data = 1;senden Sie nicht die Zeichen '0' bzw. '1'. Sie senden NUL und SOH aus: siehe http://www.asciitable.com , und diese Zeichen werden in einem Terminalemulator als nichts angezeigt. Schließen Sie stattdessen die Werte in Anführungszeichen ein, zB data = '0';, um die Zeichen '0' bzw. '1' zu senden.

  • Überprüfen Sie die Baudrate. Mit UCSR0A = 0x00;UBRR0 sollte eingestellt werden auf: (F_CPU / 8 / baud - 1) / 2;(Quelle: Arduino Serial Library) wo F_CPUist Ihre CPU-Frequenz in Hertz. In Anbetracht dessen 005Fscheint es ein lustiger Wert zu sein. Überprüfen Sie die MCU-Frequenz und berechnen Sie entsprechend.

Einige Vorschläge:

  • Komische Zeichen am seriellen Ausgang deuten zwar auf eine falsche Baudrate hin, erscheinen aber nicht immer .

  • Laden Sie die Arduino IDE herunter und sehen Sie sich den Seriencode an / leihen Sie ihn aus.

Also meine Vermutung ist, dass mit der Hardwareeinstellung etwas nicht stimmt

  • Greifen Sie der Fehlerbehebung nicht vor, sondern entscheiden Sie im Voraus, wo das Problem liegt, sonst könnten Sie das eigentliche Problem übersehen. Diesen Fehler mache ich immer noch! :)
Nochmals vielen Dank, werde es nach Ihren Vorschlägen erneut überprüfen !!
Schön, bitte lass es uns wissen, wenn es nicht funktioniert. Ich habe ein sehr ähnliches Setup, aber mit atmega328p. Um die Baudrate zu überprüfen, könnten Sie den atmega168 auch an einen PC anschließen?
@Geometrical. Vielen Dank für alle Ihre Antworten. Ich habe das Programm überarbeitet, wie Sie sagten (bitte oben nachsehen), und es war ein sehr dummer Fehler, den ich gemacht habe. Aber ich bekomme immer noch keine Ausgabe. Ich habe einen 12-MHz-Quarzoszillator und meine Xbees sind für eine Baudrate von 9600 konfiguriert. Jetzt habe ich über den Link unten wormfood.net/… überprüft, dass ich mit UBRR = 77 (dh 4D in Hex) 9600 Baud mit einem 11,98-MHz-Quarz erhalten kann. Ist das in Ordnung oder reicht die leichte Diskrepanz aus, um meine Verbindung durcheinander zu bringen?
Ich denke, das ist in Ordnung, ich habe die UART-Timing-Toleranzen vergessen, aber weniger als 1% sollten in Ordnung sein. Versuchen Sie, den 168 UART direkt mit dem 2560 UART ( tx to rx, rx to tx, gnd to gnd ) zu verbinden, XBee vollständig zu umgehen und das einfach zu überprüfen. Hast du ein Oszilloskop? Damit könntest du auch die TX-Ausgabe überprüfen.
Werde das machen danke. Versucht, mit Proteus zu simulieren, aber auch dort gescheitert. Werde es im neuen Jahr mit einem echten Oszilloskop versuchen !!
@Geometrical Ich habe versucht, die Ausgabe von MC auf ein Oszilloskop zu übertragen. Wir haben einige rechteckige Wellenformen mit einer Spitze-zu-Spitze-Spannung beobachtet, die fast gleich +Vcc ist, aber die Signale sind nicht kontinuierlich und nicht so, wie sie sein sollten. Meistens ist der Wert nur +Vcc ohne Variation.