Forum: Mikrocontroller und Digitale Elektronik UART Senden ATmega169(AVR Butterfly) letzten 2Byte immer kaputt


von Chris H. (toffer)


Lesenswert?

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?

von Stefan E. (sternst)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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

von Chris H. (toffer)


Lesenswert?

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.

von Chris H. (toffer)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Chris H. (toffer)


Lesenswert?

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
Noch kein Account? Hier anmelden.