Started working on COM module.
This commit is contained in:
234
avr/com.asm
Normal file
234
avr/com.asm
Normal file
@@ -0,0 +1,234 @@
|
||||
|
||||
|
||||
|
||||
.equ COM_BIT_LENGTH = 52000 ; 104000=9600, 52000=19200, 26000=38400
|
||||
|
||||
|
||||
.equ COM_DATA_OFFS_ID = 0
|
||||
.equ COM_DATA_OFFS_FLAGS = 1
|
||||
.equ COM_DATA_OFFS_ADDR_DDR_DATA = 2
|
||||
.equ COM_DATA_OFFS_ADDR_PORT_DATA = 3
|
||||
.equ COM_DATA_OFFS_ADDR_PIN_DATA = 4
|
||||
.equ COM_DATA_OFFS_PINMASK_DATA = 5
|
||||
.equ COM_DATA_OFFS_ADDR_DDR_ATTN = 6
|
||||
.equ COM_DATA_OFFS_ADDR_PORT_ATTN = 7
|
||||
.equ COM_DATA_OFFS_ADDR_PIN_ATTN = 8
|
||||
.equ COM_DATA_OFFS_PINMASK_ATTN = 9
|
||||
.equ COM_DATA_OFFS_IRQNUM_ATTN = 10 ; 0 for PCINT0, 1 for PCINT1
|
||||
.equ COM_DATA_OFFS_IRQMASK_ATTN = 11 ; e.g. 0x80 for PCINT7 in PCMSK0
|
||||
.equ COM_DATA_SIZE = 12
|
||||
|
||||
.equ COM_BUFFER_FLAGS_DONE = 0x80
|
||||
.equ COM_BUFFER_FLAGS_RECEIVED = 0x40
|
||||
|
||||
|
||||
; interface data in SRAM
|
||||
.equ COM_SRAM_OFFS_ID = 0
|
||||
.equ COM_SRAM_OFFS_FLAGS = 1
|
||||
.equ COM_SRAM_OFFS_ADDRESS = 2
|
||||
.equ COM_SRAM_OFFS_MODULE_ID = 3
|
||||
.equ COM_SRAM_OFFS_SUBNET_START = 4
|
||||
.equ COM_SRAM_OFFS_SUBNET_END = 5
|
||||
|
||||
.equ COM_SRAM_OFFS_DATA_BITMASK = 6
|
||||
.equ COM_SRAM_OFFS_DATA_INPUT_PORT = 7
|
||||
.equ COM_SRAM_OFFS_DATA_OUTPUT_PORT = 8
|
||||
.equ COM_SRAM_OFFS_DATA_DDR_PORT = 9
|
||||
|
||||
.equ COM_SRAM_OFFS_ATTN_BITMASK = 10
|
||||
.equ COM_SRAM_OFFS_ATTN_INPUT_PORT = 11
|
||||
.equ COM_SRAM_OFFS_ATTN_OUTPUT_PORT = 12
|
||||
.equ COM_SRAM_OFFS_ATTN_DDR_PORT = 13
|
||||
|
||||
.equ COM_SRAM_OFFS_STAT_PACKETS_IN = 14 ; 2 bytes
|
||||
.equ COM_SRAM_OFFS_STAT_PACKETS_OUT = 16 ; 2 bytes
|
||||
.equ COM_SRAM_OFFS_STAT_COLLISIONS = 18 ; 2 bytes
|
||||
.equ COM_SRAM_OFFS_STAT_RECVERR = 20 ; 2 bytes
|
||||
.equ COM_SRAM_OFFS_STAT_MISSED = 22 ; 2 bytes
|
||||
|
||||
.equ COM_SRAM_SIZE = 24
|
||||
|
||||
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
; macros
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; comSetRamBitInX
|
||||
;
|
||||
; Set a given bit in the byte pointed to by X.
|
||||
; IN:
|
||||
; - @0: bit mask to check
|
||||
; - @1: temporary register to use
|
||||
; OUT:
|
||||
; - nothing
|
||||
; MODIFIED REGS: temporary register
|
||||
; CYCLES: 4
|
||||
|
||||
.macro comSetRamBitInX
|
||||
ld @1, x ; 1
|
||||
or @1, @0 ; 1
|
||||
st x, @1 ; 2
|
||||
.endmacro
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; comClearRamBitInX
|
||||
;
|
||||
; Clear a given bit in the byte pointed to by X.
|
||||
; IN:
|
||||
; - @0: bit mask to check
|
||||
; - @1: temporary register to use
|
||||
; OUT:
|
||||
; - nothing
|
||||
; MODIFIED REGS: temporary register
|
||||
; CYCLES: 6 (CAVE: two cycles more than comSetRamBitInX!)
|
||||
|
||||
.macro comClearRamBitInX
|
||||
ld @1, x ; 1
|
||||
com @0 ; 1
|
||||
and @1, @0 ; 1
|
||||
com @0 ; 1
|
||||
st x, @1 ; 2
|
||||
.endmacro
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; comTestRamBitInX
|
||||
;
|
||||
; Test a given bit in the byte pointed to by X.
|
||||
; IN:
|
||||
; - @0: bit mask to check
|
||||
; - @1: temporary register to use
|
||||
; OUT:
|
||||
; - ZFLAG: set if bit is zero, cleared otherwise
|
||||
; MODIFIED REGS: temporary register
|
||||
; CYCLES: 6 (CAVE: two cycles more than comSetRamBitInX!)
|
||||
|
||||
.macro comTestRamBitInX
|
||||
ld @1, x ; 1
|
||||
and @1, @0 ; 1
|
||||
.endmacro
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
; code
|
||||
|
||||
.cseg
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Com_Init
|
||||
;
|
||||
; IN:
|
||||
; - Y: pointer to SRAM data
|
||||
; - Z: pointer to FLASH data
|
||||
; OUT:
|
||||
; - CFLAG: set if okay, clear on error
|
||||
; USED:
|
||||
|
||||
Com_Init:
|
||||
mov xh, yh
|
||||
mov xl, yl
|
||||
clr r16
|
||||
ldi r17, COM_SRAM_SIZE
|
||||
rcall Utils_FillSram
|
||||
|
||||
; copy data from flash to sram
|
||||
push zh
|
||||
push zl
|
||||
lsl zl
|
||||
rol zh
|
||||
|
||||
lpm r16, z+ ; id
|
||||
std y+COM_SRAM_OFFS_ID, r16
|
||||
lpm r16, z+ ; flags
|
||||
std y+COM_SRAM_OFFS_FLAGS, r16
|
||||
lpm r16, z+ ; ADDR_DDR_DATA
|
||||
std y+COM_SRAM_OFFS_DATA_DDR_PORT, r16
|
||||
lpm r16, z+ ; ADDR_PORT_DATA
|
||||
std y+COM_SRAM_OFFS_DATA_OUTPUT_PORT, r16
|
||||
lpm r16, z+ ; ADDR_PIN_DATA
|
||||
std y+COM_SRAM_OFFS_DATA_INPUT_PORT, r16
|
||||
lpm r16, z+ ; PINMASK_DATA
|
||||
std y+COM_SRAM_OFFS_DATA_INPUT_PORT, r16
|
||||
lpm r16, z+ ; ADDR_DDR_ATTN
|
||||
std y+COM_SRAM_OFFS_ATTN_DDR_PORT, r16
|
||||
lpm r16, z+ ; ADDR_PORT_ATTN
|
||||
std y+COM_SRAM_OFFS_ATTN_OUTPUT_PORT, r16
|
||||
lpm r16, z+ ; ADDR_PIN_ATTN
|
||||
std y+COM_SRAM_OFFS_ATTN_INPUT_PORT, r16
|
||||
lpm r16, z+ ; PINMASK_ATTN
|
||||
std y+COM_SRAM_OFFS_ATTN_INPUT_PORT, r16
|
||||
lpm r17, z+ ; IRQNUM_ATTN
|
||||
lpm r18, z+ ; COM_DATA_OFFS_IRQMASK_ATTN
|
||||
pop zl
|
||||
pop zh
|
||||
|
||||
; set DATA port as input
|
||||
clr xh
|
||||
ldd xl, y+COM_SRAM_OFFS_DATA_DDR_PORT
|
||||
ldd r4, y+COM_SRAM_OFFS_DATA_BITMASK
|
||||
comClearRamBitInX r4, r16
|
||||
; disable internal pullup for DATA
|
||||
ldd xl, y+COM_SRAM_OFFS_DATA_OUTPUT_PORT
|
||||
comClearRamBitInX r4, r16
|
||||
|
||||
; set ATTN as input
|
||||
ldd xl, y+COM_SRAM_OFFS_ATTN_DDR_PORT
|
||||
ldd r4, y+COM_SRAM_OFFS_ATTN_BITMASK
|
||||
comClearRamBitInX r4, r16
|
||||
; disable internal pullup for DATA
|
||||
ldd xl, y+COM_SRAM_OFFS_ATTN_OUTPUT_PORT
|
||||
comClearRamBitInX r4, r16
|
||||
|
||||
; setup pin IRQ for ATTN (intnum in r17, irqmask in r18)
|
||||
tst r17
|
||||
brne Com_Init_setupInt1
|
||||
Com_Init_setupInt0:
|
||||
; enable PCIE0
|
||||
in r16, GIMSK
|
||||
ori r16, (1 << PCIE0)
|
||||
out GIMSK, r16
|
||||
; clear pending interrupts
|
||||
in r16, GIFR
|
||||
andi r16, ~(1 << PCIF0)
|
||||
out GIFR, r16
|
||||
ldi xl, PCMSK0+0x20
|
||||
rjmp Com_Init_enablePinIrq
|
||||
Com_Init_setupInt1:
|
||||
; enable PCIE1
|
||||
in r16, GIMSK
|
||||
ori r16, (1 << PCIE1)
|
||||
out GIMSK, r16
|
||||
; clear pending interrupts
|
||||
in r16, GIFR
|
||||
andi r16, ~(1 << PCIF1)
|
||||
out GIFR, r16
|
||||
ldi xl, PCMSK1+0x20
|
||||
Com_Init_enablePinIrq:
|
||||
ld r16, x
|
||||
or r16, r18 ; set mask bits
|
||||
st x, r16
|
||||
sec
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
32
avr/main.asm
32
avr/main.asm
@@ -4,6 +4,30 @@
|
||||
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
; defines
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; COM module
|
||||
|
||||
.equ COM_DDR_DATA DDRA
|
||||
.equ COM_PORT_DATA PORTA
|
||||
.equ COM_PIN_DATA PINA
|
||||
.equ COM_PINMASK_DATA (1<<PORTA1)
|
||||
.equ COM_PINNUM_DATA PORTA1
|
||||
|
||||
.equ COM_DDR_ATTN DDRA
|
||||
.equ COM_PORT_ATTN PORTA
|
||||
.equ COM_PIN_ATTN PINA
|
||||
.equ COM_PINMASK_ATTN (1<<PORTA7)
|
||||
.equ COM_PINNUM_ATTN PORTA7
|
||||
|
||||
.equ COM_IRQ_ADDR_ATTN PCMSK0
|
||||
.equ COM_IRQ_MASK_ATTN (1<<7) ; bit 7 in PCMSK0
|
||||
.equ COM_IRQ_GIFR_ATTN (1 << PCIF0)
|
||||
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
; code segment
|
||||
|
||||
@@ -36,8 +60,10 @@
|
||||
; ***************************************************************************
|
||||
; includes
|
||||
|
||||
.include "ringbuffer.asm"
|
||||
.include "timer.asm"
|
||||
.include "led.asm"
|
||||
.include "com.asm"
|
||||
.include "utils.asm"
|
||||
|
||||
|
||||
@@ -48,6 +74,7 @@
|
||||
.dseg
|
||||
|
||||
ledA3Sram: .byte LED_SRAM_SIZE
|
||||
wanA7A1Sram: .byte COM_SRAM_SIZE
|
||||
|
||||
|
||||
|
||||
@@ -57,7 +84,10 @@ ledA3Sram: .byte LED_SRAM_SIZE
|
||||
.cseg
|
||||
|
||||
ledA3Flash: .db DDRA+0x20, PORTA+0x20, PINA+0x20, (1<<PORTA3)
|
||||
|
||||
comA7A1Flash: .db 1, 0 ; id, flags
|
||||
.db DDRA+0x20, PORTA+0x20, PINA+0x20, (1<<PORTA1) ; port info for DATA line
|
||||
.db DDRA+0x20, PORTA+0x20, PINA+0x20, (1<<PORTA7) ; port info for ATTN line
|
||||
.db 0, 0x80 ; ATTN: PCINT irq type, irq mask (e.g. for PCMSK0)
|
||||
blinkPattern: .db 5, 5, 5, 5, 5, 10, 0xff, 0xff ; 3 short blinks, 1s pause, restart
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user