1 | /******************************************************************************
|
2 | * getTSicTemp 08/2012 HoWL
|
3 | * input: -
|
4 | * output: int Temperatur, ungültiger wert = 999
|
5 |
|
6 | * temp_in = Datenausgangspin vom TSIC
|
7 | * IRQ Sperre, power on/ off extern
|
8 | ******************************************************************************/
|
9 | #include <p18cxxx.h>
|
10 | #include <stdlib.h>
|
11 | #include "tsic.h"
|
12 | #include "hardware.h"
|
13 | #include "../__libs/tools.h"
|
14 |
|
15 |
|
16 | unsigned int getTSicTemp(void)
|
17 | {
|
18 | unsigned char i,j,parity;
|
19 | unsigned char strobe_time, strobe_count;
|
20 | unsigned int temperatur;
|
21 | unsigned int timeout;
|
22 |
|
23 | // init
|
24 | TSIC_POWER_TRIS = 0; // Power als Ausgang
|
25 | TSIC_DATA_TRIS = 1; // Daten Pin als Eingang
|
26 |
|
27 | TSIC_POWER_ON // Spannung Sensor einschalten
|
28 |
|
29 | delay_ms(10);
|
30 | timeout=0;
|
31 | while(TSIC_DATA_IO==0) // warten auf high
|
32 | {
|
33 | timeout++;
|
34 | if (timeout==0) return 999;
|
35 | }
|
36 | for (i=0;i<2;i++) // 2 Bytes Daten
|
37 | {
|
38 | strobe_time = 0; // für Messung löschen
|
39 | timeout=0;
|
40 | while(TSIC_DATA_IO==1) // warten auf low
|
41 | {
|
42 | timeout++;
|
43 | if (timeout==0) return 999;
|
44 | }
|
45 |
|
46 | // Startbit, ab hier messen
|
47 | while(TSIC_DATA_IO==0) // Low - Zeit messen
|
48 | {
|
49 | strobe_time++; // messen bitlänge
|
50 | if (strobe_time==0) return 999; // Überlauf, error
|
51 | } // strobe_time hat ca. Wert 62 = 62µs bei 40MHz
|
52 |
|
53 | parity = 0;
|
54 | for (j=0;j<8;j++) // 8 Datenbits
|
55 | {
|
56 | temperatur <<= 1; // nach links verschieben,
|
57 | // Bit 0 wird automatisch auf 0 gesetzt
|
58 | strobe_count = strobe_time; // Zähler laden
|
59 |
|
60 | while(TSIC_DATA_IO==1); // auf fallende Flanke warten
|
61 |
|
62 |
|
63 | while(strobe_count--) { Nop(); } // hier die gemessene Bitzeit warten
|
64 |
|
65 | if (TSIC_DATA_IO==1) // PIN messen und Bit 0 setzen wenn high
|
66 | {
|
67 | temperatur |= 0x01;
|
68 | parity++; // Parität gleich mitzählen
|
69 | }
|
70 |
|
71 | while(TSIC_DATA_IO==0); // weiter wenn high
|
72 |
|
73 | } // ende bitcount
|
74 |
|
75 | // Parity Bit
|
76 | strobe_count = strobe_time; // Zähler laden
|
77 | while(TSIC_DATA_IO==1); // auf Low warten
|
78 |
|
79 | while(strobe_count--) { Nop(); } // hier die gemessene Bitzeit warten
|
80 |
|
81 | if (TSIC_DATA_IO==1) parity++; // Parity Bit dazurechnen
|
82 |
|
83 | if (parity % 2 != 0) return 999; // Parity Fehler (muss gerade Zahl sein)
|
84 |
|
85 | while(TSIC_DATA_IO==0); // weiter wenn high
|
86 |
|
87 |
|
88 | } // ende Bytecount
|
89 |
|
90 | // Umrechnung in Temperatur, gleich in Festkomma mit einer Nachkommastelle
|
91 |
|
92 | temperatur = (((long)temperatur * 2000) / 2047)-500;
|
93 |
|
94 | return temperatur;
|
95 | }
|