Temperaturmessung mit TSIC 206

OP #3988418
Lesenswert?

Moin,

ich versuche gerade den Temperatursensor TSIC 206 mit einem ATMEGA644 
auszuwerten und auf einem LCD auszugeben. Im Prinzip funktioniert das 
auslesen auch ganz gut, mein Problem ist jetzt, dass meine Ausgabe 
teilweise Werte von größer 5000 anzeigt. Wahrscheinlich liegt der Fehler 
in der Umrechnung der Werte. Leider finde ich den Fehler im Moment 
nicht, vielleicht gibt es ja jemanden, dem etwas auffällt. Hier mein 
bisheriger Code:
1
#define F_CPU 1000000UL
2

3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <stdint.h>
6
#include <stdlib.h>
7
#include "tsic.h"
8
#include "lcd.h"
9

10
uint16_t temperature=0;
11
float celsius=0;
12
char temperature_out[10];
13

14

15
int main(void)
16
{
17
  TSIC_INIT();
18
  lcd_init();
19
  lcd_clear();
20
  
21
  
22
    while(1)
23
    {
24

25
  getTSicTemp(&temperature);        
26
  temperature = ((temperature * 250L) >> 8) - 500;    
27
  celsius = temperature / 10 + (float) (temperature % 10) / 10;
28
  lcd_string("Temperatur:");
29
  lcd_numbers(celsius, 4, 1);
30
  lcd_data('C');
31
  _delay_ms(1000);
32
  lcd_clear();
33
    
34
    }
35
}
Gast #3988448
Lesenswert?

also wir haben die TSIC506 auf Arbeit. Und die geben 2700, bei 27°C aus. 
Du musst mal ins Datenblatt schauen. Da gibt es auch 'hochgenaue' Typen. 
Je nach Auflösung kann es durchaus sein, das du /1000 teilen musst. Wenn 
du allerdings Pech hast und du hast ein OEM-TSIC erwischt hilft das 
Datenblatt auch nicht.
Und auch wichtig: die arbeiten auch nur in einem bestimmten 
Temperaturbereich genau.
#3988455
Lesenswert?

Karl Heinz schrieb:
> Marco G. schrieb:
>
>> auslesen auch ganz gut, mein Problem ist jetzt, dass meine Ausgabe
>> teilweise Werte von größer 5000 anzeigt. Wahrscheinlich liegt der Fehler
>> in der Umrechnung der Werte.
>
> Nun. Wenn du das vermutest, wer oder was hindert dich daran, dir mal die
> Werte vor der Umrechnung auf dem LCD ausgeben zu lassen?
1
  getTSicTemp(&temperature);
dieser Wert ist interessant

1
  temperature = ((temperature * 250L) >> 8) - 500;
auch dieser Wert ist interessant
1
  celsius = temperature / 10 + (float) (temperature % 10) / 10;
und daraus folgt dann dieser Wert.

Der letzte ist offenbar ab und an falsch. Aber was ist mit den davor? 
Wie gross ist der Wert, den du vom Sensor bekommst und unter welchen 
Umständen ergibt sich dann deine seltsame Ausgabe?
OP #3988473
Lesenswert?

Ich habe mir die Werte mal "roh" als Dezimalzahl ausgeben lassen. 
Interessanterweise sind dort manchmal Werte von -4000 bis -6500 zu 
erkennen. Ich werde das noch einmal als HEX ausgeben lassen.

@mike

Den TSIC, den ich verwende soll eine Toleranz von 0,5°C haben. Ich will 
ihn allerdings auch nur für Temperaturen von 10°C bis ca 45°C verwenden. 
Ich hoffe er ist dafür geeignet.

@Karl Heinz
Karl Heinz schrieb:
> Der letzte ist offenbar ab und an falsch

Leider nicht nur der, da ich mir die Variable Temperatur ausgeben lasse. 
Diese weist auch schon diese großen Werte auf. Normal sind im Moment 
Werte um 220 herum (Zimmertemperatur. Ich möchte damit nur Temperaturen 
über 0°C messen, kälter sollte es in einem beheizten Haus lieber nicht 
werden.
#3988492
Lesenswert?

Marco G. schrieb:

> Leider nicht nur der, da ich mir die Variable Temperatur ausgeben lasse.
> Diese weist auch schon diese großen Werte auf.

An welcher Stelle. Temperatur wird 2 mal verwendet. Einmal um darin den 
WErt vom Sensor zu speichern und das 2.te mal nach einer Umrechnung


So ist das nun mal im Debugging.
Wenn am Ende was falsches rauskommt, dann muss man die ganze Kette 
zurückverfolgen, wie die jeweiligen Werte entstehen.
Und ja. Manchmal ist das gaaaanz bis zum Anfang. Jeder einzelne Schritt.
#3988530
Lesenswert?

Marco G. schrieb:
> Karl Heinz schrieb:
>> Ist trotzdem kein Argument mit negativen Temperaturen nicht zurecht zu
>> kommen.
>
> stimmt, aber im ersten Schritt ist es für erst mal wichtig, die
> Temperatur Konstant zu halten.
>
> Die Umrechnung der Temperatur habe ich auskommentiert, ich sollte als
> direkt die Werte bekommen, die von der Funktion zurückkommen.

Gut.
Und? Zeigen sich auch dort schon Anomalien?

Dann musst du eben mal in die get FUnktion rein und nachsehen was da 
schief läuft. Ev. mal mit dem Oszi kontrollieren ob da dasselbe Ergebnis 
rauskommt, wie das was man auf der Leitung sieht.
OP #3988538
Lesenswert?

Dort kommen die Werte auch als negative Werte zurück.
Hier mal der Code der Funktion (und der dazugehörigen Funktionen):
1
#include "tsic.h"
2

3
void TSIC_INIT(void) {
4
  TSIC_PORT_DDR_Power |= TSCI_POWER_PIN;    // Ausgang
5
  TSIC_PORT_DDR &= ~TSIC_SIGNAL_PIN;      // Eingang
6
}
7

8
uint8_t readSens(uint16_t *temp_value){
9
  uint16_t strobelength = 0;
10
  uint16_t strobetemp = 0;
11
  uint16_t dummy = 0;
12
  uint16_t timeout = 0;
13

14
  while (TSIC_SIGNAL_HIGH)
15
    ; // wait until start bit starts
16
  // Measure strobe time
17
  strobelength = 0;
18
  timeout = 0;
19
  while (TSIC_SIGNAL_LOW) {    // wait for rising edge
20
    strobelength++;
21
    timeout++;
22
    Abbruch();
23
  }
24
  for (uint8_t i=0; i<9; i++) {
25
    // Wait for bit start
26
    timeout = 0;
27
    while (TSIC_SIGNAL_HIGH) { // wait for falling edge
28
      timeout++;
29
      Abbruch();
30
    }
31
    // Delay strobe length
32
    timeout = 0;
33
    dummy = 0;
34
    strobetemp = strobelength;
35
    while (strobetemp--) {
36
      timeout++;
37
      dummy++;
38
      Abbruch();
39
    }
40
    *temp_value <<= 1;
41
    // Read bit
42
    if (TSIC_SIGNAL_HIGH) {
43
      *temp_value |= 1;
44
    }
45
    // Wait for bit end
46
    timeout = 0;
47
    while (TSIC_SIGNAL_LOW) {    // wait for rising edge
48
      timeout++;
49
      Abbruch();
50
    }
51
  }
52
  return 1;
53
}
54

55
uint8_t checkParity(uint16_t *temp_value) {
56
  uint8_t parity = 0;
57

58
  for (uint8_t i = 0; i < 9; i++) {
59
    if (*temp_value & (1 << i))
60
      parity++;
61
  }
62
  if (parity % 2)
63
    return 0;  // Parityfehler
64
  *temp_value >>= 1;               // Parity Bit löschen
65
  return 1;
66
}
67

68
uint8_t getTSicTemp(uint16_t *temp_value16) {
69
    uint16_t temp_value1 = 0;
70
    uint16_t temp_value2 = 0;
71

72
    TSIC_ON();
73
    _delay_us(200);     // wait for stabilization
74

75
    readSens(&temp_value1);      // 1. Byte einlesen
76
    readSens(&temp_value2);      // 2. Byte einlesen
77
    checkParity(&temp_value1);    // Parity vom 1. Byte prüfen
78
    checkParity(&temp_value2);    // Parity vom 2. Byte prüfen
79

80
    TSIC_OFF();    // Sensor ausschalten
81
    *temp_value16 = (temp_value1 << 8) + temp_value2;
82
    return 1; //*temp_value16;
83
}
#3988565
Lesenswert?

Das #define F_CPU 1000000UL gehört ins Makefile und nicht in .c oder .h 
Files. Ansonsten kann es Probleme mit _delay_ms/us geben.

Schön ist auch, dass zwar Parity ermittelt wird, aber das Erbegnis 
scheinbar nicht interessiert.
Also mal ein
  if (!checkParity(&temp_value1)) return 0;
einschieben und im Hauptprogramm reagieren.
OP #3988578
Lesenswert?

also so?
1
uint8_t getTSicTemp(uint16_t *temp_value16) {
2
    uint16_t temp_value1 = 0;
3
    uint16_t temp_value2 = 0;
4

5
    TSIC_ON();
6
    _delay_us(200);     // wait for stabilization
7

8
    readSens(&temp_value1);      // 1. Byte einlesen
9
    readSens(&temp_value2);      // 2. Byte einlesen
10
    checkParity(&temp_value1);    // Parity vom 1. Byte prüfen
11
    checkParity(&temp_value2);    // Parity vom 2. Byte prüfen
12

13
    TSIC_OFF();    // Sensor ausschalten
14
    *temp_value16 = (temp_value1 << 8) + temp_value2;
15
    if (!checkParity(&temp_value1))
16
    { 
17
     return 0;
18
    }
19
    else
20
    {
21
     return 1;
22
    }
23

24
}
#3988591
Lesenswert?

eher so:

readSens(&temp_value1);      // 1. Byte einlesen
readSens(&temp_value2);      // 2. Byte einlesen
if (!checkParity(&temp_value1)) return 0;
if (!checkParity(&temp_value2)) return 0;

Du solltest versuchen, das Programm zu verstehen.

Btw:
   if (!checkParity(&temp_value1))
ist das gleiche wie
   if (checkParity(&temp_value1)==0)
oder
  int ret;
  ret=checkParity(&temp_value1);
  if (ret==0) return 0;
OP #3988696
Lesenswert?

Kleines Update:

Ich habe mal den TSIC206 gegen einen TSIC 306 getuscht. Nun bleibt die 
Temperatur stabil, wahrscheinlich hatte der andere Sensor einen defekt.
Weiß jemand ein Datenblatt des TSIC 206 in dem das Package-marking 
vermerkt ist? Ich wollte mal überprüfen, ob es nicht ein anderer Sensor 
geworden ist, als auf der Verpackung steht.

Danke an alle, die mir bis hierher geholfen haben :)
OP #3988716
Lesenswert?

Eine weitere Frage habe ich noch, jedoch zu einem anderen Bauteil.

Ich möchte als LCD eventuell ein EA DIP203G-4NLED verwenden. Wenn ich 
mir das Datenblatt ansehe, genau die Maßzeichnungen verwirren mich ein 
wenig die Maßangaben der Pins. 18 - 0,5 mm? Ich hätte auf 0,8mm getippt, 
genauso soll die gesamte Stiftleiste nur 8mm lang sein. Da passt eher 
die 18mm.
Hat jemand bereits Erfahrungen mit den Maßen des LCDs?
Angehängte Dateien:
#3988744
Lesenswert?

Ob die Pins 0.5 oder 0.8 mm Durchmesser haben, weiss ich nicht mehr. Was 
aber unangenehm ist, das ist das Rastermass mit 2mm Abstand zwischen den 
Pins und nicht wie sonst üblich 2.54mm.
Dadurch passt das Teil zb nicht in eine Lochrasterplatine. Für eine 
geätzte Platine musste ich mir damals in Eagle ein eigenes Symbol 
anlegen, weil man ja auch nicht mittels vorhandenen 9-poligen 
Steckerleisten tricksen könnte.
OP #3989241
Lesenswert?

@Karl Heinz

Da es für eine selbstgefertigte Platine ist, ist das Rastermaß egal. 
Dann ist das Datenblatt aber von den Zeichnungen aber relativ schlecht, 
muss ich sagen, die Angaben zu den Pins oder deren Rastermaß sind 
anscheinend nicht richtig, oder ich interpretiere diese einfach falsch.

@Pete K.
Stimmt es ist recht teuer, jedoch ist es wie schon angesprochen ein 4 x 
20 Display und die Bauform ist für meine Zwecke recht angenehm, ich 
benötige keine weitere Verschraubung oder ähnliches.
Gast #3989434
Lesenswert?

Marco G. schrieb:
> Wenn ich
> mir das Datenblatt ansehe, genau die Maßzeichnungen verwirren mich ein
> wenig die Maßangaben der Pins. 18 - 0,5 mm?

Selten eine so verbockte Maßzeichnung gesehen ...
Da hat wohl jemand - ohne dass er den blassestem Schimmer hatte, was er 
tat - eine in Ehren ergraute Maßzeichnung für das Datenblatt neu 
beschriftet.
#3990652
Lesenswert?

Werner M. schrieb:
> Karl Heinz schrieb:
>> Für eine geätzte Platine musste ich mir damals in Eagle ein eigenes
>> Symbol anlegen
>
> Ooh my god - vermutlich hätte die Anpassung eines bestehenden Packages
> gereicht ...

Weiss ich nicht mehr, wie ich das gemacht hab. Vermutlich hab ich mir 2 
Pinheader genommen, im richtigen Abstand angeordnet, den Pinabstand 
angepasst und ein Rechteck in der richtigen Größe drumrumgelegt.
Für ein Einzelstück fackel ich da nicht lange rum, so lange es seinen 
Zweck erfüllt. Ehe ich da stundenlang nach etwas ähnlichem suche, das 
angepasst werden kann, mach ich mir das lieber in ein paar Minuten 
selber.

OK so?

Das war eines der ersten LCD, die ich je gekauft habe. Da wusste ich 
noch nicht, dass es LCD auch viel billiger gibt. Aber die beiden 
Pinreihen haben einen unbestreitbaren Vorteil. Sie fixieren das LCD 
sauber auf der Platine. Mit der üblichen einzelnen Stiftleiste 
funktioniert das weit nicht so gut.
Gast #3990755
Lesenswert?

Karl Heinz schrieb:
> Das war eines der ersten LCD, die ich je gekauft habe. Da wusste ich
> noch nicht, dass es LCD auch viel billiger gibt.

Wenn man auf den Preis sieht, dann muß man auch sehen, wie klein die 
Anzeige ist, daß sie zusätzlich eine SPI-Schnittstelle hat und auch in 3 
V Systemen läuft.
Wenn man das braucht, relativiert sich der Preis (16,90 bei Reichelt) 
recht schnell!

Zur Buchsenleiste: 
http://www.reichelt.de/Buchsenleisten/BL-1X10G-2-00/3/index.html?&ACTION=3&LA=2&ARTICLE=51822&GROUPID=3221&artnr=BL+1X10G+2%2C00

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren