Forum: Mikrocontroller und Digitale Elektronik [PIC18F4550][CCS-C] CCP-Capture Timer 1/3 Problem


von Martin (Gast)


Lesenswert?

Hallo,

Wie der Betreff verrät habe ich ein Problem mit dem CCPX Timer.

Ein Sensor spukt mir eine Frequenz zwichen 2Hz und 130KHz vor die Nase
welche ich mittels CCP Modul lesbar umwandeln möchte.
Nun verdirbt mir aber der Timer den ganzen Spass seit einiger Zeit,
er fängt meist irgendwo zwichen 0 und 65535 an zu Zählen dabei überläuft 
er (und die Berechnung fällt hin) und kommt dann irgendwann zum stehen.
Hatte versucht mit Interrupt-routinen den Überlauf fest zu stellen
was aber nicht funktionierte da er immer einmal überläuft bevor er was 
ausspukt....

Habe als Fehlerkorrektur eine kleine Software-lößung eingebaut welche 
aber viel Speicher verschlingt und alles andere als Fehlerfrei & Optimal 
ist.

Gibt es irgendeine Möglichkeit den Überlauf fest zu stellen??
Oder eine möglichkeit das der CCP/Timer irgendwo (nahe?) bei 0 anfängt??

Für jeden Lösungsvorschlag in ASCI-C/(asm)/CCS-C/C18 wäre ich dankbar.

1
while(i2<=10) {
2
tmr3con = 0xCC;
3
// set_timer3(65535);
4
setup_ccp1(CCP_CAPTURE_FE);
5
setup_ccp2(CCP_CAPTURE_RE);
6
tmr3start = 1;
7
 
8
delay_ms(200);
9
10
cap1 = CCP_1;
11
cap2 = CCP_2;
12
.........

Debug Ausgabe:

0 cap1: 60179 cap2: 42853
ERROR : 1 cap1: 8178 cap2: 56659
1 cap1: 12525 cap2: 30843
2 cap1: 35402 cap2: 14216
3 cap1: 19786 cap2: 40159
4 cap1: 45489 cap2: 24829
5 cap1: 30194 cap2: 48487
6 cap1: 49970 cap2: 34471
7 cap1: 1377 cap2: 49345
ERROR: 8 cap1: 56598 cap2: 10402
8 cap1: 29235 cap2: 8305
9 cap1: 19672 cap2: 40575
10 cap1: 44824 cap2: 24932

17326 18318 (21186) 20373 20660 18293 15499 (47968) 20930 20903 19892

von mätthu (Gast)


Lesenswert?

definiere eine Variable die um jeden Takt inkrementiert wird. Die kannst 
du ja danach beliebig händeln. auf 0 setzen u.s.w..

von Martin (Gast)


Lesenswert?

Danke  mätthu,
Gesagt getan, nur bekomm ich immer genau 2 Interrupts raus und gleich 
doofe Ergebnisse ;( Ich werde mal ne weile mit den Timings und dem 
Interrupt rumspielen, vll. ergibt sich ja noch was.

Falls noch jemmanden was einfällt... für jeden Tip bin ich sher 
dankbar..

von Martin (Gast)


Lesenswert?

Oooookkk habe es gelößt, Ich musste mein Programm so Umschreiben das ich 
direkten zugriff auf CCP1IF und CCP2IF Register hatte welches mir nun 
erlaubt den Timer nach dem Capturen anzuhalten damit kein weiterer 
Interrupt folgt.

Verfluchtes CCS, die die den Compiler geschrieben haben, haben leider 
vieles links liegen lassen... Im Endeffekt wird es so nur schwerer weil 
man ja mit der Zeit selbst die ganzen Fehlenden einträge erstellen muss 
:(

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.