Fixed a few bugs.
This commit is contained in:
58
avr/com.asm
58
avr/com.asm
@@ -82,11 +82,11 @@ Com_Init:
|
|||||||
rcall RingBuffer_Init
|
rcall RingBuffer_Init
|
||||||
|
|
||||||
; setup pins and interrupts
|
; 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
|
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
|
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
|
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
|
in r16, GIMSK ; enable pin change irq PCIE0 or PCIE1
|
||||||
@@ -137,15 +137,14 @@ COM_EnqueuePacket:
|
|||||||
cpi r16, 3 ; at least 3 bytes?
|
cpi r16, 3 ; at least 3 bytes?
|
||||||
brcs COM_EnqueuePacket_error ; too few bytes
|
brcs COM_EnqueuePacket_error ; too few bytes
|
||||||
; read flags
|
; read flags
|
||||||
push r18
|
push r18 ; r18 points to flags
|
||||||
rcall RingBuffer_Read
|
rcall RingBuffer_Read ; advances r18 behind flags
|
||||||
pop r18
|
pop r18 ; r18 back to flags
|
||||||
; write flags
|
; write flags
|
||||||
andi r16, (~(COM_BUFFER_FLAGS_PRIO1 | COM_BUFFER_FLAGS_PRIO0 | COM_BUFFER_FLAGS_RECEIVED | COM_BUFFER_FLAGS_DONE)) & 0xff
|
andi r16, (~(COM_BUFFER_FLAGS_PRIO1 | COM_BUFFER_FLAGS_PRIO0 | COM_BUFFER_FLAGS_RECEIVED | COM_BUFFER_FLAGS_DONE)) & 0xff
|
||||||
or r16, r20 ; add priority
|
or r16, r20 ; add priority
|
||||||
ori r16, COM_BUFFER_FLAGS_TOSEND
|
ori r16, COM_BUFFER_FLAGS_TOSEND
|
||||||
rcall RingBuffer_Write
|
rcall RingBuffer_Write
|
||||||
brcc COM_EnqueuePacket_error ; too few bytes
|
|
||||||
out SREG, r15 ; restore IRQ flag
|
out SREG, r15 ; restore IRQ flag
|
||||||
sec
|
sec
|
||||||
ret
|
ret
|
||||||
@@ -167,24 +166,24 @@ COM_EnqueuePacket_error:
|
|||||||
COM_EnqueuePing:
|
COM_EnqueuePing:
|
||||||
ldi yl, LOW(comRingBuffer)
|
ldi yl, LOW(comRingBuffer)
|
||||||
ldi yh, HIGH(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
|
push r17
|
||||||
rcall RingBuffer_Alloc
|
rcall RingBuffer_Alloc ; r16: pos of allocated buffer (r16, r17, r18, r19, r20, r21)
|
||||||
pop r17
|
pop r17
|
||||||
brcc COM_EnqueuePing_error
|
brcc COM_EnqueuePing_error
|
||||||
; write header stuff
|
; 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
|
mov r20, r16 ; r20: start of packet in ring buffer
|
||||||
ldd r19, y+RINGBUFFER_OFFS_MAXSIZE
|
ldd r19, y+RINGBUFFER_OFFS_MAXSIZE
|
||||||
ldi r16, 3+2
|
ldi r16, 3+1
|
||||||
rcall RingBuffer_Write ; write length
|
rcall RingBuffer_Write ; write length (r3, r22)
|
||||||
clr r16
|
clr r16
|
||||||
rcall RingBuffer_Write ; write flags
|
rcall RingBuffer_Write ; write flags
|
||||||
; write payload
|
|
||||||
mov r16, r17
|
mov r16, r17
|
||||||
rcall RingBuffer_Write ; write dest addr
|
rcall RingBuffer_Write ; write dest addr
|
||||||
|
; write payload
|
||||||
ldi r16, COM_CMD_PING
|
ldi r16, COM_CMD_PING
|
||||||
rcall RingBuffer_Write ; write cmd
|
rcall RingBuffer_Write ; write cmd
|
||||||
mov r18, r20
|
mov r18, r20
|
||||||
ldi r20, COM_REPEAT_INFO
|
ldi r20, COM_REPEAT_INFO
|
||||||
rcall COM_EnqueuePacket
|
rcall COM_EnqueuePacket
|
||||||
@@ -213,6 +212,9 @@ comHandleNextPacketInRingbuffer:
|
|||||||
; read current packet in ringbuffer (read pointer)
|
; read current packet in ringbuffer (read pointer)
|
||||||
ldi yl, LOW(comRingBuffer)
|
ldi yl, LOW(comRingBuffer)
|
||||||
ldi yh, HIGH(comRingBuffer)
|
ldi yh, HIGH(comRingBuffer)
|
||||||
|
ldd r16, y+RINGBUFFER_OFFS_USED
|
||||||
|
tst r16
|
||||||
|
breq comHandleNextPacketInRingbuffer_retNc
|
||||||
ldd r19, y+RINGBUFFER_OFFS_MAXSIZE
|
ldd r19, y+RINGBUFFER_OFFS_MAXSIZE
|
||||||
ldd r18, y+RINGBUFFER_OFFS_READPOS
|
ldd r18, y+RINGBUFFER_OFFS_READPOS
|
||||||
rcall RingBuffer_Read ; packet length (R3, R22)
|
rcall RingBuffer_Read ; packet length (R3, R22)
|
||||||
@@ -221,7 +223,7 @@ comHandleNextPacketInRingbuffer:
|
|||||||
mov r1, r16
|
mov r1, r16
|
||||||
rcall RingBuffer_Read ; read flags from packet
|
rcall RingBuffer_Read ; read flags from packet
|
||||||
ldd r18, y+RINGBUFFER_OFFS_READPOS ; r18 back to read pointer
|
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
|
andi r17, COM_BUFFER_FLAGS_TOSEND ; check for message to send
|
||||||
brne comHandleNextPacketInRingbuffer_sendPacket
|
brne comHandleNextPacketInRingbuffer_sendPacket
|
||||||
mov r17, r16 ; check for received message
|
mov r17, r16 ; check for received message
|
||||||
@@ -298,8 +300,8 @@ comSendPacketHandleRepeat:
|
|||||||
rcall RingBuffer_Read ; flags
|
rcall RingBuffer_Read ; flags
|
||||||
pop r18
|
pop r18
|
||||||
rcall comSetupRepeat ; setup comRepeatCount if not already done
|
rcall comSetupRepeat ; setup comRepeatCount if not already done
|
||||||
sbis COM_PIN_ATTN, COM_PINNUM_ATTN ; check ATTN: low?
|
; sbis COM_PIN_ATTN, COM_PINNUM_ATTN ; check ATTN: low?
|
||||||
rjmp comSendPacketHandleRepeat_adjustRepeat ; yes, line is busy, retry later
|
; rjmp comSendPacketHandleRepeat_adjustRepeat ; yes, line is busy, retry later
|
||||||
push r18
|
push r18
|
||||||
cbi COM_PORT_ATTN, COM_PINNUM_ATTN ; set ATTN low
|
cbi COM_PORT_ATTN, COM_PINNUM_ATTN ; set ATTN low
|
||||||
sbi COM_DDR_ATTN, COM_PINNUM_ATTN ; set ATTN as output
|
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
|
; - R18: pos pointer inside ring buffer to read from next
|
||||||
; OUT:
|
; OUT:
|
||||||
; - CFLAG: set if okay, clear otherwise
|
; - 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:
|
comSendPacketRaw:
|
||||||
ldi yl, LOW(comRingBuffer)
|
ldi yl, LOW(comRingBuffer)
|
||||||
@@ -429,16 +431,14 @@ comSendPacketRaw:
|
|||||||
dec r10
|
dec r10
|
||||||
dec r10 ; r10: number of bytes in message
|
dec r10 ; r10: number of bytes in message
|
||||||
clr r11 ; r11: XOR checksum
|
clr r11 ; r11: XOR checksum
|
||||||
mov r20, r18 ; store pos of flags in buffer for later ref
|
rcall RingBuffer_Read ; read flags from buffer (ignore)
|
||||||
rcall RingBuffer_Read ; read flags from buffer
|
|
||||||
mov r12, r16 ; r12: flags
|
|
||||||
rcall RingBuffer_Read ; read dest address from buffer
|
rcall RingBuffer_Read ; read dest address from buffer
|
||||||
eor r11, r16 ; calculate checksum
|
eor r11, r16 ; calculate checksum
|
||||||
rcall comSendByte ; send destination address (R16, R21, R22)
|
rcall comSendByte ; send destination address (R16, R21, R22)
|
||||||
brcc comSendPacketRaw_error
|
brcc comSendPacketRaw_error
|
||||||
mov r16, r10 ; send msg length
|
mov r16, r10 ; send msg length
|
||||||
eor r11, r16 ; calculate checksum
|
eor r11, r16 ; calculate checksum
|
||||||
rcall comSendByte ; send destination address
|
rcall comSendByte ; send msg length
|
||||||
brcc comSendPacketRaw_error
|
brcc comSendPacketRaw_error
|
||||||
tst r10 ; payload?
|
tst r10 ; payload?
|
||||||
breq comSendPacketRaw_sendCrc ; no payload, go send checksum
|
breq comSendPacketRaw_sendCrc ; no payload, go send checksum
|
||||||
@@ -450,13 +450,11 @@ comSendPacketRaw_loop:
|
|||||||
dec r10
|
dec r10
|
||||||
brne comSendPacketRaw_loop
|
brne comSendPacketRaw_loop
|
||||||
comSendPacketRaw_sendCrc:
|
comSendPacketRaw_sendCrc:
|
||||||
mov r16, r10 ; send checksum
|
mov r16, r11 ; send checksum
|
||||||
rcall comSendByte ; send byte
|
rcall comSendByte ; send byte
|
||||||
brcc comSendPacketRaw_error
|
brcc comSendPacketRaw_error
|
||||||
mov r18, r20 ; pos of flags byte in ringbuffer
|
sbi DDRA, PORTA2 ; debug
|
||||||
mov r16, r12
|
sbi PINA, PORTA2 ; debug (toggle)
|
||||||
ori r16, COM_BUFFER_FLAGS_DONE ; set flag
|
|
||||||
rcall RingBuffer_Write ; write new flags (R3, R22)
|
|
||||||
sec
|
sec
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@@ -572,7 +570,7 @@ comSendByte:
|
|||||||
; send remaining bits
|
; send remaining bits
|
||||||
comSendByte_loop:
|
comSendByte_loop:
|
||||||
lsr r16 ; 1+ bit to send -> CARRY
|
lsr r16 ; 1+ bit to send -> CARRY
|
||||||
brcc comSendByte_setHigh ; HI: +2, LO: +1
|
brcs comSendByte_setHigh ; HI: +2, LO: +1
|
||||||
comSendByte_setLow:
|
comSendByte_setLow:
|
||||||
sbi COM_DDR_DATA, COM_PINNUM_DATA ; +2 set DATA as output
|
sbi COM_DDR_DATA, COM_PINNUM_DATA ; +2 set DATA as output
|
||||||
nop
|
nop
|
||||||
@@ -580,7 +578,7 @@ comSendByte_setLow:
|
|||||||
comSendByte_setHigh:
|
comSendByte_setHigh:
|
||||||
cbi COM_DDR_DATA, COM_PINNUM_DATA ; +2 set DATA as input, pullup R makes it ONE
|
cbi COM_DDR_DATA, COM_PINNUM_DATA ; +2 set DATA as input, pullup R makes it ONE
|
||||||
nop ; +1 (to make pin change available)
|
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
|
rjmp comSendByte_error ; +2 if error
|
||||||
comSendByte_waitBit: ; 7 cycles in this loop until now
|
comSendByte_waitBit: ; 7 cycles in this loop until now
|
||||||
Utils_WaitNanoSecs COM_BIT_LENGTH, 10, r22
|
Utils_WaitNanoSecs COM_BIT_LENGTH, 10, r22
|
||||||
|
|||||||
Reference in New Issue
Block a user