Hallo, bin noch recht frisch hinter den Ohren was Mikrocontroller betrifft und will gerne für ein Schulprojekt einen Langzeit timer ca. 6h realisieren. Ich habe einen ATMega32 zur verfügung ist dies Problemlos möglich oder ist das sehr aufwendig? Hat vielleicht schon einmal jemand einen solchen Langzeittimer realisiert? Bin für jede Hilfe dankbar, villeicht hat ja jemand so ein ähnliches Programm das er mal posten kann. Gruß Andi
Er muß nicht besonders genau sein soll halt alle 6h eine Messung machen dabei ist es unwichtig ob es jetzt nach 5,5h oder erst nach 6,5h geschieht.
definiere "aufwändig" Ob dein Timer 5 Sekunden oder 6 Stunden oder 3 Tage laufen soll, ist letzten Endes nur eine Frage dessen, wieviele Sekundenimpulse man abzählt, bis die Aktion passiert. (Sekundenpulse ist jetzt nur ein Beispiel. Es können auch 0.5 Sekundenpulse sein oder was auch immer. Hauptsache regelmässig und man kann sie zählen)
Die eleganteste Lösung bietet meiner Meinung nach eine RTC. Da dir die (scheinbar) nicht zur Verfügung steht, musst du mit einem integrierten Timer vorlieb nehmen. D.h.: -höchsten Frequenzteiler wählen -im Overflow Interrupt Zähler inkrementieren -beim Erreichen von Zählerstand x wird die Messung gemacht und der Zähler zurückgesetzt x errechnet sich aus: 21600sec [=6h] / Zeit_zwischen_Interrupts [in sec]
Ich würde dir zu ner batteriegestützen Echtzeituhr ala DS1307 oder ähnlichem raten. Diese kannst du dann aller paar Minuten abfragen und wenn die richtige Zeit erreicht ist, dann machst du die Messung. Damit wäre sichergestellt, dass auch nach einem Stromausfall alles noch so funktioniert, wie es soll. Du könntest könntest den AVR sekündlich aus dem Schlaf holen (Dazu einfach den Takt an der Echtzeituhr abgreifen) und dann nen Zähler hochzählen lassen und wieder schlafen legen. Bei nem bestimmten Zählerstand ließt du die Uhr aus. Ist deine Stunde der Messung erreicht, dann machst du sie auch, ansonsten nur Zähler zurücksetzen und den Atmel wieder schlafen legen. Was hast du überhaupt damit vor? Gruß Skriptkiddy
Du kannst auch den ganzen Programmierkrempel sein lassen und zu klassischer Logik greifen: Ein Uhrenquarz, am CD4060. Nachdem der das 14 mal geteilt hat durch 10 Teilen, z.B. mit CD4018. Und nochmal durch einen CD4060 herunterteilen lassen. 6h ohne zusätzliche Logik auf 5% genau.
Hallo Andi, das ist problemlos möglich. Ich habe es realisiert mit einem timer, der alle 100ms überläuft und dann ein overflow-flag setzt. Dieses flag frage ich im main-loop ab und zähle meine Zeit mit einer anderen Variable mit. Und falls "time == 6*10*3600*", führe ich das aus was ich möchte. Falls Stromverbrauch kritisch: Watchdoginterrupt.
Andi schrieb: > Er muß nicht besonders genau sein soll halt alle 6h eine Messung machen > dabei ist es unwichtig ob es jetzt nach 5,5h oder erst nach 6,5h > geschieht. Ein CMOS IC 4060 ist das, was Deine Aufgabe schnell und preiswert löst: Langzeittimer.
Hauspapa schrieb: > Ein Uhrenquarz, am CD4060. Nachdem der das 14 mal geteilt hat durch 10 > Teilen, z.B. mit CD4018. Und nochmal durch einen CD4060 herunterteilen > lassen. 6h ohne zusätzliche Logik auf 5% genau. Komisch. CD4060+CD4018 würde ich jetzt schon als "zusätzliche Logik"(-Chips) betrachten. Den Uhrenquarz kann man auch direkt an den Mega32 klemmen, wenn man's denn so genau braucht und der Stromverbrauch wichtig ist. 2 ICs weniger, und dafür auf ~30ppm genau. Ansonsten: http://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC
Die dafür nötigen Programmbytes fühlen sich einsam in dem riesengroßen ATmega32. Nimm den kleinsten AVR, den Du kriegen kannst, z.B. ATTiny12: Beitrag "Re: 24h Schalter mit Attiny 12" Das Programm von 24h auf 6h zu ändern, wirst Du schon schaffen. Peter
Hallo euch allen, ihr seid echt Spitze, ich danke euch! Jetzt hab ich ja tausende von möglichkeiten! Werd euch auf dem laufenden halten aber jetzt erst mal in die Haia gehen :)
2Stk. CD4060 plus 2 Stk. CD4018 geht auf 0.4% genau. Das sind in 6 Stunden 1min 36s daneben. Ohne Tiny und ohne Programmieren. Oder ein Tiny und kein Logikgrab da stimme ich voll zu. 2Stk. CD4060 plus 4 Stk. CD4018 geht dann ganz genau. jetzt dürft Ihr mich schlagen
Er will "eine Messung machen", es geht also offenbar nicht nur um den Timer (der, wenn man erst mal einen uC an einen Quartz angeschlossen hat nur noch ein simples Programm ist), sondern wohl auch um Erfassung von Analogwerten und Speicherung. Daher sind Lösungen mit CD4060 wohl Humbug, denn da misst nix.
Ich habe Euch ja verstanden. Vermutlich würde ich selbst auch einen uC nehmen. Der Vollständigkeit halber: Ein 6,144 MHz Quarz und 2 74HC4060 braucht für 6 Stunden ziemlich genau 4 Minuten zu lange. Für einen CD4060 sind die 6 MHz vermutlich etwas schnell. Wenn es nur um einen Trigger geht finde ich 2 Standardschaltkreise + Quarz nicht schlecht. Leider hat man den passenden Quarz und die ICs meist nicht im Haus. Den uC schon eher.
Hallo, wie findet ihr folgenden Vorschlag. Mit einem uHz Timer z.Bsp.: LTC6991 den Controller alle 6 Stunden aufwecken, die Messung machen und wieder schlafen. Der LTC6991 ist einstellbar von 1ms bis 9,5h Das ist doch das einfachste, oder? mfg Rene
Hauspapa schrieb: > Ich habe Euch ja verstanden. Vermutlich würde ich selbst auch einen uC > nehmen. Der Vollständigkeit halber: > > Ein 6,144 MHz Quarz und 2 74HC4060 braucht für 6 Stunden ziemlich genau > 4 Minuten zu lange. Für einen CD4060 sind die 6 MHz vermutlich etwas > schnell. Wenn es nur um einen Trigger geht finde ich 2 > Standardschaltkreise + Quarz nicht schlecht. Leider hat man den > passenden Quarz und die ICs meist nicht im Haus. Den uC schon eher. Der Fragesteller hat auch seine Vorstellungen von der zu erzielenden Genauigkeit gegeben. 6 Stunden +/- 0.5 Stunden. Das erreicht man mit einem µC (er hat bereits einen Mega32) locker auch ohne Quarz und (auch wenn ich jetzt geschlagen werde) mit ganz banalen Delay-Schleifen.
Rene Schube schrieb: > Mit einem uHz Timer z.Bsp.: LTC6991 den Controller alle 6 Stunden > aufwecken, die Messung machen und wieder schlafen. Der LTC6991 ist > einstellbar von 1ms bis 9,5h > > Das ist doch das einfachste, oder? Genau wie Lösungen mit RTC-Chip, wo man sich nen "Wecker" stellen kann... Macht manchmal Sinn. Ist aber nicht "das einfachste". Wenn die Schaltung z.B. Jahrelang aus einer Knopfzelle laufen soll, kann es lohnen einen besonders sparsamen Zusatzchip einzusetzen, um im Durchschnitt ein paar 100 nA weniger zu verbrauchen. Extrem niedriger Stromverbrauch war aber keine der Anforderungen. Besonders hohe Genauigkeit auch nicht. Also reicht die allerbilligste Lösung, und die ist halt rein in Software. Sogar der interne 8MHz RC-Oszi im ATMega würde reichen, nochmal 20 Cent für nen Quarz eingespart...
Ganz einfach. Besorge dir einen DS1371 Zähler (Sekundenzähler). Den steuerst du per I2C an. Alles easy. Wenn du dann fragen bei der Umsetzung hast, meldest du dich hier noch mal.
af schrieb: > Ganz einfach. Besorge dir einen DS1371 Zähler (Sekundenzähler). Den > steuerst du per I2C an. Alles easy. Wenn du dann fragen bei der > Umsetzung hast, meldest du dich hier noch mal. Siehe oben. Exakt gleiche Begründung. Ist nicht easy, ist unnützer und teurer Mehraufwand.
Also nochmals danke, hab da grad was mit delay schleifen gehört wie genau funktioniert sowas? Werden dazu auch timmer verwendet? Das Programm von Peter Danneger sieht echt gut aus, aber leider in basic geschrieben such eher was in C. von irgendwelchen externen Bauteilen wollte ich mich eigentlich fern halten, die Genauigkeit ist mir nicht so wichtig.
Das Programm von Peter Danneger sieht mir eher wie Assembler aus, oder meine Basic-Kenntnisse sind schon zu stark eingerostet :-) In C z.B. von der Idee her:
1 | void main() |
2 | {
|
3 | int i, j; |
4 | for (i = 0; i < 1000; i++) { |
5 | for (j = 0; j < 1000; j++) { |
6 | // tu nix
|
7 | }
|
8 | }
|
9 | ledAn(); |
10 | stop(); |
11 | }
|
Die Verschachtelung der Schleifen brauchst du, falls der "int"-Zahlenwert z.B. nur 16 Bit ist. Ausprobieren, wie viel Ebenen mit welcher Schleifenlänge du brauchst. Bei guten Compilern wird so eine Schleife wegoptimiert, daher bei "tu nix" per Inline-Assembler noch ein "nop" einbauen, oder z.B. eine Dummy-Variable hochzählen. PS: das ist eine schnell gehackte Lösung und nicht gut, da wenn du mal einen neuen Compiler installierst, es eine andere Verzögerung haben könnte. Besser per Interrupt einen genauen Takt generieren lassen und dann zählen, oder auch einfach nur Timerregister in einer Endlosschleife auswerten. Für eine Einmalanwendung, die du später nie wieder ändern willst, reicht es aber aus.
@ Frank Buss 32 oder 64 bit Variablen sind auch kein thema... wenn du schon einen µC hast dann mit Timer durchlaufenlassen und im overflow interrupt hochzählen ( 32 bit variable sollte reichen) oder mit einem hier vorgeschlagenen rtc chip hat den vorteil das dass dann gegen stromausfall sicherer ist. die lösung mit externen cmos steinen is doch völliger humbug bringt ja null vorteile teilen kann ein µC ganz gut und einen Uhrenquarz kann man auch dranhängen (ja die elektronik zum ansteuern is da schon drinn) gruß sven
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.