Guten Tag Liebes MC Forum,
ich möchte gerne ziemlich genau den DS2740U abfragen.
Der aktualisiert seine Register ja im Intervall von 3,515 Sekunden.
Ich habe ein Atmega88-PA und ein Display und möchte damit halt
Batteriemessungen durchführen.
Angenommen, mein Quarz schwingt nun mit +/- 0 ppm und der Quarz ist in
Ordnung.
Wie löse ich den am besten denn alle 3,515 Sekunden ein Interrupt dafür
aus?
Bzw. welchen Quarz kann ich dafür am besten wählen?
Es soll kein Batterie betriebenes Gerät werden (also der der den DS2740U
abfragt).
Gruß
Wolfsente
mr. mo schrieb:> Gegenfrage:> Wieso muss das so genau sein?
Möchte halt nicht 2-mal den selben Wert abfragen.
abfrage schrieb:> Nette Idee, aber wie bekommst du deine Abfrage mit dem Refresh des> Registers synchronisiert?
Muss ja nicht genau nach dem Refresh sein, sondern einfach nur genau
alle 3,515 Sekunden sein.
Dann wird ja das Register aktualisiert.
Peter D. schrieb:> Wolfsente schrieb:>> Der aktualisiert seine Register ja im Intervall von 3,515 Sekunden.>> Timebase Accuracy: +/-4%
Ok, 140 mS ist schon bisschen was. Dann brauch ichs ja doch nicht so
genau.
Danke.
Wolfsente schrieb:> Muss ja nicht genau nach dem Refresh sein, sondern einfach nur genau> alle 3,515 Sekunden sein.> Dann wird ja das Register aktualisiert.
Wenn du alle 4 Sekunden abfragst, dann kannst du sicher sein, dass auf
jeden Fall ein neuer Wert im Register stand.
Du machst dir Probleme, die es eigentlich gar nicht gibt.
Oliver S. schrieb:> http://evolutec.publicmsg.de/index.php?menu=software&content=prescalertools
Der Link ist aber eher untauglich, der "Preload" ist ziemlicher Unsinn.
Korrekt wäre sich einen Betriebsmodus rauszusuchen in dem sich der TOP
Wert des Timers einstellen lässt, etwa Mode 7 beim 8-Bit Timer im
Mega328.
Oder auch Mode 14 beim 16-Bit Timer im Mega328.
Dann wird nämlich der Overflow Interrupt immer zur gleichen Zeit
ausgelöst ohne das man mit dem Counter-Register rum fummeln muss.
Der Andere schrieb:> Wenn du alle 4 Sekunden abfragst, dann kannst du sicher sein, dass auf> jeden Fall ein neuer Wert im Register stand.
Dann könnte ich aber ein Wert überspringen
Der Andere schrieb:> Du machst dir Probleme, die es eigentlich gar nicht gibt.
Ja, mit den +/- 4% hab ichs selber auch schon gemerkt.
Trtzdm nochmal danke an alle.
Rudolph schrieb:> Korrekt wäre sich einen Betriebsmodus rauszusuchen in dem sich der TOP> Wert des Timers einstellen lässt,
Natürlich macht an das per CTC. Und mit etwas nachdenken findet man dann
auch raus, wie der Preload-Wert und der TOP-Wert für CTC zusammenhängen.
Denn irgendwie muß man den ja auch ausrechnen ;)
Oliver
Wolfsente schrieb:> Dann könnte ich aber ein Wert überspringen
Was passiert dann? Bleibt der Erdkern stehen, schaltet sich die Sonne
aus?
Sprich: Hat das irgendeinen Einfluss auf das was du erreichen willst?
Ich wette nein.
Was ist dein Ziel?
Der Andere schrieb:> Was passiert dann? Bleibt der Erdkern stehen, schaltet sich die Sonne> aus?
Wenn Venus und Merkur richtig stehen, könnte es vllt den Weltfrieden
bringen.
Wenn nicht, das weiss dann niemand.
Der Andere schrieb:> Was ist dein Ziel?
Hatte mir nur Gedanken gemacht, wie ichs ziemlich genau abgefragt
bekomme.
Das Thema hat sich für mich doch erledigt und ich habe es verstanden :D
Oliver S. schrieb:> Natürlich macht an das per CTC.
Ich tendiere da eher zu Fast PWM, damit der Overflow IRQ auch beim TOP
Wert kommt.
> Und mit etwas nachdenken findet man dann auch raus,> wie der Preload-Wert und der TOP-Wert für CTC zusammenhängen.> Denn irgendwie muß man den ja auch ausrechnen ;)
Ob man nun Preload oder TOP ausrechnet, die Anzahl der Zählschritte
bleibt gleich, ja.
Aber der Link propagiert eben Preload beim AVR und da ist das Murks,
weil man den Counter nicht automatisch neu setzen lassen kann.
Rudolph schrieb:> Ich tendiere da eher zu Fast PWM, damit der Overflow IRQ auch beim TOP> Wert kommt.
Was willst du mit dem Overflow?
Man generiert mit dem Timer im CTC eine Millisekunde und lässt in der
CTC-ISR einen Abwärtszähler mit Startwert 3515 laufen. Wenn dieser bei 0
angekommen ist, geht der Punk ab oder die K... ist am Dampfen oder was
auch immer.
Rudolph schrieb:> Aber der Link propagiert eben Preload beim AVR und da ist das Murks
Wenn der Timer nichts anderes kann, ist das kein Murks. Da es für die
meisten Leute nur einen einzigen AVR gibt, nämich den Atmega8 und dessen
8048-Gedächtnis-Timer0 nur Overflow kann, macht man das eben so.
Da der TO aber einen Atmega88 hat, ist das natürlch kein Thema und man
nimmt selbstverständlich den CTC-Mode. Alles andere wäre dann
tatsächlich Murks.
mfg.
Thomas E. schrieb:>> Ich tendiere da eher zu Fast PWM, damit der Overflow IRQ auch beim TOP>> Wert kommt.>> Was willst du mit dem Overflow?
Willst Du mich trollen?
Thomas E. schrieb:>> Aber der Link propagiert eben Preload beim AVR und da ist das Murks>> Wenn der Timer nichts anderes kann, ist das kein Murks.
...
> Da der TO aber einen Atmega88 hat
Die Timer vom ATMega88 könnten einen automatischen Preload vom
Counter-Register? Interessant.
Macht das doch mit dem CTC wenn Ihr Spass dran habt, ob nun Fast PWM mit
Overflow oder CTC mit Compare Match ändert ja am Ergebnis nichts.
Rudolph schrieb:> Willst Du mich trollen?
Hast du irgendwelche verbotenen Substanzen genommen?
Rudolph schrieb:> Die Timer vom ATMega88 könnten einen automatischen Preload vom> Counter-Register? Interessant.
Schalt dein Hirn ein!
Rudolph schrieb:> Macht das doch mit dem CTC wenn Ihr Spass dran habt
Ja, so macht man das.
mfg.
Mal ne Frage dazu.
Ich habe 8 mHz
im CTC Mode habe ich ein Prescal von 64 und muss 125 Takte in das
OutputCompare Register dazu reinpacken damit ich im 1 mS Intervall ein
Interrupt bekomme.
im Overflow Mode ist es doch eig. dasselbe oder? außer das ich in der
Interrupt Routine noch das Register wieder auf 0 setzen muss?
und dann noch ne Frage.
Ich hab das grad ausgerechent mit dem 8MHz und einer Millisekunden.
8MHz / 64 Prescale = 8nS.
8nS * 125 Takte = 1mS.
Wenn ich aber das Tool von der Seite nehme, sagt der mir 131 Takte :o
Ok habs schon verstanden, bei Compare cleart er das und bei Overflow
mach ich ja ein Preload ich Dussel.
Sry....
Aber warum ist CTC denn besser als OVF? ich versteh nicht so ganz warum
CTC besser ist. Am ende hab ich doch eine mS oder nicht?
Thomas E. schrieb:>> Willst Du mich trollen?>> Hast du irgendwelche verbotenen Substanzen genommen?
Ich nicht, aber Du kannst scheinbar welche empfehlen.
Die Antwort werte ich dann mal als klares "ja".
> Rudolph schrieb:>> Die Timer vom ATMega88 könnten einen automatischen Preload vom>> Counter-Register? Interessant.>> Schalt dein Hirn ein!
Schreibt der der keine fünf Beiträge hier lesen will aber trotzdem
dagegen diskutieren will.
Wolfsente schrieb:> Ok habs schon verstanden, bei Compare cleart er das und bei Overflow> mach ich ja ein Preload ich Dussel.
Nein, ein Preload des Counter-Registers macht man auf gar keinen Fall,
weil das nicht automatisch geht.
Im Fast-PWM Modus 7 vom ATMega88 stell man mit OCRA den TOP Wert des
Zählers ein und wenn dieser erreicht wird gibt es die Möglichkeit, einen
Overflow Interrupt auszulösen.
> Aber warum ist CTC denn besser als OVF? ich versteh nicht so ganz warum> CTC besser ist. Am ende hab ich doch eine mS oder nicht?
CTC ist nicht besser oder schlecht als Fast PWM, bei CTC nimmt man den
Compare-Match Interrupt, bei Fast PWM mit OCRA als TOP den Overflow
Interrupt.
Die beiden Modi machen in der Anwendung als Zeitbasis sogar quasi das
gleiche, wenn der Zähler den Wert von OCRA erreicht wird er automatisch
auf Null zurück gesetzt.
Wolfsente schrieb:> Aber warum ist CTC denn besser als OVF? ich versteh nicht so ganz warum> CTC besser ist. Am ende hab ich doch eine mS oder nicht?
Wenn der TCNT per Programm mit einem Preload versehen werden soll,
geschieht das in der OVF-ISR, die im Programm irgendwann nach Auftreten
des OVF-Interrupts ausgeführt wird.
Aber der Timer läuft bis zur Aktualisierung des Counters natürlich
weiter. Sodaß er möglicherweise beim Laden des Preloads nicht auf 0
steht. Das mag mit Prescaler = 64 sogar noch alles funktionieren.
Läuft der Timer aber schneller, funktioniert das mit Sicherheit nicht.
Dann muß, damit der Timer exakt läuft, der aktuelle TCNT ausgewertet und
der Preload entsprechend angepasst werden. In der Zeit läuft er
natürlich auch weiter, was dann auch wieder berücksichtigt werden muss.
Im CTC macht das die Hardware des Controllers alles von alleine. Exakt.
Immer.
mfg.
Warum nicht einfach das Stromakkumulierende register mit abfragen? Das
dürfte sich wahrscheinlich (je nach Stromfluss und Sensewiderstand) wohl
doch ständig ändern, oder?
Nein, das wird auch alle 3,5s aktualisiert.
Frag einfach alle 1s ab und nutz es für die Verarbeitung.
Es ist halt ein Verbrauchsmesser und kein Strommesser. Dafür gibt es
andere Lösungen.
Hans
Mit ständig ändern war gemeint, dass jeder Refresh zu einer Änderung
führt. Anhand dieses Registers könnte also gesehen werden, ob der
Refresh statt gefunden hat.
Thomas E. schrieb:> Wenn der TCNT per Programm mit einem Preload versehen werden soll,> geschieht das in der OVF-ISR, die im Programm irgendwann nach Auftreten> des OVF-Interrupts ausgeführt wird.>> Aber der Timer läuft bis zur Aktualisierung des Counters natürlich> weiter. Sodaß er möglicherweise beim Laden des Preloads nicht auf 0> steht. Das mag mit Prescaler = 64 sogar noch alles funktionieren.>> Läuft der Timer aber schneller, funktioniert das mit Sicherheit nicht.> Dann muß, damit der Timer exakt läuft, der aktuelle TCNT ausgewertet und> der Preload entsprechend angepasst werden. In der Zeit läuft er> natürlich auch weiter, was dann auch wieder berücksichtigt werden muss.
Ok, angenommen ich habn Asynchronen Timer mit nem 32.768 Hz Quarz dran.
Mit Prescaler 1024 und mach ein Preload von 224 in dem Interrupt.
Dann sollte das praktisch gesehen genauso gut laufen, wenn ich das mit
CTC mache?
Weil 1024 ist ja ein sehr großer Prescaler und mein interner Takt von
8MHz ja sher groß ist, das es da keine Überschneidungen geben könnte
Also davon abgesehen mach ich trtzdm ads mit CTC. Mir gehts nur ums
Verständnis
Wolfsente schrieb:> Also davon abgesehen mach ich trtzdm ads mit CTC. Mir gehts nur ums> Verständnis
Das hast du richtig verstanden. Auch, wenn es ein sehr extremes Beispiel
ist.
Die OVF-ISR-Preload-Variante funktioniert manchmal, die CTC-Variante
immer.
mfg.
Wolfsente schrieb:> Hatte mir nur Gedanken gemacht, wie ichs ziemlich genau abgefragt> bekomme.
Du machst dir unötig Gedanken. Der DS2740U summiert alle Messergebnisse
auf (1. Messung + 2. Messung u.s.w.).
Mal angenommen du liest zu schnell aus bekommst du eben mehrmals das
selbe Ergebniss und irgendwann das neu berechnete Ergebniss. Du machst
also einfach nen Vergleich -> Alt = Neu? Wenn:Ja -> verwerfe Neu
Wenn:Nein -> übernehme neues Ergebniss. Wenn du schneller als die 3,5s
aus liest wirst du so nie ein Ergebniss verlieren bzw. Überspringen.
Wenn du aber langsamer als deine 3.5s ausliest, kann es durch aus
passieren das du mal ein Ergeniss verpasst.
Also solltest du einfach alle z.B. 3s auslesen dann ist alles Save.