ATXMEGA 128a3 mit ds18s20

Gast #2361319
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
Gast #2361400
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.
Persönliche Seite #2361418
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.
#2361449
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
Gast #2361524
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?
Persönliche Seite #2361565
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.
Gast #2361621
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren