Hi,
der Timer wird vor den Codeausschnitten gestartet, und läuft mit 32kHz.
Im Timerinterrupt schalte ich einen Pin ein und aus.
Ich habe mittlerweile das Programm komplett leergemacht, die Beschaltung
sicherheitshalber entkoppelt, die Schaltung aus einer Batterie (3.2V)
versorgt. Interner Takt mit 8MHz.
1 | #include <avr/io.h>
|
2 | #include <stdint.h>
|
3 | #include <stdlib.h>
|
4 | #include <avr/sleep.h>
|
5 | #include <avr/interrupt.h>
|
6 | #include <avr/pgmspace.h>
|
7 |
|
8 | ISR(TIM0_COMPA_vect)
|
9 | {
|
10 | PORTB |= 1<<PB0;
|
11 | GIMSK = (1<<PCIE);
|
12 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
13 | PORTB &= ~(1<<PB0);
|
14 | }
|
15 |
|
16 | ISR(PCINT0_vect)
|
17 | {
|
18 | GIMSK &= ~(1<<PCIE);
|
19 | set_sleep_mode(SLEEP_MODE_IDLE);
|
20 | }
|
21 |
|
22 | int main( void )
|
23 | {
|
24 |
|
25 | OSCCAL = 0x55;
|
26 |
|
27 | PORTB = 1<<PB2;
|
28 | DDRB = 1<<PB0;
|
29 |
|
30 | ACSR = 1<<ACD;
|
31 |
|
32 | TCCR0A = 1<<WGM01;
|
33 | TCCR0B = 1 << CS00;
|
34 | OCR0A = 250;
|
35 | TCCR1 = 1<<PWM1A | 1<<CS10 | 1<<COM1A1;
|
36 | OCR1A = 0;
|
37 |
|
38 | TIMSK = 1<<OCIE0A;
|
39 | MCUCR = 0;
|
40 | GIMSK = 1<<PCIE;
|
41 | PCMSK = 1<<PCINT2;
|
42 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
43 | sei();
|
44 | for (;;)
|
45 | {
|
46 | sleep_mode();
|
47 | }
|
48 | }
|
Nach Anlegen der Versorgung messe ich an PB0 erwartungsgemäß je einen
High-Impuls beim Drücken/Loslassen von PB2. Das Ganze funktioniert sogar
mehrmals hintereinander, aber irgendwann ist dann Schluß - warum?