From a4b7b7fe2152984037c3526977177bc2b41eb835 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Sat, 21 Jan 2023 18:11:13 +0100 Subject: [PATCH] Fixed a few bugs. --- avr/com.asm | 58 ++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/avr/com.asm b/avr/com.asm index fa12622..769a1ea 100644 --- a/avr/com.asm +++ b/avr/com.asm @@ -82,11 +82,11 @@ Com_Init: rcall RingBuffer_Init ; setup pins and interrupts - sbi COM_DDR_DATA, COM_PINNUM_DATA ; set DATA port as input cbi COM_PORT_DATA, COM_PINNUM_DATA ; disable internal pullup for DATA + sbi COM_DDR_DATA, COM_PINNUM_DATA ; set DATA port as input - sbi COM_DDR_ATTN, COM_PINNUM_ATTN ; set ATTN port as input cbi COM_PORT_ATTN, COM_PINNUM_ATTN ; disable internal pullup for ATTN + sbi COM_DDR_ATTN, COM_PINNUM_ATTN ; set ATTN port as input sbi COM_IRQ_ADDR_ATTN, COM_IRQ_BIT_ATTN ; enable pin change irq for ATTN line in r16, GIMSK ; enable pin change irq PCIE0 or PCIE1 @@ -137,15 +137,14 @@ COM_EnqueuePacket: cpi r16, 3 ; at least 3 bytes? brcs COM_EnqueuePacket_error ; too few bytes ; read flags - push r18 - rcall RingBuffer_Read - pop r18 + push r18 ; r18 points to flags + rcall RingBuffer_Read ; advances r18 behind flags + pop r18 ; r18 back to flags ; write flags andi r16, (~(COM_BUFFER_FLAGS_PRIO1 | COM_BUFFER_FLAGS_PRIO0 | COM_BUFFER_FLAGS_RECEIVED | COM_BUFFER_FLAGS_DONE)) & 0xff or r16, r20 ; add priority ori r16, COM_BUFFER_FLAGS_TOSEND rcall RingBuffer_Write - brcc COM_EnqueuePacket_error ; too few bytes out SREG, r15 ; restore IRQ flag sec ret @@ -167,24 +166,24 @@ COM_EnqueuePacket_error: COM_EnqueuePing: ldi yl, LOW(comRingBuffer) ldi yh, HIGH(comRingBuffer) - ldi r16, 3+2 ; 3 bytes for buffer length, flags and destination address, src address, cmd, + ldi r16, 3+1 ; 3 bytes for buffer length, flags and destination address, cmd push r17 - rcall RingBuffer_Alloc + rcall RingBuffer_Alloc ; r16: pos of allocated buffer (r16, r17, r18, r19, r20, r21) pop r17 brcc COM_EnqueuePing_error ; write header stuff - mov r18, r16 + mov r18, r16 ; r18: start of packet in ring buffer mov r20, r16 ; r20: start of packet in ring buffer ldd r19, y+RINGBUFFER_OFFS_MAXSIZE - ldi r16, 3+2 - rcall RingBuffer_Write ; write length + ldi r16, 3+1 + rcall RingBuffer_Write ; write length (r3, r22) clr r16 - rcall RingBuffer_Write ; write flags - ; write payload + rcall RingBuffer_Write ; write flags mov r16, r17 - rcall RingBuffer_Write ; write dest addr + rcall RingBuffer_Write ; write dest addr + ; write payload ldi r16, COM_CMD_PING - rcall RingBuffer_Write ; write cmd + rcall RingBuffer_Write ; write cmd mov r18, r20 ldi r20, COM_REPEAT_INFO rcall COM_EnqueuePacket @@ -213,6 +212,9 @@ comHandleNextPacketInRingbuffer: ; read current packet in ringbuffer (read pointer) ldi yl, LOW(comRingBuffer) ldi yh, HIGH(comRingBuffer) + ldd r16, y+RINGBUFFER_OFFS_USED + tst r16 + breq comHandleNextPacketInRingbuffer_retNc ldd r19, y+RINGBUFFER_OFFS_MAXSIZE ldd r18, y+RINGBUFFER_OFFS_READPOS rcall RingBuffer_Read ; packet length (R3, R22) @@ -221,7 +223,7 @@ comHandleNextPacketInRingbuffer: mov r1, r16 rcall RingBuffer_Read ; read flags from packet ldd r18, y+RINGBUFFER_OFFS_READPOS ; r18 back to read pointer - mov r17, r16 + mov r17, r16 ; flags andi r17, COM_BUFFER_FLAGS_TOSEND ; check for message to send brne comHandleNextPacketInRingbuffer_sendPacket mov r17, r16 ; check for received message @@ -298,8 +300,8 @@ comSendPacketHandleRepeat: rcall RingBuffer_Read ; flags pop r18 rcall comSetupRepeat ; setup comRepeatCount if not already done - sbis COM_PIN_ATTN, COM_PINNUM_ATTN ; check ATTN: low? - rjmp comSendPacketHandleRepeat_adjustRepeat ; yes, line is busy, retry later +; sbis COM_PIN_ATTN, COM_PINNUM_ATTN ; check ATTN: low? +; rjmp comSendPacketHandleRepeat_adjustRepeat ; yes, line is busy, retry later push r18 cbi COM_PORT_ATTN, COM_PINNUM_ATTN ; set ATTN low sbi COM_DDR_ATTN, COM_PINNUM_ATTN ; set ATTN as output @@ -415,7 +417,7 @@ comDeallocReadBufAndIncrCounter: ; - R18: pos pointer inside ring buffer to read from next ; OUT: ; - CFLAG: set if okay, clear otherwise -; MODIFIED REGS: R10, R11, R12, R16, R20 (R3, R21, R22) +; MODIFIED REGS: R10, R11, R16 (R3, R21, R22) comSendPacketRaw: ldi yl, LOW(comRingBuffer) @@ -429,16 +431,14 @@ comSendPacketRaw: dec r10 dec r10 ; r10: number of bytes in message clr r11 ; r11: XOR checksum - mov r20, r18 ; store pos of flags in buffer for later ref - rcall RingBuffer_Read ; read flags from buffer - mov r12, r16 ; r12: flags + rcall RingBuffer_Read ; read flags from buffer (ignore) rcall RingBuffer_Read ; read dest address from buffer eor r11, r16 ; calculate checksum rcall comSendByte ; send destination address (R16, R21, R22) brcc comSendPacketRaw_error mov r16, r10 ; send msg length eor r11, r16 ; calculate checksum - rcall comSendByte ; send destination address + rcall comSendByte ; send msg length brcc comSendPacketRaw_error tst r10 ; payload? breq comSendPacketRaw_sendCrc ; no payload, go send checksum @@ -450,13 +450,11 @@ comSendPacketRaw_loop: dec r10 brne comSendPacketRaw_loop comSendPacketRaw_sendCrc: - mov r16, r10 ; send checksum + mov r16, r11 ; send checksum rcall comSendByte ; send byte brcc comSendPacketRaw_error - mov r18, r20 ; pos of flags byte in ringbuffer - mov r16, r12 - ori r16, COM_BUFFER_FLAGS_DONE ; set flag - rcall RingBuffer_Write ; write new flags (R3, R22) + sbi DDRA, PORTA2 ; debug + sbi PINA, PORTA2 ; debug (toggle) sec ret @@ -572,7 +570,7 @@ comSendByte: ; send remaining bits comSendByte_loop: lsr r16 ; 1+ bit to send -> CARRY - brcc comSendByte_setHigh ; HI: +2, LO: +1 + brcs comSendByte_setHigh ; HI: +2, LO: +1 comSendByte_setLow: sbi COM_DDR_DATA, COM_PINNUM_DATA ; +2 set DATA as output nop @@ -580,7 +578,7 @@ comSendByte_setLow: comSendByte_setHigh: cbi COM_DDR_DATA, COM_PINNUM_DATA ; +2 set DATA as input, pullup R makes it ONE nop ; +1 (to make pin change available) - sbic COM_PIN_DATA, (1<