com2w*: allow for higher frequencies than 8MHz

to be used with node S03, which is run at 20MHz.
This commit is contained in:
Martin Preuss
2025-08-18 18:04:30 +02:00
parent 9b1badb310
commit d9e7d4df81
7 changed files with 412 additions and 172 deletions

View File

@@ -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