; *************************************************************************** ; defines .equ COM_MAXWAIT = 200 ; maximum loop count when waiting for rising/falling clock (TODO: Make frequency-dependant) .equ COM_BUFFER_FLAGS_DONE = 0x80 .equ COM_BUFFER_FLAGS_RECEIVED = 0x40 .equ COM_BUFFER_FLAGS_TOSEND = 0x20 .equ COM_BUFFER_FLAGS_PRIO1 = 0x08 .equ COM_BUFFER_FLAGS_PRIO0 = 0x04 .equ COM_BUFFER_FLAGS_IFACE1 = 0x02 .equ COM_BUFFER_FLAGS_IFACE0 = 0x01 .equ COM_BUFFER_PRIO_INFO = 0 .equ COM_BUFFER_PRIO_NORMAL = COM_BUFFER_FLAGS_PRIO0 .equ COM_BUFFER_PRIO_IMPORTANT = COM_BUFFER_FLAGS_PRIO1 .equ COM_BUFFER_PRIO_VITAL = (COM_BUFFER_FLAGS_PRIO0 | COM_BUFFER_FLAGS_PRIO1) .equ COM_REPEAT_INFO = 3 .equ COM_REPEAT_NORMAL = 32 .equ COM_REPEAT_IMPORTANT = 64 .equ COM_REPEAT_VITAL = 255 ; *************************************************************************** ; data .dseg comDataBegin: comFlags: .byte 1 comAddress: .byte 1 comRepeatCount: .byte 1 comReserved1: .byte 1 comStatsPacketsIn: .byte 2 comStatsPacketsOut: .byte 2 comStatsRecvErrs: .byte 2 comStatsCollisions: .byte 2 comStatsMissed: .byte 2 comStatsAborted: .byte 2 comStatsIgnored: .byte 2 comStatsHandled: .byte 2 comRingBuffer: .byte RINGBUFFER_OFFS_DATA+COM_RINGBUFFER_SIZE comDataEnd: ; *************************************************************************** ; code .cseg ; --------------------------------------------------------------------------- ; Com_Init ; ; IN: ; OUT: ; - CFLAG: set if okay, clear on error ; USED: R16, R17, X, Y Com_Init: ; preset SRAM data area ldi xh, HIGH(comDataBegin) ldi xl, LOW(comDataBegin) clr r16 ldi r17, (comDataEnd-comDataBegin) rcall Utils_FillSram ; init ringbuffer ldi r16, COM_RINGBUFFER_SIZE ldi yl, LOW(comRingBuffer) ldi yh, HIGH(comRingBuffer) 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_ATTN, COM_PINNUM_ATTN ; set ATTN port as input cbi COM_PORT_ATTN, COM_PINNUM_ATTN ; disable internal pullup for ATTN 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 ori r16, (1< CARRY brcc comSendByte_setHigh ; HI: +2, LO: +1 comSendByte_setLow: sbi COM_DDR_DATA, COM_PINNUM_DATA ; +2 set DATA as output nop rjmp comSendByte_waitBit ; +2 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<