PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mehrere DS18S20 an einem 1 wire Bus



ACsenf
17.04.2005, 18:51
Hallo Ich habe mal wieder eine Frage :-)...

Vielleicht hat von Euch ja schon jemand Erfahrungen mit mehreren Dallas Temperatursensoren an einem Bus. Bisher habe ich mich mal anhand des Datenblatts und einem Beispiel von der MCS Site reingearbeitet.

Das Beispiel habe ich für 0.1 Grad genauigkeit und Ausgabe auf einem LCD modifiziert. Funktioniert wunderbar.


' ----------------------------------------------------------------
' Example measuring temperature using Dallas DS1820,
' with calculated for 0.1 C resolution and with 8-bit CRC!
' BASCOM 8051 AN
' ----------------------------------------------------------------
'-------------------------------------------------------------------------------
'Anschluß der iButtons an Portd.3 am AT90S8515 Board
'GND Schirm
'DQ Weiß
'Vdd braun
'-------------------------------------------------------------------------------
$regfile = "8515DEF.DAT"
$crystal = 4000000


Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.4 , Db6 = Porta.5 , Db7 = Porta.6 , E = Porta.2 , Rs = Porta.0

'************************************************* ******************************
Config Lcd = 16 * 2 'configure lcd screen
Config 1wire = Portd.3 ' DS1820 on pin 12 (pull up)

Declare Sub Read1820
Declare Sub Crcit
Declare Sub Temperature

Dim Bd(9) As Byte
Dim I As Byte , Tmp As Byte
Dim Crc As Byte
Dim T As Integer , Temp As Single
Dim V As Byte

Cls 'clear the LCD display
Lcd " ITG 2005" 'display this at the top line
Waitms 5
Lowerline 'select the lower line
Waitms 5
Lcd " Temp. Messung " 'display this at the lower line
Wait 5

Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32 ' replace ? with number (0-7)
Cursor Off Noblink
Cls

Locate 1 , 1 : Lcd "DEMO f" ; Chr(245) ; "r DS1820"
Locate 2 , 1 : Lcd "Temp.="

Do
Temperature
Waitms 250
Loop

End


'//////////////////////////////////////////////////////////////////////////////
Sub Temperature ' actual measuring

1wwrite &HCC : 1wwrite &H44 ' start measure
Waitms 300 ' wait for end of conversion
Read1820 ' read 9 bytes

If Err = 1 Then ' if there is no sensor
Locate 2 , 8 : Lcd " -- " ' we put "-- " on LCD
Else
If Crc = 0 Then ' sensor present, check CRC
Locate 2 , 8 : Lcd Fusing(temp , "#.##") ; Chr(0) ; "C" ' CRC OK, print T*10 on LCD
Else
Locate 2 , 8 : Lcd " ** " ' CRC NOT OK, "** " on LCD
End If
End If
End Sub

'//////////////////////////////////////////////////////////////////////////////
Sub Read1820 ' reads sensor ans calculate
' T for 0.1 C
1wreset ' reset the bus
1wwrite &HCC ' read internal RAM
1wwrite &HBE ' read 9 data bytest
Bd(1) = 1wread(9) ' read bytes in array
1wreset ' reset the bus

Crcit ' ckeck CRC
If Crc = 0 Then ' if is OK, calculate for
Tmp = Bd(1) And 1 ' 0.1C precision
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T / 2
Temp = Bd(8) - Bd(7)
Temp = Temp / Bd(8)
Temp = T + Temp
Temp = Temp - 0.25
End If
End Sub

'//////////////////////////////////////////////////////////////////////////////
Sub Crcit ' calculate 8 bit CRC
' bigger but faster
Crc = 0 ' needs a 256 elements table
For I = 1 To 9
Tmp = Crc Xor Bd(i)
Crc = Lookup(tmp , Crc8)
Next
End Sub

'//////////////////////////////////////////////////////////////////////////////
Crc8:
Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 247 , 182 , 232
Data 10 , 84 , 215 , 137 , 107 , 53


Dies ist für einen Sensor. Nur würde ich gerne mehrere Sensoren auswerten und jedem in sein eeprom eine Nummer für die Messstelle zuordnen um den jeweiligen angesprochen zu identifizieren. Momentan stehe ich da noch etwas ratlos da, wie das gehen soll.

Bin auf Eure Ideen und Tipps gespannt.

Gruß

Sven

edit: Schreibfehler in Titel korrigiert

edit: Bitte verwende die Code-Tokens (übersichtlicher)

x-ryder
17.04.2005, 22:23
hast du ICQ? da könnte ich mal nen paar sachen besprechen und dann hinterher den code hier reinstellen...

meine numma iss: 196004120

17.04.2005, 22:35
Hoi!
Japp habe dich autorisiert. Werde vermutlich morgen abend mal on sein.

Gruß

Sven

avrflo
20.06.2005, 20:48
Hi,
ich hol den Thread mal wieder aus der versenkung.
Hat jemand von euch inzwischen das Auslesen von mehreren Ds1820 hinbekommen?
Ein Sensor ist kein Problem, aber bei zwei bekomm ich das irgendwie nichtmehr hin! Achja, der Sensor ist über drei Leitungen angeschlossen, also nicht im parasite modus!
Hier mal mein Code:


$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600

Config 1wire = Portb.0

Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.6 , Db4 = Portb.7 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.1 , E2 = Portb.2


Dim ___lcdno As Bit
Dim T1 As Byte
Dim T2 As Byte
Dim I As Byte
Dim Id1 As Word
Dim Id2 As Word
Dim Ar1(2) As Byte
Dim Ar2(2) As Byte

___lcdno = 0
Initlcd
Cursor Off
Cls

___lcdno = 1
Initlcd
Cursor Off
Cls




Id1 = 1wsearchfirst()
Id2 = 1wsearchnext()

Do
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id1 'Id von Sensor 1
1wwrite &H44 'Convert T

Waitms 300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id1 'id von sensor 1
1wwrite &HBE 'scratchpad lesen
Ar1(1) = 1wread(1) 'erstes byte auslesen, da steht Temp drin
Ar1(2) = 1wread(1) 'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen



1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id2 'Id von Sensor 2
1wwrite &H44 'Convert T

Waitms 300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id2 'id von sensor 2
1wwrite &HBE 'scratchpad lesen
Ar2(1) = 1wread(1) 'erstes byte auslesen, da steht Temp drin
Ar2(2) = 1wread(1) 'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen





___lcdno = 0


Upperline
Lcd "Temperatur 1:" ; Ar1(2) ; " " ; Ar1(1)

Lowerline
Lcd "Temperatur 2:" ; Ar2(2) ; " " ; Ar2(1)

___lcdno = 1

Upperline
Lcd "ID 1:" ; Id1
Lowerline
Lcd "ID 2:" ; Id2



Loop





Ich bekomme immer als wert für das erste Byte 255 und für das zweite auch 255, das kann ja nicht stimmen.
MfG
Florian

21.06.2005, 10:02
Hallo avrflo,

Dein Fehler liegt in der Deklaration von ID1 und ID2. Der DS18S20 besitzt eine Adresse die aus 8 Bytes besteht. Da Du nur ein WORD definiert hast, werden die DS18S20 nie richtig adressiert.
Ich würde ID folgendermassen definieren:


DIM ID1(8) as Byte
DIM ID2(8) as Byte

...

ID1(1) = 1wsearchfirst()

usw.


Wenn alles klappt, kannst Du den Code ja mal hier reinstellen.

mfg

AVRWALLI

avrflo
21.06.2005, 11:15
Hallo AVRWALLI,
danke für den Tipp, man sollte das Datasheet halt genau lesen, jetzt klappts!
Hab nurnoch ein kleines Problem:

Ich bekomm ne Temperatur von 52°C raus, es ist zwar grad richtig heiß, aber 52 hats wohl doch nicht ganz, die Hälfte würde stimmen. Ist das irgandwie in nem anderen Datenformat codiert oder so?, ich versteh da das Datasheet auf S.3 net so ganz.
Datasheet:
http://pdfserv.maxim-ic.com/en/ds/DS1820-DS1820S.pdf

Achja, hier mein Code, ich werd, wenn er komplett fertig ist nen neuen Beitrag aufmachen, wo dann der Code von der kompletten Wetterstation mit RTC, zwei Temp Sensoren und nem Drucksensor als Barometer drin ist.
Hier also meine Code:



$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600

Config 1wire = Portb.0

Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.6 , Db4 = Portb.7 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.1 , E2 = Portb.2


Dim ___lcdno As Bit
Dim T1 As Byte
Dim T2 As Byte
Dim I As Byte
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(2) As Byte
Dim Ar2(2) As Byte


___lcdno = 0
Initlcd
Cursor Off
Cls

___lcdno = 1
Initlcd
Cursor Off
Cls




Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()


Do
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id1(1) , 8 'Id von Sensor 1
1wwrite &H44 'Convert T

Waitms 300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id1(1) , 8 'id von sensor 1
1wwrite &HBE 'scratchpad lesen
Ar1(1) = 1wread(1) 'erstes byte auslesen, da steht Temp drin
Ar1(2) = 1wread(1) 'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen


Waitms 500
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id2(1) , 8 'Id von Sensor 2
1wwrite &H44 'Convert T

Waitms 300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id2(1) , 8 'id von sensor 2
1wwrite &HBE 'scratchpad lesen
Ar2(1) = 1wread(1) 'erstes byte auslesen, da steht Temp drin
Ar2(2) = 1wread(1) 'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen

T1 = Ar1(1)
T2 = Ar2(1)






___lcdno = 0


Upperline

If Ar1(2) = 0 Then 'wenn byte 2 aus dem sensor = 0 dann temp pos, sonst neg
Lcd "Temperatur 1:" ; " " ; T1

Else
Lcd "Temperatur 1:" ; "-" ; T1

End If

Lowerline

If Ar2(2) = 0 Then 'wenn byte 2 aus dem sensor = 0 dann temp pos, sonst neg
Lcd "Temperatur 2:" ; " " ; T2

Else
Lcd "Temperatur 2:" ; "-" ; T2

End If

___lcdno = 1

Upperline
Lcd "ID 1:" ; Id1(1) ; Id1(2) ; Id1(3) ; Id1(4) ; Id1(5) ; Id1(6) ; Id1(7) ; Id1(8)

Lowerline
Lcd "ID 2:" ; Id2(1) ; Id2(2) ; Id2(3) ; Id2(4) ; Id2(5) ; Id2(6) ; Id2(7) ; Id2(8)

Waitms 500

Loop


Gruß
Florian

avrwalli
21.06.2005, 12:22
Hallo Florian,

so lese ich den DS18S20 aus und rechne um:



Sub 18s20_auslesen
1wreset Pinc , F ' Reset
1wwrite Skip_rom , 1 , Pinc , F ' Chip ansprechen
1wwrite Read_ram , 1 , Pinc , F ' Befehl zum Auslesen des Rams
Bd(1) = 1wread(9 , Pinc , F) ' 9 Bytes lesen
1wreset Pinc , F ' Reset
Temp = Bd(2)
Shift Temp , Left , 8
Temp = Temp + Bd(1)
If Temp > $f000 Then
Temp = $ffff - Temp
Temp1 = Temp + 1
Grad = Temp1 * -0.0625
Else
Grad = Temp * 0.0625 ' Auflösung 12 Bit
End If
End Sub


In Grad steht die umgerechnete Temperatur. Störe Dich nicht an de Parametern hinter den 1Wire-Befehlen, die geben nur an welcher Port und welcher Pin benutzt werden soll. Denke daran, es müssen 9 Byte ausgelesen werden.
Ich hoffe, es hilft Dir weiter.

mfg

AVRWALLI

avrflo
21.06.2005, 12:48
Hallo,
ich habe es inzwischen auch hinbekommen, im Datasheet steht ja, dass die ausgeleseneTemperatur durch zwei geteilt werden muss. Ich lese nur die ersten zwei Bytes aus, das reicht ja, ich mache auch keine CRC Prüfung oder so, mir reichen 0,5° Genauigkeit. Im ersten Byte steht ja die Temp und im zweiten das Vorzeichen, mehr brauch ich nicht und es funktioniert auch so.
Hier also mein endgültiger Code:


$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600

Config 1wire = Portb.0

Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.6 , Db4 = Portb.7 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.1 , E2 = Portb.2


Dim ___lcdno As Bit
Dim T1 As Byte
Dim T2 As Byte
Dim I As Byte
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(2) As Byte
Dim Ar2(2) As Byte


___lcdno = 0
Initlcd
Cursor Off
Cls

___lcdno = 1
Initlcd
Cursor Off
Cls




Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()


Do
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id1(1) , 8 'Id von Sensor 1
1wwrite &H44 'Convert T

Waitms 300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id1(1) , 8 'id von sensor 1
1wwrite &HBE 'scratchpad lesen
Ar1(1) = 1wread(1) 'erstes byte auslesen, da steht Temp drin
Ar1(2) = 1wread(1) 'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen


Waitms 500
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id2(1) , 8 'Id von Sensor 2
1wwrite &H44 'Convert T

Waitms 300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id2(1) , 8 'id von sensor 2
1wwrite &HBE 'scratchpad lesen
Ar2(1) = 1wread(1) 'erstes byte auslesen, da steht Temp drin
Ar2(2) = 1wread(1) 'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen

T1 = Ar1(1) / 2
T2 = Ar2(1) / 2






___lcdno = 0


Upperline

If Ar1(2) = 0 Then 'wenn byte 2 aus dem sensor = 0 dann temp pos, sonst neg
Lcd "Temperatur 1:" ; " " ; T1

Else
Lcd "Temperatur 1:" ; "-" ; T1

End If

Lowerline

If Ar2(2) = 0 Then 'wenn byte 2 aus dem sensor = 0 dann temp pos, sonst neg
Lcd "Temperatur 2:" ; " " ; T2

Else
Lcd "Temperatur 2:" ; "-" ; T2

End If

___lcdno = 1

Upperline
Lcd "ID 1:" ; Id1(1) ; Id1(2) ; Id1(3) ; Id1(4) ; Id1(5) ; Id1(6) ; Id1(7) ; Id1(8)

Lowerline
Lcd "ID 2:" ; Id2(1) ; Id2(2) ; Id2(3) ; Id2(4) ; Id2(5) ; Id2(6) ; Id2(7) ; Id2(8)

Waitms 500

Loop



Gruß und Danke
Florian

Reeper
20.08.2006, 12:43
Ich weiß, der Thread ist schon sehr alt.

Die 2 Code's hier sind ja echt wunderbar =D>
Habe diese nur noch mal zusammengefasst und auf eine Kommastelle gebracht.
Also 2 DS1820 mit 0,1 Grad Auflösung.
Wen es interessiert:


$regfile = "m32def.dat"
$framesize = 32
$swstack = 256
$hwstack = 128
$crystal = 16000000
$baud = 9600

Config 1wire = Portd.6

Dim T As Integer
Dim T1 As Integer
Dim T2 As Integer
Dim T3 As Integer
Dim T4 As String * 10
Dim T5 As String * 10
Dim T6 As Single
Dim T7 As Single
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(9) As Byte
Dim Ar2(9) As Byte
Dim I As Byte , Tmp As Byte , Tmp2 As Byte
Dim Crc As Byte

Declare Sub Crcit
Declare Sub Crcit2

Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()


Do
Print " "
1wreset
1wwrite &H55
1wwrite Id1(1) , 8
1wwrite &H44

Waitms 300
1wreset
1wwrite &H55
1wwrite Id1(1) , 8
1wwrite &HBE
Ar1(1) = 1wread(9)
1wreset
Crcit
If Crc = 0 Then
Tmp = Ar1(1) And 1
If Tmp = 1 Then Decr Ar1(1)
T = Makeint(ar1(1) , Ar1(2))
T = T * 50
T = T - 25
T1 = Ar1(8) - Ar1(7)
T1 = T1 * 100
T1 = T1 / Ar1(8)
T = T + T1
T = T / 10
T6 = T / 10
T4 = Fusing(t6 , "#.#")

End If

Waitms 500
1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &H44

Waitms 300
1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &HBE
Ar2(1) = 1wread(9)
1wreset
Crcit2
If Crc = 0 Then
Tmp2 = Ar2(1) And 1
If Tmp2 = 1 Then Decr Ar2(1)
T2 = Makeint(ar2(1) , Ar2(2))
T2 = T2 * 50
T2 = T2 - 25
T3 = Ar2(8) - Ar2(7)
T3 = T3 * 100
T3 = T3 / Ar2(8)
T2 = T2 + T3
T2 = T2 / 10
T7 = T2 / 10
T5 = Fusing(t7 , "#.#")

End If




Print "Temperatur in der Botwanne:" ; " " ; T4 ; " " ; "Grad Celsius"
Print "Temperatur am Gehäuse:" ; " " ; " " ; T5 ; " " ; "Grad Celsius"

Waitms 500

Loop

Sub Crcit

Crc = 0
For I = 1 To 9
Tmp = Crc Xor Ar1(i)
Crc = Lookup(tmp , Crc8)
Next
End Sub

Sub Crcit2

Crc = 0
For I = 1 To 9
Tmp2 = Crc Xor Ar2(i)
Crc = Lookup(tmp2 , Crc8)
Next
End Sub
'//////////////////////////////////////////////////////////////////////////////


Crc8:
Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 21 , 75 , 169

Berni28
18.10.2006, 08:35
Hallo Reeper,

du scheinst dich gut auszukennen, darum zwei Fragen (gilt natürlich auch für andere, die mir dabei helfen können ;-) ) :

Die Temperstursensoren (TS) werden ja mit 1wsearchfirst und 1wsearchnext angesprochen. Wird dann der erste in der Leitung als 1 erkannt, oder ist der mit der niedrigsten Seriennummer der erste ?

Gibt es eine Möglichkeit, daß Bascom selber erkennt wieviele TS angeschlossen sind und diese dann ausgibt (also TS1 ... TSn) und wenn ja, wie würde diese aussehen ?
Ich bräuchte das Prog für 10 Sensoren und das ganze zig mal zu kopieren und ewig viele Variablen du dimensionieren erscheint mir etwas irrwitzig.
Rein pragmatisch würde ich mal nach allen in der Leitung suchen lassen und diese durch eine Schleife dann nacheinander 'abklappern'.
Ok, vielleicht geht's auch nicht anders aber dazu habe ich nun doch zu wenig Ahnung. So weit bin ich mit meinen Mega32 Kenntnissen noch nicht.

Reeper
18.10.2006, 10:34
Hallo Berni28,

ich habe leider sogut wie keine Ahnung von Bascom (für solche komplizierteren Aufgaben) und arbeite mich erstmal in C ein.

Das o.g. Programme habe ich rein aus logischen Aspekten aus den 2 einzelnen Programmen zusammenbekommen.
Mit dem ersten Programm konnte man einen DS18S20 auf Kommastelle genau anzeigen lassen (durch auslesen der einzelnen Bit's und einer Tabelle) und mit dem 2. Programm 2 Sensoren ohne Kommastelle. Warum man aber genau den Sensor so ausliest, kann ich dir (noch ;-) )nicht sagen :oops:

Gruß
Stefan

Berni28
18.10.2006, 10:48
Aha,
sieht aber richtig professionell aus ;-)

Ich verwende Bascom, da ich seinerzeit unheimlich viel mit VisualBasic programmiert hatte. Die Befehle sind sich sehr ähnlich. Dafür tu ich mir mit C sehr schwer (Buch mit sieben Siegeln und so ...).

Mal sehen, vielleicht weiß noch jemand was dazu.

Berni28
18.10.2006, 12:34
Hab gerde bei den Application Notes bei Maxim etwas gestöbert und nützliche Programm-Code-Schnipsel (allerdings dürfte das C sein) gefunden !
Hier kommt Ihr dorthin:
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2815

for_ro
18.10.2006, 16:29
Hallo zusammen,
in meiner Heizungsteuerung habe ich auch mehrere DS1820 verbaut.
Dazu habe ich auch die angegebenen Codeschnipsel verwendet, die jemand dankenswerter Weise eingestellt hat.

Allerdings sieht man in allen Programmen, die ich gesehen habe, dass in einem Loop die Sensoren abgefragt werden. Das geht immer mit resetten, ID übertragen, Konvertierung starten, WARTEN, resetten, ID übertragen, Werte einlesen.
Warten fällt mir immer schwer, besonders weil mein Controller was tun soll. Also habe ich das so abgeändert, dass ich zu Anfang alle Sensoren konvertieren lasse. In meinem Loop wird dann erst eingelesen und dann sofort wieder die Konvertierung gestartet. -> keine Wartezeit. Der Loop ist bei mir der SecTic der Uhr, also jede Sekunde!

Außerdem frage ich nicht jedesmal ab, welche Sensoren auf dem Bus liegen. Wenn man das einmal gemacht hat, kann man die IDs auch fest ins EEPROM schreiben. Ich möchte ja schließlich sicher sein, welchen der Sensoren ich gerade abfrage. Dazu vergleiche ich entweder seine ID mit einer vorgegebenen oder ich gebe die direkt an. Ansonsten fehlt mal einer wegen Wackler und schon sind alle Werte durcheinander.

Gruß Rolf

Berni28
19.10.2006, 07:42
Hallo for_ro,
hab das gestern mal mit 3 Sensoren und 'nacheinanderkopieren' ausprobiert:
Es funktioniert zwar, ist aber nicht wirklich einfach. Ich bin noch nicht dahintergekommen, wie er die Sensoren sortiert. Da werde ich mal Deinen Gedanken auffassen und die entsprechenden Seriennummern hinterlegen. Erst dann kann ich definitiv sagen: Sensor 1 ist Temperatur 1 usw.
Das mit den Wartezeiten ist auch so 'ne Sache. Für eine Heizungssteuerung reicht das zwar leicht, wenn ich aber eine schnellere Rückmeldung oder höhere Temperaturen brauche, muß ich auf ein anderes Meßsystem übergehen. Ich hab mir mal einen PT1000 in einer Wheastone-Brücke durchgerechnet. Der macht bei einem Temperaturunterschied von -30...+100°C (=130K) eine Spannungsänderung von 0,0713...1,3563V bei 5V Nennspannung.
Aber irgendwie werde ich da jetzt auch nicht wirklich schlau draus. Hab ich zehn Sensoren auszuwerten, brauch ich ja einen imensen Vorschaltungsaufwand. Unsere Heizungssteuerung kann bis zu 15 Sensoren verarbeiten und hat auf einer Eurokarte platz. Nur wie die das machen kann ich leider nicht sehen (wg. Garantie versiegelt).

Ps.: Kannst du mir mal deinen Code posten ?

for_ro
19.10.2006, 08:52
Hallo Berni,
irgendwo habe ich mal gelesen, dass man höchstens 16 Sensoren an einen 1wire-Bus hängen kann. Aber der Controller kann ja mehrere Busse ansprechen. Schau mal hier http://s-huehn.de/elektronik/tempmess/tempmess-sm.htm

Zur Sortierung habe ich ehrlich gesagt keine Ahnung wie das geht, ist auch völlig egal. Du willst in der Regel immer wissen, welcher Sensor dir gerade welche Temperatur liefert. Also kannst du dich nicht auf die Sortierung verlassen. Lass dir in dem Loop die Temperaturen ausprinten und erwärme dann einen Sensor nach dem anderen. Dann weißt du welcher Sensor welche ID hat und schreib einen eindeutigen Teil auf jeden drauf.

Bei den Wartezeiten geht es mir mehr darum, die Reihenfolge umzudrehen. Nicht Konvertierung anfragen, warten, Wert übertragen sondern Wert übertragen, Konvertierung anfragen und dann sinnvolle andere Sachen tun. Dazu muss natürlich ganz am Anfang zuerst einmal konvertiert werden, sonst ist die erste Anzeige Müll.

Die schnellere Rückmeldung ist doch mehr eine Frage der Trägheit des Sensors, was sehr stark vom Gehäuse abhängt, das ja mit erhitzt oder gekühlt werden muss. Ich kann jede Sekunde einen Wert bekommen und nebenbei noch vieles andere tun. Und dafür brauche ich nur einen Pin des Controllers. Die PT1000 kannst du nur über die AD Eingänge abfragen. Wenn du das mal mit vernünftiger Genauigkeit versucht hast, lernst du die DS1820 schätzen. Und kalibriert sind die auch schon. Meine 5 habe eine Abweichung von 0.2 Grad, wenn ich sie alle nebeneinander halte. Das wirst du mit den PTs kaum schaffen. Den einzigen Nachteil, den ich wirklich sehe ist die Beschränkung auf 125°, was bei der Heizung aber uninteressant ist.
Interessant sind übrigens auch die I²C Sensoren, wie der LM75, allerdings mit viel mehr Leitungen. Die habe ich aber noch nicht ausprobiert.

Ich schau mal, ob ich die relevanten Teile aus dem Programm kopieren kann. Allerdings weiß ich auch noch nicht, wie man den Code hier einstellt. Kann also etwas dauern.

Gruß Rolf

Berni28
19.10.2006, 09:47
... interessante Schaltung. Danke für den Tipp !

Das mit der Trägheit ist klar, die habe ich ja bei jedem Sensor. Für eine erste Messung habe ich gestern mal zwei Sensoren mit 'nem Kabelbinder auf die Kühlkörper (KK) geschnallt. Soweit hat das auch gut funktioniert, da sich die KK's langsam erwärmt hatten.

Für die PT's (multi Analaogmessung) werden die AVR's wohl eh zu langsam sein. Da wird man ARM's nehmen müssen (allein schon wegen der Mittelwertberechnungen um einen halbwegs stabilen Meßwert zu bekommen).

Ich hab aber auch was gelesen, daß man die DS's in einen continous conversation Betrieb versetzen kann. Sprich die konvertieren laufend und man muß nur den Rom auslesen. Bei welcher Serie das geht, müsste ich aber nochmal explizit nachlesen (hab nur DS1820er).

Das mit der Seriennummer draufschreiben ist bei einem schwarzen TO-92 Gehäuse eine kitzlige Angelegenheit. Ich hab mir deshalb einen Silberstift besorgt und eine laufende Nummern auf den Kopf geschrieben. Das geht gerade so daß mann's noch lesen kann. Seitlich macht's wenig Sinn, da man diese Fläche sinnvoller Weise als Kontaktfläche verwendet.

Was den Code anbelangt:
Du klickst einfach oben auf den Knopf CODE fügst den Programmcode hier ein und drückst wieder auf CODE. Das wird zwar in dem Eingabefenster ein riesen Text, wenn du's gepostet hast siehts aber so wie weiter oben in diesem Thread aus.

for_ro
19.10.2006, 21:32
Hallo,
so hier mal der Code. Ich habe alles rausgeschmissen, was uninteressant ist.


$crystal = 16000000
$regfile = "m128def.dat"

Config 1wire = Portd.5 'DS1820

Match_rom Alias &H55
Read_scratchpad Alias &HBE
Start_conversion Alias &H44
Aussen Alias 0
Boiler Alias 1
Kessel Alias 2
Rücklauf Alias 3
Vorlauf Alias 4

Dim Read_temp As Integer
Dim Sensor_ids(40) 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

Config Graphlcd = 240 * 128 , Dataport = Portc , Controlport = Porta , Ce = 4 , Cd = 5 , Wr = 2 , Rd = 3 , Reset = 7 , Fs = 6 , Mode = 6
Cursor Off
Cls

For Id = 1 To 40 'Einlesen der 5 Sensoren IDs (5*8 Byte)
I = Id - 1
Readeeprom Sensor_ids(id) , I
Next Id

Do
Wait 1
For Id = Aussen To Vorlauf
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 - 32767
Bruchteil = 16 - Ds_array(7)
Bruchteil = Bruchteil / 16
Bruchteil = Bruchteil - 0.25
Temperatur = Read_temp + Bruchteil
Locate 11 , 1 : Lcd " Auss Boil Kess Rück Vorl "
Select Case Id
Case Aussen:
Locate 12 , 2 : Lcd Fusing(temperatur , "#.#")
Case Boiler: 'ausgabe im Display ist dann z.B.
Locate 12 , 8 : Lcd Fusing(temperatur , "#.#") ' Auss Boil Kess Rück Vorl
Case Kessel: ' 14.4 52.4 67.3 43.0 62.8
Locate 12 , 13 : Lcd Fusing(temperatur , "#.#")
Case Rücklauf:
Locate 12 , 18 : Lcd Fusing(temperatur , "#.#")
Case Vorlauf:
Locate 12 , 23 : Lcd Fusing(temperatur , "#.#")
End Select
Next Id
Loop
End

$eeprom

Data &H10 , &H50 , &H4F , &HE3 , &H00 , &H08 , &H00 , &HE4
Data &H10 , &HFD , &HE8 , &HE2 , &H00 , &H08 , &H00 , &H1F
Data &H10 , &H44 , &H42 , &HFF , &H00 , &H08 , &H00 , &HA5
Data &H10 , &H1D , &H14 , &HE3 , &H00 , &H08 , &H00 , &H3E
Data &H10 , &HB0 , &HEF , &HE2 , &H00 , &H08 , &H00 , &H71

Vielleicht kann jemand was damit anfangen.
Wie gesagt, bei mir wird das Ganze aus der SecTic Int -Routine aufgerufen. Da will ich dann lieber keine Zeit verschwenden.

Gruß Rolf

TobiasBlome
14.11.2006, 19:50
Hallo,
ich habe noch nichts mit eeProm gemacht. Kann mir einer kurz erklären was es mit $eeprom auf sich hat? Ist das irgendwie eine Speicherzuordnung? Welche Daten werden dort wofür gespeichert?

vielen Dank, Tobias


$eeprom

Data &H10 , &H50 , &H4F , &HE3 , &H00 , &H08 , &H00 , &HE4
Data &H10 , &HFD , &HE8 , &HE2 , &H00 , &H08 , &H00 , &H1F
Data &H10 , &H44 , &H42 , &HFF , &H00 , &H08 , &H00 , &HA5
Data &H10 , &H1D , &H14 , &HE3 , &H00 , &H08 , &H00 , &H3E
Data &H10 , &HB0 , &HEF , &HE2 , &H00 , &H08 , &H00 , &H71

TobiasBlome
14.11.2006, 19:54
Ach so,
noch eine Frage:

wozu ist diese Tabelle?

Crc8:
Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 21 , 75 , 169

for_ro
15.11.2006, 08:35
Hallo Tobias,
meine eeprom Einträge zeigen die 64bit Adressen meiner 5 Sensoren.
Ich habe sie vorher ausgelesen und dann fest ins Programm (eeprom) eingetragen. Mit meinem Programmer muss ich die eeprom Daten separat vom Programm übertragen. Das eeprom kann nur beschränkt neu beschrieben werden, also Vorsicht.
Die Ccr8 Tabelle verwendet ACsenf, um die Checksum zu überprüfen. Kann er wohl besser erklären. Ich benutze den Check überhaupt nicht, da ich noch nie Probleme mit der Übertragung hatte.
Gruß Rolf

TobiasBlome
15.11.2006, 15:52
Vielen Dank,
also kann ich den Block $eeprom einfach weg lassen oder?
->Das eeprom kann nur beschränkt neu beschrieben werden...
Ich möchte die Temp. Daten gerne speichern und später über rs232 übertragen - gibt es auch Bausteine die man "belibig" neu beschreiben kann? Also gibt es da so ne Art "Arbeitsspeicher" wie bei einem PC? Ich wollte ca 10 Temp. Sensoren und noch3-4 andere speichern - gemessen über 2-3 Tage müsste man mal ausrechnen wieviel Speicher da benötigt wird.

Tobias

Berni28
16.11.2006, 07:22
Hi miteinander,
hab mal im Datenblatt (hab ich auf meiner Page im Downloadbereich) nachgesehen und da ist der AT24C256 mit 100.000 Schreibzyklen angegeben.
Bei einem richtigen RAM-Baustein brauchst du halt eine Pufferbatterie, da die Daten sonst futsch sind. Da es hier aber auch LowPower-Varianten geben dürfte, wird das die eh benötigte Batterie für den Datenlogger nicht allzusehr belasten.

TobiasBlome
10.06.2007, 20:12
Hallo,
hier wurde lange nicht mehr geschrieben aber ich versuchs mal ;-)

Das Programm läuft soweit, aber die Temperatur springt in 0,5°C Schritten - warum nicht in 0,1°C Schritten?
Und das zweite Problem ist ein Anzeige Problem:
Ôeíðåòáôõò 1: 27.0°Ã
Ôåíðåòáôõr 2: 26.5°Ã

Ja was ist denn da falsch? Temperatur 1: wäre besser als Ôeíðåòáôõò

Hat jemand eine Idee?

Tobias



$regfile = "m8def.dat"
$crystal = 1000000
$baud = 9600

Config 1wire = Portb.0




Dim T1 As single
Dim T2 As Single
Dim I As Byte
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(2) As Byte
Dim Ar2(2) As Byte





Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()


Do
Print " "
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id1(1) , 8 'Id von Sensor 1
1wwrite &H44 'Convert T

Waitms 300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id1(1) , 8 'id von sensor 1
1wwrite &HBE 'scratchpad lesen
Ar1(1) = 1wread(1) 'erstes byte auslesen, da steht Temp drin
Ar1(2) = 1wread(1) 'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen


Waitms 500
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id2(1) , 8 'Id von Sensor 2
1wwrite &H44 'Convert T

Waitms 300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id2(1) , 8 'id von sensor 2
1wwrite &HBE 'scratchpad lesen
Ar2(1) = 1wread(1) 'erstes byte auslesen, da steht Temp drin
Ar2(2) = 1wread(1) 'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen

T1 = Ar1(1) / 2
T2 = Ar2(1) / 2






If Ar1(2) = 0 Then 'wenn byte 2 aus dem sensor = 0 dann temp pos, sonst neg
Print "Temperatur 1: " ; T1 ; "°C"

Else
Print "Temperatur 1: " "-" ; T1 ; "°C"

End If


If Ar2(2) = 0 Then 'wenn byte 2 aus dem sensor = 0 dann temp pos, sonst neg
Print "Temperatur 2: " ; T2 ; "°C"

Else
Print "Temperatur 2: " "-" ; T2 ; "°C"
End If


Waitms 500

Loop

peterfido
10.06.2007, 21:18
Da scheint die Baudrate nicht zu stimmen. Sollte am PC die gleiche wie am Mega8 sein.

TobiasBlome
11.06.2007, 14:45
hhmmm - die Baudrate ist aber ganz sicher richtig...

das merkwürdige ist nur, dass die Zahlen fast immer richtig rüber kommen....

Tobias

Eisbaeeer
11.06.2007, 15:25
hhmmm - die Baudrate ist aber ganz sicher richtig...
das merkwürdige ist nur, dass die Zahlen fast immer richtig rüber kommen....
Tobias

Der DS1820 braucht 750ms um nach einem "Convert T" die Wandlung durchzuführen. Änder mal den Wert "Waims 300" auf "Waitms 800" nach dem Convert T Befehl "1wwrite &H44".
Das ist aber nicht das eigentliche Problem. Denn die Werte vom DS1820 kommen ja "fast" immer richtig an bei dir.
Ich tippe darauf, dass deine Einstellung bei Crystal nicht stimmt. Hast du einen externen Quarz?
Taktest du mit dem internen Takt?

Zu deinem zweiten Problem. Warum 0,5 Schritte und nicht 0,1 Schritte.
Du musst die Genauigkeit erst errechnen. Wie das geht, wurde schon im Forum gelöst. Ich kann dir aber, wenn du nichts findest, den Link nachschauen.

Grüße Eisbaeeer

TobiasBlome
11.06.2007, 16:03
-> Genauigkeit: bitte link schicken

-> Crystal: Also ich benutze den internen 1MHz Takt

Rofo88
11.06.2007, 16:09
Der interne Takt von 1MHZ ist für 9600 sehr schlecht geeignet da Du einen Baudratenfehler von -7% hast.

Entweder die Baudrate auf 4800 ändern oder den internen Takt auf 4MHz einstellen.

MfG

TobiasBlome
11.06.2007, 16:09
Hallo Eisbaeeer
meinst du den Beitrag von AVRwalli?



Sub 18s20_auslesen
1wreset Pinc , F ' Reset
1wwrite Skip_rom , 1 , Pinc , F ' Chip ansprechen
1wwrite Read_ram , 1 , Pinc , F ' Befehl zum Auslesen des Rams
Bd(1) = 1wread(9 , Pinc , F) ' 9 Bytes lesen
1wreset Pinc , F ' Reset
Temp = Bd(2)
Shift Temp , Left , 8
Temp = Temp + Bd(1)
If Temp > $f000 Then
Temp = $ffff - Temp
Temp1 = Temp + 1
Grad = Temp1 * -0.0625
Else
Grad = Temp * 0.0625 ' Auflösung 12 Bit
End If
End Sub

TobiasBlome
11.06.2007, 16:13
da fällt mir auf, das da keine Zeiten drinn sind...

TobiasBlome
11.06.2007, 16:19
sorry Rofo88,
habe deine Antwort irgendwie übersehen! ABER es war / ist die Lösung!

@Eisbaeeer
also wenn ich die Zeit auf 800ms erhöhe, dann ließt er immer beide Sensoren gleich aus also beide haben die gleiche Temperatur:-(

Tobias

TobiasBlome
11.06.2007, 17:25
So, nun noch mal zu den Kommastellen 0,5°C bzw 0,1°C - kann mir noch mal einer zeigen wie man das umrechnet bzw wo das hier im Forum steht?

hier noch mal mein Code, der nun mit 2 Sensoren funktioniert :-)



$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config 1wire = Portb.0




Dim T1 As single
Dim T2 As Single
Dim I As Byte
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(2) As Byte
Dim Ar2(2) As Byte





Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()


Do
Print " "
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id1(1) , 8 'Id von Sensor 1
1wwrite &H44 'Convert T

Waitms 300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id1(1) , 8 'id von sensor 1
1wwrite &HBE 'scratchpad lesen
Ar1(1) = 1wread(1) 'erstes byte auslesen, da steht Temp drin
Ar1(2) = 1wread(1) 'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen


Waitms 500
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id2(1) , 8 'Id von Sensor 2
1wwrite &H44 'Convert T

Waitms 300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id2(1) , 8 'id von sensor 2
1wwrite &HBE 'scratchpad lesen
Ar2(1) = 1wread(1) 'erstes byte auslesen, da steht Temp drin
Ar2(2) = 1wread(1) 'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen

T1 = Ar1(1) / 2
T2 = Ar2(1) / 2






If Ar1(2) = 0 Then 'wenn byte 2 aus dem sensor = 0 dann temp pos, sonst neg
Print "Temperatur 1: " ; T1 ; "°C"

Else
Print "Temperatur 1: " "-" ; T1 ; "°C"

End If


If Ar2(2) = 0 Then 'wenn byte 2 aus dem sensor = 0 dann temp pos, sonst neg
Print "Temperatur 2: " ; T2 ; "°C"

Else
Print "Temperatur 2: " "-" ; T2 ; "°C"
End If


Waitms 500

Loop

Eisbaeeer
11.06.2007, 19:13
@Eisbaeeer
also wenn ich die Zeit auf 800ms erhöhe, dann ließt er immer beide Sensoren gleich aus also beide haben die gleiche Temperatur:-(

Tobias

Dann stimmt noch was im Zeitlichen Ablauf nicht. Ich kann dir, wenn ich wieder zuhause bin, mein Script hier Posten. Wichtig ist das Timing. Das muss genau wie im Datenblatt ablaufen.
Wie hast du die Sensoren angeschlossen?
Als Parasite oder mit 3 Adern?
4,7K Pullupwiederstände?

Hier noch der Link für die 0,1 Grad Auflösung:

https://www.roboternetz.de/phpBB2/viewtopic.php?t=8555

Viele Grüße Eisbaeeer

TobiasBlome
11.06.2007, 19:24
Also ich habe 2 sensoren paralell - 3 Adern mit 4,7k Widerstand

die 0,1Gradlösung ist für nur einen Sensor...aber da muss er ja auch irgendwo umrechnen :-) ich guck mir das mal an.

Tobias

TobiasBlome
11.06.2007, 19:29
Also der erste Unterschied ist schon mal, dass ich nur die ersten beiden Bytes auslese und nicht 9!

ich glaube das ist diese Rechnung

If Crc = 0 Then ' if is OK, calculate for
Tmp = Bd(1) And 1 ' 0.1C precision
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T / 2
Temp = Bd(8) - Bd(7)
Temp = Temp / Bd(8)
Temp = T + Temp
Temp = Temp - 0.25
End If

TobiasBlome
11.06.2007, 19:30
toll diese Smilys :-)



If Crc = 0 Then ' if is OK, calculate for
Tmp = Bd(1) And 1 ' 0.1C precision
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T / 2
Temp = Bd(8) - Bd(7)
Temp = Temp / Bd(8)
Temp = T + Temp
Temp = Temp - 0.25
End If

Eisbaeeer
11.06.2007, 19:44
toll diese Smilys :-)



Du kommst der Sache näher. Ich empfehle dir dringend, das Datenblatt zu studieren. Es ist z.B. möglich, an alle Sensoren den Befehl zu schicken, eine Temperaturmessung durchzuführen. Anschließend kannst du dann einen nach dem anderen auslesen. Damit sparst du dir schon mal 750ms pro Sensor.
Weiterhin ist ein "parasite" Modus möglich. 2 Drähte reichen aus. Und einiges mehr.

Grüße Eisbaeeer

TobiasBlome
12.06.2007, 18:15
klingt gut - aber erst mal langsam an die Messung, und dann die Optimierung ;-)

Also ich habe 2 Sensoren und die kann ich mit 0,5°C Genauigkeit auslesen - aber das mit der Umrechnung auf 0,1°C macht mir echt zu schaffen :-k
kann mir da vielleicht jemand unter die Arme greifen?

Tobias

TobiasBlome
12.06.2007, 21:41
so, also ich hbe jetzt mal das zusammen kopierte programm von der 1. Seite benutzt. Leider bekomme ich keine Werte...
Ich bekomme erst einen Wert sobald ich eine Temperaturänderung habe. Also einmal gegenpusten und schon wird die Temperatur angezeigt. Warum ist das so?
ich habe nur einen anderen µC statt mega 32 einen mega 8 und statt 16MHz 4 MHz oder bringe ich ihn damit durcheinander?

Tobias


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config 1wire = Portb.0
Dim T As Integer
Dim T1 As Integer
Dim T2 As Integer
Dim T3 As Integer
Dim T4 As String * 10
Dim T5 As String * 10
Dim T6 As Single
Dim T7 As Single
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(9) As Byte
Dim Ar2(9) As Byte
Dim I As Byte , Tmp As Byte , Tmp2 As Byte
Dim Crc As Byte

Declare Sub Crcit
Declare Sub Crcit2

Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()


Do
Print " "
1wreset
1wwrite &H55
1wwrite Id1(1) , 8
1wwrite &H44

Waitms 300
1wreset
1wwrite &H55
1wwrite Id1(1) , 8
1wwrite &HBE
Ar1(1) = 1wread(9)
1wreset
Crcit
If Crc = 0 Then
Tmp = Ar1(1) And 1
If Tmp = 1 Then Decr Ar1(1)
T = Makeint(ar1(1) , Ar1(2))
T = T * 50
T = T - 25
T1 = Ar1(8) - Ar1(7)
T1 = T1 * 100
T1 = T1 / Ar1(8)
T = T + T1
T = T / 10
T6 = T / 10
T4 = Fusing(t6 , "#.#")

End If

Waitms 500
1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &H44

Waitms 300
1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &HBE
Ar2(1) = 1wread(9)
1wreset
Crcit2
If Crc = 0 Then
Tmp2 = Ar2(1) And 1
If Tmp2 = 1 Then Decr Ar2(1)
T2 = Makeint(ar2(1) , Ar2(2))
T2 = T2 * 50
T2 = T2 - 25
T3 = Ar2(8) - Ar2(7)
T3 = T3 * 100
T3 = T3 / Ar2(8)
T2 = T2 + T3
T2 = T2 / 10
T7 = T2 / 10
T5 = Fusing(t7 , "#.#")

End If



Print "Temperatur T4: " ; T4 ; "°C"
Print "Temperatur T5: " ; T5 ; "°C"

Waitms 500

Loop

Sub Crcit

Crc = 0
For I = 1 To 9
Tmp = Crc Xor Ar1(i)
Crc = Lookup(tmp , Crc8)
Next
End Sub

Sub Crcit2

Crc = 0
For I = 1 To 9
Tmp2 = Crc Xor Ar2(i)
Crc = Lookup(tmp2 , Crc8)
Next
End Sub
'//////////////////////////////////////////////////////////////////////////////


Crc8:
Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 21 , 75 , 169

Eisbaeeer
13.06.2007, 06:55
so, also ich hbe jetzt mal das zusammen kopierte programm von der 1. Seite benutzt. Leider bekomme ich keine Werte...
Ich bekomme erst einen Wert sobald ich eine Temperaturänderung habe. Also einmal gegenpusten und schon wird die Temperatur angezeigt. Warum ist das so?
ich habe nur einen anderen µC statt mega 32 einen mega 8 und statt 16MHz 4 MHz oder bringe ich ihn damit durcheinander?

Tobias

Dein Code sieht eigentlich ganz gut aus. Hast du denn jetzt schon mal das Datenblatt angeschaut? Da gibt es 2 Schaubilder mit den Abläufen (Bild 14 und Bild 15). Und dann würde ich den Code noch kommentieren, dann weisst du, was da passiert. Ich hab das mal angefangen.
Du hast jetzt deinen internen Takt auf 4MHz umgestellt? Bist du dir 100%tig sicher, dass er jetzt auch stimmt (damit meine ich, hast du das überprüft, z.B. eine LED im Sekundentakt blinken lassen)
Das könnte auch das Timing Problem erklären.
Um die DS1820 besser zu verstehen, kannst du dir die ID´s mal auf die Serielle Schnittstelle ausgeben lassen. Denn in den Variablen hast du sie ja schon drin. Hab das mal im Code eingefügt. Ich hab den Code mal compiliert, das ging ohne Fehler. Hab ihn aber noch nicht getestet.

Grüße Eisbaeeer



$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config 1wire = Portb.0
Dim T As Integer
Dim T1 As Integer
Dim T2 As Integer
Dim T3 As Integer
Dim T4 As String * 10
Dim T5 As String * 10
Dim T6 As Single
Dim T7 As Single
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(9) As Byte
Dim Ar2(9) As Byte
Dim I As Byte , Tmp As Byte , Tmp2 As Byte
Dim Crc As Byte
Dim W as Byte

Declare Sub Crcit
Declare Sub Crcit2

W = 1wirecount()
Id1(1) = 1wsearchfirst() 'ID des 1. auslesen
Id2(1) = 1wsearchnext() 'ID des nächstenauslesen


Do
Print "Gefundene Bausteine "
Print "Anzahl " ; W ; 'Anzahl der Bausteine ausgeben
Print ""
Print "ID des ersten Bausteins"
For i = 1 to 8 'erstes bis 8tes Bit
Print "";Hex(Id1(i)); 'Ausgabe des RomCode auf UART
Next

1wreset
1wwrite &H55 'Match Rom
1wwrite Id1(1) , 8 '64Bit senden (DS1820 adresse)
1wwrite &H44 'Convert temp
Waitms 800 'wenn parasite powered, ansonsten kann man auch den idle-state abfragen. Dieser geht auf low, wenn die Wandlung fertig ist (aber nur bei externer Stromversorgung, nicht im parasite modus).

'usw... kommentieren
1wreset
1wwrite &H55
1wwrite Id1(1) , 8
1wwrite &HBE
Ar1(1) = 1wread(9)
1wreset
Crcit
If Crc = 0 Then
Tmp = Ar1(1) And 1
If Tmp = 1 Then Decr Ar1(1)
T = Makeint(ar1(1) , Ar1(2))
T = T * 50
T = T - 25
T1 = Ar1(8) - Ar1(7)
T1 = T1 * 100
T1 = T1 / Ar1(8)
T = T + T1
T = T / 10
T6 = T / 10
T4 = Fusing(t6 , "#.#")

End If

1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &H44

Waitms 800
1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &HBE
Ar2(1) = 1wread(9)
1wreset
Crcit2
If Crc = 0 Then
Tmp2 = Ar2(1) And 1
If Tmp2 = 1 Then Decr Ar2(1)
T2 = Makeint(ar2(1) , Ar2(2))
T2 = T2 * 50
T2 = T2 - 25
T3 = Ar2(8) - Ar2(7)
T3 = T3 * 100
T3 = T3 / Ar2(8)
T2 = T2 + T3
T2 = T2 / 10
T7 = T2 / 10
T5 = Fusing(t7 , "#.#")

End If



Print "Temperatur T4: " ; T4 ; "°C"
Print "Temperatur T5: " ; T5 ; "°C"

Waitms 500

Loop

Sub Crcit

Crc = 0
For I = 1 To 9
Tmp = Crc Xor Ar1(i)
Crc = Lookup(tmp , Crc8)
Next
End Sub

Sub Crcit2

Crc = 0
For I = 1 To 9
Tmp2 = Crc Xor Ar2(i)
Crc = Lookup(tmp2 , Crc8)
Next
End Sub
'//////////////////////////////////////////////////////////////////////////////


Crc8:
Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 21 , 75 , 169

TobiasBlome
13.06.2007, 18:05
Programm funzt - ABER jetzt kommt die Temp von einem Sensor wenn ich den 2. Sensor anpuste / erwärme werden beide Temp angezeigt - vielleicht wirklich ein Timing Problem

RS232:

Gefundene Bausteine
Anzahl 2
ID des ersten Bausteins
101C60C10008000CTemperatur T4: 24.2°C
Temperatur T5: °C
Gefundene Bausteine
Anzahl 2
ID des ersten Bausteins
101C60C10008000CTemperatur T4: 24.2°C
Temperatur T5: °C
Gefundene Bausteine
Anzahl 2
'----SCHIPP----
Anzahl 2
ID des ersten Bausteins
101C60C10008000CTemperatur T4: 25.3°C
Temperatur T5: 25.6°C
Gefundene Bausteine
Anzahl 2
ID des ersten Bausteins
101C60C10008000CTemp
'........

Eisbaeeer
13.06.2007, 19:00
Hallo

Freut mich, wenn es funktioniert.
Glaub mir, es ist auf jeden Fall ein Timing Problem.
Crystal überprüfen, tatsächliche Taktfrequenz überprüfen.

Dieses Script funktioniert auch im Parasite Modus. 2 Drähte reichen aus.

Ich hoffe ich konnte helfen. Den Rest packst du jetzt auch alleine.

Grüße Eisbaeeer

TobiasBlome
13.06.2007, 21:27
Danke für die Unterstützung. Ich werde gleich morgen mal eine LED mit anschließen um den Takt zu kontrollieren ;-)

Tobias

TobiasBlome
14.06.2007, 15:00
Hilfe, das ist doch kein Auto zum ankurbeln....

die Led blinkt gleichmäßig mit (ca.) 1Hz :-)

ABER es wird nur eineTemp angezeigt! nach einer Temp.änderung werden beide angezeigt!
Wenn man nun einen Reset macht werden nach kurzem Stillstand trotzdem beide Temp.werte angezeigt. ](*,)

Jetzt kommt´s:
wenn ich den Strom abdrehe ist alles dunkel - wenn ich wieder einschalte, wird keine Temp. ! Und dann das übliche Temp.änderung und alles wieder ok....

Tobias



$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config 1wire = Portb.0
Dim T As Integer
Dim T1 As Integer
Dim T2 As Integer
Dim T3 As Integer
Dim T4 As String * 10
Dim T5 As String * 10
Dim T6 As Single
Dim T7 As Single
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(9) As Byte
Dim Ar2(9) As Byte
Dim I As Byte , Tmp As Byte , Tmp2 As Byte
Dim Crc As Byte
Dim W As Byte

Declare Sub Crcit
Declare Sub Crcit2

W = 1wirecount()
Id1(1) = 1wsearchfirst() 'ID des 1. auslesen
Id2(1) = 1wsearchnext() 'ID des nächstenauslesen

'=========
'TIMER 16bit
Config Timer1 = Timer , Prescale = 64
On Timer1 Timer_irq
Const Timervorgabe = 3036 'also 1 mal pro Sekunde!!!
Enable Timer1
Enable Interrupts

Config Pinb.1 = Output
Led Alias Portb.1


Do
Print "Gefundene Bausteine "
Print "Anzahl " ; W ; 'Anzahl der Bausteine ausgeben
Print ""
Print "ID des ersten Bausteins"
For I = 1 To 8 'erstes bis 8tes Bit
Print "" ; Hex(id1(i)); 'Ausgabe des RomCode auf UART
Next

1wreset
1wwrite &H55 'Match Rom
1wwrite Id1(1) , 8 '64Bit senden (DS1820 adresse)
1wwrite &H44 'Convert temp
Waitms 800 'wenn parasite powered, ansonsten kann man auch den idle-state abfragen. Dieser geht auf low, wenn die Wandlung fertig ist (aber nur bei externer Stromversorgung, nicht im parasite modus).

'usw... kommentieren
1wreset
1wwrite &H55
1wwrite Id1(1) , 8
1wwrite &HBE
Ar1(1) = 1wread(9)
1wreset
Crcit
If Crc = 0 Then
Tmp = Ar1(1) And 1
If Tmp = 1 Then Decr Ar1(1)
T = Makeint(ar1(1) , Ar1(2))
T = T * 50
T = T - 25
T1 = Ar1(8) - Ar1(7)
T1 = T1 * 100
T1 = T1 / Ar1(8)
T = T + T1
T = T / 10
T6 = T / 10
T4 = Fusing(t6 , "#.#")

End If

1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &H44

Waitms 800
1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &HBE
Ar2(1) = 1wread(9)
1wreset
Crcit2
If Crc = 0 Then
Tmp2 = Ar2(1) And 1
If Tmp2 = 1 Then Decr Ar2(1)
T2 = Makeint(ar2(1) , Ar2(2))
T2 = T2 * 50
T2 = T2 - 25
T3 = Ar2(8) - Ar2(7)
T3 = T3 * 100
T3 = T3 / Ar2(8)
T2 = T2 + T3
T2 = T2 / 10
T7 = T2 / 10
T5 = Fusing(t7 , "#.#")

End If



Print "Temperatur T4: " ; T4 ; "°C"
Print "Temperatur T5: " ; T5 ; "°C"

Waitms 500

Loop

Sub Crcit

Crc = 0
For I = 1 To 9
Tmp = Crc Xor Ar1(i)
Crc = Lookup(tmp , Crc8)
Next
End Sub

Sub Crcit2

Crc = 0
For I = 1 To 9
Tmp2 = Crc Xor Ar2(i)
Crc = Lookup(tmp2 , Crc8)
Next
End Sub
'//////////////////////////////////////////////////////////////////////////////


Timer_irq:
Timer1 = Timervorgabe
Toggle Led

Return


Crc8:
Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 21 , 75 , 169

TobiasBlome
14.06.2007, 17:07
also der µC läuft nun eine halbe Stunde und zeigt keine Werte an - eine Temp.änderung und es geht...

gibt es einen Reset für die DS1820 oder ähnliches?

Tobias

Eisbaeeer
15.06.2007, 08:17
also der µC läuft nun eine halbe Stunde und zeigt keine Werte an - eine Temp.änderung und es geht...

gibt es einen Reset für die DS1820 oder ähnliches?

Tobias


Der Reset muss sogar immer am Anfang kommen und wird mit einem Puls durchgeführt. Dieser muss! mindestens 480 µs lang sein.
Dann wartet der DS1820 für 15-60 µs und sendet ein "presence puls", der ist 60-240µs lang. Siehe Abbildung 10 Datenblatt.

Laut Datenblatt sollte folgender Ablauf funktionieren:
1. Master Tx initiate Reset Pulse
2. DS18S20 meldet sich mit einem "presence Pulse"
3. Master "Rom" command --> Befehl z.B. hCC
4. Master "H44" (Convert temp)
5. Parasite: Bus auf 1 setzen,750ms warten | ext. VDD, DS1820S setzt Bus wieder auf 0
6. Master Tx initiate Reset Pulse
7. DS18S20 meldet sich mit einem "presence Pulse"
8. Master "Rom" command --> Befehl z.B. hCC (skip rom)
9. Master Tx --> Befehl hBE (read scratchpad)
10. DS1820 schickt Temperatur

Fertig.

Sobald ich Zeit hab, werde ich mein fertiges Programm dann veröffentlichen. Ich hab folgendes vor:

Mehrere DS1820 (max 16 Stück an einem Bus!) per skip rom und anschließendem convert temp dazu veranlassen, alle gemeinsam die Temperatur zu errechnen. Dann alle nacheinander auslesen. Mahl sehen, ob das so laut Datenblatt auch funktioniert.

Grüße Eisbaeeer

TobiasBlome
15.06.2007, 21:12
alsooooo,

ich habe jetzt die crc Prüfung rausgenommen und nun laufen die zwei DS1820 \:D/

Tobias

Also wen´s interessiert:


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config 1wire = Portb.0
Dim T As Integer
Dim T1 As Integer
Dim T2 As Integer
Dim T3 As Integer
Dim T4 As String * 10
Dim T5 As String * 10
Dim T6 As Single
Dim T7 As Single
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(9) As Byte
Dim Ar2(9) As Byte
Dim I As Byte
Dim Tmp As Byte
Dim Tmp2 As Byte
Dim Crc As Byte
Dim W As Byte

Declare Sub Crcit
Declare Sub Crcit2

W = 1wirecount()
Id1(1) = 1wsearchfirst() 'ID des 1. auslesen
Id2(1) = 1wsearchnext() 'ID des nächstenauslesen

'=========
'TIMER 16bit
Config Timer1 = Timer , Prescale = 64
On Timer1 Timer_irq
Const Timervorgabe = 3036 'also 1 mal pro Sekunde!!!
Enable Timer1
Enable Interrupts

Config Pinb.1 = Output
Led Alias Portb.1


Do
1wreset 'Bus resetten
1wwrite &H55 'Match Rom
1wwrite Id1(1) , 8 '64Bit senden (DS1820 adresse)
1wwrite &H44 'Convert temp
Waitms 800 'wenn parasite powered, ansonsten kann man auch den idle-state abfragen. Dieser geht auf low, wenn die Wandlung fertig ist (aber nur bei externer Stromversorgung, nicht im parasite modus).



1wreset 'Bus resetten
1wwrite &H55 'Match Rom
1wwrite Id1(1) , 8 '64Bit senden (DS1820 adresse)
1wwrite &HBE
Ar1(1) = 1wread(9)
1wreset 'Bus resetten
Tmp = Ar1(1) And 1
If Tmp = 1 Then Decr Ar1(1)
T = Makeint(ar1(1) , Ar1(2))
T = T * 50
T = T - 25
T1 = Ar1(8) - Ar1(7)
T1 = T1 * 100
T1 = T1 / Ar1(8)
T = T + T1
T = T / 10
T6 = T / 10
T4 = Fusing(t6 , "#.#")



1wreset 'Bus resetten
1wwrite &H55 'Match Rom
1wwrite Id2(1) , 8 '64Bit senden (DS1820 adresse)
1wwrite &H44 'Convert temp

Waitms 800
1wreset 'Bus resetten
1wwrite &H55 'Match Rom
1wwrite Id2(1) , 8 '64Bit senden (DS1820 adresse)
1wwrite &HBE
Ar2(1) = 1wread(9)
1wreset 'Bus resetten

Tmp2 = Ar2(1) And 1
If Tmp2 = 1 Then Decr Ar2(1)
T2 = Makeint(ar2(1) , Ar2(2))
T2 = T2 * 50
T2 = T2 - 25
T3 = Ar2(8) - Ar2(7)
T3 = T3 * 100
T3 = T3 / Ar2(8)
T2 = T2 + T3
T2 = T2 / 10
T7 = T2 / 10
T5 = Fusing(t7 , "#.#")





Print "Temp. T4: " ; T4 ; Chr(248) ; "C" ; " / Temp. T5: " ; T5 ; Chr(248) ; "C"


Waitms 500

Loop

Timer_irq:
Timer1 = Timervorgabe
Toggle Led

Return

Eisbaeeer
15.06.2007, 21:37
alsooooo,

ich habe jetzt die crc Prüfung rausgenommen und nun laufen die zwei DS1820 \:D/

Tobias


Hey Super

Also ich hab mal noch die Subroutinen eingefügt und das ganze ein bischen schneller gemacht (durch skip_rom). Da geht das ganze merklich schneller. Vor allem, wenn es mal die 2 Senoren übersteigt:




'Ausschnitt aus dem Listing

'#######################
'Programm starten
Do
Gosub Convert_temp
Gosub Read_temp1 'Springe zum Subprogramm
Gosub Read_temp2 'Springe zum Subprogramm

Print T4 "°C "
Print T5 "°C "
Loop


'#####################################
'Sub Convert_Temp
Sub Convert_temp
1wreset
1wwrite &HCC 'Skip Rom
1wwrite &H44 'Convert Temp
Porta.6 = 1 'DQ High für Parasite Mode
Waitms 750 'alle DS konvertieren
1wreset
End Sub


'Sub Read_temp1
Sub Read_temp1
1wreset
1wwrite &H55 'Match Rom
1wwrite Id1(1) , 8 'DS1820 ID senden
1wwrite &HBE 'Read Scratchpad
Ar1(1) = 1wread(9) 'Temp Wert auslesen
1wreset
Tmp = Ar1(1) And 1
If Tmp = 1 Then Decr Ar1(1)
T = Makeint(ar1(1) , Ar1(2))
T = T * 50
T = T - 25
T1 = Ar1(8) - Ar1(7)
T1 = T1 * 100
T1 = T1 / Ar1(8)
T = T + T1
T = T / 10
T6 = T / 10
T4 = Fusing(t6 , "#.#")
End Sub

'Sub Read_temp2
Sub Read_temp2
1wreset
1wwrite &H55 'Match Rom
1wwrite Id2(1) , 8 'DS1820 ID senden
1wwrite &HBE 'Read Scratchpad
Ar2(1) = 1wread(9) 'Temp Wert auslesen
1wreset
Tmp2 = Ar2(1) And 1
If Tmp2 = 1 Then Decr Ar2(1)
T2 = Makeint(ar2(1) , Ar2(2))
T2 = T2 * 50
T2 = T2 - 25
T3 = Ar2(8) - Ar2(7)
T3 = T3 * 100
T3 = T3 / Ar2(8)
T2 = T2 + T3
T2 = T2 / 10
T7 = T2 / 10
T5 = Fusing(t7 , "#.#")
End Sub



Der letzte Schliff wäre jetzt noch, aus dem Read_temp1 und Read_temp2 eine Subroutine zu machen.
Wie sieht´s aus?
Soll mers anpacken?

Grüße Eisbaeeer

TobiasBlome
16.06.2007, 07:07
Läuft :-)

die Sub´s müssen noch deklariert werden und bei der Printanweisung fehlt das ;

Aber wozu ist:
Porta.6 = 1 'DQ High für Parasite Mode
???????
Da muss man doch nur den + Pin auf Masse legen - > sonst spart man doch keine 3.Ader ein ;-)

Tobias

TobiasBlome
16.06.2007, 07:17
die Temperatur schwankt bei mir um 0,3°C - da könnte man natürlich den Mittelwert aus vielleicht 3 Werten nehmen - oder? Leider wird die messung dann etwas langsamer...?

Tobias

Eisbaeeer
16.06.2007, 08:22
Läuft :-)

die Sub´s müssen noch deklariert werden und bei der Printanweisung fehlt das ;


Ja, sorry. Ich gebe das ganze auf einem Graphischen LCD aus. Da hab ich einfach schnell den Print Befehl eingefügt.



Aber wozu ist:
Porta.6 = 1 'DQ High für Parasite Mode
???????
Da muss man doch nur den + Pin auf Masse legen - > sonst spart man doch keine 3.Ader ein ;-)

Tobias

Ich geb den Ausgang ja auf den Bus. Da ist von mir noch ein Denkfehler drin. Also im Parasite mode wird beim TO92 Pin1 und Pin3 vom DS1820 auf Masse gelegt, Pin2 über 4,7 kOhm auf +5V. Das heisst, dass 2 Dräte ausreichen. Laut Datenblatt benötigt ein DS1820 für die Temperaturwandlung bis zu 4mA. Da ich 8 Sensoren an einem Bus im Parasite Modus betreiben will, könnte es sein, dass die Spannung zusammenbricht, weil der Pullup überlastet wird. Also lege ich auf den Bus die 5V von einem Pin für die 750ms an. Aber das wird warscheinlich nicht mit dem gleichen Pin gehen. Ich sollte da einen extra Pin des µControllers nehmen. Aber das kann ich noch später machen, wenn es nicht gehen sollte mit mehreren DSs.
Was ich noch machen will:

- Die Adressen ermitteln
- Die Adresse im Eeprom abspeichern
- Die Adresse einer Bezeichnung zuordnen können (z.B. Innen)
- Das ganze als Setup Untermenü

Setup --> Sensor zuordnen --> Innen = soundso ID --> Zuordnung aus Eeprom auslesen.

Grüße Eisbaeeer[/quote]

TobiasBlome
16.06.2007, 09:36
das klingt gut :-)

mich würde noch interessieren, wie ich das ganze über I2C in einem EEprom speichern kann und später über RS232 auslesen (also daten per Knopfdruck an den PC senden). Ich habe mir eine 24C512 besorgt und nun muss ich mich erst mal schlau machen wie soetwas überhaupt geht... Hast du soetwas schon mal gemacht?

Tobias

Eisbaeeer
16.06.2007, 11:43
das klingt gut :-)

mich würde noch interessieren, wie ich das ganze über I2C in einem EEprom speichern kann und später über RS232 auslesen (also daten per Knopfdruck an den PC senden). Ich habe mir eine 24C512 besorgt und nun muss ich mich erst mal schlau machen wie soetwas überhaupt geht... Hast du soetwas schon mal gemacht?

Tobias

Du wirst lachen, so etwas ähnliches habe ich auch vor. Ich hab mir die Tage eben dieses 24C512 und ein Uhrenbaustein mit I2c bestellt. Leider ist es noch nicht da, kann also noch nicht testen. Der Uhrenbaustein soll am gleichen Bus hängen und mit DCF77 Empfänger synchronisiert werden.
Dein Vorhaben dürfte kein Problem sein. Werte abspeichern, per Taste an aus dem Baustein auslesen und an die UART schicken.
Ist dir die Zeit der Werte egal oder willst du das auch noch mit Zeitstempel versehen?

Unter Bascom gibt es beispiele für I2C. Dürfte aber kein Problem sein, es gibt ja Datenblätter :-b

Was hast du eigentlich vor?
Ich werde meine Heizungssteuerung ersetzen. Endlich die Funktionen, die ich will.

Grüße Eisbaeeer

TobiasBlome
16.06.2007, 13:47
hahaha... :-)

Also ich habe ein kleinen Swimmingpool im Garten. Auf dem Dach habe ich 100m Gartenschlauch als Heizung. Eine Pumpe pumt das Wasser durch den Schlauch über das Dach. Letzte Woche hatte ich 55°C auf dem Dach und wenn ich das Wasser etwas im Schlauch stehen lasse, habe ich nach 3-4min knapp 45°C Wassertemp. \:D/ Nun möchte ich gerne die Pumpe "takten" um Energie zu sparen (Pumpe hat 800W und wenn es bewölkt ist bringt das pumpen nix - so genug)

Ja - also Funkuhr ist toll aber muss nicht unbedingt sein ne´einfache µC-Uhr mit Datum würde mir reichen. 1 Wert pro Minute wäre in meinem Fall auch völlig ausreichen.
Hast du schon mal EEprom´s programmiert?

Ich habe hier im Forum schon mal gefragt und deshalb habe ich den 24C512 besorgt:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=31459

und im RN Wissensbereich gibt es auch einen Artikel - aber nicht für EEprom´s in dieser Größe und die 64kb würde ich natürlich schon ganz gerne nutzen ;-) am besten als "durchlaufspeicher" also wenn der speicher voll ist sollen die ältesten Werte gelöscht werden.

Tobias

Eisbaeeer
16.06.2007, 14:02
Naja,

Ich hab mir gerade das RN-Wissen durchgelesen. Dort sind ja Beispielefür die beiden kleineren Brüder. Es unterscheidet sich ja nur noch die Adresse zum großen Bruder:

https://www.roboternetz.de/wissen/index.php/Bascom_und_I2C_EEprom

Das müssten wir hinkriegen. Ich warte nur noch auf die Lieferung. Solange werde ich mal mit dem Atmega eeprom testen.

Zu der Heizung.
Du pumpst das ganze also im Kreislauf durch den Pool?
Dann machst du eine Differenzregelung, oder? Vor- und Rücklauftemperatur messen, anhand von der Differenztemperatur einen PWM Port ansteuern, einen FET als Leistungsstufe. Coole Idee.

Ach ja. Zu deiner Frage. Ich hab schon ein Eprom programmiert. Das ist um einiges umständlicher gewesen. Das musst du jedes mal unter UV-Licht wieder löschen. Mein erster Microcontroller war ein Z80 mit Eprom. Damit hab ich meine Technikerarbeit gemacht. Das ganze in Assembler. Da greife ich heute lieber zu Bascom. Das macht mehr spaß, auch wenn einige nicht verstehen, warum man von Assembler weg geht. Warscheinlich auch ein bischen Faulheit von meiner Seite. Assembler ist halt sehr nahe am Controller programmiert und damit benötigt man viel weniger Speicher. Aber den gibt es ja heute fast umsonst O:)

TobiasBlome
16.06.2007, 14:27
Ich bastel gerade die Uhr doch da gibt es ein Problem...
Woher weiß der µC ob der Monat 30 oder 31 Tage hat?! oder vielleicht nur 28!?

TobiasBlome
16.06.2007, 15:40
Auch eine kleine Uhr kann Schwirigkeiten mit sich bringen...
ich möchte die Uhrzeit 2stellig angezeigt bekommen, auch wenn die Zeit nur einstellig ist 01:01:01

Was ist daran falsch?!

Dim Sek As Single
Dim Sekunden As Single

Sek = Fusing(sekunden , "##")

Tobias

for_ro
16.06.2007, 15:48
Fusing möchte einen String zurückgeben!

TobiasBlome
16.06.2007, 15:56
das geht aber auch nicht:

Dim Sek As String * 2
Dim Sekunden As Single

Sek = Fusing(sekunden , "##")

for_ro
16.06.2007, 16:03
Na ja, Singles können ziemlich lang werden. Mach den String mal länger.

TobiasBlome
16.06.2007, 16:09
das geht aber auch nicht:

Dim Sek As String * 800
Dim Sekunden As Single

Sek = Fusing(sekunden , "##")

Error:247 Line129 , expected[##] , in File.....

for_ro
16.06.2007, 16:14
Ein String kann glaube ich nur 256 Zeichen lang sein.
Aber Fusing ist bestimmt eh die falsche Funktion.
Wenn du nur eine führende 0 haben willst, benutzt du
out_str=Format(in_string, "00")

TobiasBlome
16.06.2007, 16:15
@Eisbaeeer
ich habe das Programm mal neu sortiert und die Variablen namen geändert, damit das Prog. übersichtilicher ist und man weiß, welche Var. wozu gehört!

Tobias

P.S.: Der Fehler mit FUSING ist noch nicht behoben... :cry:



'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

'-------------------------------------------------------------------------------
'Konfiguration LCD
'Config Lcd = 20 * 4
'Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.3 , Db6 = Portb.2 , Db7 = Portb.1 , E = Portd.7 , Rs = Portb.0
'Cursor Off Noblink

'-------------------------------------------------------------------------------
'16Bit Timer:
Config Timer1 = Timer , Prescale = 64
On Timer1 Timer_irq
Const Timervorgabe = 3036 'also 1 mal pro Sekunde!!!
Enable Timer1
Enable Interrupts

'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Config Pinb.1 = Output
Led Alias Portb.1
Config 1wire = Portb.0

'-------------------------------------------------------------------------------
'Variablen

'Uhr


Dim Sek As String * 800


Dim Sekunden As Single
Dim Minuten As Byte
Dim Stunden As Byte

'Datum
Dim Tag As Byte
Dim Monat As Byte
Dim Jahr As Word

'rechnen
Dim T10 As Integer
Dim T11 As Integer
Dim T20 As Integer
Dim T21 As Integer
Dim T13 As String * 10
Dim T23 As String * 10
Dim T12 As Single
Dim T22 As Single

Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Id3(8) As Byte

Dim Ar1(9) As Byte
Dim Ar2(9) As Byte
Dim Ar3(9) As Byte

Dim Tmp10 As Byte
Dim Tmp20 As Byte

Dim W As Byte


Declare Sub Convert_temp
Declare Sub Read_temp10
Declare Sub Read_temp20


W = 1wirecount()
Id1(1) = 1wsearchfirst() 'ID des 1. auslesen
Id2(1) = 1wsearchnext() 'ID des nächsten auslesen
'Id3(1) = 1wsearchnext() 'ID des nächsten auslesen

'-------------------------------------------------------------------------------
'Programm:
'-------------------------------------------------------------------------------
'Start

Sekunden = 0
Minuten = 0
Stunden = 0
Tag = 1
Monat = 6
Jahr = 2007



Do

Sek = Fusing(sekunden , "##")


Gosub Convert_temp
Gosub Read_temp10 'Springe zum Subprogramm
Gosub Read_temp20 'Springe zum Subprogramm
'Gosub Read_temp30 'Springe zum Subprogramm


Print "Uhrzeit: " ; Stunden ; ":" ; Minuten ; ":" ; Sekunden ; " Datum: " ; Tag ; "." ; Monat ; "." ; Jahr
Print "Temp. T13: " ; T13 ; Chr(248) ; "C" ; " / Temp. T23: " ; T23 ; Chr(248) ; "C"
'Print T13 ; " °C"
'Print T23 ; " °C"



If Tag = 32 Then
Tag = 1
Incr Monat
If Monat = 13 Then
Monat = 1
Incr Jahr
End If
End If







Loop








'................................................. ..............................
'Sprungmarken
'................................................. ..............................

'Sub Convert_Temp
Sub Convert_temp
1wreset
1wwrite &HCC 'Skip Rom
1wwrite &H44 'Convert Temp
Waitms 750 'alle DS konvertieren
1wreset
End Sub

'................................................. ..............................
'Sub Read_temp10
Sub Read_temp10
1wreset
1wwrite &H55 'Match Rom
1wwrite Id1(1) , 8 'DS1820 ID senden
1wwrite &HBE 'Read Scratchpad
Ar1(1) = 1wread(9) 'Temp Wert auslesen
1wreset
Tmp10 = Ar1(1) And 1
If Tmp10 = 1 Then Decr Ar1(1)
T10 = Makeint(ar1(1) , Ar1(2))
T10 = T10 * 50
T10 = T10 - 25
T11 = Ar1(8) - Ar1(7)
T11 = T11 * 100
T11 = T11 / Ar1(8)
T10 = T10 + T11
T10 = T10 / 10
T12 = T10 / 10
T13 = Fusing(t12 , "#.#")
End Sub

'................................................. ..............................
'Sub Read_temp20
Sub Read_temp20
1wreset
1wwrite &H55 'Match Rom
1wwrite Id2(1) , 8 'DS1820 ID senden
1wwrite &HBE 'Read Scratchpad
Ar2(1) = 1wread(9) 'Temp Wert auslesen
1wreset
Tmp20 = Ar2(1) And 1
If Tmp20 = 1 Then Decr Ar2(1)
T20 = Makeint(ar2(1) , Ar2(2))
T20 = T20 * 50
T20 = T20 - 25
T21 = Ar2(8) - Ar2(7)
T21 = T21 * 100
T21 = T21 / Ar2(8)
T20 = T20 + T21
T20 = T20 / 10
T22 = T20 / 10
T23 = Fusing(t22 , "#.#")
End Sub

'................................................. ..............................
Timer_irq:
Timer1 = Timervorgabe

Toggle Led

Incr Sekunden
If Sekunden = 60 Then
Sekunden = 0
Incr Minuten

If Minuten = 60 Then
Minuten = 0
Incr Stunden

If Stunden = 24 Then
Stunden = 0
Incr Tag
End If
End If
End If


Return

TobiasBlome
16.06.2007, 16:17
@for_ro

beides als String?

TobiasBlome
16.06.2007, 16:24
also jetzt kommt keine Fehlermeldung ABER er schreibt immer 00

Dim Sek As String * 2
Dim Sekunden As Single

Sek = Format(sekunden , "00")

for_ro
16.06.2007, 16:37
beides müssen strings sein, also erst mal sekunden_str=str(sekunden)

for_ro
16.06.2007, 16:42
Ich habe mir gerade mal die Temperatur Berechnung angesehen.
Funktioniert das so auch für negative Temperaturen?

TobiasBlome
16.06.2007, 16:43
also negative Temperaturen habe ich noch nicht ausprobiert

TobiasBlome
16.06.2007, 16:49
jetzt zeigt er mir nicht mehr die Zahlen an sondern als ZEICHEN

Smilis, Pfeile usw.

TobiasBlome
16.06.2007, 17:05
nicht schön aber selten.... (und es läuft)



Dim Sekunden As Byte
Dim Byte_sekunden As Byte
Dim String_sekunden As String * 2
Dim Sek As String * 2

Byte_sekunden = Sekunden
String_sekunden = Str(byte_sekunden)
Sek = Format(string_sekunden , "00")

for_ro
16.06.2007, 17:14
Wofür ist denn Byte_sekunden gut?

TobiasBlome
16.06.2007, 17:21
???irgendetwas stimmt mit der µC Uhr nicht:
wenn der µC 00:11:00 anzeigt, dann zeigt meine Uhr 00:10:35 Also 25Sekunden weniger d.h. die µC uh läuft 25 sekunden schneller in 11 min.!

TobiasBlome
16.06.2007, 17:27
@for_ro
hab´ein bisschen gespielt bis es ging...
aber nun hab ich es gelöscht und es war überflüssig.

Dann weiß ich aber nicht, warum deine Version nicht funktioniert...

TobiasBlome
16.06.2007, 17:51
oder liegt die Zeitdifferenz daran, das ich keinen Quarz benutze, sondern den internen?

for_ro
16.06.2007, 19:47
Bei meinem Mega128 stand glaube ich was von 3% Abweichung, bei dir sind es etwa 2,5%, kommt also hin.
Daher habe ich gleich einen kleinen Uhrenquarz mit 32768 Hz angeschlossen. Vielleicht geht das bei dir ja auch.

TobiasBlome
16.06.2007, 21:02
wo ist der Unterschied zwischen einem Uhrenquarz und einem "normalen"
hat das ewas mit der genauigkeit zu tun? Habe einen bei Reichelt gefunden und der hat eine sehr niedrige Frequenz: 0,032768MHz
Ist das nicht etwas wenig fuür den µC oder schließt man den an einem bestimmten Port ZUSÄTZLICH an?

for_ro
16.06.2007, 21:23
Ja, zusätzlich.
Beim Mega128 sind das separate Anschlüsse, bei deinem Mega8 (?) wohl nicht. Ich denke aber, dass du den internen 1Mhz für die $crystal nehmen kannst und extern dann noch den 32768 Hz Quarz anschließen kannst.
Bei mir kann ich dann auch die Uhr benutzen
Config Clock = Soft , Gosub = Sectic
Die läuft dann automatisch, du musst sie nur einmal auf aktuelle Zeit und Datum stellen. Dann gibt es jede Menge Zeitfunktionen automatisch dazu.

TobiasBlome
16.06.2007, 21:32
[quote="for_ro"]
Bei mir kann ich dann auch die Uhr benutzen
quote]

welche uhr?
hab mal gesucht - ist dass das Ding mit Time$ und Date$
Muss man dann die Uhr nicht selber basteln?

Also wenn sekunden = 60 dann Minute +1 u.s.w.

Tobias

for_ro
16.06.2007, 21:42
Genau, alle diese schicken Sachen bekommst du damit geliefert.
Nur wie das bei deinem Mega8 geht, kann ich dir nicht sagen. Da den internen Quarz ja eh schon benutz würde ich außen einfach den 32768 anlöten und dann den Befehl Config Clock = Soft , Gosub = Sectic benutzen. Dann siehste ja, ob die Uhr läuft.

TobiasBlome
17.06.2007, 12:30
Danke - muss noch son´nen Quarz besorgen und dann kanns losgehen ;-)

Eisbaeeer
17.06.2007, 13:02
Danke - muss noch son´nen Quarz besorgen und dann kanns losgehen ;-)

Hast du keinen Quarz rumliegen? Du kannst den Mega 8 mit einem externen Quarz beschalten (Xtal1 und Xtal2).
IMHO hast du dann eine sehr genau gehende Uhr.

Die Fuses des Mega8 müssen dann aber noch anders gesetzt werden.

Grüße Eisbaeeer

TobiasBlome
17.06.2007, 13:24
???????

ich denk´ ich muss einen Uhren Quarz benutzen 3x,xxxkHz....? oder nicht
Alle die ich habe sind irgend wo 1-20MHz

Eisbaeeer
17.06.2007, 13:41
???????

ich denk´ ich muss einen Uhren Quarz benutzen 3x,xxxkHz....? oder nicht
Alle die ich habe sind irgend wo 1-20MHz

Definitv nein. Der Compiler rechnet ja die Frequenz um. Du brauchst nur einen möglichst genauen Takt und den kannst du mit einem genauen Quarz erzeugen.
Du hast einen Atmega8, dann nimm einen 8MHz Quarz, an XTAL1 und XTAL2 anschließen, die Kondensatoren nicht vergessen, die Fuses anpassen und fertig. Die Uhr müsste dann sehr genau laufen.
Die Funktionen von der Soft-Uhr sind dadurch nicht anders.

Grüße Eisbaeeer

TobiasBlome
17.06.2007, 13:43
und warum nehmen alle andere einen UHRENQUARZ?

TobiasBlome
17.06.2007, 13:48
ich wollte die "Soft Clock" benutzen. Aber in dem Programm, welches ich hier im Forum gefunden habe ist KEIN Quarz irgendwo definiert... WARUM?



'************************************************* ***********
'Atmega Softclock -> genau Uhrzeit ohne RTC (Real-Time-Clock)
'Benutzt wird ein Mega8/8, Fusebits auf Auslieferungszustand,
'Lcd An Portb , Taster Zum Stellen An Pd.0
'zum Hochzählen An Pd.3.
'zwischen XTAL ist ein 32.xxx Uhrenquarz
'14.08.2006, Andree-HB, www.pixelklecks.de
'************************************************* ***********

$regfile = "m8def.dat"

Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
Config Lcd = 24 * 2
Initlcd
Cursor Off
Cls
Enable Interrupts

Config Date = Mdy , Separator = /
Config Clock = Soft
Config Portd = Input


Portd.0 = 1 'Taster1, Zeit/Datum stellen, PullUp ein, schaltet gegen Minus
Portd.3 = 1 'Taster2, Zahl hochzählen, PullUp ein, schaltet gegen Minus


Time$ = "00:00:00" 'Setzen auf Startwert
Date$ = "00/00/00" 'Setzen auf Startwert

Do
Locate 1 , 1
Lcd Time$ 'Zeige Zeit in Zeile1
Locate 2 , 1
Lcd _day ; "/" ; _month ; "/0" ; _year 'Zeige Datum in Form DD/MM/YYin Zeile2
'lcd Date$ 'zeige Datum in Form MM/DD/YY

If Pind.0 = 0 Then Gosub Time 'wiederhole Anzeige bis Taster 1 zum Stellen gedrückt, springe nach Sub "Time"
Loop
End


'Stunde
Time:
Waitms 200
Cls 'lösche Zeilen
Do
Locate 1 , 1
Lcd "Set Hour:" 'Stunden setzen
Locate 2 , 1
Lcd _hour
If Pind.3 = 0 Then 'Mit Taster 2
Incr _hour 'hochzählen
Locate 2 , 1
Lcd _hour
End If
If _hour > 23 Then 'Zählt bis Max, danach wieder ab 0
Cls
_hour = 00
End If 'solange, bis Taster 1 gedrückt
Loop Until Pind.0 = 0
Waitms 200


'Minute
Cls
Do
Locate 1 , 1
Lcd "Set Minute:"
Locate 2 , 1
Lcd _min
If Pind.3 = 0 Then
Incr _min
Locate 2 , 1
Lcd _min
End If
If _min > 59 Then
Cls
_min = 00
End If
Loop Until Pind.0 = 0
Waitms 200
Cls



'Tag
Cls
Do
Locate 1 , 1
Lcd "Set Day :"
Locate 2 , 1
Lcd _day
If Pind.3 = 0 Then
Incr _day
Locate 2 , 1
Lcd _day
End If
If _day > 31 Then
Cls
_day = 01
End If
Loop Until Pind.0 = 0
Waitms 200
Cls



'Monat
Cls
Do
Locate 1 , 1
Lcd "Set Month :"
Locate 2 , 1
Lcd _month
If Pind.3 = 0 Then
Incr _month
Locate 2 , 1
Lcd _month
End If
If _month > 12 Then
Cls
_month = 01
End If
Loop Until Pind.0 = 0
Waitms 200
Cls



'Jahr
Cls
Do
Locate 1 , 1
Lcd "Set Year :"
Locate 2 , 1
Lcd _year
If Pind.3 = 0 Then
Incr _year
Locate 2 , 1
Lcd _year
End If
If _year > 10 Then
Cls
_year = 00
End If
Loop Until Pind.0 = 0
Waitms 200
Cls


_sec = 00 'Springe Nach Setzen Von Zeit / Datum Wieder Zurueck
Return

Eisbaeeer
18.06.2007, 15:49
Hallo

Ich hab da was interessantes für dich gefunden. Zitat:

Hast du dir das Datenblatt des ATmega8 wirklich mal angesehen ?

Der ist extra vorgesehen für den Anschluss eines 32Khz Uhrenquarzes
an den Anschlüssen Tosc1 und Tosc2.
Damit wird dann der Timer2 getaktet.
Der Prozessor selbst lässt du dann mit dem Internen RC-Oscillator
mit 1, 2, 4 oder 8 MHz laufen.

Das klappt dann auch.
Gruß Jan


Das beantwortet wohl deine Frage. Da ich mit einem Atmega32 arbeite und die Uhr extern machen werde, hab ich mir das Datenblatt vom Amega8 noch nicht angeschaut.
Grüße Eisbaeeer

TobiasBlome
18.06.2007, 16:18
Naja - sooooooooo genau hab´ich das Datenblatt denn doch nicht "gelesen" da mein englisch auch nicht sooo gut bleibt es wohl mehr bei überfliegen und dann spezielle Stellen heraussuchen...

Danke!
Tobias