Forum: Mikrocontroller und Digitale Elektronik Atmgega48 + RS232 Clock bestimmen?


von Timo S. (tim0s)


Angehängte Dateien:

Lesenswert?

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

von Jan W. (derwissel)


Lesenswert?

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

von Helfer (Gast)


Lesenswert?

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.

von Timo S. (tim0s)


Lesenswert?

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
Noch kein Account? Hier anmelden.