LM73 - macht mich irre

  • 1
  • 2
  • 3
  • 4
  • Page 1 of 4
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

LM73 - macht mich irre

 · 
Posted: 13.12.2016 - 16:31  ·  #1
Hallo @ all,

ich versuche gerade einen LM73 auszulesen und die gleiche Schaltung habe ich mit abweichendem Layout und einem Mega8 vor 3 Jahren schon einmal erfolgreich aufgebaut und programmiert. Jetzt ist ein Mega168V drin und nichts geht.
Das ist der Teil mit dem damals der LM ausgelesen wurde:
Code
TWIOut(LM73Adr,$00);               { Register 0                            }
LMStatus:=TWIInp(LM73Adr,HiTemp,LoTemp);

Einfach gesagt: Das Temperaturregister auswählen und Hi-/LoByte lesen. Exakt die gleiche Zeile 2 führt nun dazu, daß sich der uC komplett in den Wald stellt.
Also habe ich zuerst wieder das Temperaturregister gewählt und dann mit zwei getrennten TWIInp die beiden Bytes gelesen. Das hat aber zur Folge, daß zweimal das HiByte gelesen wird und kein LoByte.
Wenn ich nun ein Word oder Integer lese kommt auch nur Mist raus. Als nächstes versuche ich mal ein Array aus zwei Bytes mit einem Pointer (geht das bei TWI?).
Evtl. hat ja einer von euch noch einen Tip für mich :)

Wenn nichts mehr geht werde ich mal eine meiner 3 Jahre alten Schaltungen neu flashen in der Hoffnung, das ich diese nicht damit kille.

Gruss
Harry
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: LM73 - macht mich irre

 · 
Posted: 13.12.2016 - 18:45  ·  #2
Hallo Harry,
hast Du schon mal in den generierten ASM Code reingeschaut?
Oder die beidem ASM Files dahingehend verglichen?

rolf
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: LM73 - macht mich irre

 · 
Posted: 13.12.2016 - 19:45  ·  #3
Hallo Rolf,
die beiden ASM-Files schauen in den relevanten Routinen gleich aus.
Ich hab aber ein bisschen getestet und was ganz kurioses festgestellt:
Code

Procedure Messung;                     { LM73 auslesen                         }
  Var LoTemp, HiTemp : Byte;
  Begin
    LMStatus:=TWIOut(LM73Adr,$00);     { Register 0                            }
    LMStatus:=TWIInp(LM73Adr,HiTemp,LoTemp);
  End Messung;

ist compilierbar. Wenn ich jedoch die beiden Var LoTemp und HiTemp global deklariere und in der Procedure lösche kommt ein Fehler: siehe Bild - der Cursor steht nach HiByte. D.h. heißt doch, daß TWIInp bei lokal deklarierten Variablen 2 Bytes lesen kann und bei globalen nur ein Byte. Bahnhof??????

Gruss
Harry

PS:Noch was: Wenn ich sage, daß sich der µC komplett aufhängt, heißt das, daß das angeschlossene Display (5x7 Punktmatrix per Software gemultiplext) nichts anzeigt - auch nicht den vorhandenen statischen Text, der immer und auch ohne Messwert erscheinen sollte. Wenn ich nun Make&Optimize mache und
Code
{$OPTI No_Phase_2_OR_3}
aktiviere wird wenigstens der statische Text (mit der Zeile von oben TWIInp(LM73Adr,HiByte,LoByte); !!!) angezeigt, wenn auch der Messwert immer noch sche...e ist :D
Attachments
LM73 - macht mich irre
Filename: LM73Fehler.PNG
Filesize: 7.61 KB
Title:
Download counter: 190
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: LM73 - macht mich irre

 · 
Posted: 13.12.2016 - 20:09  ·  #4
Ich habs :wav1: :wav1:

So funktioniert es (kein Hänger und richtige Temperatur):
Code

Var Temp : Array[0..1] of Byte;

Procedure Messung2;                     { LM73 auslesen                         }
  Begin
    LMStatus:=TWIOut(LM73Adr,$00);     { Register 0                            }
    LMStatus:=TWIInp(LM73Adr,Temp);
  End Messung2;


.... nur wieso?????

Gruss
Harry
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: LM73 - macht mich irre

 · 
Posted: 13.12.2016 - 20:36  ·  #5
Hi Harry,
das
Code
LMStatus:=TWIInp(LM73Adr,HiTemp,LoTemp);

hat damals zufällig funktioniert.
Da hat er dein HiTemp als dst Pointer genommen und LoTemp als Count wenn dort nun mehr als 2 drin stand dann hat es den Frame zerlegt und dein Prog ist abgenippelt.

Richtigwäre es gewesen
Code

Var
  tmp : word;
LMStatus:=TWIInp(LM73Adr,Tmp,2);  // pointer und Anzahl bytes


oder einfach:
Code

var 
Tmp : word; // oder  .. array[0..1] of byte
LMStatus:=TWIInp(LM73Adr,Tmp);  // var dst 


Gruß
miparo
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: LM73 - macht mich irre

 · 
Posted: 13.12.2016 - 21:30  ·  #6
Hi miparo,

mit einer Word-Var hat es definitiv nicht funktioniert.

Aber damals Zufall bei 12 Geräten?

Gruss
Harry
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: LM73 - macht mich irre

 · 
Posted: 13.12.2016 - 22:12  ·  #7
Code
LMStatus:=TWIInp(LM73Adr,HiTemp,LoTemp);

das hätte auch nur als als
Code
LMStatus:=TWIInp(P)(LM73Adr,HiTemp,LoTemp);

funktionieren dürfen mit einem random Ergebnis.
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: LM73 - macht mich irre

 · 
Posted: 14.12.2016 - 08:11  ·  #8
Nagut :D ..... jetzt funktioniert es und ich hab das nächste Problem: irgendwas auf der Platine sorgt für eine Erwärmung des Sensors. Nur ist da außer dem uC eigentlich nicht viel drauf .... ich will ja nur die Raumtemperatur messen.
  • 1
  • 2
  • 3
  • 4
  • Page 1 of 4
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 16 · Cache Hits: 15   135   150 · Page-Gen-Time: 0.034094s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI