Hallo,
Ich stehe hier vor einem Problem und hoffe, daß mir jemand helfen kann.
Und zwar experimentiere ich zur Zeit mit meinem Butterfly und versuche
eine Uhr zu Programmieren.
Zusätzlich möchte ich, daß der Schmetterling nach einer Zeit in den
Powersave Modus wechselt.
An sich keine große Sache, ich habe mir das eine oder andere aus dem
Originalprogramm abgeschaut und die Uhr läuft sehr genau.
Erst nachdem ich versuche in den Powersave Modus zu wechseln, gibt es
ein Problem und zwar wechselt der Butterfly in Powersave läßt sich auch
wieder Wecken, nur die Zeit stimmt danach absolut nicht mehr.
Ich würde sagen in 5 Minuten Powersave ist die Uhr etwa 20 Minuten
weitergelaufen...
Ich hänge einfach die wichtigsten Sachen rein
Für die Uhr habe ich eine struct genommen:
1 | typedef struct {
|
2 | uint8_t sek;
|
3 | uint8_t min;
|
4 | uint8_t std;
|
5 | uint8_t tag;
|
6 | uint8_t monat;
|
7 | uint8_t jahr;
|
8 | } Zeit;
|
9 |
|
10 | volatile Zeit uhr;
|
Timer2 Init:
1 | void RTC_Init(void) {
|
2 | cli();
|
3 | TIMSK2 &=~(1<<TOIE2);
|
4 | ASSR = (1<<AS2);
|
5 | TCNT2 = 0;
|
6 | TCCR2A |= (1<<CS22) | (1<<CS20);// select precaler: 32.768 kHz / 128 = 1 sec between each overflow
|
7 | while((ASSR & 0x01) | (ASSR & 0x04));// wait for TCN2UB and TCR2UB to be cleared
|
8 | TIFR2 = 0xFF; // clear interrupt-flags
|
9 | TIMSK2 |=(1<<TOIE2); // enable Timer2 overflow interrupt
|
10 | sei();
|
11 | uhr.sek = 0;
|
12 | uhr.min = 20;
|
13 | uhr.std = 19;
|
14 | uhr.tag = 1;
|
15 | uhr.monat = 12;
|
16 | uhr.jahr = 7;
|
17 |
|
18 | }
|
Der Timer 2 Überlauf Interrupt:
1 | ISR(TIMER2_OVF_vect) {
|
2 | if (++uhr.sek >= 60) {
|
3 | PowerSaveTimer++;
|
4 | uhr.sek = 0;
|
5 | if (++uhr.min >= 60) {
|
6 | uhr.min = 0;
|
7 | if (++uhr.std >=24){
|
8 | uhr.std = 0;
|
9 | }
|
10 | }
|
11 | }
|
12 | }
|
und die Endlosschleife:
1 | while(1){
|
2 | if (!PowerSave) {
|
3 | Sek_Local = uhr.sek;
|
4 | while(Sek_Local == uhr.sek);
|
5 | ShowClock();
|
6 | }
|
7 | if (PowerSaveTimer >= PowerSaveTimeout) {
|
8 | PowerSaveTimer = 0;
|
9 | PowerSave = TRUE;
|
10 | }
|
11 | if (PowerSave) {
|
12 | LCDCRA &=~(1<<7);
|
13 | set_sleep_mode(SLEEP_MODE_PWR_SAVE);
|
14 | sleep_mode();
|
15 | if (!(PINB&(0x40))) {
|
16 | PowerSave = FALSE;
|
17 | LCDCRA |=(1<<7);
|
18 | }
|
19 | }
|
20 |
|
21 | }
|
Wie gesagt, lasse ich die Sache mit Powersave weg läuf die Uhr mehrere
Tage ohne Problemme.
Weiß da jemand einen Rat ?
Gruß Sebastian