tsic.c


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
}