Hallo, Ich versuche die UART Schnittstelle meines ATMEGA48 in Betrieb zu nehmen. Dazu verwende ich einen MAX232 Pegelwandler, bei dessen Aufbau ich mich an diesem Tutorial orientiert habe: http://www.ermicro.com/blog/?p=325 Der MAX232-Teil scheint auch perfekt zu funktionieren, denn wenn ich den Pin 11 und 12 (TXD und RXD zum Microcontroller) verbinde bekomme ich im Terminalprogramm meine Tastatureingaben wieder angezeigt. Wenn ich allerdings per AVR versuche etwas zu senden kommt nur Mist an. Die Initalisierung und die Routine zum senden sind direkt aus dem Datenblatt des ATMELs uebernommen (siehe angehaengter code meines Testprogramms). Ich habe die Vermutung das die im Datenblatt angegebene FOSC-Frequenz nicht stimmt. Nur leider habe ich keine Ahnung wie ich die richtige Frequenz herausfinde. Ich verwende keinen Externen Quarz, also muesste es doch egentlich die Frequenz sein die im Datenblatt steht, also genau das was ich kopiert habe? Oder gibt es vielleicht ein einfaches Testprogram welches mehrere Clock-Speeds durchprobiert, solange bis auf der PC Seite das richrige ankommt? Leider habe ich kein Oszilloskop oder andere Hardware zum testen, da ich gerade erst in das Thema Microcontroller einsteige. Gruesse, Timo
ich hab sowas letzte woche noch gemacht, auch auf einem mega48 also in deinem code: #define FOSC 1843200 // Clock Speed gibt an, auf welcher frequenz der mega läuft. wenn du keinen quarz hast, und die fuses noch auf werkseinstellung hast, sollte es 1000000 sein.. ich würde dir empfehlen mal die library die peter fleury geschrieben hat zu probieren, hat bei mir auf anhieb mit internem takt (8mhz) geklappt: http://homepage.hispeed.ch/peterfleury/avr-software.html ist glaub ich auch direkt ein beispielcode dabei.. musst dann nur noch acht geben, das du den mega48 auch richtig gefused hast, und die einstellungen im makefile entsprechend sind. achte auch drauf, das du CKDIV8 ausschaltest..
Vielleicht ein FAQ Thema. > #define FOSC 1843200 // Clock Speed Das allein reicht nicht. Dafür muss auch 1. eine externe Taktquelle angeschlossen sein 2. die AVR Fuses passend zu dieser externen Taktquelle gefust sein ABER in meinem Atmega48 Datenblatt steht: [zitat] 8.2.1 Default Clock Source The device is shipped with internal RC oscillator at 8.0MHz and with the use CKDIV8 programmed, resulting in 1.0MHz system clock. The startup time is set to maximum and time-out period enabled. (CKSEL = "0010", SUT = "10", CKDIV8 = "0"). The default setting ensures that all users can make their desired clock source setting using any available programming interface. [/zitat] d.h. die 1843200 sind seltsam! Für einen werkfrischen Atmega48 gehört dort eine 1000000 hin. Bei 9600 Baud dann mit gesetztem U2Xn = 1 Bit mit einkalkulierten 0.2% Baudratenfehler (Abschnitt Examples of Baud Rate Setting). ABER Nr.2: UART mit interner Taktquelle kann funktionieren, muss aber nicht. Ein Quarz ist genauer und kann max. 1-2% Baudratenabweichung sicherstelen, der RC-Oszillator nicht.
Jan W. schrieb: > ich hab sowas letzte woche noch gemacht, auch auf einem mega48 > ich würde dir empfehlen mal die library die peter fleury geschrieben hat > zu probieren, hat bei mir auf anhieb mit internem takt (8mhz) geklappt: Danke, das wollte ich urspruenglich nicht, da ich eben selber alles "verstehen" wollte. Habe es jetzt doch damit gemacht und es geht! > musst dann nur noch acht geben, das du den mega48 auch richtig gefused > hast, und die einstellungen im makefile entsprechend sind. > > achte auch drauf, das du CKDIV8 ausschaltest.. Ja, die Fuses einzustellen scheint mir zwar ein kleines Hexenwerk, da low-aktiv und avrdude zeigt das in hex an... aber vielleicht geht das mit den windows-tools besser (habe leider gerade kein passendes vmware image oder so). Aber ich habe versucht die CKDIV8 fuse auf 1 zu stellen (bedeutet ja aus) und in Peter Fleury's makefile F_CPU auf 8000000 gestellt und es funktioniert, also werd ich das mit den fuses wohl richtig gemacht haben. Ausserdem benutze ich das INIT_DOUBLE_SPEED makro, wie in der anderen Antwort empfohlen. Vielen Dank fuer eure Hilfe!!! Das naechste Abenteuer wird wohl TWI/I2C werden, da wird das debuggen dann nochmal eine Spur haariger, aber jetzt weiss ich wenigstens welchen F_CPU wert ich nehmen muss :-) Gruesse, Timo
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.