Forum: Mikrocontroller und Digitale Elektronik Genau 3,515 Sekunden etwas abfragen


von Wolfsente (Gast)


Lesenswert?

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

von mr. mo (Gast)


Lesenswert?

Gegenfrage:
Wieso muss das so genau sein?

von Der Andere (Gast)


Lesenswert?


von abfrage (Gast)


Lesenswert?

Nette Idee, aber wie bekommst du deine Abfrage mit dem Refresh des 
Registers synchronisiert?

von Wolfsente (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

Wolfsente schrieb:
> Der aktualisiert seine Register ja im Intervall von 3,515 Sekunden.

Timebase Accuracy: +/-4%

von Wolfsente (Gast)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

Wolfsente schrieb:
> Angenommen, mein Quarz schwingt nun mit +/- 0 ppm

Tut er aber nicht. Und die "Timebase Accuracy" des DS2740U wird nicht 
mal in ppm, sondern in % angegeben.

Ergo vergiß den Ansatz (was immer der auch war). Die Zeitgeber in CPU 
und DS2740U werden auseinanderlaufen.

http://evolutec.publicmsg.de/index.php?menu=software&content=prescalertools

Oliver

von Der Andere (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wolfsente schrieb:
> Möchte halt nicht 2-mal den selben Wert abfragen.
Und wenn der sich mal für 1 Minute nicht ändert?

von Rudolph (Gast)


Lesenswert?

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.

von Wolfsente (Gast)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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

von Hans M. (Gast)


Lesenswert?

Das ist Wurscht^^, der akkumuliert ja eh alles auf.
Du solltest nur aufpassen, das dir zwischen 2 Auslesungen nicht die +/- 
15Bit überlaufen...

Hans

von Der Andere (Gast)


Lesenswert?

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?

von Wolfsente (Gast)


Lesenswert?

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

von Rudolph (Gast)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Rudolph (Gast)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Wolfsente (Gast)


Lesenswert?

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

von Wolfsente (Gast)


Lesenswert?

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?

von Rudolph (Gast)


Lesenswert?

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.

von Rudolph (Gast)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Felix A. (madifaxle)


Lesenswert?

Warum nicht einfach das Stromakkumulierende register mit abfragen? Das 
dürfte sich wahrscheinlich (je nach Stromfluss und Sensewiderstand) wohl 
doch ständig ändern, oder?

von Hans M. (Gast)


Lesenswert?

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

von Felix A. (madifaxle)


Lesenswert?

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.

von Wolfsente (Gast)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

von Sajuuk (Gast)


Lesenswert?

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.

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.