Hallo ich habe mir einen ATXMEGA 128a3 zugelegt an
dem schon ein i2c Uhr und Bluetooth läuft.
Nun habe ich die 1wire schnittstelle für meinen
ds18s20 eingerichtet und ich kann die Adresse des
Sensors Lesen aber die Tempereatur wird nicht angezeigt.
Woran könnte das liegen ?
Soll das eine Bascon-1-Wire-Bibliothek sein?
Hast Du das Datenblatt und die Signal-Zeit-Bedingungen berücksichtigt?
Der 1820 muß zurückgesetzt werden. Dazu macht man so ca. 480 ms - reset
Impulse
Dann muß der Wandelbefehl absetzt werden.
Hier sollte man die Zeit abwarten, bis die Temperaturwandlung fertig
ist.
bei 12bit idR 750 ms. Alternative kann man auch den Wandelstatus
abfragen.
Beim Auslesen sollte man den Skip-ROM-Befehl ausgeben, wenn man nur
einen Sensor hat.
Im Anschluß muß das Scratchpad-RAM ausgelesen werden.
Wenn keine CRC berechnet werden soll, kann man nach dem 2 Byte die
weitere Komunikation beenden.
Dazwischen sollte man regelmäßig Resetzen, damit die
Kommunikationssynchronisation vom Sensor richtig erkannt wird.
Kann man diese Anforderungen mit Basic überhaupt leisten? Ich bin das
lernfähig.
cskulkw schrieb:> Soll das eine Bascon-1-Wire-Bibliothek sein?
Nein, soweit ich es weiß, ist diese itegriert.
> Der 1820 muß zurückgesetzt werden. Dazu macht man so ca. 480 ms - reset> Impulse
"1wreset" sollte das machen.
> Kann man diese Anforderungen mit Basic überhaupt leisten? Ich bin das> lernfähig.
Ich schätze ja, da das Basic ja nicht interpretiert, sondern compiliert
wird.
Das sind aber nur meine Erfahrungen aufgrund des Lesens dieses Forums.
Ich kenne mich mit Bascom nicht aus, kann also auch ganz anders sein.
Hier ein DS18S20 unter BASCOM, allerdings auf mega16, persönlich
getestet.
Da sollte auch der xmega gehen, man beachte nur mal die niedrige F_CPU.
Stammte direkt von MCS, glaube ich, der Verfasser möge mir meine
Vergesslichkeit verzeihen....
$regfile = "m16def.dat"
$crystal = 1000000
' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend
zuordnen
Ddrd = &HFF
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 ,
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
' Pin für 1wire Schnittstelle festlegen
' Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portb.5
Dim Dsid(8) As Byte
' Die Adresse meines DS18S20 die ich vorher ermittelt habe
Dsid(1) = &H10 : Dsid(2) = &H68 : Dsid(3) = &H17 : Dsid(4) = &H25 :
Dsid(5) = &H01 : Dsid(6) = &H08 : Dsid(7) = &H00 : Dsid(8) = &H98
Dim Sc(9) As Byte
Dim T As Integer
Dim Ta As Integer
Dim Tb As Integer
Dim T1 As Integer
Dim I As Byte
Cls
Cursor Off
Locate 1 , 1 : Lcd "Temp:"
Do
' Alle angeschlossenen DS18S20 zum Messen veranlassen
1wreset
1wwrite &HCC
1wwrite &H44
Waitus 200
' Den gewünschten Sensor auswählen
1wverify Dsid(1)
' Kommando READ SCRATCHPAD
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
' Genauere Temperaturberechnung auf 0,1 °C
I = Sc(1) And 1
If I = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
T = T * 50
T = T - 25
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1
T = T / 10 'z.B. 273
Ta = T / 10 'z.B. 27
T1 = Ta * 10 'z.B. 270
Tb = T - T1 'z.B.
273-270=3
' Temperatur in 0,1 Grad Schritten ausgeben
Locate 1 , 12
Lcd Ta ; "." ; Tb ;
Lcd Chr(&Hdf)
'Else
' Wenn Fehler Scratchpad zur Kontrolle Hexadezimal ausgeben
Locate 2 , 1
' Es passen nur 8 Byte auf das Display
For I = 1 To 8
Lcd Hex(sc(i))
Next
End If
' Ausgabe alle 1 Sekunden
Waitms 1000
Loop
End
Danke für die Netten Antworten,
ich habe einen Systemwechsel von ATMega8 - 328p nach
dem neuen ATXMEGA128 vollzogen.
Nun habe ich beim ATMega8 die DS18s20 auch zum laufen
bekommen(sind sehr schnell wenn Sie nicht im Parasitär
betrieben werden), nun sollen die Sensoren auch unter
dem ATXMega laufen.
Nun der Stand der Dinge:
$regfile = "xm128a3def.dat"
Rem $crystal = 2000000 '2MHz
$hwstack = 64
$swstack = 40
$framesize = 40
$crystal = 32000000
Config Osc = Enabled , 32mhzosc = Enabled
Config Sysclock = 32mhz
$lib "xmega.lib" : $external _xmegafix_clear : $external
_xmegafix_rol_r1014
'_________________________________________________
Dim Twi_start As Byte
Open "twic" For Binary As #2
I2cinit #2
Config Twi = 100000
'_______________________________________________
Config Com1 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits =
1 , Databits = 8
Open "COM1:" For Binary As #1
'__________________________________________________
Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.4 , Db6 = Porta.5 ,
Db7 = Porta.6 , E = Portb.1 , Rs = Porta.7
Config Lcd = 16 * 4 'configure lcd screen
Config Lcdbus = 4
Cls
'___________________________
Dim Z As Byte
'__________________________________________________
'Config Portd.6 = Input
Config 1wire = Portd.6
Dim Sc(9) As Byte
Dim Adresse(8) As Byte
Dim T As Integer
'______________________________________
'1wreset
Locate 1 , 1
Lcd "Sensor Scan"
Adresse(1) = 1wsearchfirst()
For Z = 1 To 8
Waitms 300
Cls
Locate 1 , 1
Lcd Hex(adresse(z)) 'Hier werden auch die Adressen Ausgegeben Richtig !
Next Z
Do
1wreset
1wwrite &HCC
1wwrite &H44
Wait 3
1wwrite &HBE
Sc(1) = 1wread(9)
T = Makeint(sc(1) , Sc(2)) 'Aber Die Temperatur wird nicht ausgegeben ?
Cls
Locate 3 , 1
Lcd T
Wait 1
Loop
Das ist mein Problem das die Temperatur nicht gemessen wird.
Da aber die Sensoren (habe 4 Stück) die Adressen Senden muss
der Bus folglich richtig Funktionieren.
Meine Vermutung das ich den Messwert nicht genauso wie
beim ATMega 8 lesen kann?
Lohmann schrieb:> (habe 4 Stück)
Das ist wohl das Problem und der entscheidende Hinweis, den Du
unterschlagen hast.
> Do> 1wreset> 1wwrite &HCC
0xCC = SKIP ROM
Du adressierst also alle vier Sensoren gleichzeitig.
> 1wwrite &H44
0x44 = Convert T
Du löst also bei allen adressierten Sensoren eine Messung aus.
> Wait 3
Hier fehlt, meines Erachtens, ein 1wreset.
> 1wwrite &HBE
Du liest bei allen vier Sensoren gleichzeitig das Scratchpad aus?
Das geht nicht. Du musst dazu jeden Sensor am Bus gezielt adressieren.
Das Zauberwort heißt MATCH ROM (0x55 und dann die ID)
> Da aber die Sensoren (habe 4 Stück) die Adressen Senden muss> der Bus folglich richtig Funktionieren.
Das geht, da hier ein SEARCH ROM die Sensoren nacheinander abfragt.
Das ist richtig, aber ich betreibe jeweils nur einen Sensor.
Ich habe 4 Sensoren und überprüfe einzelnt ob die
Adressen auch ausgelesen werden, aber beim Messen ist nur
einer am Bus.
Ich habe den Fehler gefunden, vielen Dank für die Antworten.
Ich habe die mit '**** gekennzeichneten Befehle eingefügt und
es geht :-)
Do
1wreset
1wwrite &HCC
1wwrite &H44
Wait 3
'1wverify Sensor1(1)
1wreset '****
1wwrite &HCC '****
1wwrite &HBE
Waitms 200
Sc(1) = 1wread(9)
T = Makeint(sc(1) , Sc(2))
T = T / 2
Cls
Locate 3 , 1
Lcd T
Wait 1
Also nur mit 1wreset und 1wwrite &HCC funktioniert es,
wenn der Reset vergessen wird geht es nicht, wenn 1wwrite &HCC
vergessen wird geht es nicht.