Forum: Mikrocontroller und Digitale Elektronik timer overflow interrupt atmel unterbinden


von Clemens K. (clemensk)


Lesenswert?

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!

von Floh (Gast)


Lesenswert?

Output compare ist nicht dasselbe wie overflow.
Laut Kommentar oben ist Overflow an, und der kommt dann natürlich auch.
Übrigends läuft ein Timer immer, solange er über den Prescaler nicht 
gestoppt ist. :-)

von spess53 (Gast)


Lesenswert?

Hi

>ISR(SIG_INTERRUPT0) {  //interrupt bei fallender flanke gestartet
>tcnt0=0x00; // timer starten
>}

Der läuft seit:

>  TCCR0 = 0x03;  // normal mode, no output compare, internal clock,

>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?

Der löst jedes mal aus, wenn TCNT=7 ist.

Um welchen Controller geht es denn?

MfG Spess

von Clemens K. (clemensk)


Lesenswert?

um einen atmega 32..

der kommentar oben ist falsch.
1
TIMSK = 0x02;    // enable interrupt on overflow
da stand mal 0x03, dann passt das.

ich dachte ich starte den timer mit tcnt0=0x00.

weil jetzt löst er 2 mal aus. wenn der interrupt den tcnt0 startet und 
wenn nichts passiert alle 255 zähler, sprich alle 1ms bei 16mhz atmel 
atmega 32.

von spess53 (Gast)


Lesenswert?

Hi

>der kommentar oben ist falsch.
>TIMSK = 0x02;    // enable interrupt on overflow
>da stand mal 0x03, dann passt das.

0x03 ist Overflow und Compare-Interrupt.

>ich dachte ich starte den timer mit tcnt0=0x00.

Der Timer wird gestartet, wenn du die CS-Bits setzt.

MfG Spess

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.