Forum: Mikrocontroller und Digitale Elektronik Capture Mode mit PIC18F46k80


von Fabian F. (freysn)


Angehängte Dateien:

Lesenswert?

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!

von Max H. (hartl192)


Lesenswert?

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
von Fabian F. (freysn)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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.

von Fabian F. (freysn)


Lesenswert?

>
> 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?

von Max H. (hartl192)


Lesenswert?

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
von Fabian F. (freysn)


Lesenswert?

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
Noch kein Account? Hier anmelden.