PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problemchen mit der programmierung mehrerer sht 11 sensoren



Tom K
15.01.2006, 10:28
Ich hab ne routine für die Sht 11 sensoren gefunden.
diese sensoren haben einen 2 draht bus bei mir sck und dat.
Mit einem sensor kein Problem nur mit den 4 sensoren.

in der routine ist der bus so definiert
Sck Alias Portb.0
Dat Alias Portb.1
wenn ich die anderen sensoren auslesen will sagte ich
Sck Alias Portb.2
Dat Alias Portb.3
nur läst er mich nicht und scheibt
ALIAS already used [sck]
ALIAS already used [dat]
ist mir auch klar dopelt definiert

jezt die frage wie kann ich es so programmieren das ich auch mit der selben routine mehrere auslese? kann ich das ALIAS irgendwie löschen oder reseten?

für jeden sensor eine eigene routine wäre doch platzverschwendung!

PicNick
15.01.2006, 10:41
Alias kann man nicht ändern, da er ihn beim Kompilieren direkt verwendet, d.h. er schreibt das direkt in seinen Code rein.
Platzverschwendung: Kommt auf die Routine an. EINE Routine, die die Pins als variable nimmt, ist eben deshalb einiges länger. Ist nicht gesagt, daß 4 einzelne wirklich soooo viel mehr platz brauchen.
Deshalb: Wie sehen dies Routinen aus ?

Tom K
15.01.2006, 10:47
die routine hab ich von
http://www.mcselec.com/index.php?option=com_content&task=view&id=80&Itemid=57

PicNick
15.01.2006, 11:01
ogottogott. Ich bin für standrechtliche Erschiessung oder zumindest drei Tage Wasser und Brot.
Der Seppel macht mächtig tamtam mit alias und trallalla, im Code setzt er aber brutal hardcoded seine PINS. d.h. wenn du die Alias änderst, ist die ganze Routine sowieso im A....
*grunz*
Aber in einem hast du recht: diese Routine kannst du nicht 4 mal reinschreiben, das ist Tierquälerei.
Da muß man fest reingreifen, uiuiuiui.

Ich hol mir das Zeugs mal runter und schau, was sich machen läßt, das ist ja eine Schande. *schnorch*

Tom K
15.01.2006, 11:04
das war aber die kürzere und die auch funktioniert *gg*

PicNick
15.01.2006, 11:38
Das die Routine, so wie sie ist, funktioniert, wollt' ich nicht bezweifeln, das glaub ich schon.
Aber genau für dein Problem ist da kein Platz.

Wie ist eigentlich deine Anforderung: sind deine SCK & DTA Pins kreuz und quer irgendwo auf die Ports verteilt, oder sind die irgendwie gruppiert ?

Tom K
15.01.2006, 11:42
Sensor 1 liegt an portb.0 und portb.1
Sensor 1 liegt an portb.2 und portb.3
Sensor 1 liegt an portb.4 und portb.5
Sensor 1 liegt an portb.6 und portb.7

Tom K
15.01.2006, 11:43
richtigstellung
Sensor 1 liegt an portb.0 und portb.1
Sensor 2 liegt an portb.2 und portb.3
Sensor 3 liegt an portb.4 und portb.5
Sensor 4 liegt an portb.6 und portb.7

PicNick
15.01.2006, 12:03
Also eh' sehr routinenfreundlich. Nun, man muß die einzelnen Befehle (hauptsächlich "getit()" ) durchackern und sie auf parametrisierbar umbauen
Am effizientesten wär eigentlich, das Pin-Gefummel mit assembler entweder inline oder als library auszuführen
*klingt nach arbeit*

bluelight_electronic
15.01.2006, 12:07
hi,

hmm kann mit der basic routiene leider null anfangen :/ aber hmm SCK & Data ? kann man die nicht alle paralell schalten? für was hab ich n Nen Bussystem wenn ich jeden einzeln irgendwo ranhäng ? Kenn die dinger grad nich Auswändig aber währe für mich logisch..

kann sein das die das nich unterstützen aber öhm währ komisch

//
edit : es gibt ne Edit Funktion ( *da rechts oben bei deinem Post*) ^^ musst nich neuen Post machen zum Richtigstellen :)
//

Tom K
15.01.2006, 12:35
Stimmt die haben nen bus aber leider unterstützen sie keine adressen und so muss man sie einzeln anhängen

bluelight_electronic
15.01.2006, 12:47
ah ok ^^ na das is ja ma sehr Sinvoll ^^

hmm aber ma ne andere idee,

wie zeitkritisch musst du die Messung machen?

wenns dir nicht eilt machs ganz einfach ..

häng die VCC auf nen port Pins deines Prozessors..

also alle VCC auf nen Eigenen Port... und die 2 SCK & Data machst alle paralell ... dann beim messen schaltest dir deinen Sensor 1 die VCC auf High. Wartest ka 1 bis 2sec misst schaltest den wieder aus. Schaltest n nächsten ein wartest wieder 2sec und misst ... und so halt durch die bank...


ev.

Tom K
15.01.2006, 13:03
wäre ne möglichkeit nur hab nur mehr 2port´s frei und zu den 2 m32 noch einen dazu!?

bluelight_electronic
15.01.2006, 13:08
naja wenn du insgesammt 4 frei hast kannst auf normalem Wege auch nur 2 Anschließen... ^^ wenn 6 frei hättest könntest halt mit der von mir beschriebenen Methode 4 Anschließen und auf normalem Wege nur 3 ..

zudem hast halt weniger act beim code neu machen .. Aber wie gesagt nur nen Vorschlag ;)

Tom K
15.01.2006, 13:15
sorry falsch gedacht 2ports sind frei und 8port´s hab ich schon für die Sensoren reserviert! =>10 port´s zur verfügung!!
Hab nur etwas bedenken wegen der 3 anderen sensoren die halt keine Spannung(VCC) haben aber zwischen den Bus leitungen und GND liegen sie dann schon auf Spannung! und wenn man dann die VCC an einen Sensor gibt muss man dann doch mind 11ms warten bis ein Start Befehl gesendet werden darf!

PicNick
15.01.2006, 14:15
Ich täte sage, das Zappeln nutzt dir nix, alles andere ist noch viel stranger. Mit dem VCC hast du auch recht, das ist nicht das wahre.
am gescheitesten ist und bleibt das Umschreiben der Pin-befehle
das ist einmal arbeit, aber dann ist die sache erledigt.

PS: Einen Bus zu haben, aber nur die adresse 000 zuzulassen, ist ja schon recht lustig, ich muß schon sagen

bluelight_electronic
15.01.2006, 15:19
hmm gibt noch ne andere möglichkeit ^^ (gut den Code umschreiben wird das einfachste sein ..) aber wenns auch ma mit Portpins Knapp wird.. und du Angst hast wegen der Busleitungen die an VCC liegen und das ic auf GND ...


es gibt Multiplexer (cd4053) die dir gleichzeitig 3 Pins umschalten können (kannst auch Manuell machen per z.b. cd4066 (is n Analogschalter)) da kannst die Pins dann komplett "Wegnehmen"...

aber wenn dir deine Portpins kein prob machen.. machs wie PicNick sagt und schreib das ding um... :) dabei lernst noch was *gg*

und das mit m Bus und keinen Adressen find ich auch immer noch klasse ^^

PicNick
15.01.2006, 15:57
Ja, ich find', das sollt' man sich von Muttern aussticken lassen und an die Wand hängen

Ratber
15.01.2006, 22:50
Meine Güte der Code auf MCS ist ja Terrible hoch drei.


Der PCA9516 ist eigentlich genau für so ein dilemma geschaffen.

Da er selber ebenfalls über den I2C gesteuert wird ist der Bus sauber und universell.
Man kann sogar fast unendlich Kaskadieren.
Es sind eben nur zusätzlche Befehle fällig aber ich denke mal das es hier kaum Zeitkritisch wird.

Tom K
17.01.2006, 12:17
ich hab´s jezt mal auf 4 umgeschrieben könnt ihr´s euch mal ansehen !


$regfile = "M32def.dat"

$lcd = &HC000

$lcdrs = &H8000

Config Lcdbus = 8

Config Lcd = 20 * 4


Dim Messergebnis As Word
Dim Command As Byte
Dim Tt As String * 20
Dim Ff As String * 20
Dim Calc As Single
Dim Calc1 As Single
Dim Calc2 As Single
Dim Rh_lin As Single
Dim Rh_komp As Single
Dim Tempc As Single
Dim Tempf As Single
Dim Ctr As Single
Dim Dataword As Word
Dim A As Byte
Dim Temp1ist As String * 20
Dim Temp2ist As String * 20
Dim Temp3ist As String * 20
Dim Temp4ist As String * 20
Dim Rlf1ist As String * 20
Dim Rlf2ist As String * 20
Dim Rlf3ist As String * 20
Dim Rlf4ist As String * 20
Dim Temp1soll As Word
Dim Temp2soll As Word
Dim Temp3soll As Word
Dim Temp4soll As Word
Dim Rlf1soll As Word
Dim Rlf2soll As Word
Dim Rlf3soll As Word
Dim Rlf4soll As Word
Const C1 = -4
Const C2 = 0.648
Const C3 = -0.00072
Const T1 = 0.01
Const T2 = 0.00128
Const T1c = 0.04
Const T1f = 0.072
Temp1soll = 30
Temp2soll = 30
Temp3soll = 30
Temp4soll = 30
Rlf1soll = 75
Rlf2soll = 75
Rlf3soll = 75
Rlf4soll = 75
Declare Sub Getit1()
Declare Sub Getit2()
Declare Sub Getit3()
Declare Sub Getit4()
Declare Sub Connection1()
Declare Sub Connection2()
Declare Sub Connection3()
Declare Sub Connection4()
Declare Sub Transmission1()
Declare Sub Transmission2()
Declare Sub Transmission3()
Declare Sub Transmission4()
Declare Sub Temp()
Declare Sub Feucht_lin()
Declare Sub Feucht_kom()
Declare Sub Statusregister()
Declare Sub Befehl1()
Declare Sub Befehl2()
Declare Sub Befehl3()
Declare Sub Befehl4()

Sck1 Alias Portb.0
Dataout1 Alias Portb.1
Datain1 Alias Pinb.1
Sck2 Alias Portb.2
Dataout2 Alias Portb.3
Datain2 Alias Pinb.3
Sck3 Alias Portb.4
Dataout3 Alias Portb.5
Datain3 Alias Pinb.5
Sck4 Alias Portb.6
Dataout4 Alias Portb.7
Datain4 Alias Pinb.7

A = 1

Sensoren_reset:
Command = &B00011110
If A = 1 Then Call Transmission1
If A = 2 Then Call Transmission2
If A = 3 Then Call Transmission3
If A = 4 Then Call Transmission4
If A = 1 Then Call Befehl1
If A = 2 Then Call Befehl2
If A = 3 Then Call Befehl3
If A = 4 Then Call Befehl4
If A < 5 Then Call Statusregister
A = A + 1
If A = 5 Then Goto Main Else Goto Sensoren_reset

Main:

Do
A = 1
Gosub Anzeige
Gosub Sensoren_auslesen
Waitms 10
Loop

Anzeige:
Cls
Locate 1 , 1
Print "1.Chamäleon " ; Temp1ist ; "/" ; Temp1soll ; " °C " ; Rlf1ist ; "/" ; Rlf1soll ; "%"
Locate 2 , 1
Print "2.Geko´s " ; Temp2ist ; "/" ; Temp2soll ; " °C " ; Rlf2ist ; "/" ; Rlf2soll ; "%"
Locate 3 , 1
Print "3.Aufzucht " ; Temp3ist ; "/" ; Temp3soll ; " °C " ; Rlf3ist ; "/" ; Rlf3soll ; "%"
Locate 4 , 1
Print "4.Incubator " ; Temp3ist ; "/" ; Temp3soll ; " °C " ; Rlf3ist ; "/" ; Rlf3soll ; "%"
Return

Sensoren_auslesen:
If A = 1 Then Call Connection1
If A = 2 Then Call Connection2
If A = 3 Then Call Connection3
If A = 4 Then Call Connection4
Command = &B00000011
If A = 1 Then Call Befehl1
If A = 2 Then Call Befehl2
If A = 3 Then Call Befehl3
If A = 4 Then Call Befehl4
Waitms 60
If A = 1 Then Call Getit1
If A = 2 Then Call Getit2
If A = 3 Then Call Getit3
If A = 4 Then Call Getit4
Call Temp
If A = 1 Then Temp1ist = Tt
If A = 2 Then Temp2ist = Tt
If A = 3 Then Temp3ist = Tt
If A = 4 Then Temp4ist = Tt
If A = 1 Then Call Connection1
If A = 2 Then Call Connection2
If A = 3 Then Call Connection3
If A = 4 Then Call Connection4
Command = &B00000101
If A = 1 Then Call Befehl1
If A = 2 Then Call Befehl2
If A = 3 Then Call Befehl3
If A = 4 Then Call Befehl4
Waitms 20
If A = 1 Then Call Getit1
If A = 2 Then Call Getit2
If A = 3 Then Call Getit3
If A = 4 Then Call Getit4
Call Feucht_lin
If Tempc <= 5 Then
Call Feucht_kom
Else
If Tempc >= 45 Then
Call Feucht_kom
Else
Rh_komp = Rh_lin
End If
End If
Ff = Fusing(rh_komp , "##.##")
If A = 1 Then Rlf1ist = Ff
If A = 2 Then Rlf2ist = Ff
If A = 3 Then Rlf3ist = Ff
If A = 4 Then Rlf4ist = Ff
A = A + 1
If A = 5 Then Goto Main Else Goto Sensoren_auslesen


Sub Getit1
Local Datavalue As Word
Local Databyte As Byte
Config Datain1 = Input
Shiftin Datain1 , Sck1 , Databyte , 1 'get the MSB
Datavalue = Databyte
Config Datain1 = Output
Reset Dataout1
Set Sck1
Reset Sck1
Config Datain1 = Input
Shiftin Datain1 , Sck1 , Databyte , 1 'get the LSB
Shift Datavalue , Left , 8
Datavalue = Datavalue Or Databyte
Dataword = Datavalue
Config Datain1 = Output
Set Dataout1
Set Sck1
Reset Sck1
End Sub


Sub Getit2
Local Datavalue As Word
Local Databyte As Byte
Config Datain2 = Input
Shiftin Datain2 , Sck2 , Databyte , 1 'get the MSB
Datavalue = Databyte
Config Datain2 = Output
Reset Dataout2
Set Sck2
Reset Sck2
Config Datain2 = Input
Shiftin Datain2 , Sck2 , Databyte , 1 'get the LSB
Shift Datavalue , Left , 8
Datavalue = Datavalue Or Databyte
Dataword = Datavalue
Config Datain2 = Output
Set Dataout2
Set Sck2
Reset Sck2
End Sub


Sub Getit3
Local Datavalue As Word
Local Databyte As Byte
Config Datain3 = Input
Shiftin Datain3 , Sck3 , Databyte , 1 'get the MSB
Datavalue = Databyte
Config Datain3 = Output
Reset Dataout3
Set Sck3
Reset Sck3
Config Datain3 = Input
Shiftin Datain3 , Sck3 , Databyte , 1 'get the LSB
Shift Datavalue , Left , 8
Datavalue = Datavalue Or Databyte
Dataword = Datavalue
Config Datain3 = Output
Set Dataout3
Set Sck3
Reset Sck3
End Sub


Sub Getit4
Local Datavalue As Word
Local Databyte As Byte
Config Datain4 = Input
Shiftin Datain4 , Sck1 , Databyte , 1 'get the MSB
Datavalue = Databyte
Config Datain4 = Output
Reset Dataout4
Set Sck4
Reset Sck4
Config Datain4 = Input
Shiftin Datain4 , Sck4 , Databyte , 1 'get the LSB
Shift Datavalue , Left , 8
Datavalue = Datavalue Or Databyte
Dataword = Datavalue
Config Datain4 = Output
Set Dataout4
Set Sck4
Reset Sck4
End Sub

Sub Connection1
Config Datain1 = Output
Set Dataout1
For Ctr = 1 To 15
Set Sck1
Waitus 2
Reset Sck1
Waitus 2
Next Ctr
Call Transmission1
End Sub

Sub Connection2
Config Datain2 = Output
Set Dataout2
For Ctr = 1 To 15
Set Sck2
Waitus 2
Reset Sck2
Waitus 2
Next Ctr
Call Transmission2
End Sub

Sub Connection3
Config Datain3 = Output
Set Dataout3
For Ctr = 1 To 15
Set Sck3
Waitus 2
Reset Sck3
Waitus 2
Next Ctr
Call Transmission3
End Sub

Sub Connection4
Config Datain4 = Output
Set Dataout4
For Ctr = 1 To 15
Set Sck4
Waitus 2
Reset Sck4
Waitus 2
Next Ctr
Call Transmission4
End Sub


Sub Transmission1
Config Datain1 = Output
Set Sck1
Reset Dataout1
Reset Sck1
Set Sck1
Set Dataout1
Reset Sck1
End Sub

Sub Transmission2
Config Datain2 = Output
Set Sck2
Reset Dataout2
Reset Sck2
Set Sck2
Set Dataout2
Reset Sck2
End Sub

Sub Transmission3
Config Datain3 = Output
Set Sck3
Reset Dataout3
Reset Sck3
Set Sck3
Set Dataout3
Reset Sck3
End Sub

Sub Transmission4
Config Datain4 = Output
Set Sck4
Reset Dataout4
Reset Sck4
Set Sck4
Set Dataout4
Reset Sck4
End Sub


Sub Temp
Tempf = T1f * Dataword
Tempf = Tempf - 40
Tempc = T1c * Dataword
Tempc = Tempc - 40
Tt = Fusing(tempc , "###.##")
End Sub


Sub Feucht_lin
Calc = C2 * Dataword
Calc1 = Dataword * Dataword
Calc2 = C3 * Calc1
Calc1 = Calc + C1
Rh_lin = Calc1 + Calc2
End Sub


Sub Feucht_kom
Calc = T2 * Dataword
Calc1 = Calc + T1c
Calc2 = Tempc - 25
Calc = Calc2 * Calc1
Rh_komp = Calc + Rh_lin
End Sub


Sub Statusregister
If A = 1 Then Call Transmission1
If A = 2 Then Call Transmission2
If A = 3 Then Call Transmission3
If A = 4 Then Call Transmission4
Command = &B00000110
If A = 1 Then Call Befehl1
If A = 2 Then Call Befehl2
If A = 3 Then Call Befehl3
If A = 4 Then Call Befehl4
If A = 1 Then Call Transmission1
If A = 2 Then Call Transmission2
If A = 3 Then Call Transmission3
If A = 4 Then Call Transmission4
Command = &B00000001 'Switch to 8/12 bit resolution
If A = 1 Then Call Befehl1
If A = 2 Then Call Befehl2
If A = 3 Then Call Befehl3
If A = 4 Then Call Befehl4
End Sub


Sub Befehl1
Config Datain1 = Output
Shiftout Dataout1 , Sck1 , Command , 1
Reset Dataout1
Reset Sck1
Set Sck1
Bitwait Datain1 , Reset 'Wait ACK
Reset Sck1
End Sub

Sub Befehl2
Config Datain2 = Output
Shiftout Dataout2 , Sck2 , Command , 1
Reset Dataout2
Reset Sck2
Set Sck2
Bitwait Datain2 , Reset 'Wait ACK
Reset Sck2
End Sub

Sub Befehl3
Config Datain3 = Output
Shiftout Dataout3 , Sck3 , Command , 1
Reset Dataout3
Reset Sck3
Set Sck3
Bitwait Datain3 , Reset 'Wait ACK
Reset Sck3
End Sub

Sub Befehl4
Config Datain4 = Output
Shiftout Dataout4 , Sck4 , Command , 1
Reset Dataout4
Reset Sck4
Set Sck4
Bitwait Datain4 , Reset 'Wait ACK
Reset Sck4
End Sub
laut simulator sollte es funktionieren

PicNick
17.01.2006, 13:27
uiuiuiui. Wenn der Simulator zufrieden is, bin ich es auch. Dur bist mir nicht böse, wenn ich das Monster nicht mit dem Bleistift durchsteppe :-)

btw: Ist "Gecko" nicht mit "CK" ?

Ratber
17.01.2006, 17:39
Ich passe auch.
Kein Zeit für.

gandalf
19.01.2006, 02:31
Hier ein Datenblatt von SHT 11 :

http://www.driesen-kern.de/downloads/dbsht1x7xdeutschdk0704.pdf


Bernd