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