diff --git a/avr/com.asm b/avr/com.asm index 3e73342..470f095 100644 --- a/avr/com.asm +++ b/avr/com.asm @@ -38,6 +38,7 @@ .equ COM_MSG_OFFS_MSGDATA = 2 .equ COM_CMD_PING = 1 +.equ COM_CMD_COMSENDSTATS = 2 ; *************************************************************************** @@ -259,6 +260,90 @@ COM_EnqueuePing_error: +; --------------------------------------------------------------------------- +; Enqueue a COM Send stats packet. +; +; IN: +; - R16: destination address +; OUT: +; - CFLAG: set if okay, clear otherwise +; MODIFIED REGS: R16, R17, R20, X (R15, Y) + +COM_EnqueueComSendStats: + push r15 + in r15, SREG + cli + push r16 + rcall COM_AllocBufferAndGetXY ; (r16, r17, r21) + pop r16 + brcc COM_EnqueueComSendStats_error + clr r17 ; r17: XOR byte + ; write header (dest address, msg length) + st X+, r16 ; destination address + eor r17, r16 + ldi r16, 12 ; 8 bytes payload + st X+, r16 + eor r17, r16 + ; write payload + ldi r16, COM_CMD_COMSENDSTATS + st X+, r16 + eor r17, r16 + lds r16, comAddress + st X+, r16 + eor r17, r16 + + lds r16, timerModuleCounterSecs + st X+, r16 + eor r17, r16 + lds r16, timerModuleCounterSecs+1 + st X+, r16 + eor r17, r16 + lds r16, timerModuleCounterSecs+2 + st X+, r16 + eor r17, r16 + lds r16, timerModuleCounterSecs+3 + st X+, r16 + eor r17, r16 + + lds r16, comStatsPacketsOut + st X+, r16 + eor r17, r16 + lds r16, comStatsPacketsOut+1 + st X+, r16 + eor r17, r16 + + lds r16, comStatsCollisions + st X+, r16 + eor r17, r16 + lds r16, comStatsCollisions+1 + st X+, r16 + eor r17, r16 + + lds r16, comStatsAborted + st X+, r16 + eor r17, r16 + lds r16, comStatsAborted+1 + st X+, r16 + eor r17, r16 + + ; store XOR byte + st X+, r17 + ; mark buffer as enqueued with PRIO "info" (limited amount of retries) + ldi r20, COM_BUFFER_PRIO_INFO + rcall COM_EnqueuePacket ; (R15, R16) + brcc COM_EnqueueComSendStats_error + pop r15 + out SREG, r15 + sec + ret +COM_EnqueueComSendStats_error: + pop r15 + out SREG, r15 + clc + ret + + + ; --------------------------------------------------------------------------- ; comHandleNextPacketInQueue ; @@ -347,6 +432,11 @@ comHandleReceivedPacket_l2: comSendPacketHandleRepeat: in r15, SREG cli + cbi COM_PORT_ATTN, COM_PINNUM_ATTN ; disable pullup on ATTN + cbi COM_DDR_ATTN, COM_PINNUM_ATTN ; set ATTN as input + nop ; needed to sample current input + sbis COM_PIN_ATTN, COM_PINNUM_ATTN ; ATTN low? + rjmp comSendPacketHandleRepeat_adjustRepeat ; jump if it is ldd r16, y+COM_BUFFER_OFFS_FLAGS rcall comSetupRepeat ; setup comRepeatCount if not already done (R16, R17) cbi COM_PORT_ATTN, COM_PINNUM_ATTN ; set ATTN low @@ -354,23 +444,25 @@ comSendPacketHandleRepeat: Utils_WaitNanoSecs COM_BIT_LENGTH, 0, r22 ; wait for one bit duration rcall comSendPacketHandleBuffer ; (R16, R17, R21, R22) cbi COM_DDR_ATTN, COM_PINNUM_ATTN ; release ATTN line - brcc comSendPacketHandleRepeat_adjustRepeat + brcc comSendPacketHandleRepeat_collision ; packet sent, adjust stats, release buffer ldi xl, LOW(comStatsPacketsOut) ldi xh, HIGH(comStatsPacketsOut) rcall comDeallocReadBufAndIncrCounter ; (r16, r17, r18) rjmp comSendPacketHandleRepeat_retC -comSendPacketHandleRepeat_adjustRepeat: +comSendPacketHandleRepeat_collision: ; increment collisions counter ldi xl, LOW(comStatsCollisions) ldi xh, HIGH(comStatsCollisions) - clr r22 + ldi r22, 1 ld r16, x+ ld r17, x - inc r16 + add r16, r22 + dec r22 adc r17, r22 - st -x, r17 - st x, r16 + st x, r17 + st -x, r16 +comSendPacketHandleRepeat_adjustRepeat: ; decrement repeat counter (except for vital messages) lds r17, comRepeatCount cpi r17, COM_REPEAT_VITAL @@ -445,13 +537,14 @@ comSetupRepeat_l99: comDeallocReadBufAndIncrCounter: rcall COM_BufferDeallocFront ; (r16, r17, r21) - clr r21 + ldi r21, 1 ld r16, x+ ld r17, x - inc r16 + add r16, r21 + dec r21 adc r17, r21 - st -x, r17 - st x, r16 + st x, r17 + st -x, r16 sts comRepeatCount, r21 ; set comRepeatCount to zero ret @@ -829,7 +922,7 @@ COM_BufferAlloc: lds r16, comRecvBuffersWritePos ; get current write pos mov r17, r16 ; increment for next call inc r17 - cpi r17, COM_BUFFER_NUM + cpi r17, COM_BUFFER_NUM ; CF set if COM_BUFFER_NUM > R17 brcs COM_AllocBuffer_l1 clr r17 ; wraparound COM_AllocBuffer_l1: @@ -868,8 +961,8 @@ COM_BufferDeallocBack: dec r17 sts comRecvBuffersUsed, r17 ; store new value lds r17, comRecvBuffersWritePos - tst r17 - brne COM_BufferDeallocBack_l1 + tst r17 ; 0? + brne COM_BufferDeallocBack_l1 ; nope go directly decrement r17 ldi r17, COM_BUFFER_NUM ; wrap-around COM_BufferDeallocBack_l1: dec r17 @@ -934,8 +1027,8 @@ COM_BufferDeallocFront_error: COM_BufferPosToY: ; calculate offset clr r17 - add yl, r16 - adc yh, r17 + mov yl, r16 + clr yh lsl yl rol yh ; *2 diff --git a/avr/timer.asm b/avr/timer.asm index 2eb86be..ad5b73b 100644 --- a/avr/timer.asm +++ b/avr/timer.asm @@ -189,8 +189,9 @@ timerIrq2_l1: ; increment seconds ld r19, x+ ld r20, x+ ld r21, x - clr r22 - inc r18 + ldi r22, 1 + add r18, r22 + dec r22 adc r19, r22 adc r20, r22 adc r21, r22