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
Siehe hier: https://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts https://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer
Nette Idee, aber wie bekommst du deine Abfrage mit dem Refresh des Registers synchronisiert?
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.
Wolfsente schrieb: > Der aktualisiert seine Register ja im Intervall von 3,515 Sekunden. Timebase Accuracy: +/-4%
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: > 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
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.
Wolfsente schrieb: > Möchte halt nicht 2-mal den selben Wert abfragen. Und wenn der sich mal für 1 Minute nicht ändert?
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
Das ist Wurscht^^, der akkumuliert ja eh alles auf. Du solltest nur aufpassen, das dir zwischen 2 Auslesungen nicht die +/- 15Bit überlaufen... Hans
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.