Hallo,
Also wenn ich mein Programm Simuliere, wird nicht PD6 (Capture Pin) verwendet, sondern PD4 (OC1B). Sollte nicht PD6 verwendet werden sobald ich das Register ICIE1 auf High setze?
Meine 2 Frage ist, wenn ich einen Timer2 bis OCR2A laufen lasse, dann kommt es zu einem Overflow Interrupt, dabei wird der Timer auf 0 gesetzt. Zudem möchte ich, wenn Timer1 ein Interrupt aufruft, sol Timer2 gelöscht werden. Wenn ich das Overflow Flag setze(bei Timer2), löscht er sich nicht. Habt ihr eine Idee wie ich das am besten realisieren kann? TCNT2= 0 geht offenbar zu langsam??
lg
Code:
#include <avr/io.h>
#define F_CPU 20000000
#include <util/delay.h>
#include <avr/interrupt.h>
// Umdrehung durch Hallsensor messen
uint8_t softtimer = 0, LB =0, HB = 0;
double TIME=0, OLDTIME = 0;
ISR(TIMER1_OVF_vect) // Timer1 Überlauf
{
softtimer++; // zählen der Überläufe
}
ISR(TIMER1_CAPT_vect) // Flanke an ICP pin
{
// Variablendeklaration
LB = ICR1L; // low Byte zuerst, high Byte wird gepuffert
HB = ICR1H;
TIME = (HB<<8)| LB;
if(softtimer) {
TIME += 65535 * softtimer-OLDTIME;
TIFR1 = (1<<TOV1);
}
OLDTIME = TIME;
}
int main(void) {
TCCR1A = 0; // kein PWM, kein INPUT bei OC1...
TCCR1B |= (1<<ICES1); // reagiert bei steigender Flanke
TCCR1B |= (1<<CS11) | (1<<CS10); // TAKT /64
TIMSK1 |= (1<<ICIE1)|(1<<TOIE1); // ICP steigende Flanke und overflow
TIFR1 |= (1<<TOV1);
DDRC = 0xff;
PORTC =0;
long int Zahl =0;
while(1){
sei();
Zahl = TIME;
cli();
PORTC = Zahl;
sei();
}
return 0;
}
Lesezeichen