SelectRom: ldi zl,low(RealRom) ldi zh,high(RealRom) rcall One_Wire_Reset ;OneWire Reset ldi accu,0x55 ;Match_Rom einleiten rcall One_Wire_Write ;senden ldi index,8 ;8 Bytes SR10: ld accu,z+ ;Ein Byte aus der Romtabelle laden... rcall One_Wire_Write ;senden dec index ;schon 8 Bytes? brne SR10 ;wenn nicht - nächstes Byte ret SkipRom: rcall One_Wire_Reset ;1-Wire Bus Reset ldi accu,0xCC ;Skip Rom laden rcall One_Wire_Write ;senden timer,2 ;2µs delay ret Mess_Temp: ;rcall SkipRom ;Skip Rom senden rcall SelectRom ldi accu,0x44 ;Messung starten rcall One_Wire_Write ;1 Byte schreiben ret Read_Temp: ;rcall SkipRom ;Skip Rom senden rcall SelectRom ldi accu,0xBE ;Vom DS18B20 Ram, die Temperatur auslesen rcall One_Wire_Write ;1 Byte schreiben timer,2 ;2µs delay rcall One_Wire_Read ;1-Wire Byte lesen mov RawLow,accu ;Byte 0 des Scratchpad rcall One_Wire_Read ;1-Wire Byte lesen mov RawHigh,accu ;Byte 1 des Scratchpad ret CalcT: sbrs rawhigh,7 ;Vorzeichenbit prüfen rjmp CalcT5 ;wenn + dann weiter com rawhigh ;ansonsten neg rawlow ;umrechnen ldi accu,'-' ;und "minus" setzen st z+,accu ;wegspeichern rjmp CalcT10 CalcT5: ldi accu,'+' ;und "plus" setzen st z+,accu ;wegspeichern CalcT10: mov accu,RawLow ;Nachkomma sichern andi accu,0x0F ;oberes nibble ausklammern sts nachkomma,accu ;im Ram sichern andi Rawlow,0xF0 ;Nachkommastellen ausklammern andi RawHigh,0x07 ;Minusflags löschen or Rawlow,RawHigh ;zusammenführen swap Rawlow ;richtig platzieren mov temp,rawlow rcall Bin_Asc ;10stelle reicht ldi accu,',' ;, laden st z+,accu ;wegspeichern ;------------------------------------------------ ;Nachkommastelle = (temp1*10)/16 - ;------------------------------------------------ lds temp,Nachkomma mov accu,temp ;nachkomma in accu sichern lsl temp ;*2 lsl temp ;nochmal *2 add temp,accu ;+1* lsl temp ;nochmal *2 swap temp ;richtig positionieren andi temp,0x0F ;ASCII ori temp,0x30 ;maskieren st z+,temp ;wegspeichern ldi accu,0xDF ;"°" laden st z+,accu ;speichern ldi accu,'C' ;"C" laden st z+,accu ;speichern clr accu ;EOT st z+,accu ;wegspeichern ret Readrom: ldi zl,low(romcopy) ;z-pointer auf Romcopy (Ascii-Format) ldi zh,high(romcopy) ; ldi yl,low(RealRom) ;y-pointer auf RealRom (Real-Format ldi yh,high(RealRom) ; rcall One_Wire_Reset ;OW-Reset ldi accu,0x33 ;ReadRom command rcall One_Wire_Write ;senden ldi index,0x08 ;index für 8 Byte zu lesen setzen Rom5: rcall One_Wire_Read ;1 Byte lesen st y+,accu ;wegspeichern mov temp,accu ;Byte sichern swap accu ;oberes nibble zuerst rcall A_F_test ;über 9? Rückgabe in BCD 0-9 A-F st z+,accu ;auf romcopy in SRam speichern mov accu,temp ;gesicherter Wert unteres nibble rcall A_F_test ;über 9? Rückgabe in BCD 0-9 A-F st z+,accu ;auch wegspeichern dec index ;schon 8 bytes gelesen? brne Rom5 ;wenn nicht -> nächstes Byte lesen clr accu ;EOT st z+,accu ;wegspeichern ldi zl,low(romcopy) ;z-pointer ldi zh,high(romcopy) ;zurücksetzen rcall UART_stringram ;auf UART ausgeben ret