µC Auswahl Atmel Atmega - UART und Batteriebetrieb

#3860504
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).
#3860562
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.
#3860567
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?)
#3860570
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.
Gast #3860572
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.
#3860591
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.
#3860619
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.
Gast #3860622
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.
Gast #3860635
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.
#3860640
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
#3860653
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.
#3860661
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.
#3860667
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)
#3860673
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.
Gast #3860713
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren