com2w*: allow for higher frequencies than 8MHz
to be used with node S03, which is run at 20MHz.
This commit is contained in:
@@ -23,12 +23,16 @@ com2wnSetupIrq:
|
||||
; setup pin-change interrupt for CLK
|
||||
rcall com2wnEnableClkIrq
|
||||
|
||||
; enable and clear PCIE0/1 (@TODO put later into general setup)
|
||||
inr r16, GIMSK ; enable pin change irq PCIE0 or PCIE1
|
||||
sbr r16, (1<<COM_IRQ_GIMSK_CLK)
|
||||
outr GIMSK, r16
|
||||
ldi r16, (1<<COM_IRQ_GIFR_CLK) ; clear pending irq by writing 1 to GIFR bit
|
||||
outr GIFR, r16
|
||||
; enable PCIEn irq
|
||||
inr r16, COM_IRQ_ADDR_M_CLK ; enable pin change irq PCIEn
|
||||
sbr r16, (1<<COM_IRQ_BIT_M_CLK)
|
||||
outr COM_IRQ_ADDR_M_CLK, r16
|
||||
|
||||
; clear PCIEn interrupt flag
|
||||
inr r16, COM_IRQ_ADDR_F_CLK ; enable pin change irq PCIEn
|
||||
sbr r16, (1<<COM_IRQ_BIT_F_CLK)
|
||||
outr COM_IRQ_ADDR_F_CLK, r16
|
||||
|
||||
ret
|
||||
; @end
|
||||
|
||||
@@ -74,14 +78,16 @@ com2wnDisableClkIrq:
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine COM2WN_ClkChangeOnePortIsr @global @isr
|
||||
; @routine COM2WN_ClkChangeIsr @global @isr
|
||||
;
|
||||
; Interrupt service routine for single port (i.e. one port contains all
|
||||
; CLOCK and DATA bits like in node R05).
|
||||
; Interrupt service routine for dual or single port (i.e. one port contains all
|
||||
; CLOCK and DATA bits like in node R05 and R06).
|
||||
;
|
||||
; @clobbers none
|
||||
|
||||
COM2WN_ClkChangeOnePortIsr:
|
||||
COM2WN_ClkChangeIsr:
|
||||
.if COM_DATA_INPUT == COM_CLK_INPUT
|
||||
; routine for single port
|
||||
push r15
|
||||
in r15, SREG
|
||||
push r16
|
||||
@@ -95,11 +101,11 @@ COM2WN_ClkChangeOnePortIsr:
|
||||
ldi yl, LOW(com2wnIoRingBuffer)
|
||||
ldi yh, HIGH(com2wnIoRingBuffer)
|
||||
rcall RingBufferY_WriteByte ; (R17, R18, X)
|
||||
brcs COM2WN_ClkChangeOnePortIsr_popRet
|
||||
brcs COM2WN_ClkChangeIsr_popRet
|
||||
lds r16, com2wnIoFlags
|
||||
ori r16, (1<<COM2W_IO_FLAGS_BIT_OVR)
|
||||
sts com2wnIoFlags, r16
|
||||
COM2WN_ClkChangeOnePortIsr_popRet:
|
||||
COM2WN_ClkChangeIsr_popRet:
|
||||
pop yh
|
||||
pop yl
|
||||
pop xh
|
||||
@@ -110,19 +116,8 @@ COM2WN_ClkChangeOnePortIsr_popRet:
|
||||
out SREG, r15
|
||||
pop r15
|
||||
reti
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine COM2WN_ClkChangeTwoPortIsr @global @isr
|
||||
;
|
||||
; Interrupt service routine for single port (i.e. one port contains all
|
||||
; CLOCK and DATA bits like in node R05).
|
||||
;
|
||||
; @clobbers none
|
||||
|
||||
COM2WN_ClkChangeTwoPortIsr:
|
||||
.else
|
||||
; routine for two port
|
||||
push r15
|
||||
in r15, SREG
|
||||
push r16
|
||||
@@ -139,14 +134,14 @@ COM2WN_ClkChangeTwoPortIsr:
|
||||
push r17
|
||||
rcall RingBufferY_WriteByte ; push clk state (R17, R18, X)
|
||||
pop r16 ; pop DATA input into r16 (from r17)
|
||||
brcc COM2WN_ClkChangeTwoPortIsr_ovr
|
||||
brcc COM2WN_ClkChangeIsr_ovr
|
||||
rcall RingBufferY_WriteByte ; push data state (R17, R18, X)
|
||||
brcs COM2WN_ClkChangeTwoPortIsr_popRet
|
||||
COM2WN_ClkChangeTwoPortIsr_ovr:
|
||||
brcs COM2WN_ClkChangeIsr_popRet
|
||||
COM2WN_ClkChangeIsr_ovr:
|
||||
lds r16, com2wnIoFlags
|
||||
ori r16, (1<<COM2W_IO_FLAGS_BIT_OVR)
|
||||
sts com2wnIoFlags, r16
|
||||
COM2WN_ClkChangeTwoPortIsr_popRet:
|
||||
COM2WN_ClkChangeIsr_popRet:
|
||||
pop yh
|
||||
pop yl
|
||||
pop xh
|
||||
@@ -157,6 +152,8 @@ COM2WN_ClkChangeTwoPortIsr_popRet:
|
||||
out SREG, r15
|
||||
pop r15
|
||||
reti
|
||||
|
||||
.endif
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user