Forum: Mikrocontroller und Digitale Elektronik AVR F_CPU kalibrieren


von grundschüler (Gast)


Lesenswert?

ich verwende m328 mit 8MHz intern.

F_CPU ist mit 8000000 angegeben. ich Möchte jetzt F_CPU kalibrieren, so 
dass _delay_ms(1000) möglicht genau eine Secunde ergibt. Dass da immer 
Ungenauigkeiten bleiben, ist mir klar

Das ganze soll dann mittels einer Fernbedienung als Normal ausgemessen 
werden, so dass mir mittels Fernbedienung für verschiedene MCUs der Wert 
für F_CPU auf dem display angezeigt wird.

Hat jemand für die Kalibrierung ein fertiges Programm???

von Peter II (Gast)


Lesenswert?

Bist du sicher, das es nicht an einer ISR liegt die das delay verzögert. 
Der interne Takt ist schon recht genau.

Wie groß ist deine Abweichung?

von grundschüler (Gast)


Lesenswert?

Peter II schrieb:
> Wie groß ist deine Abweichung?

genau das ist die Fragestellung.


Ich habe für die fb diese routine:
1
  //signal messen
2
  while(endwhile){
3
      i=0;
4
      while(ir_pin && i<60001)i++;
5
      tmp[n]=i;//Speichert Anzahl der Ticks bis Flankenwechsel
6
      if(i==0)endwhile=0;
7
      i=0;
8
      while(!ir_pin && i<60001)i++;
9
      tmp[n+1]=i;
10
      if(i==0)endwhile=0;
11
      if(n<48)n=n+2;
12
  }

Ich habe festgestellt dass die Zahl der Ticks in tmp[1] bei 
verschiedenen m328 - alle mit 8MHz  intern - und gleicher nec-fb 
erheblich abweicht.

Ergebnis der Kalibrierung kann aber auch sein, das 8000000 immer der 
richtige Wert ist. Ist aber eher unwahrscheinlich.

von Peter II (Gast)


Lesenswert?

grundschüler schrieb:
> erheblich abweicht.

wie viel ist erheblich?

von Peter II (Gast)


Lesenswert?

Nachtrag:

Wenn überhaupt, dann muss du die Frequenz vom AVR kalibrieren, den wert 
von F_CPU anzupassen bringt bei diese Code überhaupt nichts.

von Harry L. (mysth)


Lesenswert?

F_CPU ist via Makro definiert und kann zur Laufzeit gar nicht geändert 
werden.

von Pandur S. (jetztnicht)


Lesenswert?

Kalibrieren bedeutet einen externen Clock dagegen laufen zu lassen, und 
das Osccal Regsiter zu aendern bis der Wert genau genug ist. Dabei 
sollte aber beachtet werden, dass der internen Oszillator eine bleibende 
Empfindlichkeit auf Temperatur und speisung aufweist. siehe Datenblatt. 
Fuer die Kalibration siehe : 
http://www.ibrtses.com/embedded/avrosccal.html

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

grundschüler schrieb:
> Ich habe für die fb diese routine:

Benutze für eine Zeitmessung einen Timer, dafür ist dieser in Deinem µC 
eingebaut. Der Timer ist unabhängig von der Anzahl der Takte, welche 
Deine Zeile
1
while(ir_pin && i<60001)i++;

je nach Compilerversion und Optimierung braucht.

Wenn sonstige ISRs Dir dabei dazwischenknallen, wird Dein Zählergebnis 
"erheblich" verfälscht.

Eine timergestützte Stoppuhr ist auf dem AVR sehr simpel.

: Bearbeitet durch Moderator
von batman (Gast)


Lesenswert?

Im Prinzip einen Timer intern (RC) und einen extern (Quarz) takten und 
nach einem Durchlauf (IRQ) die Abweichung bestimmen und kompensieren.

von HildeK (Gast)


Lesenswert?

Ich habe das Gefühl, ihr seid alle irgendwie daneben. Oder habe ich das 
total missverstanden?
Der TO will den internen Oszillator nehmen und damit eine möglichst 
genaue Sekunde erhalten (mit von ihm akzeptierten Ungenauigkeiten). 
Keine externen Quarz - denn wozu soll er dann den internen Oszillator 
abgleichen wollen?

Für ein vorhandenes Prozessordevice kann man folgendes machen, um das 
delay-Makro für 1000 Millisekunden genauer zu bekommen:
- F_CPU manuell verändern (darauf baut _delay_ms() auf), bis die Sekunde 
weitgehend stimmt.
- oder den Parameter für _delay_ms so lange anpassen (998, 999, 1001 
...), bis die Sekunde weitgehend stimmt
- oder den Wert für OSCCAL anpassen, bis die Sekunde weitgehend stimmt.

Alle Maßnahmen erfordern jeweils einen Compilerlauf und eine Messung mit 
einem Frequenzzähler (das wäre dann die Kalibrierung). Sie sind nicht 
zur Laufzeit möglich und auch nicht sinnvoll. Er hat ja keine externe 
Referenz (Quarz, Quarzoszillator), sonst könnte er gleich diese als 
Taktquelle nehmen und eine ausreichend genaue Sekunde erhalten.

Bei anderen Temperaturen werden sich mehr oder weniger große 
Abweichungen ergeben.
Bei jedem einzelnen Prozessor ist die Prozedur erneut durchzuführen.

von cd (Gast)


Lesenswert?

grundschüler schrieb:
> F_CPU ist mit 8000000 angegeben. ich Möchte jetzt F_CPU kalibrieren, so
> dass _delay_ms(1000) möglicht genau eine Secunde ergibt. Dass da immer
> Ungenauigkeiten bleiben, ist mir klar

http://www.atmel.com/webdoc/avrlibcreferencemanual/group__util__delay_1gad22e7a36b80e2f917324dc43a425e9d3.html

Die Funktion _delay_ms ist für 1s nicht spezifiziert. Der maximale Delay 
in MHz beträgt 262.14 ms/F_CPU, also bei 8 MHz 31ms.

von Peter II (Gast)


Lesenswert?

cd schrieb:
> Die Funktion _delay_ms ist für 1s nicht spezifiziert. Der maximale Delay
> in MHz beträgt 262.14 ms/F_CPU, also bei 8 MHz 31ms.

hast du auch den nächsten Satz gelesen?

When the user request delay which exceed the maximum possible one, 
_delay_ms() provides a decreased resolution functionality. In this mode 
_delay_ms() will work with a resolution of 1/10 ms, providing delays up 
to 6.5535 seconds (independent from CPU frequency). The user will not be 
informed about decreased resolution.

von Jim M. (turboj)


Lesenswert?

grundschüler schrieb:
> F_CPU ist mit 8000000 angegeben. ich Möchte jetzt F_CPU kalibrieren, so
> dass _delay_ms(1000) möglicht genau eine Secunde ergibt.

Verbaue einen Quarz. Der interne RC-Osc reagiert auf Temperatur- und 
Spannungsschwankungen im Prozentbereich.

Und _delay_ms verlängert sich übrigens um jedweilige Interrupts, da es 
diese Zyklen nicht mitzählen kann.

F_CPU ist ein Makro. Wenn man das als Variable redefiniert fliegt einem 
_delay_ms() um die Ohren, denn dann ist dann eine float Berechnung drin. 
Die macht der C-Optimizer nur dann raus wenn F_CPU ein konstantes Makro 
ist.

von grundschüler (Gast)


Lesenswert?

HildeK schrieb:

Danke. Ich dachte schon, niemand versteht mich.

Peter II schrieb:
> wie viel ist erheblich?

habe jetzt mittels kleiner Programmänderung
1
  //NEC -code
2
   if(ir_div>17 && ir_div<25){//nec 95
3
4
    tmp1[tmp1_zl++]=tmp[1];
5
    if(tmp1_zl>4)tmp1_zl=0;
6
    
7
    
8
    tmp1[5]=0;
9
    for(i=0;i<5;i++){
10
      tmp1[5]+=tmp1[i];
11
      }
12
    
13
      lcd_goto(1,10);
14
      lcd_int(tmp1[5]/5);
15
      lw("x");
die Abweichung anzeigen lassen
mcu1: 7360 - mcu2:7400

Wenn mcu2 genau 8MHz hätte, hätte mcu1 einen 7956756-MHz-Takt.



Den genauen Wert bestimmen, ist sicher nicht schwierig. Einen Timer mit 
definierten Werten für 8 MHz eine Stunde laufen lassen, sec+min+hou 
zählen und mit der Küchenuhr vergleichen.

Mir fehlen nur die definierten Werte.

von batman (Gast)


Lesenswert?

HildeK schrieb:
> Er hat ja keine externe
> Referenz (Quarz, Quarzoszillator), sonst könnte er gleich diese als
> Taktquelle nehmen und eine ausreichend genaue Sekunde erhalten.
>
Anders funktioniert Kalibrieren nunmal nicht. Ob er dabei auf die Uhr 
guckt oder einen Frequenzzähler dranhängt - er benutzt einen 
(Quarz-)Referenztakt.

Die Investition in einen Quarzoszillator (Quarz+Inverter+Hühnerfutter) 
zum Kalibrieren von RC-Oszillatoren scheint mir auch nicht 
unrealistisch.

von grundschüler (Gast)


Lesenswert?

Jim M. schrieb:
> Verbaue einen Quarz. Der interne RC-Osc reagiert auf Temperatur- und
> Spannungsschwankungen im Prozentbereich.

Ich habe zwei AVRs, die per 1Wire miteinander kommunizieren. Der 
1Wire-Bus basiert auf Zeitmessung. um das so genau wie möglich 
hinzubekommen, brauche ich möglichst exakte Werte, die dann in #define 
F_CPU eingegeben werden. Dass dann immer noch Schwankungen zu erwarten 
sind, ist klar.

von Peter II (Gast)


Lesenswert?

grundschüler schrieb:
> Ich habe zwei AVRs, die per 1Wire miteinander kommunizieren. Der
> 1Wire-Bus basiert auf Zeitmessung. um das so genau wie möglich
> hinzubekommen, brauche ich möglichst exakte Werte, die dann in #define
> F_CPU eingegeben werden. Dass dann immer noch Schwankungen zu erwarten
> sind, ist klar.

nein. Man ändert F_CPU nicht aber, sondern Kalibriert den m128!. Schau 
ins Datenblatt wie das geht.

von Stefan K. (stefan64)


Lesenswert?

grundschüler schrieb:
> mcu1: 7360 - mcu2:7400

Ist das die Abweichung, die Dir Probleme bereitet? Das sind 0,5%. Das 
bekommst Du nie mit dem internen RC-Oszillator hin. Schon eine Differenz 
der Versorgungsspannung beider mc's um 0,2V oder ein 
Temperaturunterschied von 8 Grad bewirken eine größere Differenz.

Gruß, Stefan

von Oliver S. (oliverso)


Lesenswert?

Wie genau muß denn das Timing für den 1-wire-Bus sein? Denn wie schon 
geschrieben wurde, der interne Oszillator schwankt mit der Temperatur.

Oliver

: Bearbeitet durch User
von Stefan K. (stefan64)


Lesenswert?

grundschüler schrieb:
> Ich habe zwei AVRs, die per 1Wire miteinander kommunizieren. Der
> 1Wire-Bus basiert auf Zeitmessung.

Warum brauchst Du dafür eine genaue Zeitmessung?

Ich denke, Du solltest Deinen Aufbau bzw. Vorhaben nochmal deutlich 
genauer beschreiben.

von HildeK (Gast)


Lesenswert?

batman schrieb:
> Anders funktioniert Kalibrieren nunmal nicht.

Richtig, aber das Ziel war, den Prozessor nicht mit einem dauerhaft 
angeschlossenen Quarz zu betreiben, sondern den internen Oszillator mit 
den vorhandenen Möglichkeiten abzugleichen. Klar ist dazu irgend eine 
Referenz notwendig.

Habe selber einen Tiny25 als DCF-Uhr programmiert. Er läuft mit dem 
internen Oszillator, den ich für dieses Device vorher mit einem 
Frequenzzähler an CKOUT mittels OSCCAL abgeglichen habe. Genau so was 
schwebt dem TO wohl vor.

Gut, wenn das DCF-Signal mal 1 Stunde weg ist, dann hab ich eben ev. 
einige Sekunden Ablage.

von spess53 (Gast)


Lesenswert?

Hi

>Mir fehlen nur die definierten Werte.

CKOUT-Fuse setzen und Messen.

MfG Spess

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

grundschüler schrieb:
> mcu1: 7360 - mcu2:7400

Kommen wir doch mal zur ursprünglichen Aufgabe zurück:

Du möchtest die Zeiten zwischen Flanken messen, um das IR-NEC-Protokoll 
zu decodieren.

Um das NEC-Protokoll sicher zu decodieren, ist Deine angegebene 
Abweichung 7360 vs. 7400 ein Witz. IRMP verkraftet beim 
NEC-Protokoll, wo sich die Pausendauern für das Bit 0 (560µs) und 1 
(1690µs) erheblich unterscheiden, Abweichungen von bis zu 40% im Timing.

Es ist doch überhaupt kein Problem, zu schreiben:
1
 if (dauer > 7100 && dauer < 7600)
2
 {
3
    // Bit ist gültig
4
 }
5
 else
6
 {
7
    // Bit ist ungültig
8
 }

Für so ein simples IR-Protokoll braucht man weder einen Quarz noch eine 
supergenaue Zeitmessung. Wenn man sich die Zeiten unter

  https://www.mikrocontroller.net/articles/IRMP#NEC_.2B_extended_NEC

anschaut, dauert die Pause eines 1-Bits dreimal(!) so lange wie die 
eines 0-Bits. Da kann man sogar noch die Temperatur um 70° schwanken 
lassen, um das ohne Quarz unterscheiden zu können.

: Bearbeitet durch Moderator
von Stefan K. (stefan64)


Lesenswert?

Frank M. schrieb:
> Du möchtest die Zeiten zwischen Flanken messen, um das IR-NEC-Protokoll
> zu decodieren.

HildeK schrieb:
> Habe selber einen Tiny25 als DCF-Uhr programmiert. Er läuft mit dem
> internen Oszillator, den ich für dieses Device vorher mit einem
> Frequenzzähler an CKOUT mittels OSCCAL abgeglichen habe. Genau so was
> schwebt dem TO wohl vor.

Oliver S. schrieb:
> Wie genau muß denn das Timing für den 1-wire-Bus sein?

Hier scheinen deutlich unterschiedliche Vorstellungen zu kursieren, was 
der TS wohl machen will ... ohne den TS kommen wir da nicht weiter.

von HildeK (Gast)


Lesenswert?

Stefan K. schrieb:
> deutlich unterschiedliche Vorstellungen

Sorry - das war mein Beispiel. Der TO hat nie von DCF geredet, nur vom 
Abgleich des internen Oszillators ...

von Oliver S. (oliverso)


Lesenswert?

grundschüler schrieb:
> Ich habe zwei AVRs, die per 1Wire miteinander kommunizieren.

Das ist für mich eine ziemlich eindeutige Beschreibung dessen, was er 
vor hat.

Oliver

von Stefan K. (stefan64)


Lesenswert?

HildeK schrieb:
> Sorry - das war mein Beispiel.

Kein Problem, so hatte ich Dich auch verstanden und es sollte keine 
Kritik sein.

Was mir nicht ganz klar ist: die Anwendungen, die sich etwas abzeichnen 
(OneWire, IR-NEC-Protokoll?), benötigen nicht wirklich einen Abgleich, 
weil ihr Timing dazu viel zu unkritisch ist. Gleichzeitig scheinen 0,5% 
Abweichung ein Problem zu sein. Daher meine Vermutung, dass da noch 
etwas anderes dahintersteckt, was hier noch nicht genannt wurde.

Viele Grüße, Stefan

von Jim M. (turboj)


Lesenswert?

grundschüler schrieb:
> Ich habe zwei AVRs, die per 1Wire miteinander kommunizieren.

Dann brauchst Du AFAIK auf beiden Seiten Quarze, damit die Kommunikation 
sicher funktionert - ähnlich wie bei UART.

Hier im Forum kann man mit etwas Suchen die Leute finden bei denen der 
RC Osc im kühlen Keller oder auf dem Dach so weit auseinander läuft das 
die UART Kommunikation abreisst.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan K. schrieb:
> Hier scheinen deutlich unterschiedliche Vorstellungen zu kursieren, was
> der TS wohl machen will

Ja, das stimmt... er will wohl at Runtime die Taktfrequenz seines µCs 
ermitteln, indem er ein NEC-Signal einer Fernbedienung zur Kalibrierung 
verwendet:

grundschüler schrieb:
> Das ganze soll dann mittels einer Fernbedienung als Normal ausgemessen
> werden,

grundschüler schrieb:
> Ich habe festgestellt dass die Zahl der Ticks in tmp[1] bei
> verschiedenen m328 - alle mit 8MHz  intern - und gleicher nec-fb
> erheblich abweicht.

Was der TO dabei nicht beachtet: Die Sender einer IR-Fernbedienung sind 
noch unzuverlässiger als sein ATMega328: Jede NEC-Fernbedienung liefert 
ein abweichendes Timing - teilweise mit Abweichungen um bis zu 30%. Auch 
wenn der TO die nächsten 10 Jahre dieselbe Fernbedienung zur 
"Kalibrierung" nutzen wird, wird er feststellen, dass morgen bei einer 
anderen Zimmertemperatur seine Fernbedienung ganz andere Werte 
ausspuckt. Ich spreche da aus Erfahrung.

Eine Infrarot-Fernbedienung zur Kalibrierung zu nutzen ist einfach 
Unsinn.

von justy (Gast)


Lesenswert?

HildeK schrieb:
> Sorry - das war mein Beispiel. Der TO hat nie von DCF geredet, nur vom
> Abgleich des internen Oszillators ...

Nein, er hat von "Kalibrierung" gesprochen.

Es bedeutet nicht "Abgleich", sondern nur "Messen":

https://de.wikipedia.org/wiki/Kalibrierung

von Stefan K. (stefan64)


Lesenswert?

Oliver S. schrieb:
> Das ist für mich eine ziemlich eindeutige Beschreibung dessen, was er
> vor hat.

Dazu passt aber der Anfangspost nicht. Und wenn das das Problem ist, 
dann ist die Anwort sehr einfach. Eine Kalibration ist dann schlicht 
überflüssig.

Gruß, Stefan

von Jim M. (turboj)


Lesenswert?

Jim M. schrieb:
>> Ich habe zwei AVRs, die per 1Wire miteinander kommunizieren.
>
> Dann brauchst Du AFAIK auf beiden Seiten Quarze, damit die Kommunikation
> sicher funktionert - ähnlich wie bei UART.

Oder auch nicht. Da werden Sync Flanken pro Bit vom Master gesendet, das 
hatte ich vergessen.

von Oliver S. (oliverso)


Lesenswert?

Doch, der Anfangspost passt schon.

Er will halt kalibrieren, weil er meint, das für den 1-wire-Bus 
unbedingt zu brauchen.

Oliver

: Bearbeitet durch User
von justy (Gast)


Lesenswert?

Oliver S. schrieb:
> Er will halt kalibrieren

Nochmal !!! (siehe oben)

Kalibrieren heißt in etwa "messen" und nicht abgleichen, einstellen, 
justieren, etc.

von Stefan F. (Gast)


Lesenswert?

Die Programmieradapter von Atmel (z.B. ISP MkII) unterstützen eine 
Abgleichprozedur, bei der ein einzelner µC in der Zielschaltung mit 
einem Quarz im Programmieradapter verglichen und korrigiert wird.

Der dazu nötige Korrekturwert für das OSCCAL Register wird dabei im 
EEPROM Abgelegt. Danach musst du dein Programm so ändern, daß es diesen 
Wert beim, Start liest und in das OSCCAL Register rein schreibt.

Soweit ich weiß, werden alle AVR Mikrocontroller schon ab Werk 
kalibriert geliefert. Diese Prozedur macht daher nur Sinn, wenn bei Dir 
die Versorgungsspannung oder Temperatur abweicht. Im Datenblatt findest 
du die konkreten Bereiche, für die im Werk kalibiert wird.

Aber wie gesagt nützt das wenig, wenn die Versorgungsspannung oder die 
Temperatur nicht konstant sind. R/C Oszillatoren sind halt Prinzip 
bedingt nicht sehr stabil.

Beitrag #5081526 wurde vom Autor gelöscht.
von Stefan K. (stefan64)


Lesenswert?

Jim M. schrieb:
> Dann brauchst Du AFAIK auf beiden Seiten Quarze, damit die Kommunikation
> sicher funktionert - ähnlich wie bei UART.

Der OneWire Bus ist wesentlich toleranter gegen Timingschwankungen als 
eine UART-Kommunikation. Er ist ja speziell entworfen für die 
Kommunikation mit Minimal-Chips.

Viele Grüße, Stefan

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Hier ist das die Application Note zu der von Atmel empfohlenen Prozedur: 
http://www.atmel.com/Images/Atmel-2555-Internal-RC-Oscillator-Calibration-for-tinyAVR-and-megaAVR-Devices_ApplicationNote_AVR053.pdf

> Kalibrieren heißt in etwa "messen" und nicht abgleichen,
> einstellen, justieren, etc.

Erzähle das den Autoren der Application Note. Vielleicht werden die 
Begriffe in deutsch und englisch etwas unterschiedlich verwendet.

von Oliver S. (oliverso)


Lesenswert?

justy schrieb:
> Kalibrieren heißt in etwa "messen" und nicht abgleichen, einstellen,
> justieren, etc.

http://www.duden.de/rechtschreibung/kalibrieren

Bei zwei von den drei Beduetungen beinhaltet es sehr wohl auch 
einstellen bzw. abgleichen.

Oliver

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Zudem möchte er eine IR-Fernbedienung zum Kalibrieren benutzen.

Der Punkt ist einfach, dass der TO nicht F_CPU verändern soll, sondern 
OSCCAL verändern muss. Dazu braucht er eine Referenz, und die ist die 
IR-Fernbedienung.

Also einfach die Zeit messen, die von der FB kommt, und dann ein 
bisschen am Oszillator spielen. Das ganze so lange, bis die Zeit stimmt.

Setzt übrigens voraus, dass die Fernbedienung genauer ist als der RC des 
Controllers. Ich vermute, dass das nicht unbedingt garantiert ist (oder 
sind alle Fernbedienungen quarzstabilisiert?).

von batman (Gast)


Lesenswert?

justy schrieb:
> Kalibrieren heißt in etwa "messen" und nicht abgleichen, einstellen,
> justieren, etc.

Toll, und er wills abgleichen. Gemäß Duden ist das auch völlig korrekt 
ausgedrückt, Herr Deutschlehrer:

"Kalibrieren
(..)
(von Messgeräten, ihren Funktionen o. Ä.) durch Vergleichen bestimmter 
Messdaten mit geeichten Normalen kontrollieren, prüfen und mit der Norm 
in Übereinstimmung bringen"

von justy (Gast)


Lesenswert?

Stefan U. schrieb:
> Erzähle das den Autoren der Application Note.

Warum, in der AN ist es korrekt verwendet.

Stefan U. schrieb:
> Vielleicht werden die
> Begriffe in deutsch und englisch etwas unterschiedlich verwendet.

Genau.

Da die obigen Texte in Deutsch verfasst sind, sorgt die mehrfach falsche 
Verwendung eher für Verwirrung.

von Erwin D. (Gast)


Lesenswert?

Stefan U. schrieb:
>> Kalibrieren heißt in etwa "messen" und nicht abgleichen,
>> einstellen, justieren, etc.
>
> Erzähle das den Autoren der Application Note. Vielleicht werden die
> Begriffe in deutsch und englisch etwas unterschiedlich verwendet.

Zitat Wikipedia:
"Der Begriff Kalibrierung wird häufig mit den nicht synonymen
Wörtern Eichung, Konformitätsaussage, Spezifikationsprüfung,
Abgleich, Justierung oder Zertifizierung verwechselt, zur Abgrenzung
siehe unten."
[...]
"Ein Abgleich oder eine Justierung kann im Anschluss an eine
Kalibrierung und eine Konformitätsprüfung erfolgen (wenn z.B.
die festgestellte Abweichung unzulässig hoch ist), ist aber
nicht zwingender Bestandteil. Nach jeder Justierung muss eine
erneute Kalibrierung stattfinden, weil durch die Änderung am
Messgerät eine vorher durchgeführte Kalibrierung bedeutungslos wird."

von grundschüler (Gast)


Lesenswert?

ich will eigentlich nur wissen, wie meine MCU wirklich taktet. Das ist 
wie beim Autofahren: Tacho 120 ist tatsächlich nur 112. Manchem ist das 
egal - ich kenne halt gerne die Abweichung. IR und 1Wire funktioniert 
sicher auch mit 5% Abweichung. Ich habe im Programm einen F_CPU Wert von 
genau 8MHz stehen. Auf der Taktfrequenz basieren die Timer, mit denen 
bei mir ein smh-Signal generiert wird und die delays, die manchmal 
wichtig sind -manchmal auch nicht.

DIe 8MHz werden wahrscheinlich nie genau stimmen. Ob ich den Wert jetzt 
ändere oder den tatsächlichen Wert -bei bestimmten Bedingungen- als 
Kommentar dahinterschreibe weiß ich noch nicht. Vielleicht sind die 
Abweichungen auch so groß, dass ich dann auf externen Quartz umstelle.

Ich will nur wissen was ich mache und deswegen den Takt genauer 
bestimmen als die Atmel-Vorgabe von 8MHz.

Danke jedenfalls für die zahlreichen Beiträge.

von HildeK (Gast)


Lesenswert?

justy schrieb:
> Da die obigen Texte in Deutsch verfasst sind, sorgt die mehrfach falsche
> Verwendung eher für Verwirrung.

Siehe Duden ( http://www.duden.de/rechtschreibung/kalibrieren ):
- das Kaliber bestimmen, messen
- (besonders von Werkstücken) auf ein genaues Maß bringen, ausrichten
  auf eine einheitliche, genormte Größe bringen
- (von Messgeräten, ihren Funktionen o. Ä.) durch Vergleichen bestimmter
  Messdaten mit geeichten Normalen kontrollieren, prüfen und mit der 
Norm in
  Übereinstimmung bringen

Nach Duden und nach meinem Verständnis ist die Verwendung des Wortes 
auch in Deutsch für diesen Vorgang zulässig.
Außer dir hat jeder verstanden, was gemeint war.

von HildeK (Gast)


Lesenswert?

grundschüler schrieb:
> Ich habe im Programm einen F_CPU Wert von
> genau 8MHz stehen. Auf der Taktfrequenz basieren die Timer, mit denen
> bei mir ein smh-Signal generiert wird und die delays, die manchmal
> wichtig sind -manchmal auch nicht.

Wichtig zu wissen: mit einem modifizierten Wert für F_CPU kannst du die 
_delay_ms anpassen, nicht aber die Timer.

von S. R. (svenska)


Lesenswert?

grundschüler schrieb:
> ich will eigentlich nur wissen, wie meine MCU wirklich taktet.

Dann programmiere die CKOUT-Fuse und schließe einen Frequenzzähler an 
PB0 (CLKO) an. Da kommt der Systemtakt direkt raus.

> DIe 8MHz werden wahrscheinlich nie genau stimmen.

Vor allem sind sie nicht konstant!

Was immer du misst, gilt nur in diesem Augenblick, bei dieser 
Temperatur, bei dieser Versorgungsspannung. Den systematischen Fehler 
kannst du da auch rausrechnen (z.B. durch Messen der Temperatur), bis zu 
einem gewissen Punkt.

> Ich will nur wissen was ich mache und deswegen den Takt genauer
> bestimmen als die Atmel-Vorgabe von 8MHz.

Du kannst mit dem RC für bestimmte Randbedingungen recht genau werden, 
indem du den Oszillator softwareseitig nachstellst. Dazu brauchst du 
aber eine Referenzquelle, die in jedem Fall genauer sein muss, als der 
verbaute RC.

Deinen Autotacho wirst du sicherlich auch nicht mit Straßenschildern und 
Armbanduhr justieren.

von spess53 (Gast)


Lesenswert?

Hi

>Die Programmieradapter von Atmel (z.B. ISP MkII) unterstützen eine
>Abgleichprozedur, bei der ein einzelner µC in der Zielschaltung mit
>einem Quarz im Programmieradapter verglichen und korrigiert wird.

Habe ich da irgend etwas verpasst? Von einem derartigen Abgleich ist mir 
nichts bekannt. Der ISP kann den zwar den werksseitig ermittelten Wert 
auslesen und im EEPROM oder Flash speichern. Von dort muss das Programm 
den Wert ins OSCCAL-Register Schreiben.

MfG Spess

von Stefan F. (Gast)


Lesenswert?

> sind alle Fernbedienungen quarzstabilisiert?

IR Fernbedienungen enthalten meistens einen Keramik Resonator.

von Stefan F. (Gast)


Lesenswert?

>>Die Programmieradapter von Atmel (z.B. ISP MkII) unterstützen eine
>>Abgleichprozedur...

> Habe ich da irgend etwas verpasst?

Ja hast du. Und zwar die Application Note. Hier nochmal der Link für 
dich: 
http://www.atmel.com/Images/Atmel-2555-Internal-RC-Oscillator-Calibration-for-tinyAVR-and-megaAVR-Devices_ApplicationNote_AVR053.pdf

Und du solltest Du mal die zugehörigen Menüpunkte im Atmel Studio 
anschauen, während einer der genannten Programmieradapter angeschlossen 
ist.

von grundschüler (Gast)


Lesenswert?

Frank M. schrieb:
> Eine Infrarot-Fernbedienung zur Kalibrierung zu nutzen ist einfach
> Unsinn.

Du bist mit deinen Aussagen manchmal etwas drastisch. Zwei AVRs auf den 
Tisch, FB 5x klicken. Der von den beiden mcus angezeigte Wert gibt das 
Verhältnis der Taktfrequenzen dann ziemlich exact wieder. Also kein 
Unsinn.



Habe meinen Timer jetzt mal berechnet:
1
void init_timer_smh(void) {
2
/*
3
cs02+01+00:
4
0 no clock
5
1 no presc
6
2 /8
7
3 /64
8
4 /256
9
5 /1024
10
*/
11
12
TCCR0A |= (1<<WGM01);
13
    // 1; Timer0 Vorteiler: 64 -> bei 16 MHz: 
14
    // 16.000.000 / 64 = 250000 Mal pro Sek gibts einen Takt an den Timer
15
    // 8.000.000 / 1024 = 7812 Mal pro Sek gibts einen Takt an den Timer
16
TCCR0B |= ((1<<CS02)|(1<<CS00));//1024
17
    
18
    // Timer0 soll bei 250 einen Output Compare Interrupt ausl?sen ->
19
    // 250.000 / 250 = 1000 mal pro Sek gibts einen Interrupt
20
    // 7812 /78 = 100 mal pro Sek gibts einen Interrupt
21
OCR0A = 78;//abgleich mit uhr
22
23
//7812/78 =>9,9846ms
24
//planmäßige Abweichung zu 60x60sec => 3594,4700460829493087557603686636
25
26
27
28
    //Compare Interrupt aktivieren
29
TIMSK0 |= (1<<OCIE0A);
30
31
    //Globale Interrupts aktivieren
32
sei();
33
}

Planmäßige Abweichung wären 5,5 sec je Stunde.  Aufgrund der 
tatsächlichen Abweichung müsste man dann die Taktfrequenz ziemlich genau 
berechnen können.

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Diese Kalibrierfunktion ist sogar schon in der GUI vom alten AVR Studio 
enthalten:

von S. R. (svenska)


Lesenswert?

Na dann wird's jetzt Zeit, am OSCCAL zu drehen und das zu verbessern. ;)

von spess53 (Gast)


Lesenswert?

Hi

>Ja hast du. Und zwar die Application Note. Hier nochmal der Link für
>dich:
>http://www.atmel.com/Images/Atmel-2555-Internal-RC...

Ok. Habe ich zwar in meiner AppNotes-Sammlung. Aber Irgenwie ignoriert.

>Und du solltest Du mal die zugehörigen Menüpunkte im Atmel Studio
>anschauen, während einer der genannten Programmieradapter angeschlossen
>ist.

Atmel Studio habe ich zwar, weil ich ATSAME70Q19 programmieren muss. 
Aber normalerweise bin ich mit dem AVR Studio 4 unterwegs. Muss ich 
morgen mal in der Firma nachsehen.

MfG Spess

von Stefan F. (Gast)


Lesenswert?

Auch das AVR Studio 4.19 hat eine entsprechende Funktion in der GUI. 
Sieht zumindest so aus - ich habe sie nie benutzt.

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

>Auch das AVR Studio 4.19 hat eine entsprechende Funktion in der GUI.
>Sieht zumindest so aus - ich habe sie nie benutzt.

Auch im 7er Studio gibt es nur den Punkt 'Oscillator Calibration' (siehe 
Anhang). Und der liest auch nur per ISP das Calibration Byte aus und 
speichert es im EEPROM bzw. Flash. Da ist, genau wie im 4er Studio, 
nichts mit messen.

MfG Spess

von Stefan F. (Gast)


Lesenswert?

Ja, im AVR Studio 4.19 sieht der Dialo prinzipiell genau so aus. Die 
Eingabefelder und Buttons sind lediglich ein bisschen anders angeordnet.

> Da ist, genau wie im 4er Studio, nichts mit messen.

Schade. Dann muss man wohl wirklich das Kommandozeilen-Tool verwenden. 
Oder sich eine eigene Methode ausdenken.

Ich frage mich allerdings, wozu dann die Drop-Down Liste "Calibrate for 
8Mhz" dient?

von Erwin D. (Gast)


Lesenswert?

Stefan U. schrieb:
> Ich frage mich allerdings, wozu dann die Drop-Down Liste "Calibrate for
> 8Mhz" dient?

Da kannst du auswählen, bei welcher Frequenz du kalibrieren möchtest. 
Ich hab mal irgendwo (Datenblatt/Application note) gesehen, daß der 
interne RC mehrere Abgleichpunkte hat für verschiedene Frequenzen hat.

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

>Ich hab mal irgendwo (Datenblatt/Application note) gesehen, daß der
>interne RC mehrere Abgleichpunkte hat für verschiedene Frequenzen hat.

Genau. Z.B. haben die ATTiny25/45/85 normal einen 8MHz Oszillator. Wenn 
der 'ATtiny15 compatibility mode' gesetzt ist, einen 6,4MHz Oszillator. 
Für beide Modes gibt es unterschiedlich Calibration Bytes.

MfG Spess

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.