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
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
voidmain()
2
{
3
inti,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