Hallo,
ich möchte folgendes machen:
mit tcnt0 = 0x00; den timer aufrufen und der soll nach einem
eingestellten counter max im ocr0 = 0x07; eine interrupt routine
starten.
mein code:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <avr/pgmspace.h>
|
4 | #include "timertest.h"
|
5 |
|
6 | void timerinit(void) {
|
7 | TCCR0 = 0x03; // normal mode, no output compare, internal clock, prescaler / 64
|
8 | OCR0 = 0x07;// set counter max, an int will be generated if max is reached
|
9 | TIMSK = 0x02; // enable interrupt on overflow
|
10 | return;
|
11 | }
|
12 |
|
13 | int main (void) {
|
14 |
|
15 | // set counter to zero
|
16 | timerinit();
|
17 | DDRA=0xFF;
|
18 | DDRD=0x80;
|
19 | DDRB=0xFF;
|
20 | sei();
|
21 | MCUCR = 0x02; // isc 01, fallende flanke auf int0, pd2 generiert interrupt
|
22 | // --- enable int0
|
23 | GICR |= 0x40;// int0, pd2 aktivieren
|
24 |
|
25 | while(1){
|
26 | PORTA=0x00;
|
27 | };
|
28 |
|
29 | ISR(SIG_INTERRUPT0) { //interrupt bei fallender flanke gestartet
|
30 | tcnt0=0x00; // timer starten
|
31 | }
|
32 |
|
33 | ISR(SIG_OUTPUT_COMPARE0) { // timer interrupt
|
34 | PORTA=0xFF;
|
35 | }
|
so.. was jetzt passiert: das starten und warten des timer0 funktioniert.
jedoch wird jedesmal wenn der timer counter bei 255 ist ein interrupt
ausgelöst und die isr(sig_output_compare0) routine gestartet. bei meinen
einstellungen müsste ja genau das jedoch deaktiviert sein, oder?
vielen dank für eure mühe!