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
|
||||
|
||||
; 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
|
||||
|
||||
Reference in New Issue
Block a user