Forum: Mikrocontroller und Digitale Elektronik TSIC 506 an eimen ATMEGA2560


von Milan M. (milance)


Lesenswert?

Hallo zusammen,
ich versuche gerade den TSIC 506 temperatursensor an einem atmega2560 
auszuwerten.
1
#define TSIC_PORT             PORTD  // Port to use
2
#define TSIC_PIN              PIND
3
#define TSIC_PORT_DDR         DDRD
4
#define TSCI_POWER_PIN        PD6    // Where TSIC-Sensors VCC is connected
5
#define TSIC_SIGNAL_PIN       PD7    // Where TSIC-Sensors "Signal"-Pin is con.
6
7
8
/******************************************************************************
9
* FUNCTION MACROS
10
******************************************************************************/
11
12
// Define TSCI_POWER_PIN as output, TSIC_SIGNAL_PIN as input
13
#define TSIC_INIT()           { TSIC_PORT_DDR |= (1<<TSCI_POWER_PIN); \
14
                              TSIC_PORT_DDR &= ~(1<<TSIC_SIGNAL_PIN); }
15
16
// Power up the TSIC-Sensor
17
#define TSIC_ON()             TSIC_PORT |=  (1<<TSCI_POWER_PIN)
18
19
// Power down the TSIC-Sensor
20
#define TSIC_OFF()            TSIC_PORT &= ~(1<<TSCI_POWER_PIN)
21
22
//#define TSIC_SIGNAL           (TSIC_PORT &   (1<<TSIC_SIGNAL_PIN))
23
24
// Low/High Signal of the TSIC-Sensor, e.g. "if(TSIC_SIGNAL_HIGH)..."
25
#define TSIC_SIGNAL_HIGH      TSIC_PIN & ( 1 << TSIC_SIGNAL_PIN )
26
#define TSIC_SIGNAL_LOW       !( TSIC_PIN & ( 1 << TSIC_SIGNAL_PIN ))
27
28
29
/******************************************************************************
30
* Function    :   getTSicTemp(*temp_value16);
31
* Description :   reads from the TSic its output value
32
* Parameters  :   pointer for return value
33
* Returns     :   1: reading sucessfull, 0: parity error
34
******************************************************************************/
35
uint8_t getTSicTemp (uint16_t *temp_value16) {
36
37
  uint16_t temp_value1 = 0;
38
  uint16_t temp_value2 = 0;
39
  uint8_t i;
40
  uint16_t Temperature;
41
  uint8_t parity;
42
43
  TSIC_ON();
44
  _delay_us(60);  // wait for stabilization
45
  _delay_us(60);
46
47
  while (TSIC_SIGNAL_HIGH); // wait until start bit starts
48
49
  // wait, TStrobe
50
  while (TSIC_SIGNAL_LOW);
51
52
  // first data byte
53
  // read 8 data bits and 1 parity bit
54
  for (i = 0; i < 9; i++) {
55
    while (TSIC_SIGNAL_HIGH);              // wait for falling edge
56
    _delay_us(60);
57
    if (TSIC_SIGNAL_HIGH)
58
        temp_value1 |= 1 << (8-i);         // get the bit
59
      else
60
        while (TSIC_SIGNAL_LOW);           // wait until line comes high again
61
  }
62
63
  // second byte
64
  while (TSIC_SIGNAL_HIGH);
65
  // wait, TStrobe
66
  while (TSIC_SIGNAL_LOW);
67
  // read 8 data bits and 1 parity bit
68
  for (i = 0; i < 9; i++) {
69
    while (TSIC_SIGNAL_HIGH);               // wait for falling edge
70
    _delay_us(60);
71
    if (TSIC_SIGNAL_HIGH)
72
        temp_value2 |= 1 << (8-i);          // get the bit
73
      else
74
        while (TSIC_SIGNAL_LOW);            // wait until line comes high again
75
  }
76
77
  TSIC_OFF();                               // switch TSic off
78
79
  // check parity for byte 1
80
  parity = 0;
81
  for (i = 0; i < 9; i++)
82
    if (temp_value1 & (1 << i))
83
        parity++;
84
  if (parity % 2)
85
  return 0;
86
87
  // check parity for byte 2
88
  parity = 0;
89
  for (i = 0; i < 9; i++)
90
    if (temp_value2 & (1 << i))
91
        parity++;
92
  if (parity % 2)
93
        return 0;
94
  temp_value1 >>= 1;                 // delete parity bit
95
  temp_value2 >>= 1;                 // delete parity bit
96
  Temperature = (temp_value1 << 8) | temp_value2;
97
  *temp_value16 = Temperature;
98
99
  return 1;                       // parity is OK
100
}

inits:
1
 uint16_t temperatur;  // 11-bit temperature value
2
 uint8_t returnvalue;  // return value of getTSicTemp(*temp);
3
 uint8_t Temp_celsius; // converted temperature in °C
4
5
 TSIC_INIT();

Ausgabe ans display:
1
 returnvalue = getTSicTemp(&temperatur);  // pull the TSIC-Sensor
2
3
           // conversion equation from TSic's data sheet
4
           Temp_celsius = ((float)temperatur*70/2047)-10;
5
            dtostrf(Temp_celsius, 5, 2, systemp);
6
           // DO SOMETHING USEFUL WITH THE VALUES HERE!
7
           // e.g. display them ;)
8
          DisplayText(100,100,systemp);

das ding zeigt alles andere als temperatur.


Bitte um Hilfe.

Gruss
Milan

von Fragen über Fragen (Gast)


Lesenswert?

Kommen Daten vom TSic?
Parity Bit Ok?
Sind die Binärdaten stimmig?
Ist der berechnete Wert stimmig?
Wird ein konstanter Wert richtig aufs Display übertragen?

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.