From 5981ec44e4522f68921c4b46f65bfed3e2eaaa42 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Thu, 1 May 2025 00:54:48 +0200 Subject: [PATCH] avr: only write COM address if changed to reduce EEPROM wear. --- avr/apps/network/main.asm | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/avr/apps/network/main.asm b/avr/apps/network/main.asm index d7f6070..45dfd2f 100644 --- a/avr/apps/network/main.asm +++ b/avr/apps/network/main.asm @@ -26,7 +26,7 @@ .equ APP_NETWORK_ADDRESS_RANGE_BEGIN = 1 -.equ APP_NETWORK_ADDRESS_RANGE_END = 192 +.equ APP_NETWORK_ADDRESS_RANGE_END = 191 .equ APP_NETWORK_REBOOT_TIME_100MS = 20 @@ -207,18 +207,23 @@ appNetworkHandleStateHaveAddress1: appNetworkHandleStateHaveAddress2: ldi r16, APP_NETWORK_STATE_UP std Y+NET_IFACE_OFFS_STATUS, r16 + ldi r16, APP_NETWORK_TIMER_100MS + std Y+NET_IFACE_OFFS_STATETIMER, r16 ldd r16, Y+NET_IFACE_OFFS_RANGE_BEGIN ; set interface address + ldd r17, Y+NET_IFACE_OFFS_ADDRESS + cp r16, r17 + breq appNetworkHandleStateHaveAddress2_end + ; store new address in IFACE and in EEPROM std Y+NET_IFACE_OFFS_ADDRESS, r16 - - in r15, SREG push r15 + in r15, SREG cli ldi xl, LOW(EEPROM_OFFS_COMADDR) ldi xh, HIGH(EEPROM_OFFS_COMADDR) rcall Utils_WriteEepromIncr ; write address to EEPROM + out SREG, r15 pop r15 - out SREG, r15 - +appNetworkHandleStateHaveAddress2_end: ret @@ -323,16 +328,16 @@ appNetworkHandleMsgDenyAddr: ; check state ldd r16, Y+NET_IFACE_OFFS_STATUS cpi r16, APP_NETWORK_STATE_UP - breq appNetworkHandleMsgDenyAddr_end ; ignore (our network stack is up) + breq appNetworkHandleMsgDenyAddr_end ; ignore (our network stack is up) ; still setting up address, check whether the last one is denied now ldd r16, Y+NET_IFACE_OFFS_RANGE_BEGIN - cp r19, r16 ; our claimed address? - brne appNetworkHandleMsgDenyAddr_end ; nope, jump + cp r19, r16 ; our claimed address? + brne appNetworkHandleMsgDenyAddr_end ; nope, jump ; try next address (if any left) ldd r17, Y+NET_IFACE_OFFS_RANGE_END - inc r16 - cp r16, r17 - brcs appNetworkHandleMsgDenyAddr_claimNext + inc r16 ; RANGE_BEGIN+1 + cp r17, r16 ; smaller than or equal to RANGE_END? + brcc appNetworkHandleMsgDenyAddr_claimNext ; out of addresses, start completely new after some waiting time rcall appNetworkResetState ldi r16, 200 ; wait for 20s before trying whole process again @@ -397,6 +402,7 @@ appNetworkResetState: cpi r16, 0xff breq appNetworkResetState_setRangeEnd std Y+NET_IFACE_OFFS_RANGE_BEGIN, r16 + std Y+NET_IFACE_OFFS_ADDRESS, r16 ; preset address from EEPROM appNetworkResetState_setRangeEnd: ldi r16, APP_NETWORK_ADDRESS_RANGE_END ; last possible address+1 std Y+NET_IFACE_OFFS_RANGE_END, r16 @@ -409,17 +415,17 @@ appNetworkResetState_setRangeEnd: ; @routine appNetworkGetAddressFromEeprom ; ; @return R16 address from EEPROM -; @clobbers R15, X +; @clobbers X appNetworkGetAddressFromEeprom: - ldi xl, LOW(EEPROM_OFFS_COMADDR) - ldi xh, HIGH(EEPROM_OFFS_COMADDR) - in r15, SREG push r15 + in r15, SREG cli + ldi xl, LOW(EEPROM_OFFS_COMADDR) + ldi xh, HIGH(EEPROM_OFFS_COMADDR) rcall Utils_ReadEepromIncr ; (R16) + out SREG, r15 pop r15 - out SREG, r15 ret ; @end