Ich möchte mit Timmer 0 am eingang PD7, die länge der Low Pulse (PWM Singnal) messen. Also: Timer einstellen: TCCR0 = (1<<CS00) | (1<<CS02); //prescaler 1024 Bei einen Zählerdtand von 4 sind 1,024 ms vergangen for(;;) { if (!(PIND & (1<<PIND7))) { Pause++; TCNT0 = 0; // Timer 0 auf 0 setzten solange Pinb1 low ist PORTA = Pause; wait(500); Pause = 0; } else { if (TCNT0 == 4) { TCNT0 = 0; Pause++; } } Jedoch laufen jetzt die Werte davon. Wie könnte ich den Timer stoppen bei high ?
Hab noch diese Idee: while(!(PIND & (1<<PIND7))); TCNT0 = 0; for (;(PIND & (1<<PIND7));) { if (TCNT0 == 4) { TCNT0 = 0; Pause++; } } Pause = 500/100 * Pause; PORTA = Pause; TCNT0 = 0; Pause = 0; wait(500); Funktioniert zwar, aber gibt es nix besseres?
>die länge der Low Pulse (PWM Singnal) messen.
Du misst übrigens die Länge der high-Dauer...
Immer wenn PB7==0 wird der Zähler zurückgesetzt.
Das ist eine rustikale Methode.
Eleganter wäre es den Timer anzuhalten, wenn er nichts zu tun hat.
Und zuerst brauchst du eine Flankenerkennung (hier mit pind7_alt).
Dann kannst du an jedem Pegelwechsel 1-mal irgendwas tun.
1 | for(;;) { |
2 | if (PIND & (1<<PIND7)) { // high |
3 | if(pind7_alt) { // steigende Flanke |
4 | TR0 = 0; // Timer anhalten |
5 | Pause = TNCT0 >> 4; // durch 4 teilen |
6 | TCNT0 = 0; // Timer auf 0 setzen |
7 | }
|
8 | PORTA = Pause; |
9 | pind7_alt = 1; // Zustand von PB7 merken |
10 | }
|
11 | else { // low |
12 | if(!pind7_alt) // fallende Flanke |
13 | TR0 = 1; // Timer starten |
14 | pind7_alt = 0; // Zustand von PB7 merken |
15 | }
|
16 | }
|
BTW: Lies dir doch bitte mal die Bedienungsanleitung zum Forum durch, insbesondere das Kapitel Formatierung [ c]C-Code [ /c]
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.