HPM
05.04.2010, 17:43
Hallo Forumler,
ich hab hier ein kleines Verständnisproblem!
Ich will eine Pumpe nach 2 verschiedenen Temp- Kriterien steuern. Dazu will ich 2 Temp.-fühler (LM75) an einer I2C auslesen. Ich hab nun schon mehrmals im Forum gelesen und auch RN-Wissen gequält, bin aber immer noch nicht so richtig hinter die Funktion der Ansteuerung gestiegen, wenn mann mehrere Geräte an einem Bus betreibt.
Hier mal mein vorbereiteter Code, der allerdings genau in dem Tempfühler SUP (ganz unten) nicht ausprogrammiert ist.
Kann mir da jemand mit größerer Erfahrung in den Dingen weiter helfen?
'-------------------------------------------------------------------------------
' Controller Grundeinstellung
'-------------------------------------------------------------------------------
$regfile = "m8def.dat" 'Prozessor MEGA8
$crystal = 1000000 'int. 1MHz-Takt
'-------------------------------------------------------------------------------
' Display Grundeinstellung
'-------------------------------------------------------------------------------
Config Lcd = 16 * 2 '16Zeichen 2Zeilen
Config Lcdbus = 4 '4 bit mode
Config Lcdmode = Port
Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.1 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
'Mega8 Anschlüsse Bein 2 Bein 3 Bein 6 Bein 11 Bein 12 Bein 13
'Displayanschluss Bein 6 Bein 4 Bein 11 Bein 12 Bein 13 Bein 14
'Displayanschluss (Rest) Bein 1 = GND Bein 2 = +5V Bein 3 = Kontrast
'-------------------------------------------------------------------------------
' Temperaturerfassung LM75 Grundeinstellung
'-------------------------------------------------------------------------------
Declare Sub Tempfuehler()
Const Lm75slavewrite = &H90
Const Lm75slaveread = &H91
Dim Lm75high As Byte
Dim Lm75low As Byte
Dim Wasser As Byte
Dim Luft As Byte
Dim Tempvar As Byte
Config Sda = Portc.4
Config Scl = Portc.5
'-------------------------------------------------------------------------------
' Eingänge, Ausgänge, Allgemeine Variablen
'-------------------------------------------------------------------------------
Config Pinb.1 = Input ' Pumpe Hand EIN
Config Pinb.2 = Output ' Pumpe Ausgang
Portb = &B11111111 ' alle PullUP ein
Portb.2 = 1 ' 1= Pumpe Aus
'************************************************* ******************************
'************************************************* ******************************
'* *
'* Hauptprogramm *
'* *
'************************************************* ******************************
'************************************************* ******************************
Do
Hand:
If Pinb.1 = 0 Then ' 0 = Schalter Ein
Portb.2 = 0 ' 0= Pumpe Ein
Locate 1 , 1
Lcd "! Hand ! "
Locate 2 , 1
Lcd "! Hand ! "
Goto Hand
End If
'-------------------------------------------------------------------------------
Call Tempfuehler()
'-------------------------------------------------------------------------------
' Display
'-------------------------------------------------------------------------------
Cls
Deflcdchar Print , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32 ' °=Grad-Zeichen
Locate 1 , 1
Lcd "Wasser="
Locate 1 , 9
Lcd Wasser
Locate 1 , 15
Lcd Chr(0) ; "C"
Locate 2 , 1
Lcd " Luft="
Locate 2 , 9
Lcd Luft
Locate 2 , 15
Lcd Chr(0) ; "C"
'-------------------------------------------------------------------------------
' Steuerung
'-------------------------------------------------------------------------------
'Steuerung, wenn Wasser zu kalt
Tempvar = Luft - 2
If Wasser < 22 And Wasser < Tempvar Then
Goto Pumpe_ein
End If
'Steuerung, wenn Wasser zu warm
Tempvar = Luft + 2
If Wasser >= 25 And Wasser > Tempvar Then
Goto Pumpe_ein
End If
Portb.2 = 1 ' 1= Pumpe AUS
Goto Endesteuerung
Pumpe_ein:
Portb.2 = 0 ' 0= Pumpe EIN
Endesteuerung:
Loop
End
'*************** ENDE HauptProgramm ********************************************
'************************************************* ******************************
'* *
'* Unterprogramme und Interrupt Routinen *
'* *
'************************************************* ******************************
'-------------------------------------------------------------------------------
' Sub LM75-Temperaturfühler
'-------------------------------------------------------------------------------
Sub Tempfuehler()
'***** Temperaturfühler 1 *****
I2cinit
I2cstart
I2cwbyte Lm75slaveread
I2crbyte Lm75high , Ack
I2crbyte Lm75low , Nack
I2cstop
If Lm75high > 127 Then
Wasser = Lm75high And 127
Wasser = Not Wasser
Incr Wasser
Else
Wasser = Lm75high '+/- Wert 'Korr. falsche Anzeige
End If
'***** Temperaturfühler 2 *****
I2cinit
I2cstart
I2cwbyte Lm75slaveread
I2crbyte Lm75high , Ack
I2crbyte Lm75low , Nack
I2cstop
If Lm75high > 127 Then
Luft = Lm75high And 127
Luft = Not Luft
Incr Luft
Else
Luft = Lm75high '+/- Wert 'Korr. falsche Anzeige
End If
'*******************************
Wait 5
End Sub
'-------------------------------------------------------------------------------
ich hab hier ein kleines Verständnisproblem!
Ich will eine Pumpe nach 2 verschiedenen Temp- Kriterien steuern. Dazu will ich 2 Temp.-fühler (LM75) an einer I2C auslesen. Ich hab nun schon mehrmals im Forum gelesen und auch RN-Wissen gequält, bin aber immer noch nicht so richtig hinter die Funktion der Ansteuerung gestiegen, wenn mann mehrere Geräte an einem Bus betreibt.
Hier mal mein vorbereiteter Code, der allerdings genau in dem Tempfühler SUP (ganz unten) nicht ausprogrammiert ist.
Kann mir da jemand mit größerer Erfahrung in den Dingen weiter helfen?
'-------------------------------------------------------------------------------
' Controller Grundeinstellung
'-------------------------------------------------------------------------------
$regfile = "m8def.dat" 'Prozessor MEGA8
$crystal = 1000000 'int. 1MHz-Takt
'-------------------------------------------------------------------------------
' Display Grundeinstellung
'-------------------------------------------------------------------------------
Config Lcd = 16 * 2 '16Zeichen 2Zeilen
Config Lcdbus = 4 '4 bit mode
Config Lcdmode = Port
Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.1 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
'Mega8 Anschlüsse Bein 2 Bein 3 Bein 6 Bein 11 Bein 12 Bein 13
'Displayanschluss Bein 6 Bein 4 Bein 11 Bein 12 Bein 13 Bein 14
'Displayanschluss (Rest) Bein 1 = GND Bein 2 = +5V Bein 3 = Kontrast
'-------------------------------------------------------------------------------
' Temperaturerfassung LM75 Grundeinstellung
'-------------------------------------------------------------------------------
Declare Sub Tempfuehler()
Const Lm75slavewrite = &H90
Const Lm75slaveread = &H91
Dim Lm75high As Byte
Dim Lm75low As Byte
Dim Wasser As Byte
Dim Luft As Byte
Dim Tempvar As Byte
Config Sda = Portc.4
Config Scl = Portc.5
'-------------------------------------------------------------------------------
' Eingänge, Ausgänge, Allgemeine Variablen
'-------------------------------------------------------------------------------
Config Pinb.1 = Input ' Pumpe Hand EIN
Config Pinb.2 = Output ' Pumpe Ausgang
Portb = &B11111111 ' alle PullUP ein
Portb.2 = 1 ' 1= Pumpe Aus
'************************************************* ******************************
'************************************************* ******************************
'* *
'* Hauptprogramm *
'* *
'************************************************* ******************************
'************************************************* ******************************
Do
Hand:
If Pinb.1 = 0 Then ' 0 = Schalter Ein
Portb.2 = 0 ' 0= Pumpe Ein
Locate 1 , 1
Lcd "! Hand ! "
Locate 2 , 1
Lcd "! Hand ! "
Goto Hand
End If
'-------------------------------------------------------------------------------
Call Tempfuehler()
'-------------------------------------------------------------------------------
' Display
'-------------------------------------------------------------------------------
Cls
Deflcdchar Print , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32 ' °=Grad-Zeichen
Locate 1 , 1
Lcd "Wasser="
Locate 1 , 9
Lcd Wasser
Locate 1 , 15
Lcd Chr(0) ; "C"
Locate 2 , 1
Lcd " Luft="
Locate 2 , 9
Lcd Luft
Locate 2 , 15
Lcd Chr(0) ; "C"
'-------------------------------------------------------------------------------
' Steuerung
'-------------------------------------------------------------------------------
'Steuerung, wenn Wasser zu kalt
Tempvar = Luft - 2
If Wasser < 22 And Wasser < Tempvar Then
Goto Pumpe_ein
End If
'Steuerung, wenn Wasser zu warm
Tempvar = Luft + 2
If Wasser >= 25 And Wasser > Tempvar Then
Goto Pumpe_ein
End If
Portb.2 = 1 ' 1= Pumpe AUS
Goto Endesteuerung
Pumpe_ein:
Portb.2 = 0 ' 0= Pumpe EIN
Endesteuerung:
Loop
End
'*************** ENDE HauptProgramm ********************************************
'************************************************* ******************************
'* *
'* Unterprogramme und Interrupt Routinen *
'* *
'************************************************* ******************************
'-------------------------------------------------------------------------------
' Sub LM75-Temperaturfühler
'-------------------------------------------------------------------------------
Sub Tempfuehler()
'***** Temperaturfühler 1 *****
I2cinit
I2cstart
I2cwbyte Lm75slaveread
I2crbyte Lm75high , Ack
I2crbyte Lm75low , Nack
I2cstop
If Lm75high > 127 Then
Wasser = Lm75high And 127
Wasser = Not Wasser
Incr Wasser
Else
Wasser = Lm75high '+/- Wert 'Korr. falsche Anzeige
End If
'***** Temperaturfühler 2 *****
I2cinit
I2cstart
I2cwbyte Lm75slaveread
I2crbyte Lm75high , Ack
I2crbyte Lm75low , Nack
I2cstop
If Lm75high > 127 Then
Luft = Lm75high And 127
Luft = Not Luft
Incr Luft
Else
Luft = Lm75high '+/- Wert 'Korr. falsche Anzeige
End If
'*******************************
Wait 5
End Sub
'-------------------------------------------------------------------------------