mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR-UART-Ausgabe kommt oft aus dem Takt


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

in meinem AVR-Programm für einen ATmega16 möchte ich alle 20ms Werte 
über die Serielle Schnittstelle ausgeben. Das klappt vom Prinzip her 
auch. Nur manchmal hängt sich der AVR auf. Ich vermute mal, dass die 
while-Schleifen der UART-Ausgabe-Funktionen(siehe unten) schuldig sind 
(die restlichen Funktionen waren bis auf die Timer-ISR auskommentiert).

Gibt es eine geschickte Möglichkeit dieses Aufhängen zu verhindern?


Sebastian
// bei neueren AVRs andere Bezeichnung fuer die Statusregister, hier ATmega16:
int uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))  // warten bis Senden moeglich 
    {
    }                             
 
    UDR = c;                      // sende Zeichen 
    return 0;
}
 
 
// puts ist unabhaengig vom Controllertyp 
void uart_puts (char *s)
{
    while (*s)
    {  //  so lange *s != '\0' also ungleich dem "String-Endezeichen" 
        uart_putc(*s);
        s++;
    }
}


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi  Sebastian,

arbeitest Du mit einem Quarz?
Ich vermute eher das den PC aus dem Tackt kommt!

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
edit:

Ich vermute eher das der PC aus dem Takt kommt!

Autor: Sven '\0' (--j)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian wrote:
>     while (!(UCSRA & (1<<UDRE)))  // warten bis Senden moeglich
>     {
>     }
>
>     UDR = c;                      // sende Zeichen
>     return 0;

Fehlt da nicht ein NOP oder wenigstens ein Semikolon? Für mich sieht das 
so aus, als ob du Daten in das UDR schreibst, solange das Senden eben 
nicht möglich ist.

PS: Je länger ich mit {} angucke, desto unsicherer bin ich mir. 
Verwertet der Compiler dies als ;?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der AVR arbeitet mit einem externen Quarz, nich mit dem internen 
Quarzosz..

Ich hab es auch ohne einen PC nur mit dem Scope angeschaut, da sieht man 
es deutlich, dass er da ein Kaffeepäuschen von ca. 300ms ab und an 
macht.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sven '\0':

Da hast du natürlich recht gehabt. nun hab ich des mal berichtigt:

while (!(UCSRA & (1<<UDRE)))  // warten bis Senden moeglich
{
  asm volatile("nop");
}

aber, er macht immer noch seine kleinen 300ms-Päuschen :-(

Autor: Bensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der AVR arbeitet mit einem externen Quarz, nich mit dem internen
Quarzosz..

Was ist das denn? Sowas wie ein "schwarzer Schimmel"?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Bensch:
Es gibt doch den iternen RC-Oszillator und nen externen Takteingang wo 
in der Regel ein Quarz angelötet wird.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>PS: Je länger ich mit {} angucke, desto unsicherer bin ich mir.
>Verwertet der Compiler dies als ;?

Das eine ist leerer Block, das andere eine leere Anweisung. Der Effekt 
ist allerdings der gleiche.

Oliver

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kaum nimmt man die Optimierungsstufe des guten AVR-Studios bzw. des 
GNU-Compilers zurück und setzt die Timer Variablen auf volatile, schon 
gehts auch deutlich stabiler.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sebastian (Gast)

>Kaum nimmt man die Optimierungsstufe des guten AVR-Studios bzw. des
>GNU-Compilers zurück und setzt die Timer Variablen auf volatile, schon
>gehts auch deutlich stabiler.

Dann liegt der Fehler wie vermutet bei dir. Poste mal vollständigen 
Code.

MFG
Falk

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.