Koertis
13.08.2010, 15:15
Hallo,
ich habe jetzt schon X mal das Datenblatt vom Atmega644 durchgeblättert, und habe auch mein Programm im AVR studio Simuliert.
Ich versuche den Caputre In Interrupt anszusprechen, ohne Erfolg.
Wenn ich im AVR Modus PD6 (ICP) auf High setze passiert nichts, wenn ich aber PD4 auf High setze springt er zum Interrupt TIMER1_CAPT_vect.
Wenn ich im Register per Mausklick das Flag ICF1 setze, springt er auch??
Sollte ICF1 nicht mit dem PD6 verbunden sein??? Habe ich ein Register übersehen?
Bitte helft mir
#include <avr/io.h>
#define F_CPU 20000000
#include <util/delay.h>
#include <avr/interrupt.h>
#define TICIE 4
// Umdrehung durch Hallsensor messen
uint8_t softtimer = 0, LB =0, HB = 0,Spalte=0;
double TIME=0, OLDTIME = 0, Overflow = 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;
OCR2A = TIME/5;
//TCNT1 =0;
TCNT2 =0;
if(Overflow)
Spalte--;
}
SIGNAL (TIMER2_COMPA_vect)
{Overflow = 0xFF;
sei();
if(Overflow)
Spalte++;
cli();
Overflow = 0;
}
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) | (1<<ICF1);
TCCR2A |= (1<<WGM21);// CTC Modus: Wenn der Timer OCR2B erreicht löst er ein Interrupt aus und beginnt von 0
//OCR2B = 0x02; // Gibt vergleichswert des TIMER 2 an
TCCR2B |= (1<<CS11) | (1<<CS10);
// Compare Interrupt erlauben
TIMSK2 |= (1<<OCIE2A);
TIFR2 |= (1<<OCIE2A); // Interrupt freischalten
DDRC = 0xff;
PORTC =0;
long int Zahl =0;
while(1){
sei();
Zahl = TIME;
cli();
PORTC = Zahl;
sei();
}
return 0;
}
ich habe jetzt schon X mal das Datenblatt vom Atmega644 durchgeblättert, und habe auch mein Programm im AVR studio Simuliert.
Ich versuche den Caputre In Interrupt anszusprechen, ohne Erfolg.
Wenn ich im AVR Modus PD6 (ICP) auf High setze passiert nichts, wenn ich aber PD4 auf High setze springt er zum Interrupt TIMER1_CAPT_vect.
Wenn ich im Register per Mausklick das Flag ICF1 setze, springt er auch??
Sollte ICF1 nicht mit dem PD6 verbunden sein??? Habe ich ein Register übersehen?
Bitte helft mir
#include <avr/io.h>
#define F_CPU 20000000
#include <util/delay.h>
#include <avr/interrupt.h>
#define TICIE 4
// Umdrehung durch Hallsensor messen
uint8_t softtimer = 0, LB =0, HB = 0,Spalte=0;
double TIME=0, OLDTIME = 0, Overflow = 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;
OCR2A = TIME/5;
//TCNT1 =0;
TCNT2 =0;
if(Overflow)
Spalte--;
}
SIGNAL (TIMER2_COMPA_vect)
{Overflow = 0xFF;
sei();
if(Overflow)
Spalte++;
cli();
Overflow = 0;
}
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) | (1<<ICF1);
TCCR2A |= (1<<WGM21);// CTC Modus: Wenn der Timer OCR2B erreicht löst er ein Interrupt aus und beginnt von 0
//OCR2B = 0x02; // Gibt vergleichswert des TIMER 2 an
TCCR2B |= (1<<CS11) | (1<<CS10);
// Compare Interrupt erlauben
TIMSK2 |= (1<<OCIE2A);
TIFR2 |= (1<<OCIE2A); // Interrupt freischalten
DDRC = 0xff;
PORTC =0;
long int Zahl =0;
while(1){
sei();
Zahl = TIME;
cli();
PORTC = Zahl;
sei();
}
return 0;
}