Hallo, ich möchte für ein Projekt möglichst lange (1-3 stunden) den Attiny2313 auf einer niedrigen Taktrate im IDLE modus haben. um mich auf diese lange zeit vorzuarbeiten habe ich es mit einem testlauf von einer sekunde probiert. bei einer clock-fuse einstellung von 8mhz und CKDIV unprogrammiert. irgendwie bekomme ich zwischen den beiden flanken von PB0 [fallende flanke] -> [steigenden flanke] nur 70ms anscheinend bleibt mein µC auf 8Mhz / 8 = 1Mhz , eigentlich müsste er aber deutlich langsamer laufen wegen: CLKPR = 7; // change F_CPU clock presc 128. ich bin ratlos warum er diese internal system clock prescaler von 128 nicht annimmt. wenn wer verbesserungsvorschläge hat wäre ich demjenigen sehr verbunden. es wird mit timer1 overflow vom sleep idle wieder aufgeweckt. CODE:
1 | #define DDR DDRB
|
2 | #define PORT PORTB
|
3 | #define PIN PB2
|
4 | #define F_CPU 1000000
|
5 | |
6 | #include <avr/io.h> |
7 | #include <util/delay.h> |
8 | #include <avr/interrupt.h> |
9 | #include <avr/sleep.h> |
10 | |
11 | ISR(TIMER1_OVF_vect) |
12 | {
|
13 | |
14 | }
|
15 | |
16 | void go_sleep (void) |
17 | {
|
18 | |
19 | CLKPR |= (1<<CLKPCE); |
20 | CLKPR = 7; // change F_CPU clock presc 128 |
21 | |
22 | set_sleep_mode(0); |
23 | sleep_enable(); |
24 | TCNT1 = 0; |
25 | |
26 | TCCR1B |= (1<<CS10); //TIMER1 presc 1 |
27 | sei(); |
28 | |
29 | sleep_cpu(); //SLEEP ab hier interrupt weckt mC wieder auf |
30 | sleep_disable(); //für sachgemäßes aufwecken |
31 | |
32 | TCCR1B =0; //TIMER1 stop |
33 | cli(); |
34 | |
35 | CLKPR |= (1<<CLKPCE); |
36 | CLKPR = 3; // change F_CPU clock presc 8 |
37 | }
|
38 | |
39 | int main (void) |
40 | {
|
41 | |
42 | |
43 | DDRB = 1; |
44 | PORTB = 0xFF; |
45 | PORTA = 0xFF; |
46 | PORTD = 0xFF; |
47 | ACSR |= (1<<ACD); //analog comparator disable |
48 | DIDR |= (1<<AIN1D)| (1<<AIN0D); |
49 | TIMSK |= (1<<TOIE1); //Timer1 ovf int. enable für sleep wake up |
50 | |
51 | |
52 | CLKPR |= (1<<CLKPCE); |
53 | CLKPR = 3; // change F_CPU clock presc 8 |
54 | |
55 | |
56 | PORTB |= (1<<PB0); |
57 | _delay_ms(150); |
58 | PORTB &= ~(1<<PB0); |
59 | _delay_ms(150); |
60 | while (1) |
61 | {
|
62 | PORTB |= (1<<PB0); |
63 | _delay_ms(5); |
64 | PORTB &= ~(1<<PB0); |
65 | _delay_ms(5); |
66 | go_sleep(); |
67 | }
|
68 | }
|