Hallo, würde gerne zwei timer in meinem Prog. implementieren. Timer 2
nutze ich zum aufwachen aus dem save-mode. Hab den quellcode aus dem
Tutorial kopier, funktioniert alles einwandfrei. Jetzt wollte ich einen
zweiten timer (timer0) einbauen um die dauer des z.B. Sendemodus
festzulegen. Z.B. Interrupt zum aufwecken kommt alle 250ms, schlafen
legen möchte ich aber den uC nach 100ms. Leider falle ich in den
Schalfmodus und wache nicht mehr auf. Bekomme einmal die Ausgabe "rex_1"
sonst nichts.
1
//***********************TIMER 2 configuration
2
// Analogcomparator ausschalten
3
4
ACSR=0x80;
5
6
// Timer2 konfigurieren
7
8
ASSR=(1<<AS2);// Timer2 asynchron takten,
9
10
_delay_ms(1000);// Einschwingzeit des 32kHz Quarzes
11
TCCR2=3;// Vorteiler 32 -> 0,250s
12
while((ASSR&(1<<TCR2UB)));// Warte auf das Ende des Zugriffs
Die geheime sleep_function() is eigentlich nicht so geheim :)
Habe auch aus dem Tutorial kopiert
1
voidsleep_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
Du hast an einigen Stellen widersprüchlich zitiert. Bitte zeige mal
die (ggf. gekürzten) Dateien compilierfähig in einer Form, in der
dein Fehler reproduzierbar ist. Ob innerhalb des Artikels oder als
Anhang, ist mir ziemlich wurscht, aber sie sollten geschlossen
übersetzbar sein. (Makefile muss nicht unbedingt sein, die wesentlichen
Compileroptionen genügen mir.)
Also habe jetzt mal das Tutorial genomme und dieses ein bisschen
erweitert. Rufe jetzt den sleep_mode durch einen Interrupt meines
Timers0 auf. Dasselbe Problem. Ist der sleep_mode() ind der main
funktion so funktioniert es einwandfrei.
1
#define F_CPU 1000000
2
3
#include<avr/io.h>
4
#include<avr/sleep.h>
5
#include<avr/interrupt.h>
6
#include<util/delay.h>
7
8
9
#include<avr/pgmspace.h>
10
#include<avr/eeprom.h>
11
#include<stdlib.h>
12
13
#include"portbits.h"
14
#include"global.h"
15
#include"uart.h"
16
#include"leds.h"
17
18
// globale Variablen
19
20
volatileuint8_tflag;
21
volatileunsignedintsleep_timer;
22
unsignedintan_aus=0;
23
24
25
voidsleep_function(void);
26
27
// lange, variable Wartezeit, Einheit in Millisekunden
28
29
voidlong_delay(uint16_tms){
30
for(;ms>0;ms--)_delay_ms(1);
31
}
32
33
intmain(void){
34
35
uart_puts("test_0");
36
37
// IO konfigurieren
38
39
DDRA=0xFF;
40
DDRB=0xFF;
41
DDRC=0xFF;
42
DDRD=0xFF;
43
44
// Analogcomparator ausschalten
45
46
ACSR=0x80;
47
48
// Timer2 konfigurieren
49
50
ASSR=(1<<AS2);// Timer2 asynchron takten
51
long_delay(1000);// Einschwingzeit des 32kHz Quarzes
52
// TCCR2 = 6; // Vorteiler 256 -> 2s
53
//Überlaufperiode
54
TCCR2=(1<<CS20)|(1<<CS22);//wake up period 1s for master
55
//(128), 1,02s
56
while((ASSR&(1<<TCR2UB)));// Warte auf das Ende des Zugriffs
TheBeginner schrieb:> OCR2 = 0; // Dummyzugriff> while((ASSR & (1<< OCR2UB))); // Warte auf das Ende des Zugriffs
Was du damit bezweckst, verstehe ich nicht.
> //wake up period 1s for master> //(128), 1,02s
Wie kommst du auf "1,02 s"? Es sind (im Rahmen der Genauigkeit deines
Quarzes) 1,00 s.