Hey, ich habe ein Problem beim UART Senden mit meinem AVR Butterfly. Egal was ich sende(lang kurz), es sind immer die letzten beiden Bytes der letzten Übertragung kaputt(nicht lesbar irgend welche Hexwerte), wenn ich nach der letzten Übertragung nicht ein Delay von 1ms einbaue(kürzere Delays habe ich nicht probiert). Kann mir das jemand erklären? Der mehr oder weniger gleiche UART Code hat bei meinen anderen AVR`S immer funktioniert (beide aber mit externer Taktquelle). Mein code: #define BAUDRATE 9600UL void init_uart() { // Set baud rate uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU / (8 * BAUDRATE) - 1); UBRRH = (uint8_t) (ubrr >> 8); UBRRL = (uint8_t) (ubrr); // Enable 2x speed UCSRA = (1<<U2X); // enabled receive and transmit UCSRB = (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<UDRIE); // Async. mode, 8N1 UCSRC = (0<<UMSEL)|(0<<UPM0)|(0<<USBS)|(0<<UCPOL) | (1<<UCSZ0)| (1<<UCSZ1); } // Einen String senden void uart_put_str(const char str[]) { uint8_t i = 0; while (1) { if ('\0' == str[i]) { break; } uart_putc(str[i]); i++; } //das hier habe ich aus Verzweiflung eingebaut, hat aber auch nix geändert. while (!(UCSRA & (1<<TXC))); //uart_putc('\0'); } void uart_putc(const char c) { while (!(UCSRA & (1<<UDRE))); UDR = c; } Kann mir jemand einen Tipp geben? Bzw weiß die Lösung?
Und in welchem Kontext wird uart_put_str aufgerufen? Schickst du den Controller danach vielleicht Schlafen? Chris H. schrieb: > //das hier habe ich aus Verzweiflung eingebaut, hat aber auch nix > geändert. > while (!(UCSRA & (1<<TXC))); Das nützt dir gar nichts, wenn du das Flag vorher nicht gelöscht hast.
Servus, Chris! Fummelst Du nach der Übertragung vielleicht an TXEN herum und hast einen Mega169 Rev. B? Laut Datenblatt hat der einen Fehler, daß die Übertragung sofort statt nach Beendigung der Transmission stoppt. Prüfe das doch 'mal. Gruß - Wolfgang
Hey danke für eure Hinweise. Ich werde beides mal untersuchen. Bezüglich des Einschlafens muss ich mal genau gucken, denn ich verwende eine modifizierte Version der GCC-Butterfly Firmware und diese lässt den Controller irgend wie schlafen, ich muss aber mal gucken wann genau.
Hey, also ich habe den Fehler gefunden, ich hatte meinen Testausschrieb direkt nach der init Methode gemacht, aber bevor das initiale sei() kam. Habe es nun danach gesetzt und die Übertragung funktioniert korrekt. Muss aber gestehen, dass ich nicht wirklich verstehe, warum das falsch war? Ich benutze ja konkret bei der Übertragung keine Interrupts. Bezüglich der Hardwarerevision, wie finde ich diese heraus? Ich habe mit na Lupe auf den Chip geguckt, konnte der Aufschrift aber nichts entsprechendes entnehmen.
Hi >Bezüglich der Hardwarerevision, wie finde ich diese heraus? Ich habe mit >na Lupe auf den Chip geguckt, konnte der Aufschrift aber nichts >entsprechendes entnehmen. Da solltest du auf der Unterseite fündig werden. MfG Spess
es handelt sich wohl um Revision A.
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.