Forum: Mikrocontroller und Digitale Elektronik µC Auswahl Atmel Atmega - UART und Batteriebetrieb


von Tino K. (blumengiesser)


Lesenswert?

Ich suche für ein Batteriebetriebenes Schaltungsprojekt den "richtigen" 
µC. Ich habe bisher den Atmega 164PA verwendet. Dieser hat die Pins XTAL 
und TOSC getrennt ausgeführt und man kann den Systemtakt und den Sleep 
Takt extern voneinander unabhängig erzeugen. Hintergrund war der, das 
ich immer wieder gelesen habe, dass bei Verwendung von UART der interne 
Takt nicht ausreicht. Stimmt das bei neueren µCs immer noch? Oder ist es 
Baudrateabhängig? Ich nutze lahme 9600Baud und von der Temperatur wird 
es sich zwischen 5-40 °C bewegen (Innenraum).

von Bernd K. (prof7bit)


Lesenswert?

Tino Kühn schrieb:
> Ich nutze lahme 9600Baud

Die absolute Höhe der Baudrate spielt hier keine Rolle, selbst wenn es 
nur 300 Baud wären, sie müssen relativ genau eingehalten werden (wenige 
Prozent) oder es gibt Übertragungsfehler.

Wenn Du mal ein paar hundert fabrikneue Exemplare auf Abweichung der 
Taktfrequenz gemessen hast wirst Du erschreckt feststellen daß es nicht 
ratsam wäre sich für rs232 ohne weitere Maßnahmen auf den internen 
Oszillator zu verlassen, Ärger wäre vorprogrammiert.

Abhilfe schafft das Kalibrierbyte OSCCAL, damit kann man den internen 
Oszillator halbwegs (genau genug) hinziehen, musst halt jedes Exemplar 
einzeln kalibrieren.

von Tino K. (blumengiesser)


Lesenswert?

Bernd K. schrieb:
> Tino Kühn schrieb:
>> Ich nutze lahme 9600Baud
>
> Die absolute Höhe der Baudrate spielt hier keine Rolle, selbst wenn es
> nur 300 Baud wären, sie müssen relativ genau eingehalten werden (wenige
> Prozent) oder es gibt Übertragungsfehler.

Ich habe es geahnt...

> Abhilfe schafft das Kalibrierbyte OSCCAL, damit kann man den internen
> Oszillator halbwegs (genau genug) hinziehen, musst halt jedes Exemplar
> einzeln kalibrieren.

Hier wäre ich an einer kurzen Einweisung interessiert... (Link?)

von Thomas E. (thomase)


Lesenswert?

Tino Kühn schrieb:
> es sich zwischen 5-40 °C bewegen (Innenraum).
Das ist ein Problem. Bei jeder Geschwindigkeit.

Mit Hilfe des Uhrenquarzes kann der interne Oszillator aber auf eine 
Baudratenfrequenz kalibriert werden. Hierfür habe ich vor einiger Zeit 
eine Anleitung geschrieben:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR#Kalibrieren_des_internen_Oszillators_mit_Timer2_als_Zeitbasis

Damit sind Baudraten bis 115K2 fehlerfrei möglich.

mfg.

von Peter II (Gast)


Lesenswert?

Bernd K. schrieb:
> Abhilfe schafft das Kalibrierbyte OSCCAL, damit kann man den internen
> Oszillator halbwegs (genau genug) hinziehen, musst halt jedes Exemplar
> einzeln kalibrieren.

Man könnte sich auch an der Gegenstelle Orientieren, in dem man die 
Bitlänge misst und damit die Kalibrierung vornimmt. Geht aber nur wenn 
die Gegenstelle nicht die gleiche "blöde" Idee hat.

von Bernd K. (prof7bit)


Lesenswert?

Ich hab vor einiger Zeit aus der Not heraus mal sowas implementiert, ein 
spezieller Kalibriermodus: Die Gegenstelle (PC mit quarzgenauem rs252 
Adapter) sendet ein "Kalibriersignal" von 0b1000000 alle 50 ms und der 
AVR fährt seine Taktfrequenz langsam hoch während er UDR0 liest. zuerst 
interpretiert er es als 0b1111000, dann 0b1110000, dann 0b11000000, dann 
wenn er zum ersten mal 0b1000000 liest merkt er sich den momentanen Wert 
von OSCCAL, dann langsam weiter erhöhen, wenn er zum ersten mal 
0b00000000 liest bildet er den Mittelwert zwischen dem momentanen und 
dem gemerkten, das wäre der optimale Wert für OSCCAL, danach passt die 
Baudrate +-1%.

Vorsicht Stolperfalle: bei manchen Typen hat OSCCAL eine Unstetigkeit 
zwischen 0x7f und 0x80, also beide Bereiche separat durchfahren.

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Bernd K. schrieb:
> Die Gegenstelle (PC mit quarzgenauem rs252
> Adapter)
Die Genauigkeit ist vollkommen egal. Selbst wenn der 397% Abweichung 
hat. Nach der Kalibrierung hat das Gegenüber sie auch und beide 
verstehen sich zu 100%.

Bernd K. schrieb:
> sendet ein "Kalibriersignal" von 0b1000000
Ist auf Dauer aber eine teure Angelegenheit.

mfg.

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

Thomas Eckmann schrieb:
> Bernd K. schrieb:
>> sendet ein "Kalibriersignal" von 0b1000000
> Das ist auf Dauer aber eine teure Angelegenheit.

Nicht auf Dauer.

Du startest den Kalibriermodus am PC und dann schaltest Du das Gerät mit 
dem AVR an. Er beginnt den Kalibriermodus und wenn er irgendwas empfängt 
was nicht zum Kalibriersignal passt oder wenn er 200ms nichts empfängt 
bricht er die Kalibrierung sofort ab und startet normal.

Nach erfolgreicher Kalibrierung wirds im EEPROM gespeichert. Findet er 
kein Kalibriersignal wird der Wert aus dem EEPROM verwendet. Das mach 
ich einmal bei Inbetriebnahme, danach nie wieder.

von Max D. (max_d)


Lesenswert?

Du kannst den (mit einem Uhrenquarz erzeugten)  "Sleep-Takt zum 
kalibrieren des internen Takts benutzen. Siehe dazu auch App-Note 
AVR055.

von holger (Gast)


Lesenswert?

>Ich nutze lahme 9600Baud und von der Temperatur wird
>es sich zwischen 5-40 °C bewegen (Innenraum).

Ich frag mich immer warum die Leute einen 20Cent teuren
Qurz einsparen wollen und dann Klimmzüge machen die
im Endeffekt erheblich teurer werden.

Ich verstehe es einfach nicht.

von holger (Gast)


Lesenswert?

>Qurz

Upps;) Machen wir einfach Furz draus. Passt irgendwie zum Thema.

von Thomas E. (thomase)


Lesenswert?

Bernd K. schrieb:
> Nicht auf Dauer.

Das war ironisch gemeint. 0x80 ist der ASCII-Code für €.

mfg.

von Max D. (max_d)


Lesenswert?

Ich hab das schon gemacht, aber nicht aus Geiz sondern weil an einen 
28er-DIP AVR nicht Haupt und rtc Quarz passen.

von Bernd K. (prof7bit)


Lesenswert?

holger schrieb:
>>Ich nutze lahme 9600Baud und von der Temperatur wird
>>es sich zwischen 5-40 °C bewegen (Innenraum).
>
> und dann Klimmzüge machen

Die nächste Version wird einen Quarz haben und auch andere Fehler werden 
behoben sein, wie immer bei Version 2.0 ;-)

von Peter II (Gast)


Lesenswert?

Bernd K. schrieb:
> Ich hab vor einiger Zeit aus der Not heraus mal sowas implementiert, ein
> spezieller Kalibriermodus: Die Gegenstelle (PC mit quarzgenauem rs252
> Adapter) sendet ein "Kalibriersignal" von 0b1000000 alle 50 ms und der
> AVR fährt seine Taktfrequenz langsam hoch während er UDR0 liest. zuerst
> interpretiert er es als 0b1111000, dann 0b1110000, dann 0b11000000, dann
> wenn er zum ersten mal 0b1000000 liest merkt er sich den momentanen Wert
> von OSCCAL, dann langsam weiter erhöhen, wenn er zum ersten mal
> 0b00000000 liest bildet er den Mittelwert zwischen dem momentanen und
> dem gemerkten, das wäre der optimale Wert für OSCCAL, danach passt die
> Baudrate +-1%.

ist das nicht etwas umständlich? Ich würde einfach die Bitzeit messen 
und dann den passenden Kalibierungswert ausrechnen.
Habe das zwar bis jetzt noch nicht gemacht, sollte aber funktionieren.

von Frank K. (fchk)


Lesenswert?

Auch andere Leute haben dieses Problem, und dieses erfolgreich gelöst. 
Schau Dir LIN an.

http://ess.cs.tu-dortmund.de/Teaching/PGs/autolab/seminarfolien/Meier-LIN.pdf

LIN ist ein paketorientierter Bus aus der Automobilindustrie wie CAN, 
wobei es Master und Slave gibt. Jedes Paket beginnt mit einem BREAK 
(>=13 Startbits), darauf kommt ein Sync-Byte (abwechselnd 0 und 1) und 
dann der Rest des Paketes. Die Slaves messen das Sync-Byte aus und 
errechnen daraus ihre Bitrate. Da sie das vor jedem Paket tun und die 
Pakete nur eine begrenzte Länge haben, brauchen sie keine stabilen 
Oszillatoren. Die Automobilindustrie ist Meister im Kostendrücken, und 
ein minimaler Hardwareaufwand war Teil des Designziels.

Die normalen UARTs der AVRs unterstützen leider LIN nicht vollständig in 
Hardware, zB fehlt eine dedizierte BREAK-Erkennung. Es gibt aber einige 
Automotive-Typen wie Tiny87/167, die eine LIN-Schnittstelle haben. Bei 
den PICs haben die meisten PIC18F und alle PIC24/dsPIC und PIC32 
LIN-fähige UARTs.

Der Master muss gemäß LIN-Spezifikation einen Quarz-Oszillator haben, um 
den Slaves das Timing vorgeben zu können.

Wie gesagt: dieses Problem ist erfolgreich gelöst und millionenfach in 
KFZ verbaut.

fchk

von Bernd K. (prof7bit)


Lesenswert?

Peter II schrieb:
> ist das nicht etwas umständlich? Ich würde einfach die Bitzeit messen
> und dann den passenden Kalibierungswert ausrechnen.
> Habe das zwar bis jetzt noch nicht gemacht, sollte aber funktionieren.

Hab ich mir auch überlegt, aber der Zusammenhang zwischen OSCCAL und 
Taktfrequenz wird wohl weder linear noch bei allen Exemplaren gleich 
sein (und dann ist da noch diese hässliche Unstetigkeit bei 0x7f). Eine 
pragmatische for-schleife jedoch wie oben beschrieben ist schnell 
hingeschrieben, keineswegs umständlich (im Gegenteil) und funktioniert 
ohne weitere wackelige Grundannahmen zuverlässig.

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Peter II schrieb:
> ist das nicht etwas umständlich? Ich würde einfach die Bitzeit messen
> und dann den passenden Kalibierungswert ausrechnen.
> Habe das zwar bis jetzt noch nicht gemacht, sollte aber funktionieren.

So mache ich das auch. Das mit dem Ausrechnen scheitert allerdings 
daran, dass die Einstellung des OSCCAL nicht "linear" ist. Deswegen ist 
Rantasten einfacher. Aber mit der Zeitmessung klappt das auch sehr gut.

holger schrieb:
> Ich verstehe es einfach nicht.
Hat auch keiner erwartet.

mfg.

: Bearbeitet durch User
von Tino K. (blumengiesser)


Lesenswert?

Mensch, da gibt es ja etliche Möglichkeiten...!

Wie wäre es, wenn ich (also nicht so kompliziert) den Systemquarz nehme 
und dann eine RTC an einen Interrupteingang hänge? Dann habe ich 
richtigen Systemtakt und bekomme den Controller zur richtigen Zeit 
aufgeweckt. Mir geht es ja weder um die ausgeklügelste Lösung noch um 
Geld zu sparen. Funktionieren soll es (und die Batterei möglichst lange 
halten)

von Thomas E. (thomase)


Lesenswert?

Tino Kühn schrieb:
> Wie wäre es, wenn ich (also nicht so kompliziert) den Systemquarz nehme
> und dann eine RTC an einen Interrupteingang hänge?

Bei den RTCs schreckt mich einfach diese Bitgefriggelei ab. Ausserdem 
ist es ein unnötiges Bauteil mehr, da ein Atmega48..328 alles von Haus 
aus mitbringt. Interner Oszillator mit Uhrenquarz an Timer2 ist die 
stromsparendste Lösung und das Kalibrieren mit Timer2 ist auch nicht 
kompliziert. Die Pins, die die externe RTC benötigte, hätte man für 
wichtigeres frei.

mfg.

von biker (Gast)


Lesenswert?

Bernd K. schrieb:
> Die absolute Höhe der Baudrate spielt hier keine Rolle, selbst wenn es
> nur 300 Baud wären, sie müssen relativ genau eingehalten werden (wenige
> Prozent) oder es gibt Übertragungsfehler.

Das ist im Prinzip richtig, bei niedrigen Baudraten ist aber der 
Prescaler ziemlich groß und damit kann auch bei "krummen" Quarzen die 
Baudrate ziemlich exakt eingestellt werden.

holger schrieb:
> Ich frag mich immer warum die Leute einen 20Cent teuren
> Qurz einsparen wollen und dann Klimmzüge machen die
> im Endeffekt erheblich teurer werden.

Den internen Oszillator zu verwenden hat auch Vorteile: weniger 
Verbrauch und schelleres Anschwingen, was gerade bei Batterieanwendungen 
interessant ist.
Der interne Oszillator ist gut für UART-Anwendungen geeignet, ggf. noch 
Nachkallibrieren.

von biker (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Die Pins, die die externe RTC benötigte, hätte man für
> wichtigeres frei.

Externe RTC kommt mit 2 I/O aus, ein externer Quarz braucht auch 2.

von Tino K. (blumengiesser)


Lesenswert?

Max D. schrieb:
> Du kannst den (mit einem Uhrenquarz erzeugten)  "Sleep-Takt zum
> kalibrieren des internen Takts benutzen. Siehe dazu auch App-Note
> AVR055.

Das war was ich gesucht hatte...

von Thomas E. (thomase)


Lesenswert?

biker schrieb:
> Externe RTC kommt mit 2 I/O aus, ein externer Quarz braucht auch 2.

Macht zusammen 4. Externer Uhrenquarz ohne externe RTC braucht 2 Pins, 
du Rechenkünstler.

mfg.

von biker (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Macht zusammen 4. Externer Uhrenquarz ohne externe RTC braucht 2 Pins,
> du Rechenkünstler.

Externer Uhrenquarz braucht zwei Pins, externe RTC braucht zwei Pins, 
wer kann hier nicht rechnen?

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.