Forum: Mikrocontroller und Digitale Elektronik ATXMEGA 128a3 mit ds18s20


von Lohmann (Gast)


Lesenswert?

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 ?
1
 Rem Lesen der Adressen von DS1820 Sensoren.
2
$regfile = "xm128a3def.dat"
3
Rem $crystal = 2000000                                          '2MHz
4
$hwstack = 64
5
$swstack = 40
6
$framesize = 40
7
$crystal = 32000000
8
Config Osc = Enabled , 32mhzosc = Enabled
9
Config Sysclock = 32mhz
10
$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
11
12
'_________________________________________________
13
Dim Twi_start As Byte
14
Open "twic" For Binary As #2
15
I2cinit #2
16
Config Twi = 100000
17
'_______________________________________________
18
Config Com1 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
19
Open "COM1:" For Binary As #1
20
'__________________________________________________
21
22
Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.4 , Db6 = Porta.5 , Db7 = Porta.6 , E = Portb.1 , Rs = Porta.7
23
Config Lcd = 16 * 4                                         'configure lcd screen
24
Config Lcdbus = 4
25
Cls
26
'___________________________
27
Dim Z As Byte
28
'__________________________________________________
29
'Config Pind.6 = Input
30
Config 1wire = Portd.6
31
Dim Daten(9) As Byte
32
Dim Adresse(8) As Byte
33
Dim Sensor1(8) As Byte
34
Dim T As Integer
35
Sensor1(1) = &H10 : Sensor1(2) = &HC0 : Sensor1(3) = &H61 : Sensor1(4) = &H01 : Sensor1(5) = &H02 : Sensor1(6) = &H08 : Sensor1(7) = &H00 : Sensor1(8) = &H0E
36
'______________________________________
37
'1wreset
38
Locate 1 , 1
39
Lcd "Sensor Scan"
40
Adresse(1) = 1wsearchfirst()
41
For Z = 1 To 8
42
Wait 2
43
Cls
44
Locate 1 , 1
45
Lcd Hex(adresse(z))
46
' Die Adresse wird richtig Angezeigt 
47
Next Z
48
49
Do
50
51
1wreset
52
1wwrite &HCC
53
1wwrite &H44
54
Wait 1
55
'1wverify Sensor1(1)
56
 1wreset
57
  1wwrite &HCC
58
 1wwrite &HBE
59
 Wait 1
60
 'Daten(1) = 1wread(9)
61
 For Z = 1 To 8
62
 Cls
63
 Locate 3 , 1
64
 Wait 1
65
 
66
Lcd Hex(1wread())
67
Hier wird nur 00 00 00 00 00 00 ... angezeigt. 
68
69
Wait 1
70
 Next Z
71
 T = Makeint(daten(1) , Daten(2))
72
73
Loop

von cskulkw (Gast)


Lesenswert?

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.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Schau mal da rein:
Beitrag "1Wire Problem - mal wieder - mit DS18B20 in C"
Angeblich funktioniert der dortige Bascom-Code.

von Martin N. (emsen)


Lesenswert?

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

von Lohmann (Gast)


Lesenswert?

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?

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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.

von Lohmann (Gast)


Lesenswert?

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.

von Lohmann (Gast)


Lesenswert?

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.

von Lohmann (Gast)


Angehängte Dateien:

Lesenswert?

Das sieht alles in allem so aus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.