Forum: Mikrocontroller und Digitale Elektronik Zähler mit Interrupts


von malt (Gast)


Lesenswert?

Hallo,

habe mit Atmega8 mit f_cpu=8MHz einen Zähler aufgebaut. Gesteuert wird 
er über die beiden externen Interrupts. INT0 erhält eine Art Gate 
Signal, wenn das Low ist sollen an INT1 Impulse gezählt werden. Das 
ganze funktioniert leider nur bis zu einer Impulsfrequenz von ca. 
180kHz. Das kommt mir etwas lahm vor. Bin dankbar für Tips zur 
Verbesserung.

Hier der Code:
1
volatile uint8_t FLAG;
2
volatile uint16_t cnt;
3
4
5
ISR (INT0_vect)  {    // Gate
6
  GIMSK |= (1 << 7);  // INT1 an
7
  FLAG=1;
8
}
9
10
ISR (INT1_vect)  {    // Counter
11
  cnt++;
12
}
13
14
...
15
16
int main() {
17
18
//Interupt 0: Gate
19
MCUCR &= ~(1 << 0);   //ISC00
20
MCUCR |= (1 << 1);    //ISC01
21
GIMSK |= (1 << 6);
22
23
//Interupt 1: Clock
24
MCUCR &= ~(1 << 2);   //ISC10
25
MCUCR |= (1 << 3);    //ISC11
26
...
27
sei();
28
FLAG=0;
29
cnt=0;
30
...
31
while(1) {
32
  if (FLAG) {   //Gate down
33
    loop_until_bit_is_set(PIND, 2);  //Gate up
34
    GIMSK &= ~(1 << 7);    //INT1 aus
35
//  in cnt steht jetzt der Zählwert...
36
        ...
37
    FLAG=0;
38
    cnt=0;
39
  }        
40
}

von Matthias L. (Gast)


Lesenswert?

>an INT1 Impulse gezählt werden ... Impulsfrequenz von ca. 180kHz.
1
ISR (INT1_vect)  {    // Counter
2
  cnt++;
3
}

Was hast du erwartet, wenn du das "per Hand" machst. Nutze doch den 
Timer als Zähler mit externem Clock. Du musst den nur in abhängigkeit 
von deinem FGatesignal ein/ausschalten bzw parametrieren.

Siehe Datenblatt mega8, Seite 98, Tabelle40. Die untersten beiden 
Zeilen.

von malt (Gast)


Lesenswert?

ok, das klappt. Hätte ich selber drauf kommen müssen. Mir war nicht 
klar, daß der interne Counter so viel schneller ist als ein cnt++ in der 
ISR.
Danke!

von Matthias L. (Gast)


Lesenswert?

>daß der interne Counter so viel schneller ist als ein cnt++ in der ISR.

Der interne Counter ist Hardware, dein cnt++ Software.

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.