Hallo zusammen Bin gerade dabei des GCC Tut etwas durchzuarbeiten. Also habe ich mir heute einen Max232 geholt und habe mich mal an die USART Programmierung gewagt. wenn ich nun versuche ein 'x' zu schicken, dann kommt ein ganz anderes Zeichen (copyrightzeichen)... Wenn ich versuche ein 'A' zu schicken kommt nur ein ü- raus. Da ich an den Fusebits noch nix rumgestellt habe, läuft der Atmega16 mit 1MHz. Kann es sein, dass der interne Takt zu ungenau ist? Oder muss etwas bestimmtes am Hyperterminal eingestellt werden? Meine Einstellungen vom HT sind: BIT / Sekunde: 9600 Datenbits: 8 Parität: Keine Stopbit: Keines Flussteuerung: Kein und hier mein Code: #include <avr/io.h> #include <stdint.h> #ifndef F_CPU #define F_CPU 1000000 /* Oszillator-Frequenz in Hz */ #endif #define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1) #define UART_BAUD_RATE 9600 int main (void) { //-------------Init-------------------------------- UCSRB |= (1<<TXEN); // UART TX einschalten UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 ); UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ); //-------------Programm----------------------------- while(!(UCSRA & (1<<UDRE))) {} UDR = 'A'; return 0; } Vielen Dank schonmal Gruß Ich
Deine HT Einstellungen schauen gut aus. interner Oszi ist bei zeitkritischen Dingen immer ein Problem. Besser ist es auf jeden Fall, wenn du einen Quarz benutzt. Ändere dein main() mal dahingehend um, dass der µC ständig ein Zeichen schickt. while( 1 ) { while(!(UCSRA & (1<<UDRE))) {} UDR = 'A'; } Ich hatte das schon manchmal, dass auf PC Seite die Synchronisierung mit dem ersten Zeichen nicht richtig klappte.
Hallo, ich hatte schon recht genaue und ziemlich ungenaue AVR mit internem Takt im Lieferzustand... Ein Tipp kam oben schon, dazu kannst Du ja mal als F_CPU 50kHz mehr oder weniger probieren. Gruß aus Berlin Michael
Hi ihr, danke schonmal für euere Antworten, des in der while(1) schleife hatte ich auch schonmal drinnen, leider zickt dann des HT und ich habe eine cpu auslastung von 100% und es dauert ewig des HT zu beenden....:-( ich werde jetzt mal versuchen mit der F_CPU ein bissel zu spielen. Anderer seits Hätte ich auf dem board hier auch 2 Quarzoszillatoren. Bin da aber etwas vorsichtig was die fuses angeht, stimmt es dass ich einfach die CKSEL Haken im ponyprog rausnehme und dann an XTAL1 diesen Takt dran hänge? Oder muss ich dabei noch mehr beachten? danke schonmal:-) Gruß Ich
Hallo Bratensoße! Hast Du schon die Lösung Deines Problems gefunden? Ich habe gestern (nacht) auch die UART in Betrieb genommen, bekomme jedoch noch nicht das zurück, was ich erwarte, aber zumindest wird was gesendet. Ich arbeite mit einem ATMega 169, welcher mit Windows XP / AVR Studio programmiert wird. Wäre super, wenn Du "die Lösung Deines Problems" posten könntest (oder stell es bei mir rein... DANKE!!!) Gruß Christian P.S.: Auch wenn Du andere Infos hast, wäre super, wenn Du mir die Listings schicken könntest!
@ Bratensosse >Da ich an den Fusebits noch nix rumgestellt habe, läuft der Atmega16 mit >1MHz. Kann es sein, dass der interne Takt zu ungenau ist? Oder muss >etwas bestimmtes am Hyperterminal eingestellt werden? 1001++ http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART#Senden MFG Falk
Hallo, Lies doch mit Deinem Programmiergerät den OSCCAL Wert für die benutzte Taktfrequenz aus Deinen Prozessor aus. In der Initialisierung dann einfach zuweisen:
1 | OSCCAL = 0x4C; // Für 0x4c den Wert für Deinen Prozessor einsetzen |
Der OSCAL Wert ist für jede intern erzeugte Taktfrequenz und bei jedem Prozessor verschieden. Gruß Frank
@ Frank Jonischkies >Der OSCAL Wert ist für jede intern erzeugte Taktfrequenz und bei jedem >Prozessor verschieden. Und gilt nur für eine eng tolerierte Spannung (5v?) und Temperatur (25C?). Ich wiederhole mich. http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART#Senden MFG Falk
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.