Fixed a few bugs.

This commit is contained in:
Martin Preuss
2023-01-21 18:11:13 +01:00
parent 69c13ab3c5
commit b27b1b7301

View File

@@ -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<<COM_PINNUM_DATA) ; +1 if okay, +2 otherwise
sbis COM_PIN_DATA, COM_PINNUM_DATA ; +1 if okay, +2 otherwise
rjmp comSendByte_error ; +2 if error
comSendByte_waitBit: ; 7 cycles in this loop until now
Utils_WaitNanoSecs COM_BIT_LENGTH, 10, r22