PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DS 1820 Bascom spricht nicht mit mir



AVRboy
16.10.2006, 18:48
Hi,

ich habe heute mal den 1 wire baustein ds 1820 testen wollen doch irgendwie will er nich mit mir reden aber ich bin mir ziemlich sicher das ich nichts falsch mache. der sensor steck auf einem steckbrett, bekommt 5V und hat den benötigten widerstand. jedoch macht er keinen mucks kann mir jemand helfen.
hier mal den zusammen geschnipselten code:




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

Config 1wire = Portb.0 'daten port

Const Ds1820 = &H10 'daten des 1w devices
Const Skiprom = &HCC
Const Read_rom = &H33
Const Convertt = &H44
Const Read_ram = &HBE
Const Write_ram = &H4E
Const Copy_ram = &H48
Const Recall_ee = &HB8
Const Read_power = &HB4

Dim Family_code As Byte 'daten variabeln die gelesen werden
Dim Serial_number(6) As Byte
Dim Crc As Byte
Dim Scratch(9) As Byte

Dim I As Byte 'temperatur variabeln
Dim Temp As Word
Dim Temp1 As Integer
Dim Stemp As Single







Do

1wreset
If Err = 1 Then
Print "DS 1820 Error" ' prüfe ob ds1820 angeschlossen

1wwrite Read_rom 'nur wenn 1 ds am bus man braucht kein 1wsearch wenn 1 am bus

Family_code = 1wread() 'lese familie aus
For I = 1 To 6
Serial_number(i) = 1wread() 'lese name aus
Next
Crc = 1wread() ' lese check summe aus
If Family_code <> Ds1820 Then 'vergleiche familie mit daten über ds1820
Exit Do

1wwrite Convertt 'initialiesiere temperaturmessung
Do
Temp = 1wread() ' lese Temperatur in temp
Loop Until Temp = &HFF 'verlase wenn temp = FF

1wreset 'reset 1w device
If Err = 1 Then

' prüfe ob ds1820 angeschlossen
Print " DS 1820 Error"

1wwrite Skiprom ' starte: alle ds am bus senden Temperatur
1wwrite Read_ram ' starte: lese scart pad

For I = 1 To 9
Scratch(i) = 1wread() 'speichere daten in scratch * 9
Next

Temp = Scratch(2) ' temp ist 1+2 byte von scratch
Shift Temp , Left , 8 ' lese linke 8 von temp

Temp = Temp + Scratch(1) 'rechne temperatur aus counts
Temp1 = Temp

Print "Der Temperaturwert ist: " ; Temp ; "Counts." 'sende temp als wert
Temp1 = Temp1 / 2

Print "Die gemessen Temp.ist" ; Temp1 ; "Grad" 'sende temp als grad
Stemp = Scratch(8) - Scratch(7)
Stemp = Stemp / Scratch(8) 'bestimme endgültige temperatur
Stemp = Stemp + Temp1
Stemp = Stemp - 0.25


Print Fusing(stemp , "#.##"); 'sende temperatur mit komma

Wait 2
Loop

Print "Kein Sensor aktiv" ' kein sensor momentan aktiv
End If
End If
End If
End



man muss nicht so auf die kommerntare sehen die habe ich mir bei meiner verzweifelten fehlersuche rein gebaut. ausserdem mag das prog vieleicht für den anfang etwas komisch sein.
nun woran liegt es vileicht an der verbindung was ich nicht glaube oder am prog.

mfg m.r.

PicNick
16.10.2006, 19:05
Bleibst du schon beim "ERR=1" nach dem 1wreset hängen ? Oder wo steigst du aus ?

AVRboy
16.10.2006, 20:06
Genau da. er gibt mi r über rs232 denn error und dan am ende des codes noch das er nichts gefunden hat woran liegt das was ist da falsch.

PicNick
16.10.2006, 20:24
Um was Gescheites zu sagen, muß ich mir erst rausklamüsern, welche bedingung beim "RESET" eigentlich einen ERR setzen kann. Das kann ich aber erst morgen, wie ich hoffe.

PicNick
17.10.2006, 10:29
So. Beim reset wird in einem bestimmten Timing überprüft, ob sich auf dem 1Wire-Bus ein Gerät befindet.
Master: Bus Low
Warten 1
Master: Bus High -> auf Input
Warten 2
Master: Bus LOw ? -> OK1
Warten 2
Master: Bus High ? -> OK2
in anderen Fällen--> ERR=1

d.h. entweder is was mit der Hardware (Pullup ?)
oder das Timing stimmt nicht ---> $Crystal= ? / Fuses

AVRboy
17.10.2006, 16:09
also wenn der 1w restet wird fragt der controller in einer bestimmten zeit ob sich jemand meldet oder.
mein pullup geht vom daten pin auf +5V und meine fuses sind auf high frequenze eingestellt.

AVRboy
17.10.2006, 17:13
die fuses sind auf : cksel=1111 sut =10 für 4 mhz stimmt doch oder.

Berni28
18.10.2006, 09:27
Hi,
hier mal mein Code. Ist ein 1920 im Dreileiter-Mode (kein parasite power) und funktioniert prima. Vielleicht hilft's ja ;-) .



'ds_1920_2_16X4.bas
'DS1920 Temperaturmessung

$regfile = "m16def.dat"
$hwstack = 32
$swstack = 8
$framesize = 24
$crystal = 8000000
$baud = 9600

Config 1wire = Portb.0
Config Lcd = 27 * 4
Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32 'Grad Zeichen Chr(0)
Config Portd.2 = Input 'Taster für Hintergrundbeleuchtung
Config Porta.6 = Output 'LED-Hintergrundbeleuchtung

'Const Parasitpower = 1

Const Ds1920 = &H10

Const Skiprom = &HCC
Const Read_rom = &H33
Const Convertt = &H44
Const Read_ram = &HBE
Const Write_ram = &H4E
Const Copy_ram = &H48
Const Recall_ee = &HB8
Const Read_power = &HB4

Dim Family_code As Byte
Dim Serial_number(6) As Byte
Dim Crc As Byte
Dim Scratch(9) As Byte

Dim I As Byte
Dim Temp As Word
Dim Temp1 As Integer
Dim Stemp As Single
Dim Mint As Single
Dim Maxt As Single

Mint = 200
Do
1wreset
If Err = 1 Then Print "iButton Error"
1wwrite Read_rom
Family_code = 1wread()
For I = 1 To 6
Serial_number(i) = 1wread()
Next
Crc = 1wread()
If Family_code <> Ds1920 Then Exit Do
1wwrite Convertt
#if Parasitpower
Wait 2
#else
Do
Temp = 1wread()
Loop Until Temp = &HFF
#endif

1wreset
If Err = 1 Then Print "iButton Error"
1wwrite Skiprom
1wwrite Read_ram

For I = 1 To 9
Scratch(i) = 1wread()
Next

Temp = Scratch(2)
Shift Temp , Left , 8
Temp = Temp + Scratch(1)
Temp1 = Temp
Print "Der Temperaturwert ist " ; Temp ; " Counts."
Temp1 = Temp1 / 2
Print "Die gemessene Temperatur ist " ; Temp1 ; " Grad Celsius"
Stemp = Scratch(8) - Scratch(7)
Stemp = Stemp / Scratch(8)
Stemp = Stemp + Temp1
Stemp = Stemp - 0.25
Print "Die exakt gemessene Temperatur ist ";
Print Fusing(stemp , "#.##");
Print " Grad Celsius"
If Maxt < Stemp Then
Maxt = Stemp
End If
If Mint > Stemp Then
Mint = Stemp
End If
Cls
Cursor Off
If Pind.2 = 1 Then Toggle Porta.6

Upperline
Lcd "T-Ist: " ; Fusing(stemp , "#.#") ; Chr(0) ; "C"
Thirdline
Lcd "min: " ; Fusing(mint , "#.#")
Fourthline
Lcd "max: " ; Fusing(maxt , "#.#")
'Wait 2
Loop

Print "kein Temperatursensor kontaktiert"

End


Die LCD-Zeilen kannst ja rausnehmen.

AVRboy
19.10.2006, 18:22
leider hat dein prog auch nicht gefunkt. ich habe meine ansprüche an den ds nun einmal veringert und will mich jetzt nur mal mit dem command read_rom beschäftigen. ich bertreibe den avr ja auf dem stk500 und den ds exta auf einem steckbrett. muss ich da irgend was ausser die datenleitung verbinden. und andere frage woran erkenne ich bei avrs (und vielleicht pics) wo die datenleitung für den 1wire ist????????????

melde mich wieder wenn ich einwenig weiter bin mit dem kommischen 1w.

mfg

Berni28
20.10.2006, 10:20
muss ich da irgend was ausser die datenleitung verbinden

Also ich habe die ds1820 im Normalmode laufen, sprich 3-Leiter Kabel (+5V / Data / Gnd ). Damit die Datenübertragung aber richtig funktioniert, mußt du +5V und Data mit einem 5kOhm Widerstand verbinden. Sonst geht schon mal gar nix.


woran erkenne ich bei avrs (und vielleicht pics) wo die datenleitung für den 1wire ist?

Bei Pic's weiß ich's jetzt nicht, aber bei avr's kannst du jeden Port mit dem Kommando:
Config 1wire = Portb.0
zum 1w-Port machen ;-) . Den mußt du natürlich auf deinen Portpin korrigieren (außer, du hast den 1820 natürlich an Portb.0 angeschlossen). Jetzt sollte es klappen (zumindest funzts so bei mir).

AVRboy
21.10.2006, 20:19
das mit dem widerstand ist alles soweitklar. aber demnach hat ein avr keinen hardware 1wire sondern software generiert in bascom. welcher timer wird da benutzt oder wie wird das sonst in den befehle wie z.b. 1wreset vom timing her geregelt.weiter kann ich ja dann z.b. auch willkürlich gewählt portb.1 als 1w definieren.

also ich habe jetzt alles noch einmal auf den kopf gestellt und bin nochmal von 0 losgegangen und habe jetzt die ERR erkennung ausgetauscht und das pro ersteinmal so geschrieben das ich über rs232 nur den family code gesendet bekomme. und siehe da meine gebete an den avr wuden erhört es klappt er schickt mir das ergebnis. nun geht es morgen weiter. hoffen wir das beste!!!!!!!!!!!

mfg

Berni28
23.10.2006, 08:56
...na also. Das mit den Timings darfst du mich allerdings nicht fragen, da mich das nicht interessiert. Das müßte auf jeden Fall im Datenblatt des DS1820 drin stehen.
Wichtiger ist, das die Daten und Anforderungen richtig hin und her geschoben werden, damit eine Auswertung überhaupt erfolgen kann. Wie gesagt, bei mir klappts mit drei Sensoren jetzt. Ich hab mir nur 'selbst ins Bein geschossen' als ich für den Job einen AT90S2313 nehmen wollte. Der hat viel zu wenig Speicher für das Prog. Drum bleibts auf 'nem Mega16 bei mir.