Hi zusammen,
folgendes Problem:
Ich möchte mit einem PIC18F einen SMT160-30 Temperatursensor einlesen.
Der SMT deswegen, weil der ein PWM-Signal schickt. Die Auswertung und
vor allem das Einlesen der Rohwerte kostet kaum Rechenzeit, weil das per
Interrupt "nebenbei" passiert ohne dass ich den Prozessor zwischendurch
"anhalten" müsste, wie beispielsweise bei einem Dallas.
Wie dem auch sei, ich krieg es nicht zum Laufen. Meine Vorgehensweise:
Der PIC18 hat einen 16MHz Quarz, PLL ist aktiv, was 64MHz ergibt. Als
erstes initialisiere ich Timer und Capture:
1 | OpenTimer3(TIMER_INT_OFF & T3_SOURCE_FOSC & T3_PS_1_2 & T3_OSC1EN_OFF, TIMER_GATE_OFF);
|
2 | OpenCapture5(CAP_EVERY_RISE_EDGE & CAPTURE_INT_ON & CCP_5_SEL_TMR34);
|
Der Timer3 läuft alle 4,096ms über, dh jeder Zählschritt braucht 62,5ns.
Im Moment gebe ich zum Testen ein 1kHz Rechtecksignal auf den Pin, dh
jede AN-Phase dauert 500µs.
Ich sehe dass der Capture-Interrupt richtig konfiguriert ist, denn er
erkennt sowohl die fallende als auch die steigende Flanke.
Mein Interrupt sieht so aus:
1 | if (PIR4bits.CCP5IF && PIE4bits.CCP5IE)
|
2 | {
|
3 | gCCP[0] = 1;
|
4 | if (CCP5CONbits.CCP5M == 0b0101)
|
5 | {
|
6 | CCP5CONbits.CCP5M = 0b0110;
|
7 |
|
8 | gCCP[1] = CCPR5;
|
9 | gCCP[0] = 2;
|
10 | }
|
11 |
|
12 | else if (CCP5CONbits.CCP5M == 0b0110)
|
13 | {
|
14 | CCP5CONbits.CCP5M = 0b0101;
|
15 |
|
16 | gCCP[2] = CCPR5;
|
17 | gCCP[0] = 3;
|
18 | }
|
19 |
|
20 | PIR4bits.CCP5IF = 0;
|
21 | }
|
gCCP gebe ich mir per CAN in der Hauptschleife aus. Byte0 zeigt sowohl 2
als auch 3, dh er erkennt beide Flanken.
Der Wert für CCPR5 ist aber konstant, und immer 0x4E43. Das wäre ja
dezimal 20035, was einer Zeit von 1,25ms entspricht.
Vor allem ist der Wert konstant, egal ob ich mit 1kHz Test-Rechteck
reinschieße oder mit dem SMT160 selbst, der eine AN-Zeit von ungefähr
133µs bei Raumtemperatur hat.
Ich hatte das zuerst mit direktem Zugriff auf die Timerregister
versucht, das Ergebnis war das gleiche. Daher habe ich jetzt mal die
Library-Funktionen verwendet.
Wie kann ich das jetzt am besten zum Laufen bringen? Das kann doch ned
so schwer sein die Zeit zu messen, die zwischen den Flanken vergeht...