From 0b1e0ea4d5d5aed754f57a94fcf4ef3b26283ba1 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Sun, 5 Feb 2023 23:42:59 +0100 Subject: [PATCH] Implemented address assignment protocol. --- avr/att84_temp1.asm | 17 +- avr/com.asm | 11 +- avr/comproto.asm | 215 +++++++++++++++++++++++-- avr/comproto_addr.asm | 357 ++++++++++++++++++++++++++++++++++++++++++ avr/main.asm | 61 ++++---- avr/utils.asm | 40 ++++- 6 files changed, 655 insertions(+), 46 deletions(-) create mode 100644 avr/comproto_addr.asm diff --git a/avr/att84_temp1.asm b/avr/att84_temp1.asm index c33e37d..f19a1cb 100644 --- a/avr/att84_temp1.asm +++ b/avr/att84_temp1.asm @@ -190,6 +190,7 @@ realInterruptTable: .include "led.asm" .include "com.asm" .include "comproto.asm" +.include "comproto_addr.asm" .include "twimaster.asm" .include "lcd.asm" ;.include "bmp280.asm" @@ -246,8 +247,6 @@ onSystemStart: #ifdef MODULES_COM rcall Utils_SetupUid ; brcc onSystemStart_l1 - ldi r16, 0xff - rcall CPRO_EnqueueNeedAddress onSystemStart_l1: #endif @@ -295,6 +294,7 @@ onEvery100ms: onEverySecond: ; rcall TWI_Master_ScanNext + rcall CPRO_OnEverySecond ret @@ -331,6 +331,16 @@ onEvery30s: #ifdef MODULES_SI7021 rcall SI7021_PeriodicMeasurement rcall Main_SendValueMsg + + lds r16, comAddress + tst r16 + brne onEvery30s_l1 + lds r16, cproMode + cpi r16, CPRO_MODE_NORMAL + brne onEvery30s_l1 + rcall CPRO_StartGetAddrProcedure +onEvery30s_l1: + #endif ret @@ -379,7 +389,8 @@ onEveryMinute: ; USED: depending on called routines onPacketReceived: - clc ; not handled + rcall CPRO_OnPacketReceived ret + diff --git a/avr/com.asm b/avr/com.asm index 9baf299..1f0314b 100644 --- a/avr/com.asm +++ b/avr/com.asm @@ -132,7 +132,14 @@ Com_Init: ldi r17, (comDataEnd-comDataBegin) rcall Utils_FillSram - ldi r16, 1 ; debug: set fixed address "1" + ; read address from EEPROM + ldi xl, LOW(EEPROM_OFFS_COMADDR) + ldi xh, HIGH(EEPROM_OFFS_COMADDR) + rcall Utils_ReadEeprom ; (R16) + cpi r16, 0xff + brne Com_Init_l1 + clr r16 +Com_Init_l1: sts comAddress, r16 ; setup pins and interrupts @@ -564,6 +571,8 @@ comReceivePacketToSram: ; compare destination address (accept "0" and own address) tst r16 breq comReceivePacketToSram_acceptAddr + cpi r16, 0xff + breq comReceivePacketToSram_acceptAddr lds r17, comAddress cp r16, r17 breq comReceivePacketToSram_acceptAddr diff --git a/avr/comproto.asm b/avr/comproto.asm index ae1b957..6d03a82 100644 --- a/avr/comproto.asm +++ b/avr/comproto.asm @@ -14,6 +14,9 @@ .equ CPRO_CMD_VALUE = 50 .equ CPRO_CMD_NEED_ADDRESS = 60 .equ CPRO_CMD_HAVE_ADDRESS = 61 +.equ CPRO_CMD_CLAIM_ADDRESS = 62 +.equ CPRO_CMD_DENY_ADDRESS = 63 +.equ CPRO_CMD_ADDRESS_RANGE = 64 ; flags for variable payload enqueue function @@ -28,6 +31,28 @@ .equ CPRO_PAYLOAD_FLAGS_SHIFT_NUM = 5 +.equ CPRO_PACKET_OFFS_DESTADDR = 0 +.equ CPRO_PACKET_OFFS_MSGLEN = 1 +.equ CPRO_PACKET_OFFS_CMD = 2 +.equ CPRO_PACKET_OFFS_SRCADDR = 3 +.equ CPRO_PACKET_OFFS_PAYLOAD = 4 + +.equ CPRO_PACKET_HAVEADDR_OFFS_ADDRESS = 8 +.equ CPRO_PACKET_CLAIMADDR_OFFS_ADDRESS = 8 +.equ CPRO_PACKET_DENYADDR_OFFS_ADDRESS = 8 + +.equ CPRO_WAITTIME_GETADDR = 130 +.equ CPRO_WAITTIME_CLAIMADDR = 30 + +; current mode of operation +.equ CPRO_MODE_NORMAL = 0 ; normal operation +.equ CPRO_MODE_GETADDRSTARTED = 10 ; waiting for HAVE_ADDRESS and ADDRESS_RANGE packets to arrive +.equ CPRO_MODE_CLAIMING_ADDR1 = 20 ; CLAIM_ADDRESS sent, waiting for HAVE_ADDRESS packet to reject the claim +.equ CPRO_MODE_CLAIMING_ADDR2 = 21 ; CLAIM_ADDRESS sent, 2nd try +.equ CPRO_MODE_CLAIMING_ADDR3 = 22 ; CLAIM_ADDRESS sent, 3rd try +.equ CPRO_MODE_SENDING_HAVE_ADDRESS = 30 ; waiting for our turn to send HAVE_ADDRESS packet + + ; *************************************************************************** ; data @@ -35,6 +60,14 @@ .dseg +cproDataBegin: + cproMode: .byte 1 ; "normal", "waitForHaveAddress", "samplingAddresses", "claimAddress" + cproAddrRangeBegin: .byte 1 + cproAddrRangeEnd: .byte 1 + cproAddressWaitCounter: .byte 1 ; counter for seconds to wait for all nodes to respond + cproUsedAddresses: .byte 16 ; one bit per address known to b in use +cproDataEnd: + ; *************************************************************************** @@ -44,6 +77,104 @@ +CPRO_Init: + ; preset SRAM data area + ldi xh, HIGH(cproDataBegin) + ldi xl, LOW(cproDataBegin) + clr r16 + ldi r17, (cproDataEnd-cproDataBegin) + rcall Utils_FillSram + sec + ret + + + +CPRO_OnEverySecond: + lds r17, cproMode + cpi r17, CPRO_MODE_NORMAL + breq CPRO_OnEverySecond_done +CPRO_OnEverySecond_l1: + cpi r17, CPRO_MODE_GETADDRSTARTED + brne CPRO_OnEverySecond_l2 + rjmp cproHandle1sGetAddrStarted +CPRO_OnEverySecond_l2: + cpi r17, CPRO_MODE_SENDING_HAVE_ADDRESS + brne CPRO_OnEverySecond_l3 + rjmp cproHandle1sSendingHaveAddress +CPRO_OnEverySecond_l3: + cpi r17, CPRO_MODE_CLAIMING_ADDR1 + brne CPRO_OnEverySecond_l4 + rjmp cproHandle1sClaimingAddr12 +CPRO_OnEverySecond_l4: + cpi r17, CPRO_MODE_CLAIMING_ADDR2 + brne CPRO_OnEverySecond_l5 + rjmp cproHandle1sClaimingAddr12 +CPRO_OnEverySecond_l5: + cpi r17, CPRO_MODE_CLAIMING_ADDR3 + brne CPRO_OnEverySecond_done + rjmp cproHandle1sClaimingAddr3 +CPRO_OnEverySecond_done: + ret + + + +; --------------------------------------------------------------------------- +; CPRO_OnPacketReceived: +; +; Try to handle the given packet. +; +; IN: +; - Y : pointer to received buffer +; OUT: +; - CFLAG: set if handled, cleared otherwise +; USED: depending on called routines + +CPRO_OnPacketReceived: + ldd r16, y+(COM_BUFFER_OFFS_DATA+CPRO_PACKET_OFFS_CMD) + cpi r16, CPRO_CMD_PING + brne CPRO_OnPacketReceived_l1 + rjmp cproHandlePing +CPRO_OnPacketReceived_l1: + cpi r16, CPRO_CMD_NEED_ADDRESS + brne CPRO_OnPacketReceived_l2 + rjmp cproHandlePckNeedAddr +CPRO_OnPacketReceived_l2: + cpi r16, CPRO_CMD_HAVE_ADDRESS + brne CPRO_OnPacketReceived_l3 + rjmp cproHandlePckHaveAddr +CPRO_OnPacketReceived_l3: + cpi r16, CPRO_CMD_ADDRESS_RANGE + brne CPRO_OnPacketReceived_l4 + rjmp cproHandleAddrRange +CPRO_OnPacketReceived_l4: + cpi r16, CPRO_CMD_DENY_ADDRESS + brne CPRO_OnPacketReceived_l5 + rjmp cproHandleDenyAddr +CPRO_OnPacketReceived_l5: + cpi r16, CPRO_CMD_CLAIM_ADDRESS + brne CPRO_OnPacketReceived_l6 + rjmp cproHandlePckClaimAddr +CPRO_OnPacketReceived_l6: + clc + ret + + +cproHandlePing: + ldd r16, y+(COM_BUFFER_OFFS_DATA+CPRO_PACKET_OFFS_SRCADDR) + tst r16 + breq cproHandlePing_notHandled + rcall CPRO_EnqueuePong + ret ; use carry flag from previous call +cproHandlePing_notHandled: + clc + ret + + + + + + + ; --------------------------------------------------------------------------- ; Enqueue a PING packet. ; @@ -286,21 +417,85 @@ CPRO_EnqueueValue_error: ; Enqueue a NEEDADDRESS packet. ; ; IN: -; - R16: destination address +; - nothing +; OUT: +; - CFLAG: set if okay, clear otherwise +; MODIFIED REGS: R18 (R3, R4, R15, R16, R17, R20, R21, X, Y (R18, R19) + +CPRO_EnqueueNeedAddress: + ldi r18, CPRO_CMD_NEED_ADDRESS + rjmp cproEnqueueAddressPacket + + + +; --------------------------------------------------------------------------- +; Enqueue a HAVE_ADDRESS packet. +; +; IN: +; - nothing +; OUT: +; - CFLAG: set if okay, clear otherwise +; MODIFIED REGS: R18 (R3, R4, R15, R16, R17, R18, R19, R20, R21, X, Y) + +CPRO_EnqueueHaveAddress: + ldi r18, CPRO_CMD_HAVE_ADDRESS + lds r19, comAddress + rjmp cproEnqueueAddressPacket + + + +; --------------------------------------------------------------------------- +; Enqueue a CLAIM_ADDRESS packet. +; +; IN: +; - R19: claimed address +; OUT: +; - CFLAG: set if okay, clear otherwise +; MODIFIED REGS: R18 (R3, R4, R15, R16, R17, R18, R19, R20, R21, X, Y) + +CPRO_EnqueueClaimAddress: + ldi r18, CPRO_CMD_CLAIM_ADDRESS + rjmp cproEnqueueAddressPacket + + + +; --------------------------------------------------------------------------- +; Enqueue a DENY_ADDRESS packet. +; +; IN: +; - nothing +; OUT: +; - CFLAG: set if okay, clear otherwise +; MODIFIED REGS: R18, R19 (R3, R4, R15, R16, R17, R20, R21, X, Y) + +CPRO_EnqueueDenyAddress: + ldi r18, CPRO_CMD_DENY_ADDRESS + lds r19, comAddress + rjmp cproEnqueueAddressPacket + + + +; --------------------------------------------------------------------------- +; cproEnqueueAddressPacket +; Enqueue a NEED/HAVE/CLAIM ADDRESS packet. +; +; IN: +; - R18: command (either CPRO_CMD_NEED_ADDRESS, CPRO_CMD_HAVE_ADDRESS or CPRO_CMD_CLAIM_ADDRESS) +; - R19: address to send (claim, have) ; OUT: ; - CFLAG: set if okay, clear otherwise ; MODIFIED REGS: R16, R17, R20, R21, X, Y (R3, R4, R15, R16, R17, R18, R19, R21, X) -CPRO_EnqueueNeedAddress: - push r16 - rcall COM_AllocBufferAndGetXY ; (r16, r17, r21) - pop r16 - brcc CPRO_EnqueueNeedAddress_error - ldi r17, CPRO_PAYLOAD_FLAGS_UID - ldi r18, CPRO_CMD_NEED_ADDRESS +cproEnqueueAddressPacket: + mov r6, r19 + rcall COM_AllocBufferAndGetXY ; (r16, r17, r21) + brcc cproEnqueueAddressPacket_error + ldi r16, 0xff + ldi r17, CPRO_PAYLOAD_FLAGS_UID | (1<