Forum: Mikrocontroller und Digitale Elektronik DS1822 auslesen klappt nicht mehr, Atmega8, BASCOM


von Christian J. (snakehanau)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Ich bin seid ein paar Monaten dabei mich mit der Materie Microcontroler 
zu beschäftigen und habe da auch schon einiges gelernt...vorallem, dass 
es gar nicht sooo schwierig ist.

Meine gewählte Hardware ist ein MyAVR-MK2 Board + LCD und als sprache 
BASCOM

Im letter zeit habe ich mich mit dem Digitalem Temp-Sensor DS1822 
beschäftigt und dazu ne Kleinigkeit auf nem Steckboard aufgebaut.
Hat auch alles soweit wunderbar funktioniert. Aber auf einmal konnte der 
uC den Sensor nicht mehr auslesen.

Hab dann die Versorgungsspannung, Verbindungen, Lötstellen und so 
kontrolliert und sogar den DS1822 getauscht....leider ohne erfolg.
Hab auch schon den uC getauscht...ohne erfolg.

beim rumprobieren kam mir die Idee, das ich die Lese/Sende Impulse auf 
der Daten-Leitung eigentlich mit ner kleinen LED sichtbar machen könnte.
Hab das so gelöst wie in der angehängten Skize.

Wobei die "LED1" eine grüne Standard 3mm LED ist (ist die auf dem 
Experimentierbord)
Und jetzt das seltsamme, sobald ich den Schalter "S1" schließe kann der 
DS1822 ohne Probleme wieder ausgelesen werden !


Ich kann mir da absolut keinen reim drauf machen

Hat einer von euch da eine Idee ?

Danke

von Christian J. (snakehanau)


Lesenswert?

Axo hier der BASCOM CODE:
1
$regfile "m8adef.dat"
2
$crystal = 1000000
3
$hwstack = 32
4
$swstack = 10
5
6
7
'--------- PWM-Definieren ------------------------------------------------------
8
'Config Timer2 = Pwm , Compare Pwm = Clear Up , Prescale = 1
9
'Config Portb.1 = Output                                     ' Port auf Ausgang setzen für LCD Beleuchtung
10
'Portb.1 = 0
11
'Ocr2 = 255
12
13
Config Lcd = 20 * 4
14
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
15
16
Deflcdchar 0 , 2 , 5 , 2 , 32 , 32 , 32 , 32 , 32           ' °C
17
Cursor Off Noblink
18
19
20
'--------- 1-Wire START ------------------------------------------------------
21
Config 1wire = Portc.5                                      'Eingang für 1-Wire Sensor DS18x20
22
Dim Dsid1(8) As Byte                                        '1. Sensor ID 64 bits (8Bytes) incl CRC als array
23
24
25
Dim Dsid1scratchpad(9) As Byte                              'Scratchpad 72 Bits (9 Bytes) incl CRC als array sind die Temperatur Daten
26
Dim Dsid2scratchpad(9) As Byte                              'Scratchpad 72 Bits (9 Bytes) incl CRC als array sind die Temperatur Daten
27
Dim Dsid3scratchpad(9) As Byte                              'Scratchpad 72 Bits (9 Bytes) incl CRC als array sind die Temperatur Daten
28
29
Dim Anzahlsensoren As Byte                                  ' Wie viele Sensoren wurden am Bus gefunden
30
Dim I As Byte                                               ' Variable für schleifen
31
Dim Dg As Integer                                           'Variable1 zur Temp. Berechnung DeziGrad
32
Dim Dg1 As Integer                                          'Variable2 zur Temp. Berechnung DeziGrad
33
Dim Dg2 As Single
34
35
Dim Index(3) As Byte                                        ' Variable für Tabelle welcher Sensortyp gefunden wurde
36
37
Dim Temp1 As String * 5
38
39
Dim Max1 As Byte
40
41
Dim Min1 As Byte
42
43
Dim Config1 As Byte
44
45
Declare Sub Ds18xauslesen                                   ' Temperatur auslesen
46
Declare Sub Temp_ds1822
47
Declare Sub Temp_ds1820
48
49
50
'--------- 1Wire 1. Sensor suchen ------------------------------------------------------
51
Cls
52
53
Anzahlsensoren = 1wirecount()                               ' Übergebe die Anzahl gefundene Sensoren in Variable
54
55
56
Cls
57
58
Dsid1(1) = 1wsearchfirst()                                  ' Suche den ersten Sensor und Speicher im array ab der ersten stelle die 8 Bytes der ID ab
59
If Err = 0 Then                                             ' wenn kein fehler (Sensor gefunden) aufgetreten dann
60
Locate 1 , 1
61
Lcd "ID1:"
62
For I = 1 To 8
63
Lcd Hex(dsid1(i))                                           ' gebe die 8 Bytes der Sensor ID auf dem LCD aus
64
Next I
65
Locate 2 , 1
66
Index(1) = Lookdown(dsid1(1) , Data2 , 3)                   ' suche nach dem ersten Byte aus dsid1 in Tabelle Data2 die aus 3 Daten besteht und speicher die Position in index(1)
67
Lcd Lookupstr(index(1) , Data1)                             ' Zeige Text aus Tabelle Data1 von Stelle index(1)
68
Wait 2
69
Locate 3 , 1
70
If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       ' Überprüfe ob die Empfangene Checksumme = der Berechneten ist. wenn das 8 Byte aus dsid1(8) = crc berechnet dann mache weiter
71
Lcd "CRC OK Sensor ID1"
72
Else
73
Lcd "CRC BAD Sensor ID1"
74
End If
75
Wait 2
76
End If
77
78
Cls
79
80
81
Hauptschleife:
82
83
Cls
84
85
Do
86
87
Ds18xauslesen
88
89
If Anzahlsensoren = 0 Then Lcd " kein Sensor am Bus "
90
91
92
'--------- Sensor 1 ------------------------------------------------------
93
94
If Anzahlsensoren > 0 Then
95
1wverify Dsid1(1)                                           'Spreche den ersten Sensor an
96
Locate 1 , 1
97
For I = 1 To 8
98
Lcd Hex(dsid1(i))                                           ' gebe die 8 Bytes der Sensor ID auf dem LCD aus
99
Next I
100
 Locate 2 , 1
101
 If Err = 1 Then
102
 Lcd "Sensor nicht am Bus "                                 'Err = 1 dann stimmt etwas nicht
103
 Elseif Err = 0 Then
104
 If Dsid1(1) = 34 Or Dsid1(1) = 40 Then
105
 Gosub Temp_ds1822                                          ' wenn der Sensor ein DS1822 oder DS18B20 ist dann Berechnung Temp_ds1822
106
 Max1 = Dsid1scratchpad(3)                                  ' Sensor Interne Alarm Max Temperatur
107
 Min1 = Dsid1scratchpad(4)                                  ' Sensor Interne Alarm Min Temperatur
108
 Config1 = Dsid1scratchpad(5)                               ' Sensor Internes Configurationsregister  Bit 5 und 6 geben die Messauflösung der Temp. an.
109
 End If
110
 If Dsid1(1) = 16 Then
111
 Gosub Temp_ds1820                                          '  wenn Sensor ein DS1820 oder DS18S20 ist dann Berechnung Temp_ds1820
112
 Max1 = Dsid2scratchpad(3)
113
 Min1 = Dsid2scratchpad(4)
114
 Config1 = Dsid1scratchpad(5)
115
 End If
116
 Temp1 = Fusing(dg2 , "#.##")                               'Ergebnis in Temp1 als String ablegen und ab der zweiten kommastellen abschneiden
117
 Lcd Lookupstr(index(1) , Data1) ; ":" ; Temp1 ; Chr(0) ; "C"       ' Zeige Text aus Tabelle Data1 von Stelle index(1) Lcd "Sensor 1: " ; Temp1 ; Chr(0) ; "C   "
118
 End If
119
End If
120
121
122
Loop
123
124
125
Temp_ds1822:                                                ' Berechnung für DS1822 und DS18B20 incl negativer Temperatur
126
 1wwrite &HBE                                               ' Kommando READ SCRATCHPAD
127
 Dsid1scratchpad(1) = 1wread(9)                             ' lese 9 bytes in das Array  (byte9=checksumme)
128
 If Dsid1scratchpad(9) = Crc8(dsid1scratchpad(1) , 8) Then  ' überprüfe Checksumme (9 Byte) wenn OK dann
129
 Dg = Makeint(dsid1scratchpad(1) , Dsid1scratchpad(2))      ' erstes und 2 Byte (LSB+MSB) zusamm fügen &H0A + &H02 = &HA2 = 162
130
 Dg2 = Dg * 100                                             ' Ergebnis mit 10 multiplizieren für eine Nachkommastelle  zb. 162*10= 1620
131
 Dg2 = Dg / 16                                              ' Ergebnis durch 16 Teilen 1620/16=101.25
132
 End If
133
134
Return
135
136
137
Temp_ds1820:
138
139
 1wwrite &HBE                                               ' Kommando READ SCRATCHPAD
140
 Dsid2scratchpad(1) = 1wread(9)                             ' lese 9 bytes in das Array  (byte9=checksumme)
141
 If Dsid2scratchpad(9) = Crc8(dsid2scratchpad(1) , 8) Then  ' überprüfe Checksumme (9 Byte) wenn OK dann
142
 I = Dsid2scratchpad(1) And 1
143
 If I = 1 Then Decr Dsid2scratchpad(1)
144
 Dg = Makeint(dsid2scratchpad(1) , Dsid2scratchpad(2))      ' erstes und 2 Byte (LSB+MSB) zusamm fügen &H0A + &H02 = &HA2 = 162
145
 Dg = Dg * 50
146
 Dg = Dg - 25
147
 Dg1 = Dsid2scratchpad(8) - Dsid2scratchpad(7)
148
 Dg1 = Dg1 * 100
149
 Dg1 = Dg1 / Dsid2scratchpad(8)
150
 Dg = Dg + Dg1
151
 Dg2 = Dg / 100
152
153
 End If
154
Return
155
156
157
158
Ds18xauslesen:
159
                                                             ' Routine die für alle Sensoren ausgeführt werden muss um Temp. zu lesen
160
1wreset                                                     ' Bus reseten damit alle Sensoren hören
161
1wwrite &HCC                                                ' &HCC = alle Sensoren am Bus werden angesprochen   / &H55 einen bestimmten Baustein ansprechen mit 1wverify Dsid1-3(1) oder 1wwrite &H55 ' 055H = Match ROM command, also Baustein auswählen For I = 1 To 8 : 1wwrite Dsid(i) : Next I
162
1wwrite &H44                                                ' Sensoren veranlassen die Temperatur zu messen
163
Wait 1                                                  ' den Sensoren Zeit geben um Temperatur zu messen
164
Return
165
166
167
'Tabellen
168
169
Data1:
170
'         0        1             2             3
171
Data "     " , "DS1822 " , "DS18S20" , "DS18B20"
172
173
Data2:
174
'      1   2    3
175
Data 34 , 16 , 40

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.