; ********************************************************************************* Temperatur_lesen: ; Temperatur alle X Minute lesen rcall DS18x20_ROM ; lese ROM Daten von DS18x20 rcall DS18x20_RAM ; lese RAM Daten von DS18x20 ;---------------------------------------------------------------------------------- rcall DS18_X_20_Temperatur ; [28] oder [10] ??? rcall LCD_Temperatur ; Temperatur ==> LCD ret ; ********************************************************************************* DS18_X_20_Temperatur: ; [28] oder [10] ??? ;---------------------------------------------------------------------------------- lds Temp0, Family_Code cpi Temp0, $28 breq DS18B20_Temperatur ; [28] cpi Temp0, $10 breq DS18S20_Temperatur ; [10] ldi Temp3, $FF ; Fehler clr RAM_High ; lösche RAM_High clr RAM_Low ; lösche RAM_Low ret ; ********************************************************************************* DS18S20_Temperatur: ; [10] ;---------------------------------------------------------------------------------- ; MSB LSB ; --------------------------------- ; --------------------------------- ; | S | S | S | S | S | S | S | S | ; | 6 | 5 | 4 | 3 | 2 | 1 | 0 | R | ; --------------------------------- ; --------------------------------- ; |<------- Vorzeichenbits ------>| ; |<--- Vorkommabits 6...0--->|(1/2)| ; --------------------------------------------------------------------------------- lds RAM_High, OW_Temp_MSB ; M: OW_Temp_MSB : SSSS SSSS lds RAM_Low, OW_Temp_LSB ; L: OW_Temp_LSB : 6543 210R ;---------------------------------------------------------------------------------- ; Die DS18S20 Bits in DS18B20 Position bringen lsl RAM_Low ; 6543 210R =<= 6,5432 10R- rol RAM_High ; SSSS SSSS =<= SSSS SSS6 lsl RAM_Low ; 5432 10R- =<= 5,4321 0R-- rol RAM_High ; SSSS SSS6 =<= SSSS SS65 lsl RAM_Low ; 4321 0R-- =<= 4,3210 R--- rol RAM_High ; SSSS SS65 =<= SSSS S654 andi RAM_Low, 0b11110000 ; 3210 R--- === 3210 ---- ;---------------------------------------------------------------------------------- ; MSB ; LSB ; --------------------------------- ; --------------------------------- ; | S | S | S | S | S | 6 | 5 | 4 | ; | 3 | 2 | 1 | 0 | . | . | . | . | ; --------------------------------- ; --------------------------------- ; |<--------------| Vorzeichenbits 6....0 ----------->| - - - - | ;---------------------------------------------------------------------------------- ; TEMPERATURE = TEMP_READ -0,25 +(COUNT_PER_C - COUNT_REMAIN) / COUNT_PER_C ldi Temp1, $10 ; COUNT_PER_C° = $10 lds Temp2, COUNT_REMAIN ; COUNT_REMAIN = $10 ... $01 sub Temp1, Temp2 ; COUNT_PER_C° - COUNT_REMAIN = $00 ... $0F or RAM_Low, Temp1 ; RAM_Low + (COUNT_PER_C°- COUNT_REMAIN) subi RAM_Low, 4 ; -0,25°C / (1/16°C) = -4 sbci RAM_High, 0 rcall DS18x20_Auswerten ret ; ********************************************************************************* DS18B20_Temperatur: ; [28] ;---------------------------------------------------------------------------------- ; MSB ; LSB ; --------------------------------- ; --------------------------------- ; | S | S | S | S | S | 6 | 5 | 4 | ; | 3 | 2 | 1 | 0 | a | b | c | d | ; --------------------------------- ; --------------------------------- ; |<--------------| Vorzeichenbits 6....0 ----------->| a b c d | ; --------------------------------------------------------------------------------- lds RAM_High, OW_Temp_MSB ; OW_Temp_MSB : SSSS S654 lds RAM_Low, OW_Temp_LSB ; OW_Temp_LSB : 3210 abcd ; ********************************************************************************* DS18x20_Auswerten: ;---------------------------------------------------------------------------------- swap RAM_High ; SSSS S654 <=> S654 SSSS swap RAM_Low ; 3210 abcd <=> abcd 3210 mov Temp0, RAM_Low ; Temp0 = abcd 3210 andi Temp0, 0b11110000 ; Temp0 = abcd 0000 andi RAM_High, 0b11110000 ; RAM_High = S654 0000 andi RAM_Low, 0b00001111 ; RAM_Low = 0000 3210 or RAM_High, RAM_Low ; RAM_High = S654 3210 mov RAM_Low, Temp0 ; RAM_Low = abcd 0000 ldi Temp3, '+' ; dann '+' als LCD sbrs RAM_High, 7 ; überstringe bei negativer Temperatur ret ; -------------------------------------- ldi Temp3, '-' ; dann '-' als LCD neg Temp0 ; Temp0 = 0x00 - Temp0 mov RAM_Low, Temp0 ; Temp0 + (Carry) clr Temp0 ; Temp0 = 0 sbc Temp0, RAM_High ; Temp0 - RAM_High (-Carry) !!! mov RAM_High, Temp0 ret ; ********************************************************************************* LCD_Temperatur: ; Temperatur Text ==> SRAM ; --------------------------------------------------------------------------------- ldi Temp1, LCD_Line2 ; setze LCD auf Line2 rcall Slave_LCE_Commando ; sendet einen Befehl an das LCD mov Temp1, Temp3 ; '+' oder '-' LCD ; -------------------------------------- cpi RAM_High, 100 ; Temperatur >= 100°C brlo Temper_Data_LCD ldi Temp1, '1' ; dann '1' als Drucken ; -------------------------------------- Temper_Data_LCD: rcall Slave_LCE_Data ; schreibe Daten zur LCD ; -------------------------------------- mov Temp2, RAM_High ; Temperatur : xxx,....°C rcall DS18x20_2Dec ; Temp2: dezimal 2-stellig -> LCD ; -------------------------------------- ldi Temp1, ',' ; ',' zum Drucken rcall Slave_LCE_Data ; schreibe Daten zur LCD ; -------------------------------------- rcall Display_DS18x20_0C ; Text: Nachkomma-Byte : ...,xxxx°C ; -------------------------------------- ldi Temp1, 0xDF ; '°' zum Drucken rcall Slave_LCE_Data ; schreibe Daten zur LCD ldi Temp1, 'C' ; 'C' zum Drucken rcall Slave_LCE_Data ; schreibe Daten zur LCD ldi Temp1, ' ' ; ' ' zum Drucken rcall Slave_LCE_Data ; schreibe Daten zur LCD ret ; ********************************************************************************* DS18x20_2Dec: ; Eingang: Temp2 ; 8 bit Binary --> ASCII (2 digit) ; --------------------------------------------------------------------------------- cpi Temp2, 100 ; Temp2 grösser als 100 ? brlo DS18x20_010A ; Verzweigen, wenn niedriger subi Temp2, 100 ; sonst: Temp2 -100 rjmp DS18x20_2Dec DS18x20_010A: ldi Temp1, '0' ; provide "x0x" DS18x20_010: cpi Temp2, 10 ; Temp2 grösser als 10 ? brlo DS18x20_010E ; Verzweigen, wenn niedriger inc Temp1 ; mittlerer Ziffer erhöhen subi Temp2, 10 ; 10 von der mittleren Ziffer rjmp DS18x20_010 DS18x20_010E: rcall Slave_LCE_Data ; schreibe Daten zur LCD subi Temp2, -'0' ; Untere Ziffer in Asci umwandeln mov Temp1, Temp2 ; Temp1 => "..X" rcall Slave_LCE_Data ; schreibe Daten zur LCD ret ; ********************************************************************************* Display_DS18x20_0C: ; ; --------------------------------------------------------------------------------- ldi ZL, low (Text_DS18x20_0C*2) ; Z -> Wochentagtabelle im Flash ldi ZH, high(Text_DS18x20_0C*2) ; -------------------------------------- mov Temp0, RAM_Low ; Nachkomma-Byte : .,xxxx°C swap Temp0 andi Temp0, 0b0000_1110 ; 0000_1110 mov Temp1, Temp0 lsr Temp0 ; Adresse Text_0C / 2 add Temp0, Temp1 ; Adresse Text_0C / 2 + 1 add ZL, Temp0 ; Zum Zeiger addieren adc ZH, NULL ; -------------------------------------- ldi Temp2, 3 ; Textlänge des Wochenendtages Loop_Temp_0C: lpm Temp1, Z+ ; Zeichen aus der Tabelle hinzufügen rcall Slave_LCE_Data ; schreibe Daten zur LCD dec Temp2 brne Loop_Temp_0C ret ; ********************************************************************************* Text_DS18x20_0C: ; 3 Adressen ; --------------------------------------------------------------------------------- .db "000","125" .db "250","375" .db "500","625" .db "750","875" ; *********************************************************************************