Hallo, steh gerade voll auf dem Schlauch bei einem PWM Eingangssignal. Ich habe einen C164 und mache das über die CAPCOM Einheit. Die Frequenz des PWM Signals liegt bei ca. 5KHz. Es läuft ein Timer 8 (einfach von 0x0000 bis 0xFFFF). Mein Signal ist so aufgelegt, daß die positive Flanke am CC18 liegt und somit einen Interrupt auslösen kann wenn diese kommt. Die negative liegt am CC19. Ich muß die Impuls/Pausenzeit bestimmen und mache das letztlich damit, daß ich die Zählerstände vergleiche, bzw. voneinander abziehe. Soweit so gut, aber das Problem ist das Synchronisationsproblem am Anfang. Ich berechne alles bei der negativen Flanke und somit im CC19 Interrupt. Hier besorg ich mir den Zählwert (CC19_Altwert) um beim nächsten CC19 Interrupt die Periodendauer zu bestimmen. Allerdings spielt es ja nun eine Rolle, ob das Signal vor dem CC19 "0" war oder "1" war. Ich krieg es einfach nicht gebacken diese Synchronisierung zu programmieren. Wäre toll wenn mir jemand ein paar Denkanstöße liefern könnte. Herzlichen Dank an euch schon mal. Gruß Gertrud
> Mein Signal ist so aufgelegt, daß die positive Flanke am CC18 liegt und > somit einen Interrupt auslösen kann wenn diese kommt. > Die negative liegt am CC19. Cool, du kannst von 1 Signal die Flanken trennen? ;-) > ob das Signal vor dem CC19 "0" war oder "1" war. Wenn CC19 auf die fallende Flanke trggert, dann wird das Signal vorher wohl oder übel '1' gewesen und jetzt '0' sein . Denn eine fallende Flanke zeichnet sich ja durch einen Übergang von 1 nach 0 aus... :-o Und was funktioniert jetzt nicht? Die Synchronisation ist auf jeden Fall totsimpel: einfach im ersten CC19 Interrupt den alten CC19 Wert nicht auswerten, sondern erst ab dem zweiten CC19 Int. Zieg doch einfach mal deinen Code, dann kann dir besser geholfen werden.
Ich schnalls nicht.... Hier mein CC18 und CC19
1 | void CC2_viIsrCC18(void) interrupt CC18INT |
2 | { |
3 | |
4 | if(z==0) |
5 | sync++; |
6 | |
7 | } |
1 | void CC2_viIsrCC19(void) interrupt CC19INT |
2 | { |
3 | |
4 | |
5 | if (sync==1) |
6 | |
7 | { |
8 | CC19Alt=CC19; |
9 | z=1; |
10 | sync++; |
11 | } |
12 | |
13 | else |
14 | { |
15 | Impulsdauer=CC19-CC18; |
16 | Periodendauer=CC19-CC19Alt; |
17 | CC19Alt=CC19; |
18 | } |
Das funktioniert zumindest fuer den Fall, daß die positive Flanke zuerst kommt. Wenn jetzt allerdings die negative zuerst kommt, dann Habe ich keinen CC18 Wert und auch keinen CC19Alt wert...
>Wenn jetzt allerdings die negative zuerst kommt, dann Habe ich >keinen CC18 Wert und auch keinen CC19Alt wert... Solche Fälle muss man halt durch geeignete Massnahmen im Programm abfangen;)
Achso ja klar....!!!! Man muß natürlich eine Maßnahme treffen...Daß ich da nicht gleich darauf gekommen bin
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.