Hast du bei den Fuses das CKDIV8 Bit umgestellt?
Hallo!
Ich habe folgendes Problem:
Ich möchte mit meinem tiny2313 die UART-Schnittstelle (nur TXD) nutzen.
Der µc läuft dabei mit 8 MHz (CKSEL=1110 SUT=01), die Fuses sind korrekt
gesetzt.
Die Baudrate soll 9600 betragen (die kann ich ja frei wählen, richtig?).
Aber egal, was ich versuche, es kommt nur Müll am Terminal an.
Diese defines benutze ich:
Mit der folgenden Formel soll die Baudrate gesetzt werden:Code:#ifndef F_CPU #define F_CPU 8000000 #endif #ifndef UART_BAUD_RATE #define UART_BAUD_RATE 9600 #endif
Die ist doch richtig, oder?Code:UBRRL = (F_CPU/(16 * baud)) - 1;
Mit einer direkten Zuweisung, dessen Wert ich dem Datenblatt entnommen
habe, geht es auch nicht:
Was ist an der ganzen Geschichte falsch?? Ich habe alle möglichen WerteCode:UBRRL=51;
durchprobiert, aber immer kommt nur Buchstabensalat an, und dabei hab'
ich gar keinen Hunger...
Im Ernst, es wäre klasse, wenn jemand einen Tipp hätte. Ich bin am
verzweifeln...
MfG Matze
Hast du bei den Fuses das CKDIV8 Bit umgestellt?
CKDIV8 ist nicht gesetzt. Ist doch auch in Ordnung, oder? Sonst müsste ich ja F_CPU für die Berechnung durch 8 teilen, richtig?
Ergänzung:
----------
(Das hätte ich wohl direkt erwähnen sollen, auch wenn ich der Ansicht
bin, dass das keinen Unterschied machen sollte.)
Der µC befindet sich auf einer Platine in einem Scanner, nicht auf dem
Testboard (STK500). Der Pin D0 ist nicht verbunden und somit frei für
die USART-Nutzung. Ich habe mir von einem Arbeitskollegen ein Kabel an
den Pin D0 löten lassen (untere Seite vom Sockel natürlich). Dieses
Kabel steckt auf dem STK500 auf dem TXD-Pin.
An dieser Vorgehensweise ist hoffentlich nichts auszusetzen, oder? Dass
überhaupt Daten ankommen, ist für mich das Indiz dafür, dass die
Kommunikation grundsätzlich klappt. Oder gibt es da noch etwas zu
beachten?
Übrigens, auf der Platine steckt ein 20 Mhz Quarz (Aufschrift AQ20.000).
Dürfte doch aber irrelevant sein, da der tatsächliche Takt zählt, und der wird über die Fuses gesetzt, richtig?
Ich habe bei der ganzen AVR-Geschichte noch nicht den Durchblick (bin neu in der Firma und habe vorher nur VB programmiert, von Elektrotechnik habe ich im Grunde keine Ahnung...). Deswegen bitte nicht böse sein, wenn ich etwas unbedarfte Fragen stelle.
Gruß Matze
Der Takt wird nicht über die Fuses gesetzt, der Oszillator wird mit den Fuses nur an den Quarz angepasst. Du musst schon die 20MHz nehmen für die Berechnung.
Hubert
Ok, kannst du mir denn sagen, was dann noch falsch sein soll? Ich denke, die Berechnung der Baudrate ist richtig, und auch sonst sollte alles stimmen, oder?
Code:#ifndef F_CPU #define F_CPU 20000000UL #endif #ifndef UART_BAUD_RATE #define UART_BAUD_RATE 9600UL #endif /***************/ int main(void) { /***************/ USART_init(UART_BAUD_RATE); for(;;) { USART_transmit('A'); _delay_ms(10); _delay_ms(10); USART_transmit('B'); _delay_ms(10); _delay_ms(10); } /***************/ static void USART_init(unsigned int baud) { //nochmal genau ansehen und schöner formulieren! /***************/ UCSRA=0x00; UBRRL = (F_CPU/(16 * baud)) - 1; UBRRH=0x00; UCSRB = (1 << RXEN) | (1 << TXEN); } /***************/ void USART_transmit(unsigned char cData) { //sendet ein Zeichen ans Terminal /***************/ while( !(UCSRA & (1<<UDRE)) ) { ;//warten, bis der transmit buffer leer ist, so dass wieder übertragen werden kann } UDR = cData; }
Bitte nicht auf fehlende Prototypen etc. achten, der Code war natürlich wesentlich größer und wurde von mir (mehr oder weniger) fachgerecht beschnitten! Es fehlt aber nichts, was für die Problematik relevant sein könnte.
Ich habe die Lösung (dank Johannes auf mikrocontroller.net) gefunden!
Auch wenn ich es nicht verstehe. Laut der Aussage von Johannes wird der selbst definierte Wert F_CPU von der Einstellung im AVR-Studio überschrieben, wenn vorhanden (Project->Configuration Options). So habe ich es zumindest verstanden.
Das scheint wohl nicht ganz richtig zu sein, denn mit einem Eintrag in
den Options läuft es plötzlich! Ich kannte diese Einstellung nicht,
deswegen habe ich da auch nicht nach der Lösung gesucht. Und bislang
habe ich immer mit internem Takt gearbeitet, da trat das Problem nicht
auf.
So kann's gehen, da sucht man Stunden vergebens nach der Lösung, und
schließlich geht's nur um eine Kleinigkeit (mit fatalen Folgen).
Jedenfalls nochmal Dankeschön an Johannes und alle anderen Meister der
Geduld hier und auf mikrocontroller.net!
Gruß Matze
Lesezeichen