Bleibst du schon beim "ERR=1" nach dem 1wreset hängen ? Oder wo steigst du aus ?
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:
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.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
nun woran liegt es vileicht an der verbindung was ich nicht glaube oder am prog.
mfg m.r.
Bleibst du schon beim "ERR=1" nach dem 1wreset hängen ? Oder wo steigst du aus ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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.
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.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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.
die fuses sind auf : cksel=1111 sut =10 für 4 mhz stimmt doch oder.
Hi,
hier mal mein Code. Ist ein 1920 im Dreileiter-Mode (kein parasite power) und funktioniert prima. Vielleicht hilft's ja.
Die LCD-Zeilen kannst ja rausnehmen.Code:'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
Gruß, Berni.
www.befi-tec.de
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
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.muss ich da irgend was ausser die datenleitung verbinden
Bei Pic's weiß ich's jetzt nicht, aber bei avr's kannst du jeden Port mit dem Kommando:woran erkenne ich bei avrs (und vielleicht pics) wo die datenleitung für den 1wire ist?
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).
Gruß, Berni.
www.befi-tec.de
Lesezeichen