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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.