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