$regfile = "m8def.dat" ' µC = AtMega8 $crystal = 1000000 ' 8 Mhz ' Ausgänge deklarieren Ddrd = &B01111111 ' PD0 - PD6 als Ausgang Ddrb = &B00000111 ' PB0 - PB2 als Ausgang ' Pin für DS18B20 Config 1wire = Portd.7 ' Timer deklarieren ' Systemtakt / Prescale = Counts ' 1000000 / 8 = 125000 Config Timer0 = Timer , Prescale = 8 ' Timer0 Overflow Input ' zählt von 0 bis 255 und löst dann Interrupt aus ' 125000 (Counts) / 256 (8-bit Timer) = 488,28125 (Interrupts pro Sekunde On Timer0 Timer0_multiplexing Enable Timer0 ' Unterprogramm aufrufen Declare Sub Read_temp ' Konstanten für OneWire Const Skip_rom = &HCC Const Convert_t = &H44 Const Read_scratch = &HBE ' Variablen deklarieren Dim On_display As Byte ' aktuelles Display beim Multiplexing schritt Dim Display_numbers(3) As Byte ' Zahlen die auf Display angezeigt werden Dim Display_number_temp As Byte ' temponäre Display variable Dim Busy As Byte ' Temperatur Dim Scratch(9) As Byte ' ScratchPad des DS18B20 Dim Vorzeichen As Byte ' Vorzeichen Dim Tempread As Byte Dim I As Byte Enable Interrupts ' Hauptschleife Do Read_temp ' Unterprogramm aufrufen If Vorzeichen = 1 Then Display_numbers(1) = 10 Else Display_numbers(1) = 11 End If Display_numbers(2) = Tempread / 10 Display_numbers(3) = Tempread Mod 10 Wait 10 ' 10 Sekunden warten Loop End Anzeige_an: On_display = 1 Enable Timer0 ' Interrupts anschalten return Anzeige_aus: Disable Timer0 ' Interrupts ausschalten Portd = &B01111111 ' alle Segmente ausschalten Portb.0 = 0 : Portb.1 = 0 : Portb.2 = 0 ' alle Displays ausschalten return Read_temp: Anzeige_aus 1wreset ' Initialisierung 1wwrite Skip_rom ' Skip ROM, da nur ein DS18B20 verwendet wird 1wwrite Convert_t ' Befehl für Messung geben Do ' warten bis Messung fertig Busy = 1wread() Loop Until Busy = &HFF 1wreset ' Initialisierung 1wwrite Skip_rom ' Skip ROM 1wwrite Read_scratch ' Temperatur auslesen For I = 1 To 9 Scratch(i) = 1wread() Next Anzeige_an If Scratch(2) = &HFF Then Tempread = &HFF - Scratch(2) Tempread = Tempread / 2 Vorzeichen = 1 Else Tempread = Scratch(2) / 2 Vorzeichen = 0 End If Return ' Timer0 Overflow Interrupt ' Multiplext die 3 7 Segment Anzeigen Timer0_multiplexing: Display_number_temp = Display_numbers(on_display) ' Zahl für Anzeige als Bitcode laden Portd = Lookup(display_number_temp , Output_bytecodes) 'Bitcode auf PortD ausgeben Portb.0 = 0 : Portb.1 = 0 : Portb.2 = 0 ' alle Displays ausschalten Select Case On_display ' jeweiliges Display anschalten Case 1 : Portb.0 = 1 Case 2 : Portb.1 = 1 Case 3 : Portb.2 = 1 End Select incr On_display ' Displayschritt erhöhen If On_display = 4 Then On_display = 1 End If Return ' Output Bytecodes Output_bytecodes: Data &B11000000, ' Ziffer 0 Data &B11111001, ' Ziffer 1 Data &B10100100, ' Ziffer 2 Data &B10110000, ' Ziffer 3 Data &B10011001, ' Ziffer 4 Data &B10010010, ' Ziffer 5 Data &B10000010, ' Ziffer 6 Data &B11111000, ' Ziffer 7 Data &B10000000, ' Ziffer 8 Data &B10010000, ' Ziffer 9 Data &B10111111, ' Minuszeichen Data &B11111111 ' alle Segmente aus