martin66119
07.12.2012, 22:42
Hallo!
vor 3 Jahren hatte ich mir mal eine Controller besorgt und mit diesem über 4 DS1820 Temperaturen gemessen. Doch heute klappt der Code nicht mehr!
Hier der Code:
$regfile = "m8def.dat"
$crystal = 3686400
$hwstack = 46
$swstack = 40
$framesize = 40
'**************************Funktionen LCD-Display*******************************
Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port
Config Portb = Output
Dim ___lcdno As Byte
___lcdno = 0
Initlcd
Cursor Off
Cls
___lcdno = 1
Initlcd
Cursor Off
Cls
'**************************Def. allgemeiner Variabeln***************************
Dim Tempmessstelle(7) As Single
'*************************Config Timer1*****************************************
Config Timer1 = Timer , Prescale = 1024 '64 '256 'Konfiguriere Timer1
Enable Timer1 'schalte den Timer1 ein
On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1
Enable Interrupts
Timer1 = 34286 'Timer1 soll schon von 34285 wegzählen 4 sekunden
'***************************Config 1Wire****************************************
Config 1wire = Portc.1 'DS1820
Match_rom Alias &H55
Read_scratchpad Alias &HBE
Start_conversion Alias &H44
Fg Alias 0
Hg Alias 1
Rl Alias 2
Vl Alias 3
Dim Read_temp As Integer
Dim Sensor_ids(4) As Byte
Dim Id As Byte
Dim Offset As Byte
Dim Ds_array(7) As Byte
Dim Bruchteil As Single
Dim Temperatur As Single
Dim I As Integer
'***************************ID 1Wire configurieren******************************
For Id = 1 To 40 '40 'Einlesen der 5 Sensoren IDs (5*8 Byte)
I = Id - 1
Readeeprom Sensor_ids(id) , I
Next Id
'***********************************Hauptprogramm* ******************************
Do
Loop
End
'**********************************1Wire********** ******************************
1wire:
For Id = Fg To Vl
Offset = Id * 8
Offset = Offset + 1 'Offset geht auf 1, 9, 17, 25 und 33
1wreset 'hier wird der Temperaturwert eingelesen
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8 '8 Byte ID wird übertragen
1wwrite Read_scratchpad
For I = 1 To 7 'nur bis 7, weil 8 und 9 uninteressant
Ds_array(i) = 1wread()
Next I
Read_temp = Makeint(ds_array(1) , Ds_array(2))
1wreset 'jetzt wird wieder die Konvertierung gestartet
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8
1wwrite Start_conversion
Shift Read_temp , Right
If 127 < Read_temp Then Read_temp = Read_temp - 32768
Bruchteil = 16 - Ds_array(7)
Bruchteil = Bruchteil / 16
Bruchteil = Bruchteil - 0.25
Temperatur = Read_temp + Bruchteil
Tempmessstelle(id + 1) = Temperatur
If Temperatur <> 85.0 Then ' < 80.0 And Temperatur > -20.0 Then
Tempmessstelle(id + 1) = Temperatur
End If
___lcdno = 0
Select Case Id
Case Fg:
Locate 1 , 1 : Lcd "FG: "
Locate 1 , 5 : Lcd Fusing(temperatur , "#.#")
Case Hg:
Locate 1 , 11 : Lcd "HG: "
Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
Case Rl: 'ausgabe im Display ist dann z.B.
Locate 2 , 1 : Lcd "VL: "
Locate 2 , 5 : Lcd Fusing(temperatur , "#.#" )
Case Vl:
Locate 2 , 11 : Lcd "RL: "
Locate 2 , 14 : Lcd Fusing(temperatur , "#.#")
End Select
Cursor Off
Next Id
Return
Return
'**************************Subroutine für Timer1********************************
Isr_von_timer1: 'ISR von Timer1
Timer1 = 34286
Gosub 1wire
Return
$eeprom
Data &H28 , &HA2 , &H75 , &HAA , &H03 , &H00 , &H00 , &HC5 'Ausgelesen mit dem Controller
Data &H28 , &H25 , &H67 , &HAA , &H03 , &H00 , &H00 , &H55 ' Ausgelesen mit dem Controller
Data &H10 , &H78 , &H37 , &H39 , &H01 , &H08 , &H00 , &H11 ' nicht mehr angeschlossen
Data &H10 , &HC0 , &H46 , &H19 , &H01 , &H08 , &H00 , &H67 ' nicht mehr angeschlossen
Data &H10 , &H56 , &HA3 , &H23 , &H01 , &H08 , &H00 , &H3F ' nicht mehr angeschlossen
Was ist denn da faslch? Kann mir jemand helfen!? Habe ich ggf. was falsch im Programmer eingestellt?
Und dann noch. Die Übertragung auf den Controller ist sehr langsam.
Dank schon einmal
Martin
vor 3 Jahren hatte ich mir mal eine Controller besorgt und mit diesem über 4 DS1820 Temperaturen gemessen. Doch heute klappt der Code nicht mehr!
Hier der Code:
$regfile = "m8def.dat"
$crystal = 3686400
$hwstack = 46
$swstack = 40
$framesize = 40
'**************************Funktionen LCD-Display*******************************
Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port
Config Portb = Output
Dim ___lcdno As Byte
___lcdno = 0
Initlcd
Cursor Off
Cls
___lcdno = 1
Initlcd
Cursor Off
Cls
'**************************Def. allgemeiner Variabeln***************************
Dim Tempmessstelle(7) As Single
'*************************Config Timer1*****************************************
Config Timer1 = Timer , Prescale = 1024 '64 '256 'Konfiguriere Timer1
Enable Timer1 'schalte den Timer1 ein
On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1
Enable Interrupts
Timer1 = 34286 'Timer1 soll schon von 34285 wegzählen 4 sekunden
'***************************Config 1Wire****************************************
Config 1wire = Portc.1 'DS1820
Match_rom Alias &H55
Read_scratchpad Alias &HBE
Start_conversion Alias &H44
Fg Alias 0
Hg Alias 1
Rl Alias 2
Vl Alias 3
Dim Read_temp As Integer
Dim Sensor_ids(4) As Byte
Dim Id As Byte
Dim Offset As Byte
Dim Ds_array(7) As Byte
Dim Bruchteil As Single
Dim Temperatur As Single
Dim I As Integer
'***************************ID 1Wire configurieren******************************
For Id = 1 To 40 '40 'Einlesen der 5 Sensoren IDs (5*8 Byte)
I = Id - 1
Readeeprom Sensor_ids(id) , I
Next Id
'***********************************Hauptprogramm* ******************************
Do
Loop
End
'**********************************1Wire********** ******************************
1wire:
For Id = Fg To Vl
Offset = Id * 8
Offset = Offset + 1 'Offset geht auf 1, 9, 17, 25 und 33
1wreset 'hier wird der Temperaturwert eingelesen
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8 '8 Byte ID wird übertragen
1wwrite Read_scratchpad
For I = 1 To 7 'nur bis 7, weil 8 und 9 uninteressant
Ds_array(i) = 1wread()
Next I
Read_temp = Makeint(ds_array(1) , Ds_array(2))
1wreset 'jetzt wird wieder die Konvertierung gestartet
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8
1wwrite Start_conversion
Shift Read_temp , Right
If 127 < Read_temp Then Read_temp = Read_temp - 32768
Bruchteil = 16 - Ds_array(7)
Bruchteil = Bruchteil / 16
Bruchteil = Bruchteil - 0.25
Temperatur = Read_temp + Bruchteil
Tempmessstelle(id + 1) = Temperatur
If Temperatur <> 85.0 Then ' < 80.0 And Temperatur > -20.0 Then
Tempmessstelle(id + 1) = Temperatur
End If
___lcdno = 0
Select Case Id
Case Fg:
Locate 1 , 1 : Lcd "FG: "
Locate 1 , 5 : Lcd Fusing(temperatur , "#.#")
Case Hg:
Locate 1 , 11 : Lcd "HG: "
Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
Case Rl: 'ausgabe im Display ist dann z.B.
Locate 2 , 1 : Lcd "VL: "
Locate 2 , 5 : Lcd Fusing(temperatur , "#.#" )
Case Vl:
Locate 2 , 11 : Lcd "RL: "
Locate 2 , 14 : Lcd Fusing(temperatur , "#.#")
End Select
Cursor Off
Next Id
Return
Return
'**************************Subroutine für Timer1********************************
Isr_von_timer1: 'ISR von Timer1
Timer1 = 34286
Gosub 1wire
Return
$eeprom
Data &H28 , &HA2 , &H75 , &HAA , &H03 , &H00 , &H00 , &HC5 'Ausgelesen mit dem Controller
Data &H28 , &H25 , &H67 , &HAA , &H03 , &H00 , &H00 , &H55 ' Ausgelesen mit dem Controller
Data &H10 , &H78 , &H37 , &H39 , &H01 , &H08 , &H00 , &H11 ' nicht mehr angeschlossen
Data &H10 , &HC0 , &H46 , &H19 , &H01 , &H08 , &H00 , &H67 ' nicht mehr angeschlossen
Data &H10 , &H56 , &HA3 , &H23 , &H01 , &H08 , &H00 , &H3F ' nicht mehr angeschlossen
Was ist denn da faslch? Kann mir jemand helfen!? Habe ich ggf. was falsch im Programmer eingestellt?
Und dann noch. Die Übertragung auf den Controller ist sehr langsam.
Dank schon einmal
Martin