Guten Tag Ich möchte gerne einen digitalen Impuls von der Länge 100us bis etwa 20ms messen. Dafür benutze ich einen PIC18F46K80 und wollte dessen Capture Mode benutzen. (Siehe Anhang die entsprechende Seite des Datenblatts) Meine Frage nun: Da steht, man kann nur auf steigende ODER abfallende Flanke einen Event (Interrupt) auslösen. Könnte ich nun das Signal auf CCP3 und CCP4 führen, mit dem einen die steigende und mit dem anderen die abfallende Flanke erkennen? Ich habe ehrlich gesagt keinen Durchblick bei all diesen Timern und noch nie einen Capture Mode benutzt. Hoffe jemand kann mir Abhilfe schaffen. Vielen Dank im Vorraus!
Fabian Frei schrieb: > Da steht, man kann nur auf steigende ODER abfallende Flanke einen Event > (Interrupt) auslösen. Das bit, das die Flanke bestimmt (CCPxCONbits.CCPxM0) in er ISR immer invertieren. Zur erkärung: CCPxM=0b0100; //Capture mode: every falling edge CCPxM=0b0101; //Capture mode: every rising edge Zwischen steigender und fallender Flanke ändert sich nur das CCPxM0 bit. Wenn du das in jeder ISR invertierst, reagiert er abwechselnd auf die steigende und fallende Flanke. Welche flanke es war, kannst du dann mit if(CCPxCONbits.CCPxM0) abfragen. Fabian Frei schrieb: > Könnte ich nun das Signal auf CCP3 und CCP4 führen, mit dem einen die > steigende und mit dem anderen die abfallende Flanke erkennen? Wenn du das CCP und den Pin nichtbrauchst kannst du das natürlich auch machen. Es sollten aber beide auf den gleichen Timer eingestellt sein.
:
Bearbeitet durch User
Hab verstanden. Das klingt nach einer guten Lösung! Und das würde den Timer selbst nicht beeinflussen,oder? Die Messung sollte ja möglichst genau werden. Dann muss ich den entsprechenden Timer bei einer steigenden Flanke zurücksetzen, oder? Sonst bestünde ja die Gefahr von einem Überlauf im falschen Moment. Vielen Dank für die schnelle Antwort.
Fabian Frei schrieb: > Sonst bestünde ja die Gefahr von einem Überlauf im > falschen Moment. Nur ein überlauf ist kein Problem. Ich vermute dass du es ungefähr so machen willst: ISR() { ... CCPRx=CCP_new; time=CCP_new-ccp_old; CCP_old=CCP_new; ... } Wenn ja, ist ein überlauf kein Problem. Ein Beispiel mit 8bit, funktioniert mit 16 genauso, mit 8 finde ich es übersichtlicher. Capture1: Timer=250 CCPRx=250 CCP_old=250 Überlauf (Timer zahl 16 Zyklen) Capture2: Timer=10 CCPRx=250 CCP_new=10 CCP_new-ccp_old= -240 -240= 1111 1111 0001 0000 Wenn du jetzt nur mit 8bit rechnest werden die oberen 8 bit abgeschnitten und die bleibt nur noch 0001 0000 übrig. 0001 0000=16 Wenn du also beim 16bit Timer mit 16bit Variablem rechnest, ist es egal wenn der Timer <=1 mal überläuft. Ich hoffe ich habe es verständlich genug erklärt, wenn nicht kannst du ruhig nachfragen.
> > Capture1: > Timer=250 > CCPRx=250 > CCP_old=250 > > Überlauf (Timer zahl 16 Zyklen) > > Capture2: > Timer=10 > CCPRx=250 > CCP_new=10 > CCP_new-ccp_old= -240 > > Ich hoffe ich habe es verständlich genug erklärt, wenn nicht kannst du > ruhig nachfragen. Ein Microcontroller rechnet ja nicht mit negativen Zahlen. Ich habe es mit dem Beispiel 17 und 1 nachgerechnet, angenommen b0001 0001 (17) - b0000 0001 (1) = b0001 0000 (16) wenn es nun andersrum ist: b0000 0001 (1) - b0001 0001 (17) = b1111 0000 (240) D.h solange nicht mehr als 256 ( bei 8Bit) Zählschritte vorbei sind, stimmt es trotzdem. Das meintest du, oder? Kann man den nicht mit einem Befehl den Timerwert zurücksetzen?
Fabian Frei schrieb: > D.h solange nicht mehr als 256 ( bei 8Bit) Zählschritte vorbei sind, > stimmt es trotzdem. Das meintest du, oder? Ja, beim CCP sind es dann 2^16 Schritte, weil der PIC mit 16bit Timern arbeitet. Fabian Frei schrieb: > Kann man den nicht mit einem Befehl den Timerwert zurücksetzen? Könnte man (TMR1=0;*), ist aber nicht nötig, und du hättest dann das Problem, dass du zwischen flanke am CCP-Pin und dem löschen des Timers ein Paar Taktzyklen verlierst. Wenn du nur ein Interrupt verwendest ist die Anzahl der Zyklen konstant, wenn du andere hast, hängt es davon ab, ob der µC wenn die Flanke auftritt gerade ein anderes Interrupt abarbeitet oder nicht... *Streng genommen ist das nicht einen Befehl, der Compiler macht daraus 2 ASM Befehle. Fabian Frei schrieb: > Ein Microcontroller rechnet ja nicht mit negativen Zahlen. Ist eine Frage der definition: http://de.wikipedia.org/wiki/Zweierkomplement
:
Bearbeitet durch User
Ach so. Habs gerade durchgerechnet mit meiner benötigten Genauigkeit sollte es mit einem 16-Bit Timer kein Problem sein. Vielen Dank. Da hab ich doch wieder einmal etwas gelernt (=
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.