Gast
#836677
Hallo hab ein Problem mit dem Timer/Counter1 beim Atmega32, hab mich nen
bissl reingefuchst aber irgendwas scheint nicht richtig zu sein.
MEIN QUELLTEXT:
************************************************************************
***
************************************************************************
***
************************************************************************
***
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint8_t flag = 0, overflow = 0;
uint16_t loop=32000, timer1=0, timer2=0, timer=0;
int main(void) {
//*** TIMER/COUNTER 1: 16-Bit: CPU-Takt(16MHz): Triggert auf pos. Flanke
***//
TCCR1B |= (0<<CS12)|(0<<CS11)|(1<<CS10);
TIMSK |= (1<<TICIE1)|(1<<TOIE1);
TCCR1B |= (1<<ICES1);
//*** INTERRUPT-Routinen Zulassen/Aktivieren ***//
sei();
//*** Datenrichtungen und Ports festlegen ***//
DDRD = 0x00;
DDRC = 0xFF;
PORTC = 0xFF;
PORTD = 0x00;
while(1) {
if (timer == 1600) //1600 entspricht bei 16MHz einer
//Pulsbreite von 100us
{
//Hier soll was passieren wenn die
//Eingelesene Pulsweite genau der
Pulsweite
//des Signals entspricht
}
}
}
//*** INTERRUPT-Routine bei Erkennung der positiven(logisch:HIGH, später
logisch:LOW) Flanke ***//
ISR (TIMER1_CAPT_vect) {
if (timer1==0)
{
// Timerwert wird ausgelesen!
timer1 = ICR1;
timer2 = 0;
// Timerinterrupt reagiert jetzt auf Flanke die logisch: LOW nach
sich zieht
TCCR1B & (0<<ICES1);
}
else
{
// Timerwert wird ausgelesen
timer2 = ICR1;
// Abfragebedingung ob Timer ein NULL-Durchgang hatte, und der
daraus resultierenden Fehlerbehebung bei der Berechnung
if (overflow == 0)
{
timer = timer2 - timer1;
}
else
{
timer = timer2 + (65536 - timer1);
}
timer1 = 0;
// Timerinterrupt reagiert jetzt wieder auf Flanke die logisch:HIGH
nach sich zieht
TCCR1B & (1<<ICES1);
}
}
//*** INTERRUPT-Routine für Timer NULL-Durchgang ***//
ISR (TIMER1_OVF_vect) {
overflow = 1;
}
************************************************************************
***
************************************************************************
***
************************************************************************
***
Meine Fragen:
1. Müssen die Fuse Bits gesetzt sein, hab nen 16 MHz Quarz dran!?
2. Mit der Schleife, in der etwas passieren soll, hab ich nen Problem...
die ist wahr(lampen an:: PORTC = 0x00;) bei nem Wert von 16000 hab ich
nen umrechnungsfehler??
3. Was fällt euch noch an Fehlern auf??
mfg mutti