'****************************************************************** 'THERMOMETER MIT 4-stelliger LED Anzeige und DS1820 by LEXATRONIC 'Anzeigen mit gemeinsamer Anode an PortB0 bis PortB6 (Segment A an PB0 usw.) 'Digitansteuerung über 4 PNP Transistoren über PD2 bis5 'AT90S2313-Deklarationen $regfile = "2313def.dat" 'Quarz: 4 MHz $crystal = 4000000 'DS1820 Kommandos (Es werden nicht alle benutzt..aber später vielleicht mal) Const Read_rom = &H33 Const Skip_rom = &HCC Const Convertt = &H44 Const Read_ram = &HBE Const Write_ram = &H4E Const Copy_ram = &H48 Const Recall_ee = &HB8 Const Read_power = &HB4 Dim Busy As Byte Dim I As Byte 'Scratchpad Dim Scratch(9) As Byte 'Variablen für die Berechnung der Nachkommastelle Dim Tmp As Byte , T As Integer , T1 As Integer , Decigrades As Integer ' variablen für die display routine Dim Tempstr As String * 4 Dim Y As Byte Dim Tempbyte As Byte ' Variable für Digitansteuerung Dim Digit As Byte 'Anzeige im Ganzen Dim Fourdigitdisplay As String * 4 Dim Umdreh As Byte 'Setze PD2-PD5 auf Ausgang und PD0 PD1 und PD6 auf Eingang Ddrd = &B00111100 'PortB alle Mann auf Ausgang Config Portb = Output 'alle Segmente aus Portb = 255 'An PD6 hängt der DS1820 Config 1wire = Portd.6 Do 'Hauptschleife 'Formatiere das Display Fourdigitdisplay = Format(str(decigrades) , "00") + 'Format(str(tfrac) , "00") '' ************ Start vom DISPLAY CODE ' jeder Lauf durch die Hauptschleife zeigt ein anderes Digit Incr Digit Waitms 6 'Zeit für die Anzeige (je länger wait desto mehr flackert es) ' mache das , bis 4 erreicht ist If Digit = 4 Then : Digit = 0 : Gosub Marke : End If 'Springe ins Unterprg zum Messsen ' addiere 1 zum Digitcounter, weil MID 1-basiert ist Y = Digit + 1 ' und hol das Digit, das wir brauchen Tempstr = Mid(fourdigitdisplay , Y , 1) Tempbyte = 2 ^ Digit ' 'Digitansteuerung auf portD ab PD2, bei Ansteuerung ab PD0 ohne *4 Umdreh = Tempbyte * 4 'Ansteuerung umdrehen für gemeinsame Anoden Umdreh = Not Umdreh Portd = Umdreh 'Dieser Teil erledigt die Wandlung in 7 Segment Code 'Für Anzeigen mit gemeinsamer Anode, bei gem. Kathoden wäre bei 0 die 63, bei 1 die 6 usw.einzusetzen Select Case Val(tempstr) Case 0 : Portb = 64 Case 1 : Portb = 121 Case 2 : Portb = 36 Case 3 : Portb = 48 Case 4 : Portb = 25 Case 5 : Portb = 18 Case 6 : Portb = 2 Case 7 : Portb = 120 Case 8 : Portb = 0 Case 9 : Portb = 16 Case Else : Portb = 128 End Select 'Im letzten Digit ein C für Grad Celsius anzeigen If Digit = 3 Then Portb = 198 '' ************ ENDE VOM DISPLAY CODE Loop Marke: 'Diese Sequenz dient zum Auslesen des DS1820 (vgl.Datenblatt vom DS1820) 1wreset ' 1wire Reset 1wwrite Skip_rom ' Read ROM command 1wwrite Convertt ' Measure Temperature 'Vom Testen übrig, um zu sehen, wann das Umwandeln abgeschlossen ist 'Do 'Busy = 1wread() 'Loop Until Busy = &HFF ' Wait for end of conversion 'Waitms 100 1wreset ' 1wire Reset 1wwrite Skip_rom ' Skip ROM command 1wwrite Read_ram ' Read Scratch command 'Die ersten 9 Byte in das Scratchpad einlesen For I = 1 To 9 Scratch(i) = 1wread() Next 'Scratch(1) = 170 vom Ausprobieren übrig 'Scratch(2) = 0 'Scratch(7) = 0 'Scratch(8) = 16 1wreset ' 1wire Reset Tmp = Scratch(1) And 1 ' 0.1C precision If Tmp = 1 Then Decr Scratch(1) T = Makeint(scratch(1) , Scratch(2)) 'Print Hex(t) 'Print T T = T * 50 'here we calculate the 1/10 precision like T = T - 25 'DS18S20 data sheet T1 = Scratch(8) - Scratch(7) T1 = T1 * 100 T1 = T1 / Scratch(8) T = T + T1 Decigrades = T / 10 'As integer, this routine gives T*10, with 1/10 degree precision 'und wieder zum Hauptprogramm Return