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


von Gustav84 (Gast)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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.

von Gustav84 (Gast)


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...

von Carsten (Gast)


Lesenswert?

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

von Sonic (Gast)


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 ??

von Oliver Döring (Gast)


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.

von Sonic (Gast)


Lesenswert?

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

Das reicht vollkommen, mehr brauchst du nicht!!!

von Gustav84 (Gast)


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

von Falk (Gast)


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

von Gustav84 (Gast)


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

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.