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