timer overflow interrupt atmel unterbinden

OP #2175828
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!
Gast #2175833
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. :-)
Gast #2175842
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
OP #2175854
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.
Gast #2175862
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.