www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem bei Senden an PC über USART (Tiny2313)


Autor: Gustav84 (Gast)
Datum:
Angehängte Dateien:
  • preview image for ht.jpg
    ht.jpg
    148 KB, 156 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen!
Ich habe ein Problem beim Senden vom ATtiny2313 an den PC über USART...
Hier erstmal der Code:



#include <avr/io.h>
#include <inttypes.h>

#ifndef F_CPU
  #define F_CPU 4000000 // 4MHz
#endif

  // UART
#define UART_BAUD_RATE 2400
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) 
((F_CPU)/((UART_BAUD_RATE)*16L)-1)

int main (void) {
  UBRRH =(uint8_t) (UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
    UBRRL =(uint8_t) UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);

    UCSRB = (1<<TXEN);
    UCSRC = (3<<UCSZ0);

     while(1) {
    while (!(UCSRA & (1<<UDRE)));
      UDR = 'a';
    while (!(UCSRA & (1<<UDRE)));
      UDR = 'b';
    while (!(UCSRA & (1<<UDRE)));
      UDR = 'c';
    while (!(UCSRA & (1<<UDRE)));
      UDR = 'd';
    while (!(UCSRA & (1<<UDRE)));
      UDR = 'e';
    while (!(UCSRA & (1<<UDRE)));
      UDR = 'f';
    while (!(UCSRA & (1<<UDRE)));
      UDR = 'g';
    while (!(UCSRA & (1<<UDRE)));
      UDR = 'h';
    while (!(UCSRA & (1<<UDRE)));
      UDR = 'i';
    while (!(UCSRA & (1<<UDRE)));
      UDR = 'j';
    while (!(UCSRA & (1<<UDRE)));
      UDR = 'k';
     }
     return 0;
}




Es sollen also einfach nur ein paar Zeichen in einer Endlosschleife 
gesendet werden, eigentlich keine große Sache. Von dem, was am PC 
ankommt habe ich mal einen Screenshot gemacht (siehe Anhang).

(Erfolglos) getestet habe ich schon:
- Baudrate auf 2400, 9600 oder 19200 geändert
- Zwischen internem Taktgeber und externem Quarz (jeweils 4 MHz) 
gewechselt
- Mit den Einsetellungen am Hyperterminal rumgespielt

Die Ausgabe ist aber immer die gleiche :(
Hat jemand eine Idee wieso der so einen "Müll" sendet?

Gruß und guten Rutsch,
Gustav

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du das tust:

> - Zwischen internem Taktgeber und externem Quarz (jeweils 4 MHz)
> gewechselt

und dabei 'Die Ausgabe ist aber immer die gleiche', dann
wechselst du nicht wirklich zwischen internem Takt
und externem Quarz.

Die Ausgabe muss sich radikal ändern wenn du die Taktfrequenz
änderst. Da müssen andere Zeichen sein, bei gleichem Pgm natürlich.

Ansonsten:
Fehler dieser Art sind eigentlich zu 99% immer bei der fehlerhaften
Einstellung der Taktrate am µC zu suchen.

Autor: Gustav84 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn ich die Fuse-Bits auf den externen Quarz umstelle und keinen 
Quarz dran habe, passiert garnichts (erst wenn ich einen Quarz 
anschließe). Stelle ich auf internen Takt, läuft es auch ohne Quarz, 
somit bin ich mir ziemlich sicher, dass ich es wirklich umgestellt 
habe...


'Fehler dieser Art sind eigentlich zu 99% immer bei der fehlerhaften
Einstellung der Taktrate am µC zu suchen.'
Das habe ich mir auch schon gedacht, aber was ist das restliche 1%? Was 
kann denn noch der Grund sein? Vom Code her müsste es doch passen oder?
Und der Takt sollte wie gesagt auch stimmen...

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal einen Baudraten-Quarz probiert (z.B. 3,6864 MHz)?

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>#define F_CPU 4000000 // 4MHz
Besser: #define F_CPU 4000000UL // 4MHz zur Berechnung unsigned long

>#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)
Was ist F_OSC ??

Autor: Oliver Döring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Ausgabe lässt eindeutig auf unterschiedliche Parameter (Startbit, 
Datenbits, Parität, Stopbits, Baudrate) zwischen µC und PC schließen. Da 
ich selbst schon viele Stunden solche Fehler "getroubleshootet" habe, 
kann ich Dir nur raten:

Baudratenquarz benutzen.
Datenblatt, Kapitel U(S)ART nochmal genau lesen, Register genau 
kontrollieren.
Einstellungen am PC kontrollieren.

Notfalls ein Zeichen in einer Endlosschleife senden, das zu einem 
alternierenden 0/1-Bitmuster führt, und mit Oszilloskop auf das Startbit 
triggern. Dann kannst Du das Datenformat genau kontrollieren und auch 
schauen, ob die Baudrate passt.

In 99,9% der Fälle wirst Du so einen GANZ DUMMEN, KLEINEN Fehler 
aufdecken.

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UCSRB = _BV(TXEN) | _BV(RXEN);  // TX und RX enabled
UBRRL = 103;                    // 2400 baud bei 4MHz

Das reicht vollkommen, mehr brauchst du nicht!!!

Autor: Gustav84 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also erstmal ein frohes neues Jahr und vielen Dank für die Antworten!
Die Register, und die Eistellungen am PC habe ich nochmal überprüft 
(ohne Erfolg).
Leider habe ich aber weder ein Oszilloskop, noch ein Baudraten-Quarz 
hier. Somit kann ich damit nichts testen.

Ich habe das Problem jetzt zwar nicht unbedingt sehr elegant, aber 
wirkungsvoll dadurch gelöst, dass ich jetzt mit einem Software-UART 
arbeite. Es läuft jetzt auf 19200 Baud und liefert mir genau die Daten, 
die ich haben möchte. Und das sowohl mit einem 4-MHz-Quarz, als auch 
über den internen 4-MHz-Takt (auch bei Temperaturänderungen) sehr 
stabil.
Für die paar Berechnungen, die der Tiny noch machen soll, bleibt dabei 
auch noch genug Rechenleistung übrig...

Wenn meine nächste "Kleinteile-Bestellung" raus geht, werde ich dann 
auch mal einen Baudraten-Quarz mit dazu bestellen und mal testen ob es 
dann auch über den Hardware-UART läuft, aber bis dahin belasse ich es 
bei der Software-Lösung.

Gustav

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Gustav84

Der Baudratenquarz wird dein Problem nicht lösen. Den UART kriegt man 
eigentlich mit fast jedem Quarz zum Laufen.
Ausserdem, deinen interen  MHz Takt im AVR kannst du vergessen in Bezug 
aufausreichende Frequenzgenauigkeit. Das funktioniert bestenfalls für 
einen engen Temperaturbereich von ein paar Grad Celsius. Nimm nen Quarz.
Besorg dir (leihweise) ein Oszi und du hast dei Problem innerhalb ner 
Stunde debugged.


MFG
Falk

Autor: Gustav84 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Den UART kriegt man eigentlich mit fast jedem Quarz zum Laufen."

Genau das habe ich mir ja auch gedacht. Deshalb versteh ich auch nicht, 
wieso das nicht läuft. Aber wie schon gesagt, ich nehm jetzt einen 
Software-UART und für meine Bedürfnisse sollte das auch ausreichend 
sein.
Leider kenne ich auch niemanden, von dem ich mir ein Oszilloskop leihen 
könnte, somit belasse ich es (zumindest erstmal) bei meiner Lösung und 
probiere da jetzt nicht mehr länger mit rum...

Danke und mfG
Gustav

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.