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...
Schon mal einen Baudraten-Quarz probiert (z.B. 3,6864 MHz)?
>#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 ??
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.
UCSRB = _BV(TXEN) | _BV(RXEN); // TX und RX enabled UBRRL = 103; // 2400 baud bei 4MHz Das reicht vollkommen, mehr brauchst du nicht!!!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.