TCCR2B=1<<CS22|1<<CS21|1<<CS20;// Prescaler auf 1024
27
28
while((ASSR&(1<<TCR2BUB)));// synchronisieren
29
TIMSK2=(1<<OCIE2A);
30
set_sleep_mode(SLEEP_MODE_PWR_SAVE);
31
sei();
32
33
DDRD=0xff;
34
DDRC=0xff;
35
DDRB&=~(1<<taster_1);
36
37
while(1)
38
{
39
while((ASSR&(1<<TCR2AUB)));
40
sleep_mode();
41
TCCR2A=TCCR2A;// sonst Mehrfachinterrupts:
42
43
if(sec<60*(32)){}//hier prescaler einbinden von 32
44
else{sec=0;min++;}
45
if(min<=60){}
46
else{min=0;hr++;}
47
if(hr<=12){}
48
else{hr=1;}
49
50
PORTD=min;
51
PORTC=hr;
52
53
}
54
}
55
56
ISR(TIMER2_COMPA_vect){
57
sec++;
58
}
OCR2A lasse ich auf 0 um die 32Hz zu erzeugen. Allerdings muss ich in
der if-Bedingung diesen als Faktor dazu rechnen oder ?
1
if(sec<60*(32)){}//hier prescaler einbinden von 32
ich weiß, dass das wahrscheinlich kein all zu schwieriges Unterfangen
ist. Aber ich sitze da schon wieder 2 Tage dran. Kann mir einer sagen
welche Werte ich wo einzusetzen habe ?
Vielen Danke
ich weiß es ehrlich gesagt nicht genau. Ich habe das Programm noch nicht
mehrere Stunden laufen lassen um eine aussagekräftige Antwort zu
liefern.
Bevor ich aber nach dem Motto: Trial and Error versuche die richtigen
Werte (wahrscheinlich tagelang, man hat ja auch noch anderes zu tun..)
herauszufinden, dachte ich frage ich hier mal unter den Profis für denen
das ein Leichtes ist, mir die richtigen Werte mitzuteilen.
M. S. schrieb:> OCR2A lasse ich auf 0 um die 32Hz zu erzeugen.
Ich weiß gar nicht, ob das funktioniert. Hat 0 nicht eine besondere
Bedeutung?
> Allerdings muss ich in der if-Bedingung diesen als Faktor dazu> rechnen oder ?>
1
if(sec<60*(32)){}//hier prescaler einbinden von 32
Wenn du den Interrupt mit 32 Hz auslöst und die Variable sec mit jedem
Interrupt inkrementierst, dann schon.
Nur:
1. Warum nennst du die Variable sec (wie "Sekunde"), obwohl sie doch
gar nicht die Sekunden zählt, sondern 32-tel Sekunden?
2. Warum überhaupt 32 Interrupts pro Sekunde? Laß doch den Timer die
Frequenz bis auf 1Hz runter teilen. Und falls du die 32Hz aus
irgendeinem Grund brauchst (ich sehe keinen), dann zähle die 32-tel
Sekunden halt in einer extra Variable.
3. Warum sind sec, min und hr jeweils vom Typ uint32_t ? Die
können doch nur Werte von 0-59 bzw. 0-23 annehmen. Dafür braucht man
doch keinen 32-Bit Datentyp.
Hau das ganze Sleep-Gedöns raus.
Das Stromsparen macht man erst ganz zum Schluß, nachdem alles andere
einwandfrei läuft.
Nie nen Haufen Baustellen gleichzeitig aufreißen, immer einen Schritt
nach dem anderen.
M. S. schrieb:> Ich habe das Programm noch nicht> mehrere Stunden laufen lassen um eine aussagekräftige Antwort zu> liefern.
Grobe Abweichungen bemerkt man doch schon nach wenigen Sekunden, wenn
man mit dem Ticken einer mechanischen Uhr vergleicht.
M. S. schrieb:> achso ich habe natürlich einen 32,768kHz Uhrenquarz an die TOSC1..2 pins> angeschlossen als Referenz.
32768Hz/32Hz = 1024.
Du brauchst also einfach einen 10-Bit Zähler, der geradeaus durchläuft.
Und beim Überlauf hast du deine 32Hz.
> OCR2A lasse ich auf 0 um die 32Hz zu erzeugen
Da ist also gar kein Compare-Register nötig. Ein simpler TOV reicht aus.
Axel S. schrieb:> dann zähle die 32-tel Sekunden halt in einer extra Variable.
Und weil es der Timer 2 ist, könnte der per 1024-Prescaler gleich die
32stel Sekunden mitzählen.
M. S. schrieb:> Bevor ich aber nach dem Motto: Trial and Error versuche die richtigen> Werte (wahrscheinlich tagelang, man hat ja auch noch anderes zu tun..)> herauszufinden, dachte ich frage ich hier mal unter den Profis für denen> das ein Leichtes ist, mir die richtigen Werte mitzuteilen.
Meist liegen die Fehler im
* off by one (<x statt <=x)
* falschen Takt (nur halber, viertel oder doppelter)
* falsche Zahl (32*60 in 8 Bit)
lass das ganze darum einfach schneller laufen (z.B. die Takte nur bis 32
statt 32*60, also Minuten als Sekunden). Dann siehst Du offensichtliche
Fehler sofort. Dann 12 Minuten (als Stunden) gestoppt auf eine Sekunde,
dann bist Du ziemlich nah an perfekt, in wenigen Minuten (+Pause mit
Eieruhr bei den 12 Minuten).
Danach mit echten Werten nach einer Minute und nach einem Tag prüfen.
M. S. schrieb:> ich weiß, dass das wahrscheinlich kein all zu schwieriges Unterfangen> ist.
Ist es nicht.
> Aber ich sitze da schon wieder 2 Tage dran.
Du hättest sie nutzen sollen, um das verdammte Datenblatt zu lesen. Dann
ist das eine Sachen von 10 Sekunden, das SELBER korrekt umzusetzen.
Wenn man allerdings nur raubkopierten Code zusammenleimt, kann man mit
solch trivialen Problemen natürlich Tage an Lebenszeit verschwenden.
Im richtigen Moment die richtige Entscheidung treffen. Das ist der
Trick...
c-hater schrieb:> Wenn man allerdings nur raubkopierten Code zusammenleimt, kann man mit> solch trivialen Problemen natürlich Tage an Lebenszeit verschwenden.
Wenn man wirklich stehlen muss, dann nur von den Besten!
W.Gates schrieb:> Wenn man wirklich stehlen muss, dann nur von den Besten!
Tja, wenn man ein voll funktionierendes tolles Auto geklaut hat, muss
man trotzdem immer noch lernen, wie man es fährt, wenn man damit nicht
im Graben landen will...
M. S. schrieb:> OCR2A lasse ich auf 0 um die 32Hz zu erzeugen.
Das steht dann wohl eher für 256.
Setze den Prescaler auf 4 und nutze den Timerüberlaufinterrupt.
c-hater schrieb:> Im richtigen Moment die richtige Entscheidung treffen. Das ist der> Trick...
Das Wort zum Sonntag:
Es gibt NUR drei Wege, welche zum Ziel führen:
1. Der goldene Weg
Problem analysieren, Lösung erarbeiten und durchsetzen.
2. Der silberne Weg
Abschauen, genau so manchen, wie die Anderen.
3. Der bronzene Weg
Aus den gemachten Erfahrungen lernen.
---
Alle anderen Wege führen ins Versagen.
Uups, gar nicht geguckt, ob 4 überhaupt ein legaler Prescalerwert ist.
Stellt man ihn auf 16, passt Overflow natürlich nicht für 32Hz, dann
müsste Compare-Interrupt auf 64. Wenn man dann aber keinen reload macht,
kommt der nächste Compare trotzdem erst wieder in 256 Takten, es sei
denn, die Interrupt-Routine seztz ihn weiter auf 128 und 192 und 0 und
64. Macht man einen reload per Programm, passt es um ein paar
Mikrosekunden nicht.
MaWin schrieb:> Uups, gar nicht geguckt, ob 4 überhaupt ein legaler Prescalerwert ist.> Stellt man ihn auf 16, passt Overflow natürlich nicht für 32Hz, dann> müsste Compare-Interrupt auf 64. Wenn man dann aber keinen reload macht,> kommt der nächste Compare trotzdem erst wieder in 256 Takten, es sei> denn, die Interrupt-Routine seztz ihn weiter ...
Ähhm. Nein. Die AVR-Timer haben dafür praktischerweise den CTC Mode.
CTC = Clear Timer on Compare match.