Hallo Leute,
ich will mit einem ATMega 8 die Länge einer Pulspause messen.
Mein Signal ist ein Rechtecksignal mit variabler Frequenz und variablem
Tastverhältnis, von diesem Signal möchte ich die Aus-Zeit messen.
Ich habe mir schon etliche Beiträge zu diesem Thema durchgelesen, nur
jetzt komme ich nicht mehr weiter, ich mache wahrscheinlich einen
Denkfehler.
Ich gehe jetzt so vor, dass ich den ICP-Pin des Controllers nehme dort
erst bei fallender Flanke einen Interrupt auslöse, in der
Interruptschleife dann auf steigende Flanke umschalte und dann wiederum
auf die positive Flanke warte.
Die beiden Timerstände zieh ich dann von einander ab und hab die
Differenzzeit, das mache ich aus dem Grund, da ich ja den Anfangsstand
des Timers nicht kenne wenn ich nur auf die steigende Flanke triggere.
Hinzu kommt, dass ich einen kleinen Überschwinger von maximal etwa 60ms
nach jeder positiven Flanke habe, jetzt hab ich den Verdacht, dass hier
schon die fallende Flanke erkannt wird, lange bevor sie wirklich kommt.
Hier der relevante Code:
1 | //Timer 1 initalisieren
|
2 |
|
3 | TCCR1B |= /*(1 << ICES1) | */(1 << CS11) | (1 << ICNC1); //Input Capture auf Positive Flanke / Prescaler = 8 -> Timerfrequenz = 1MHz / Input Noise-Canceler An
|
4 | TIMSK |= (1 << TICIE1) | (1 << TOIE1); //Input Capture Interrupt und Timer Overflow Interrupt aktivieren
|
5 |
|
6 | //Pulspause berechnen
|
7 |
|
8 | unsigned long get_timer()
|
9 | {
|
10 | timer_value = valueB - valueA + (overflow * 65536);
|
11 | return timer_value;
|
12 | }
|
13 |
|
14 |
|
15 | ISR(TIMER1_CAPT_vect)
|
16 | {
|
17 |
|
18 |
|
19 | if(run)
|
20 | {
|
21 |
|
22 | valueA = ICR1; // Inhalt vom Input Capture Register in Value A laden
|
23 | run = 0;
|
24 | overflow = 0; // Overflow zurücksetzen
|
25 | TCNT1 = 0; // Timerstand auf 0 setzen
|
26 | TCCR1B |= (1 << ICES1); // Auf steigende Flanke triggern
|
27 | TIFR |= ( 1 << ICF1 ); //Input Capture Interrupt Flag löschen
|
28 |
|
29 | }
|
30 |
|
31 | else if (run == 0)
|
32 | {
|
33 |
|
34 | valueB = ICR1; // Inhalt vom Input Capture Register in Value B laden
|
35 | run = 1;
|
36 | TCCR1B &= ~(1 << ICES1); // Auf negative Flanke triggern
|
37 | TIFR |= ( 1 << ICF1 ); // Input Capture Interrupt Flag löschen
|
38 | overflow = 0; //Overflow zurücksetzen
|
39 |
|
40 | }
|
41 |
|
42 | }
|
Kann das überhaupt so funktionieren?
Die nächste Frage wäre, wie bekomme ich es hin, dass der Interrupt für
die fallende Flanke für 60ms nach der steigenden Flanke unterdrückt
wird? Ich habe es schon über Timer 2 probiert, aber das funktioniert
auch nicht wirklich.
Ich hoffe Jemand kann mir weiterhelfen.
Danke!
Gruß, Kai