Die geheime sleep_function() is eigentlich nicht so geheim :)
Habe auch aus dem Tutorial kopiert
1 | void sleep_function(void)
|
2 | {
|
3 | OCR2 = 0; // Dummyzugriff
|
4 | while((ASSR & (1<< OCR2UB))); // Warte auf das Ende des
|
5 | set_sleep_mode(SLEEP_MODE_PWR_SAVE);
|
6 | sleep_mode();
|
7 | }
|
also im Sendemodus benutze ich nur den Timer2 zum aufwecken des Systems.
Wenn ich aber, in den Empfangsmodus umschalte,
dann kommt der Timer0 ins spiel. Timer2 wird auf
die Dauer von 1 minute vergrößert. D.h beide Timer fangen gleich an,
Timer0 brings das System nach 250ms in den sleep_mode und
Timer2 (asynchron getaktet) soll das System dann nach
1 sec (250ms+750ms) wieder aufwecken. Leider falle ich ins Komma!
1 | //***********************TIMER 2 configuration
|
2 |
|
3 | ACSR = 0x80;
|
4 | ASSR = (1<< AS2); // Timer2 asynchron takten,
|
5 |
|
6 | _delay_ms(1000); // Einschwingzeit des 32kHz Quarzes
|
7 | TCCR2 = 3; // Vorteiler 32 -> 0,250s
|
8 |
|
9 | while((ASSR & (1<< TCR2UB))); // Warte auf das Ende des Zugriffs
|
10 | TIFR = (1<<TOV2); // Interrupts löschen (*)
|
11 | TIMSK =(1<<TOIE2);
|
12 |
|
13 | //***********************TIMER 0
|
14 |
|
15 | TCCR0 =(1<<CS02)|(1<<CS00); //(1/3686400)*1024*255=~0,07s
|
hier komme ich in den Empfangsmodus
1 | if(timer_==25) //timer_=14 are 7sec, button zähler
|
2 | {
|
3 | i_am_master=1; //after pressing button 30 sec,
|
4 | //slave(sender) becames master(receiver)
|
5 |
|
6 | timer_=0; //set timer to 0
|
7 |
|
8 | TCCR2 =(1<<CS20)|(1<<CS22); //wake up period 1s for master
|
9 | //(128), 1,02s, Timer2
|
10 |
|
11 | TIMSK |=(1<<TOIE0); //activate interupts for Timer0
|
12 |
|
13 | uart_puts("rxmode!\r\n ");
|
14 | sleep_timer=0;
|
15 | }
|
interupt funktionen
1 | ISR(TIMER0_OVF_vect)
|
2 | {
|
3 | sleep_timer++; //overflow every 65ms
|
4 | if(sleep_timer==6 && i_am_master==1) //325ms
|
5 | {
|
6 | rf12_rxmode_sleep(); //shut down RF12
|
7 | sleep_function();
|
8 | }
|
9 | }
|
10 |
|
11 | //******************TIMER OVERFLOW for 32768Hz
|
12 | ISR(TIMER2_OVF_vect)
|
13 | {
|
14 | if(i_am_master==0)
|
15 | {
|
16 | if(!BUTTON_1)
|
17 | {
|
18 | uart_puts("\r\noverflow_1\r\n");
|
19 | rf12_rxmode(); //fahre das RF12 hoch
|
20 | }
|
21 | }
|
22 |
|
23 | else //if I am master
|
24 | {
|
25 | sleep_timer=0;
|
26 | rf12_rxmode();
|
27 | uart_puts("\r\nwake_up_timer\r\n");
|
28 |
|
29 | }
|
30 | }
|