Forum: Mikrocontroller und Digitale Elektronik Temperaturmessung mit TSIC 206


von Marco G. (grmg2010)


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
}

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Marco G. schrieb:
> vielleicht gibt es ja jemanden, dem etwas auffällt.

Mir fällt auf, daß der Code wohl unsichtbar ist. Wahrscheinlich geheim.

von Marco G. (grmg2010)


Lesenswert?

Ich hatte allerdings einen Code gepostet, bei mir wird er auch 
angezeigt...

von Karl H. (kbuchegg)


Lesenswert?

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?

von mike (Gast)


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.

von Karl H. (kbuchegg)


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?

von Karl H. (kbuchegg)


Lesenswert?

Auch nicht uninteressant:

Wie hast du dir vorgestellt, mit einem uint16_t negative Temperaturen 
abzubilden? Wir haben jetzt Winter, da soll es nicht ungewöhnlich sein, 
dass draussen auch mal Minusgrade vorkommen.

von Marco G. (grmg2010)


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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

Marco G. schrieb:

> Ich möchte damit nur Temperaturen
> über 0°C messen, kälter sollte es in einem beheizten Haus lieber nicht
> werden.

Ist trotzdem kein Argument mit negativen Temperaturen nicht zurecht zu 
kommen.

von Marco G. (grmg2010)


Lesenswert?

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.

von Karl H. (kbuchegg)


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.

von Marco G. (grmg2010)


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
}

: Bearbeitet durch User
von Pete K. (pete77)


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.

von Marco G. (grmg2010)


Lesenswert?

Pete K. schrieb:
> Also mal ein
>   if (!checkParity(&temp_value1)) return 0;

An welcher Stelle genau?

von Pete K. (pete77)


Lesenswert?

in getTSicTemp

von Marco G. (grmg2010)


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
}

: Bearbeitet durch User
von Pete K. (pete77)


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;

von Sabberlotte (Gast)


Lesenswert?

Temperatur = (Digital signal / 2047 * 200 - 50) °C  sagt das Datenblatt

von Marco G. (grmg2010)


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 :)

: Bearbeitet durch User
von Marco G. (grmg2010)


Angehängte Dateien:

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?

: Bearbeitet durch User
von Karl H. (kbuchegg)


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.

von Pete K. (pete77)


Lesenswert?

Marco G. schrieb:
> EA DIP203G-4NLED

Ganz schön teuer das Teil. Ein normales LCD kostet 2-3€:
http://www.ebay.de/itm/LCD-1602-Module-Display-Anzeigen-2X16-Zeichen-kompatibel-HD44780-fur-Arduino-/271712320463?pt=Bauteile&hash=item3f4350fbcf

Beim Chinesen (aliexpress.com) noch günstiger.

von m.n. (Gast)


Lesenswert?

Pete K. schrieb:
>> EA DIP203G-4NLED
>
> Ganz schön teuer das Teil. Ein normales LCD kostet 2-3€:
> Ebay-Artikel Nr. 271712320463

Da mußt Du dann aber drei Stück kaufen und passend zusammenflexen, damit 
eine 4 x 20 Anzeige daraus wird.

von Marco G. (grmg2010)


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.

: Bearbeitet durch User
von Pete K. (pete77)


Lesenswert?

Hej, ich wollte nur eine Anregung geben. Mein Geld ist es ja nicht :-)

Have fun!

von Marco G. (grmg2010)


Lesenswert?

Das ist sehr löblich von dir. Vielen Dank dafür :)

von Ingo (Gast)


Lesenswert?

Wie montiert man denn dieses LCD, gefällt mir ganz gut!

von Werner M. (Gast)


Lesenswert?

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 ...

von Werner M. (Gast)


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.

von Marco G. (grmg2010)


Lesenswert?

Ingo schrieb:
> Wie montiert man denn dieses LCD, gefällt mir ganz gut!

Einfach einlöten, keine Schrauben, keine Bolzen. Nur leider im 2mm 
Raster und nicht 2,54mm

@Werner

Das habe ich mir auch gedacht, als ich die Zeichnung gesehen hatte und 
versucht hatte das Rätsel der Pins zu lösen.

: Bearbeitet durch User
von Pete K. (pete77)


Lesenswert?

Du hast aber gesehen, dass das Display mit 3V3 betrieben wird und nicht 
mit 5V?

Da die TSICs besser mit 5V betrieben werden rate ich Dir zu einem 
anderen Display.

: Bearbeitet durch User
von Marco G. (grmg2010)


Angehängte Dateien:

Lesenswert?

Natürlich habe ich gesehen, dass das LCD mit 3V3 betrieben wird und der 
Sensor lieber mit 5V. Aus diesem Grund möchte ich zwischen uC und Sensor 
zwei dieser Level-Shifter einsetzen: TXB0101

von Karl H. (kbuchegg)


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.

von m.n. (Gast)


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

von Marco G. (grmg2010)


Lesenswert?

Ich wollte das Display jetzt einmal in Betrieb nehmen, dabei ist mir 
aufgefallen, dass der Hintergrund schwarz und die Schrift grün ist. Ist 
dies normal, oder ist dies ein invertierter Modus? Gibt es auch schwarze 
Schrift auf grünem Grund?

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.