Ich habe einen Atmega 168PA der an ein XBee S1 verbunden ist (Rx, Tx). Dieser schickt periodisch Daten an ein anderes XBee Modul, welches per hterm an einem PC Hängt. Dasklappt super! Ich verusche nun den Rückkanal zu implementieren, sprich von hterm etwas zu schicken um darauf zu reagieren. Klingt nicht kompliziert, ist es auch nicht nur tritt das Phänomen auf, das der ankommende String als erstes Zeichen ein FF enthält oder nur aus einem FF besteht. Ersteres ist deutlich häufiger als zweiteres. Ich habe implementiert, dass einfach der rx-string wieder zurück geschickt wird. Jetzt habe ich ewig nach dem Fehler gesucht und keine Ahung warum es auftritt. Ich schicke vom hterm-Modul per Broadcast an alle Module (DL=FFFF). Daran sollte es doch nicht liegen, oder?
ISR(USART_RX_vect) {
static uint8_t uart_rx_cnt; // Zähler für empfangene Zeichen
uint8_t data;
// Daten auslesen, dadurch wird das Interruptflag gelöscht
data = UDR0;
// Ist Puffer frei für neue Daten?
if (uart_rx_flag==0) {
// ja, ist Ende des Strings (RETURN=CR) erreicht?
if (data=='\r') {
uart_rx_buffer[uart_rx_cnt]='\0';
// Flag für 'Empfangspuffer voll' setzen
uart_rx_flag=1;
// Zähler zurücksetzen
uart_rx_cnt=0;
}
else if (uart_rx_cnt<(uart_buffer_size-1)) { //wenn anzahl
der zeichen kleiner sind als gesamtbuffergröße...
// Daten in Puffer speichern
// aber durch if() Pufferüberlauf vermeiden
if (data != 0xFF) {
uart_rx_buffer[uart_rx_cnt]=data;
uart_rx_cnt++; // Zähler erhöhen
}
}
}
}
So konnte ich das "Problem" umgehen, die Lösung ist mir aber immernoch
fern. Hat jemand Ideen?
Oft ein Hardwareproblem bzw. ein fehlender Pullup. Stelle dir vor, dass XBee Modul ist auf der Seriellen schon empfangsbereit und aus irgendwelchen Gründen wird ein kurzer Low-Impuls erkannt bzw. der Eingang ist noch Low. Diese High-Low Flanke gilt als Beginn des Startbits und das Byte wird eingelesen. Inzwischen könnte der serielle Eingang wieder auf High sein, jetzt wird 8x High gelesen (FF) und das abschließende Stopbit (1) ist auch OK.
Harald schrieb: > Oft ein Hardwareproblem bzw. ein fehlender Pullup. Stelle dir vor, dass > XBee Modul ist auf der Seriellen schon empfangsbereit und aus > irgendwelchen Gründen wird ein kurzer Low-Impuls erkannt bzw. der > Eingang ist noch Low. Diese High-Low Flanke gilt als Beginn des > Startbits und das Byte wird eingelesen. Inzwischen könnte der serielle > Eingang wieder auf High sein, jetzt wird 8x High gelesen (FF) und das > abschließende Stopbit (1) ist auch OK. Ohh, dann kann es an meiner Schaltung liegen? Ich habe den µC direkt an zwei AA Batterien und das XBee Modul per Step-Up Wandler an 3,2 Volt. Ohne Pullups... Je weiter die Batteriespannung absinkt, je höher wird die Differenz aber bis 0,7 * 3,2V sollte es doch gehen. Aktuell ist die Batteriespannung noch super...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.