www.mikrocontroller.net

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


Autor: Chris H. (toffer)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris H. (toffer)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chris H. (toffer)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris H. (toffer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es handelt sich wohl um Revision A.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.