hallo,
hab erst vor kurzem begonnen mich mit interrupts zu beschäftigen und
wollte nun meinen ersten int mal ausprobieren. nur leider scheint er
nicht wirklich zu funktionieren
hier mal mein quelltext:
1 | #include <avr/io.h>
|
2 | #define F_CPU 1000000UL /* Takt:1MHz */
|
3 | #include <util/delay.h>
|
4 | #include <stdlib.h>
|
5 | #include <avr/interrupt.h>
|
6 |
|
7 |
|
8 | long int sek;
|
9 | volatile int ms;
|
10 |
|
11 |
|
12 | int main(void)
|
13 | {
|
14 |
|
15 | ms=0;
|
16 | sek=0;
|
17 |
|
18 |
|
19 | DDRB = 0b11100111;
|
20 |
|
21 |
|
22 | sei(); /* Global Interrupts aktivieren */
|
23 | TCCR0A = (1<<WGM01); /* CTC Modus an */
|
24 | TCCR0B = (1<<CS00)| (1<<CS02); /* Timer Vorteiler auf 1024 (-->1000000MHz/1024) */
|
25 |
|
26 | OCR0A = 125-1; /* ((1000000/8)/1000) = 125 --> Interrupt aller 1ms */
|
27 |
|
28 | TIMSK0 |= (1<<TOIE0); /* Compare Interrupt(Interrrupt zu beliebigem Zeitpunkt) erlauben */
|
29 |
|
30 |
|
31 |
|
32 | while(1)
|
33 | {
|
34 |
|
35 | PORTB=0b000011000;
|
36 |
|
37 | if (ms==1000) /* mache aus ms -> s */
|
38 | {
|
39 | sek=sek+1;
|
40 | ms=0;
|
41 | }
|
42 |
|
43 |
|
44 | if ( best. Bedingung )
|
45 | {
|
46 |
|
47 | PORTB=0b00011010;
|
48 | ms=0;
|
49 |
|
50 | if (sek>=10) /* wenn 10sek vergangen ohne änderung */
|
51 | {
|
52 | PORTB=0b00011011;
|
53 | _delay_ms(2000);
|
54 | PORTB=0b00011000;
|
55 | ms=0;
|
56 | }
|
57 |
|
58 | }
|
59 |
|
60 | ...
|
61 |
|
62 |
|
63 | }
|
64 |
|
65 | }
|
66 |
|
67 |
|
68 | ISR (TIMER1_COMPA_vect) /* Interrupt Aktion alle 1ms */
|
69 | {
|
70 |
|
71 | ms=ms+1;
|
72 |
|
73 | reti();
|
74 | }
|
der sinn des prog soll also sein, dass der interrupt aller 1ms die var
"ms" um 1 erhöht. wärnddessen soll im hauptprogramm eine schleife
einsetzten, wenn der vorherige zustand 10s andauert.
noch zu ergänzen wäre, dass beim compilieren die warnung
"timer0_compa_vect appears to be a misspelled handler" und sonst keine
fehler auftreten.
mfg,
Tom