Hallo,
ich habe ein kleines Programm geschrieben, bei dem ein ATMega 8 als
Tacho fungieren soll. Dabei verwende ich den Timer1 im Capture-Mode und
habe an den ICP1 Pin den Reedkontakt (Magnetschalter) zu GND
angeschlossen. Den Pin habe ich über den internen Pull-Up nach VCC
gezogen. Außerdem soll jeder Timerüberlauf registriert werden, damit es
nicht zu falschen Ergebnissen kommt. Wenn die Interrupts nicht global
aktiviert sind, funktioniert das Programm ganz normal und überträgt zum
Beispiel eine inkrementierte Variable immer korrekt. Sind die Interrupts
aber aktiviert, so stürtzt er immer wieder ab (Variable geht wieder in
Ausgangswert). Von der Zeit her könnte der Absturz mit dem
Timer-Overflow zusammenhängen (nach ca. 8 Sekunden). Außerdem
funktioniert das Capture-Interrupt nicht, die ISR löst nicht aus.
Der relevante Code sieht so aus:
1 | #define F_CPU 2000000UL
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <stdint.h>
|
5 |
|
6 | volatile uint16_t capture;
|
7 | volatile uint8_t over; //Zählt die Anzahl der Overflows
|
8 |
|
9 | ISR(TIMER1_CAPT_vect){
|
10 | //Timer1 interrupt, immer wenn der Sensor auslöst
|
11 | TCNT1 = TCNT1 - ICR1; //Timer zurücksetzten
|
12 | capture = ICR1; //Capture speichern
|
13 |
|
14 | }
|
15 |
|
16 | ISR(TIMER1_OVF_vect){
|
17 | //Timer1 overflow
|
18 | over = over + 1; //Registriert den overflow
|
19 | }
|
20 |
|
21 | int main(void)
|
22 | {
|
23 |
|
24 | TCCR1A = 0b00000000; //Timer initialisieren
|
25 | TCCR1B = 0b10000100; //Prescaler 256
|
26 | TIMSK = 0b10001000; //Overflow Interrupt und Capture Interrupt aktivieren
|
27 | PORTB = 0b00000001;
|
28 | uint8_t i;
|
29 | sei(); //Interrupts global aktivieren
|
30 |
|
31 | while(1)
|
32 | {
|
33 | //Gelegentliche übertragung der Daten an Raspberry Pi, KEIN PROBLEM
|
34 | }
|
35 | }
|