UART Senden ATmega169(AVR Butterfly) letzten 2Byte immer kaputt

OP #2095010
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?
Gast #2095195
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
OP #2095241
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.
OP #2098604
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.
Gast #2098625
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren