Gute Tageszeit liebe Gemeinde,
nach einer erfolgreichen Konstruktion eines Frequenzzählers, würde ich gern versuchen das Offset von einer Sekunde zu umgehen,
indem ich bei bekannter uC-Frequenz die Impulsanzahl zwischen zwei steigenden Flanken messe. So die Theorie.
Praktisch bin ich mir nicht sicher und wende mich deshalb an euch.
Code:
TCCR0 |= (1<<CS02) | (1<<CS01) | (1<<CS00);
Diese Zeile bewirkt das Starten des Timer0 bei steigender Flanke am T0 Eingang. Beim Überlauf wird eine Zählvariable inkrementiert usw, die übliche Geschichte.
Meine Frage wäre folgende: Ich starte zwar den Timer, aber wie soll ich ihm sagen, dass er auch bei der nächsten Flanke aufhören sollte?
Denn so scheint mir das Ganze noch nicht vollständig zu sein
Anbei die relevanten Codestellen:
Ich bedanke mich im Voraus,
Nik
Code:
ISR(TIMER0_OVF_vect)
{
z++;
TIFR = (1<<TOV0); //Beim Überlauf von Timer0 und dem anschließenden Interrupt erfolgt eine Zurücksetzung auf Null
}
int main(void)
{
// Definition von Ein- und Ausgängen des uC Boards
DDRC = 0xFF; // PORTC als Ausgang - über PORTC werden die jeweiligen Segmente einer 7-Seg. Anzeige gesteuert
DDRD = 0xEF; // außer dem PD4 für den TTL-Pegel sind alle Pins als Ausgänge definiert
PORTC = 0b00000000;
TCCR0 |= (1<<CS02) | (1<<CS01) | (1<<CS00); // Extern anliegendes Signal an T0, Interrupt bei steigender Flanke, Starten des Timer0
TIMSK |= (1<<TOIE0); // Aktiviere den Interrupt von Timer0 beim Überlauf
sei(); // Interruptbehandlung ein
while(1) // unendliche Schleife
{
zaehler0_aktuell = TCNT0; // der aktuelle Timer0 Wert wird in count kopiert
zaehler0_ovf = z; // Anzahl der Überläufe wird in zaehler0_ovf kopiert
z= 0;
TCNT0 = 0;
if ((zaehler0_ovf==0)&&(zaehler0_aktuell==0))
{
freq = 0;
}
else
{
// Die abschließende Summierung aller Anteile samt Kompensation von Abweichungen
freq = (uint16_t) (F_CPU/(0.5+((256.0*zaehler0_ovf + zaehler0_aktuell)*korrekturfaktor)));
}
zahl_ausgeben(freq);
}
return 0;
}
Lesezeichen