From 39933a957b1f9a7d34f38a290bc2c61569361875 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Thu, 12 Sep 2024 04:01:52 +0200 Subject: [PATCH] avr: added first version of ds18b20 code. --- avr/modules/ds18b20/0BUILD | 11 ++ avr/modules/ds18b20/main.asm | 266 +++++++++++++++++++++++++++++++++++ 2 files changed, 277 insertions(+) create mode 100644 avr/modules/ds18b20/0BUILD create mode 100644 avr/modules/ds18b20/main.asm diff --git a/avr/modules/ds18b20/0BUILD b/avr/modules/ds18b20/0BUILD new file mode 100644 index 0000000..febd367 --- /dev/null +++ b/avr/modules/ds18b20/0BUILD @@ -0,0 +1,11 @@ + + + + + + main.asm + + + + + diff --git a/avr/modules/ds18b20/main.asm b/avr/modules/ds18b20/main.asm new file mode 100644 index 0000000..5cdab6c --- /dev/null +++ b/avr/modules/ds18b20/main.asm @@ -0,0 +1,266 @@ +; *************************************************************************** +; copyright : (C) 2024 by Martin Preuss +; email : martin@libchipcard.de +; +; *************************************************************************** +; * This file is part of the project "AqHome". * +; * Please see toplevel file COPYING of that project for license details. * +; *************************************************************************** + + + +; *************************************************************************** +; defs + +.equ DS18B20_ROMCMD_READROM = 0x33 +.equ DS18B20_ROMCMD_SKIPROM = 0xcc +.equ DS18B20_FNCMD_CONVERT = 0x44 +.equ DS18B20_FNCMD_READSCRATCHPAD = 0xbe + +.equ DS18B20_FLAGS_CONV_STARTED = 0x01 +.equ DS18B20_FLAGS_CONV_UPDATED = 0x02 + + + +; *************************************************************************** +; data + +.dseg + +ds18b20DataBegin: + ds18b20Flags: .byte 1 + ds18b20DataBuffer: .byte 9 + ds18b20DataTemp: .byte 2 +ds18b20DataEnd: + + + + + + +; *************************************************************************** +; code + +.cseg + +DS18B20_BEGIN: + + +; --------------------------------------------------------------------------- +; @routine Ds18b20_Init +; +; Init module. +; +; @return CFLAG set if okay, cleared on error +; @clobbers r16, r17, X + +Ds18b20_Init: + ; preset SRAM data area + ldi xh, HIGH(ds18b20DataBegin) + ldi xl, LOW(ds18b20DataBegin) + clr r16 + ldi r17, (ds18b20DataEnd-ds18b20DataBegin) + rcall Utils_FillSram ; (r17, x) + + + ret + + + +Ds18b20_Fini: + sec + ret + + + +Ds18b20_Run: + lds r16, ds18b20Flags + andi r16, DS18B20_FLAGS_CONV_UPDATED ; new value? + breq Ds18b20_Run_done ; nope, jump + rcall Ds18b20_SendTemp ; send value + brcc Ds18b20_Run_done ; jump on error + lds r16, ds18b20Flags ; value sent, clear flag + andi r16, ~DS18B20_FLAGS_CONV_UPDATED + sts ds18b20Flags, r16 +Ds18b20_Run_done: + clc + ret + + + +Ds18b20_OnTimer: + lds r16, ds18b20Flags + andi r16, DS18B20_FLAGS_CONV_STARTED + breq Ds18b20_OnTimer_startConversion + + ; conversion complete, read value, set flags + ldi xl, LOW(ds18b20DataBuffer) + ldi xh, HIGH(ds18b20DataBuffer) + push r15 + in r15, SREG + cli + rcall ds18b20ReadScratchPad + brcc Ds18b20_OnTimer_popr15ret + out SREG, r15 + pop r15 + + ld r16, X+ ; copy temp from scratchpad + sts ds18b20DataTemp, r16 + ld r16, X+ + sts ds18b20DataTemp+1, r16 + + lds r16, ds18b20Flags + andi r16, ~DS18B20_FLAGS_CONV_STARTED + ori r16, DS18B20_FLAGS_CONV_UPDATED + sts ds18b20Flags, r16 + ret + +Ds18b20_OnTimer_startConversion: + push r15 + in r15, SREG + cli + ldi r16, DS18B20_FNCMD_CONVERT + rcall Ds18b20_SendCommand + brcc Ds18b20_OnTimer_popr15ret + lds r16, ds18b20Flags + ori r16, DS18B20_FLAGS_CONV_STARTED + sts ds18b20Flags, r16 +Ds18b20_OnTimer_popr15ret: + out SREG, r15 + pop r15 +Ds18b20_OnTimer_done: + ret + + + +; --------------------------------------------------------------------------- +; @routine Ds18b20_SendCommand @global +; +; Reset bus, send SKIP ROM and send command. +; Cave: Needs interrupts to be disabled! +; +; @param r16 command to send +; @clobbers r18 (r21, r22) + +Ds18b20_SendCommand: + mov r18, r16 + + rcall OwiMaster_Reset ; (r22) + tst r16 ; presence detected? + breq Ds18b20_SendCommand_error ; nope, jump + + ldi r16, DS18B20_ROMCMD_SKIPROM ; skip rom + rcall OwiMaster_SendByte ; (r21, r22) + + mov r16, r18 ; command to send + rcall OwiMaster_SendByte ; (r21, r22) + sec + ret +Ds18b20_SendCommand_error: + clc + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine Ds18b20_ReadRom @global +; +; Send READ ROM and read result into buffer. +; Cave: Needs interrupts to be disabled! +; +; @return CFLAG set if okay, cleared on error +; @return X points directly behind the last byte received +; @param X pointer to SDRAM to receive 8 bytes +; @clobbers r16, r18, r19, r23, X (r17, r20, r21, r22) + +Ds18b20_ReadRom: + rcall OwiMaster_Reset ; (r22) + tst r16 ; presence detected? + breq Ds18b20_ReadRom_error ; nope, jump + + ldi r16, DS18B20_ROMCMD_READROM + rcall OwiMaster_SendByte ; (r21, r22) + + ldi r23, 8 +Ds18b20_ReadRom_loop1: + Utils_WaitNanoSecs 10000, 0, r22 + rcall OwiMaster_RecvByte ; (r21, r22) + st X+, r16 + dec r23 + brne Ds18b20_ReadRom_loop1 + sbiw xh:xl, 8 + ldi r18, 7 + ldi r19, 0x99 + rcall crc8Calc ; (R16, R17, R18, R20, X) + ld r17, X+ + cp r16, r17 + brne Ds18b20_ReadRom_error + sec + ret +Ds18b20_ReadRom_error: + clc + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine ds18b20ReadScratchPad +; +; Send SKIP_ROM, READ_SCRATCHPAD and read 9 byte result into buffer. +; +; Cave: Needs interrupts to be disabled! +; +; @return CFLAG set if okay, cleared on error +; @return X unchanged if CFLAG set (otherwise clobbered) +; @param X pointer to SDRAM to receive 8 bytes +; @clobbers r16, r18, r19, r23, X (r17, r20, r21, r22) + +ds18b20ReadScratchPad: + ldi r16, DS18B20_FNCMD_READSCRATCHPAD + rcall Ds18b20_SendCommand + brcc ds18b20ReadScratchPad_error + ldi r23, 9 +ds18b20ReadScratchPad_loop1: + Utils_WaitNanoSecs 10000, 0, r22 + rcall OwiMaster_RecvByte ; (r21, r22) + st X+, r16 + dec r23 + brne ds18b20ReadScratchPad_loop1 + sbiw xh:xl, 9 + ldi r18, 8 + ldi r19, 0x99 + rcall crc8Calc ; (R16, R17, R18, R20, X) + ld r17, X+ + cp r16, r17 +; brne ds18b20ReadScratchPad_error + sbiw xh:xl, 9 + sec + ret +ds18b20ReadScratchPad_error: + clc + ret +; @end + + + +Ds18b20_SendTemp: + ldi r16, 0xff ; destination address + ldi r17, VALUE_ID_DS18B20_TEMP ; value id + ldi r22, AQHOME_VALUETYPE_TEMP + lds r18, ds18b20DataTemp ; value + lds r19, ds18b20DataTemp+1 + ldi r20, 16 ; denominator + clr r21 + ldi xl, LOW(com2SendBuffer) + ldi xh, HIGH(com2SendBuffer) + rcall CPRO_WriteReportValue + rjmp COM2_SendPacket + + + +DS18B20_END: +.equ MODULE_SIZE_DS18B20 = DS18B20_END-DS18B20_BEGIN + +