Read_Temp: rcall One_Wire_Reset ;1-Wire Bus Reset ldi accu,0xCC ;Skip Rom rcall One_Wire_Write ;1 Byte schreiben timer,2 ;2µs delay ldi accu,0x44 ;Messung starten rcall One_Wire_Write ;1 Byte schreiben ldi index,0x0F ;Zählregister für 750ms laden vorher 1,6s R_T_wait10: timer,50000 ;50ms delay dec index ;zählregister runterzählen brne R_T_wait10 ;noch nicht 0? rcall One_Wire_Reset ;Noch ein Reset ldi accu,0xCC ;Skip_Rom rcall One_Wire_Write ;1 Byte schreiben timer,2 ;2µs delay ldi accu,0xBE ;Vom DS18B20 Ram, die Temperatur auslesen rcall One_Wire_Write ;1 Byte schreiben timer,2 ;2µs delay SCL: 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 rcall CalcT ret Readrom: ldi yl,low(romcopy) ;y-pointer auf Romcopy ldi yh,high(romcopy) ; 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 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 y+,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 y+,accu ;auch wegspeichern dec index ;schon 8 bytes gelesen? brne Rom5 ;wenn nicht -> nächstes Byte lesen clr accu st y+,accu ret A_F_test: andi accu,0x0F ;unteres nibble ausmaskieren subi accu,10 ;-10 brcs A_F_no ;wenn kein überlauf inc accu ;wert -1 und ori accu,0x40 ;+64 für ascii ret A_F_no: subi accu,-10 ;die abgezogenen 10 wieder drauf ori accu,0x30 ;+48 für ascii ret CalcT: ldi yl,low(tempcopy) ;y-pointer auf Tempcopy ldi yh,high(tempcopy) ; ;---------------------------------------------------- ;- Temperatur auf Minus testen - ;---------------------------------------------------- sbrs RawHigh,7 ;Vorzeichenbit prüfen rjmp CalcT10 ;wenn nicht Minus dann raus com RawHigh ;16Bit Rohwert nach positiv wandeln neg RawLow ; ldi accu,'-' ; "-" laden st y+,accu ;und wegspeichern rjmp CalcT15 ;---------------------------------------------------- ;- Rohdaten (RawLow/RawHigh) richtig platzieren - ;---------------------------------------------------- CalcT10: ldi accu,'+' ;"+" laden st y+,accu ;und wegspeichern CalcT15: mov nachkomma,RawLow ;Nachkomma sichern andi nachkomma,0x0F ;oberes nibble ausklammern andi Rawlow,0xF0 ;Nachkommastellen ausklammern andi RawHigh,0x07 ;Minusflags löschen or RawLow,Rawhigh ;zusammenführen swap RawLow ;richtig platzieren ;---------------------------------------------------- ;- Hex2Decimal auf Zehner und Einer - ;---------------------------------------------------- clr accu ;Arbeitsregister löschen CalcT20: brcs CalcT25 ;Carry Überlauf? dann zur Anzeige inc accu ;Arbeitsregister hochzählen (Zehner) subi RawLow,10 ;Rohdatan -10 rjmp CalcT20 ;zurück zur Carry-Überlaufprüfung springen CalcT25: subi RawLow,-10 ;den zuviel abgezogenen wieder drauf dec accu ;den zuviel gezählten wieder abziehen ascii ;ascii macro st y+,accu ;und wegspeichern mov accu,RawLow ;Einer ins Arbeitsregister ascii ;ascii macro st y+,accu ;und wegspeichern ldi accu,',' ;Komma laden st y+,accu ;und wegspeichern ;---------------------------------------------------- ;Die Nachkommastellen sind in den - ;unteren 4 Bit als 1/16 °C - ;Diese in temp1 nach 1/10° wandeln. - ;Nachkommastelle = (temp1*10)/16 - ;---------------------------------------------------- mov accu,nachkomma ;nachkomma in accu sichern lsl nachkomma ;*2 lsl nachkomma ;nochmal *2 add nachkomma,accu ;+1* lsl nachkomma ;nochmal *2 swap nachkomma ;richtig positionieren mov accu,nachkomma ;in accu ascii ;ascii macro st y+,accu ;und wegspeichern ldi accu,0xDF ;'°'laden st y+,accu ;und wegspeichern ldi accu,'C' ;'C' laden st y+,accu ;und wegspeichern clr accu st y+,accu ret