From 4377d87772b5c21d135d1180fb9c56676c9a2916 Mon Sep 17 00:00:00 2001 From: Tyler Bell Date: Thu, 1 Sep 2022 17:58:33 -0500 Subject: [PATCH 1/7] avr: adding pin change interrupt handling to atmega328p --- src/machine/machine_atmega328p.go | 114 ++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/src/machine/machine_atmega328p.go b/src/machine/machine_atmega328p.go index a7d5d0c20f..36669930ee 100644 --- a/src/machine/machine_atmega328p.go +++ b/src/machine/machine_atmega328p.go @@ -5,6 +5,7 @@ package machine import ( "device/avr" + "errors" "runtime/interrupt" "runtime/volatile" ) @@ -467,3 +468,116 @@ var SPI0 = SPI{ sdo: PB3, sdi: PB4, cs: PB2} + +// Pin Change Interrupts +var ( + pinCallbacks [3][8]func(Pin) + interrupts [3]*interrupt.Interrupt + previous [3]uint8 +) + +func handlePCINTInterrupts(intr uint8, port *volatile.Register8) { + println("Interrupted: ", intr, port) + current := port.Get() + println("Current: ", current) + new := current ^ previous[intr] + println("Toggled: ", new) + for i := uint8(0); i < 8; i++ { + if (current>>i)&0x01 == 0x01 && pinCallbacks[intr][i] != nil { + println("Calling: ", intr, i) + pinCallbacks[intr][i](Pin(i * (intr + 1))) + } + } + previous[intr] = current +} + +func handlePCINT0Interrupts(intr interrupt.Interrupt) { + handlePCINTInterrupts(avr.IRQ_PCINT0-avr.IRQ_PCINT0, avr.PINB) +} + +func handlePCINT1Interrupts(intr interrupt.Interrupt) { + handlePCINTInterrupts(avr.IRQ_PCINT1-avr.IRQ_PCINT0, avr.PINC) +} + +func handlePCINT2Interrupts(intr interrupt.Interrupt) { + handlePCINTInterrupts(avr.IRQ_PCINT2-avr.IRQ_PCINT0, avr.PIND) +} + +func SetInterrupt(pin Pin, callback func(Pin)) (err error) { + // if p == nil { + // // Disable this pin interrupt + // return errors.New("Not implemented") + // } else { + var PCMSK_REG *volatile.Register8 + var PCIE uint8 + var PCINT uint8 + var IRQ uint8 + var PIN0 Pin + //var PIN *volatile.Register8 + switch { + case pin >= PB0 && pin <= PB7: + println("PCMSK0: ", pin) + // PCMSK0 - PCINT0-7 + PCMSK_REG = avr.PCMSK0 + PCIE = avr.PCICR_PCIE0 + PIN0 = PD0 + PCINT = 1 << (pin - PIN0) + IRQ = avr.IRQ_PCINT0 + //PIN = avr.PINB + if interrupts[IRQ-avr.IRQ_PCINT0] == nil { + println("Registering interrupt: ", IRQ) + intr := interrupt.New(avr.IRQ_PCINT0, handlePCINT0Interrupts) + interrupts[IRQ-avr.IRQ_PCINT0] = &intr + } else { + println("interrupt already defined") + } + case pin >= PC0 && pin <= PC7: + println("PCMSK1: ", pin) + // PCMSK1 - PCINT8-14 + PCMSK_REG = avr.PCMSK1 + PCIE = avr.PCICR_PCIE1 + PIN0 = PC0 + PCINT = 1 << (pin - PIN0) + IRQ = avr.IRQ_PCINT1 + //PIN = avr.PINC + if interrupts[IRQ-avr.IRQ_PCINT0] == nil { + println("Registering interrupt: ", IRQ) + intr := interrupt.New(avr.IRQ_PCINT1, handlePCINT1Interrupts) + interrupts[IRQ-avr.IRQ_PCINT0] = &intr + } else { + println("interrupt already defined") + } + case pin >= PD0 && pin <= PD7: + println("PCMSK2: ", pin) + // PCMSK2 - PCINT16-23 + PCMSK_REG = avr.PCMSK2 + PCIE = avr.PCICR_PCIE2 + PIN0 = PD0 + PCINT = 1 << (pin - PIN0) + IRQ = avr.IRQ_PCINT2 + //PIN = avr.PIND + if interrupts[IRQ-avr.IRQ_PCINT0] == nil { + println("Registering interrupt: ", IRQ) + intr := interrupt.New(avr.IRQ_PCINT2, handlePCINT2Interrupts) + interrupts[IRQ-avr.IRQ_PCINT0] = &intr + } else { + println("interrupt already defined") + } + default: + return errors.New("Unsupported pin") + } + + if pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] == nil { + println("Registering callback: ", IRQ-avr.IRQ_PCINT0, pin-PIN0) + pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] = callback + } else { + return errors.New("callback already defined") + } + + println("Setting PCMSK_REG to PCINT: ", PCMSK_REG, PCINT) + PCMSK_REG.SetBits(PCINT) + println("Setting PCICR to PCIE:", avr.PCICR, PCIE) + avr.PCICR.SetBits(PCIE) + + return nil +} From 5ef1874c59d2bda251ac871f8a4da2827b34e558 Mon Sep 17 00:00:00 2001 From: Tyler Bell Date: Thu, 8 Sep 2022 10:11:23 -0500 Subject: [PATCH 2/7] avr: removing pin change interrupt debug code from atmega328p --- src/machine/machine_atmega328p.go | 131 +++++++++++++----------------- 1 file changed, 56 insertions(+), 75 deletions(-) diff --git a/src/machine/machine_atmega328p.go b/src/machine/machine_atmega328p.go index 36669930ee..8c1c2cb4c6 100644 --- a/src/machine/machine_atmega328p.go +++ b/src/machine/machine_atmega328p.go @@ -477,14 +477,10 @@ var ( ) func handlePCINTInterrupts(intr uint8, port *volatile.Register8) { - println("Interrupted: ", intr, port) current := port.Get() - println("Current: ", current) new := current ^ previous[intr] - println("Toggled: ", new) for i := uint8(0); i < 8; i++ { if (current>>i)&0x01 == 0x01 && pinCallbacks[intr][i] != nil { - println("Calling: ", intr, i) pinCallbacks[intr][i](Pin(i * (intr + 1))) } } @@ -504,80 +500,65 @@ func handlePCINT2Interrupts(intr interrupt.Interrupt) { } func SetInterrupt(pin Pin, callback func(Pin)) (err error) { - // if p == nil { - // // Disable this pin interrupt - // return errors.New("Not implemented") - // } else { - var PCMSK_REG *volatile.Register8 - var PCIE uint8 - var PCINT uint8 - var IRQ uint8 - var PIN0 Pin - //var PIN *volatile.Register8 - switch { - case pin >= PB0 && pin <= PB7: - println("PCMSK0: ", pin) - // PCMSK0 - PCINT0-7 - PCMSK_REG = avr.PCMSK0 - PCIE = avr.PCICR_PCIE0 - PIN0 = PD0 - PCINT = 1 << (pin - PIN0) - IRQ = avr.IRQ_PCINT0 - //PIN = avr.PINB - if interrupts[IRQ-avr.IRQ_PCINT0] == nil { - println("Registering interrupt: ", IRQ) - intr := interrupt.New(avr.IRQ_PCINT0, handlePCINT0Interrupts) - interrupts[IRQ-avr.IRQ_PCINT0] = &intr - } else { - println("interrupt already defined") - } - case pin >= PC0 && pin <= PC7: - println("PCMSK1: ", pin) - // PCMSK1 - PCINT8-14 - PCMSK_REG = avr.PCMSK1 - PCIE = avr.PCICR_PCIE1 - PIN0 = PC0 - PCINT = 1 << (pin - PIN0) - IRQ = avr.IRQ_PCINT1 - //PIN = avr.PINC - if interrupts[IRQ-avr.IRQ_PCINT0] == nil { - println("Registering interrupt: ", IRQ) - intr := interrupt.New(avr.IRQ_PCINT1, handlePCINT1Interrupts) - interrupts[IRQ-avr.IRQ_PCINT0] = &intr - } else { - println("interrupt already defined") + if p == nil { + // Disable this pin interrupt + return errors.New("Not implemented") + } else { + var PCMSK_REG *volatile.Register8 + var PCIE uint8 + var PCINT uint8 + var IRQ uint8 + var PIN0 Pin + //var PIN *volatile.Register8 + switch { + case pin >= PB0 && pin <= PB7: + // PCMSK0 - PCINT0-7 + PCMSK_REG = avr.PCMSK0 + PCIE = avr.PCICR_PCIE0 + PIN0 = PD0 + PCINT = 1 << (pin - PIN0) + IRQ = avr.IRQ_PCINT0 + if interrupts[IRQ-avr.IRQ_PCINT0] == nil { + intr := interrupt.New(avr.IRQ_PCINT0, handlePCINT0Interrupts) + interrupts[IRQ-avr.IRQ_PCINT0] = &intr + } else { + } + case pin >= PC0 && pin <= PC7: + // PCMSK1 - PCINT8-14 + PCMSK_REG = avr.PCMSK1 + PCIE = avr.PCICR_PCIE1 + PIN0 = PC0 + PCINT = 1 << (pin - PIN0) + IRQ = avr.IRQ_PCINT1 + if interrupts[IRQ-avr.IRQ_PCINT0] == nil { + intr := interrupt.New(avr.IRQ_PCINT1, handlePCINT1Interrupts) + interrupts[IRQ-avr.IRQ_PCINT0] = &intr + } else { + } + case pin >= PD0 && pin <= PD7: + // PCMSK2 - PCINT16-23 + PCMSK_REG = avr.PCMSK2 + PCIE = avr.PCICR_PCIE2 + PIN0 = PD0 + PCINT = 1 << (pin - PIN0) + IRQ = avr.IRQ_PCINT2 + if interrupts[IRQ-avr.IRQ_PCINT0] == nil { + intr := interrupt.New(avr.IRQ_PCINT2, handlePCINT2Interrupts) + interrupts[IRQ-avr.IRQ_PCINT0] = &intr + } + default: + return errors.New("Unsupported pin") } - case pin >= PD0 && pin <= PD7: - println("PCMSK2: ", pin) - // PCMSK2 - PCINT16-23 - PCMSK_REG = avr.PCMSK2 - PCIE = avr.PCICR_PCIE2 - PIN0 = PD0 - PCINT = 1 << (pin - PIN0) - IRQ = avr.IRQ_PCINT2 - //PIN = avr.PIND - if interrupts[IRQ-avr.IRQ_PCINT0] == nil { - println("Registering interrupt: ", IRQ) - intr := interrupt.New(avr.IRQ_PCINT2, handlePCINT2Interrupts) - interrupts[IRQ-avr.IRQ_PCINT0] = &intr + + if pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] == nil { + pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] = callback } else { - println("interrupt already defined") + return errors.New("callback already defined") } - default: - return errors.New("Unsupported pin") - } - if pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] == nil { - println("Registering callback: ", IRQ-avr.IRQ_PCINT0, pin-PIN0) - pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] = callback - } else { - return errors.New("callback already defined") - } - - println("Setting PCMSK_REG to PCINT: ", PCMSK_REG, PCINT) - PCMSK_REG.SetBits(PCINT) - println("Setting PCICR to PCIE:", avr.PCICR, PCIE) - avr.PCICR.SetBits(PCIE) + PCMSK_REG.SetBits(PCINT) + avr.PCICR.SetBits(PCIE) - return nil + return nil + } } From 497dac3be234923641d39e9b73954927d709ffc3 Mon Sep 17 00:00:00 2001 From: Tyler Bell Date: Thu, 8 Sep 2022 10:49:01 -0500 Subject: [PATCH 3/7] avr: pin change interrupt - fixing typo --- src/machine/machine_atmega328p.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_atmega328p.go b/src/machine/machine_atmega328p.go index 8c1c2cb4c6..3833efc596 100644 --- a/src/machine/machine_atmega328p.go +++ b/src/machine/machine_atmega328p.go @@ -500,7 +500,7 @@ func handlePCINT2Interrupts(intr interrupt.Interrupt) { } func SetInterrupt(pin Pin, callback func(Pin)) (err error) { - if p == nil { + if callback == nil { // Disable this pin interrupt return errors.New("Not implemented") } else { From 406027c8c3af068163e1b8c504319c3a38a15074 Mon Sep 17 00:00:00 2001 From: Tyler Bell Date: Thu, 8 Sep 2022 11:28:15 -0500 Subject: [PATCH 4/7] avr: pin change interrupt - more cleanup --- src/machine/machine_atmega328p.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/machine/machine_atmega328p.go b/src/machine/machine_atmega328p.go index 3833efc596..f1d732ca1a 100644 --- a/src/machine/machine_atmega328p.go +++ b/src/machine/machine_atmega328p.go @@ -478,7 +478,6 @@ var ( func handlePCINTInterrupts(intr uint8, port *volatile.Register8) { current := port.Get() - new := current ^ previous[intr] for i := uint8(0); i < 8; i++ { if (current>>i)&0x01 == 0x01 && pinCallbacks[intr][i] != nil { pinCallbacks[intr][i](Pin(i * (intr + 1))) From 8b7c145882cb377b1148c76d815ce34aa86c77a4 Mon Sep 17 00:00:00 2001 From: Tyler Bell Date: Wed, 21 Sep 2022 17:25:23 -0500 Subject: [PATCH 5/7] avr: pin change interrupt - yet more cleanup --- src/machine/machine.go | 13 ++-- src/machine/machine_atmega328p.go | 111 +++++++++++++++--------------- 2 files changed, 63 insertions(+), 61 deletions(-) diff --git a/src/machine/machine.go b/src/machine/machine.go index 06274220da..18be2f2bd2 100644 --- a/src/machine/machine.go +++ b/src/machine/machine.go @@ -3,12 +3,13 @@ package machine import "errors" var ( - ErrTimeoutRNG = errors.New("machine: RNG Timeout") - ErrInvalidInputPin = errors.New("machine: invalid input pin") - ErrInvalidOutputPin = errors.New("machine: invalid output pin") - ErrInvalidClockPin = errors.New("machine: invalid clock pin") - ErrInvalidDataPin = errors.New("machine: invalid data pin") - ErrNoPinChangeChannel = errors.New("machine: no channel available for pin interrupt") + ErrTimeoutRNG = errors.New("machine: RNG Timeout") + ErrInvalidInputPin = errors.New("machine: invalid input pin") + ErrInvalidOutputPin = errors.New("machine: invalid output pin") + ErrInvalidClockPin = errors.New("machine: invalid clock pin") + ErrInvalidDataPin = errors.New("machine: invalid data pin") + ErrNoPinChangeChannel = errors.New("machine: no channel available for pin interrupt") + ErrFeatureNotImplemented = errors.New("machine: this feature is not yet implemented") ) // Device is the running program's chip name, such as "ATSAMD51J19A" or diff --git a/src/machine/machine_atmega328p.go b/src/machine/machine_atmega328p.go index f1d732ca1a..0066cdc13f 100644 --- a/src/machine/machine_atmega328p.go +++ b/src/machine/machine_atmega328p.go @@ -10,6 +10,10 @@ import ( "runtime/volatile" ) +var ( + ErrCallbackAlreadyDefined = errors.New("machine: callback already defined") +) + const irq_USART0_RX = avr.IRQ_USART_RX // getPortMask returns the PORTx register and mask for the pin. @@ -501,63 +505,60 @@ func handlePCINT2Interrupts(intr interrupt.Interrupt) { func SetInterrupt(pin Pin, callback func(Pin)) (err error) { if callback == nil { // Disable this pin interrupt - return errors.New("Not implemented") - } else { - var PCMSK_REG *volatile.Register8 - var PCIE uint8 - var PCINT uint8 - var IRQ uint8 - var PIN0 Pin - //var PIN *volatile.Register8 - switch { - case pin >= PB0 && pin <= PB7: - // PCMSK0 - PCINT0-7 - PCMSK_REG = avr.PCMSK0 - PCIE = avr.PCICR_PCIE0 - PIN0 = PD0 - PCINT = 1 << (pin - PIN0) - IRQ = avr.IRQ_PCINT0 - if interrupts[IRQ-avr.IRQ_PCINT0] == nil { - intr := interrupt.New(avr.IRQ_PCINT0, handlePCINT0Interrupts) - interrupts[IRQ-avr.IRQ_PCINT0] = &intr - } else { - } - case pin >= PC0 && pin <= PC7: - // PCMSK1 - PCINT8-14 - PCMSK_REG = avr.PCMSK1 - PCIE = avr.PCICR_PCIE1 - PIN0 = PC0 - PCINT = 1 << (pin - PIN0) - IRQ = avr.IRQ_PCINT1 - if interrupts[IRQ-avr.IRQ_PCINT0] == nil { - intr := interrupt.New(avr.IRQ_PCINT1, handlePCINT1Interrupts) - interrupts[IRQ-avr.IRQ_PCINT0] = &intr - } else { - } - case pin >= PD0 && pin <= PD7: - // PCMSK2 - PCINT16-23 - PCMSK_REG = avr.PCMSK2 - PCIE = avr.PCICR_PCIE2 - PIN0 = PD0 - PCINT = 1 << (pin - PIN0) - IRQ = avr.IRQ_PCINT2 - if interrupts[IRQ-avr.IRQ_PCINT0] == nil { - intr := interrupt.New(avr.IRQ_PCINT2, handlePCINT2Interrupts) - interrupts[IRQ-avr.IRQ_PCINT0] = &intr - } - default: - return errors.New("Unsupported pin") - } + return ErrFeatureNotImplemented + } + var PCMSK_REG *volatile.Register8 + var PCIE uint8 + var PCINT uint8 + var IRQ uint8 + var PIN0 Pin - if pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] == nil { - pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] = callback - } else { - return errors.New("callback already defined") + switch { + case pin >= PB0 && pin <= PB7: + // PCMSK0 - PCINT0-7 + PCMSK_REG = avr.PCMSK0 + PCIE = avr.PCICR_PCIE0 + PIN0 = PD0 + PCINT = 1 << (pin - PIN0) + IRQ = avr.IRQ_PCINT0 + if interrupts[IRQ-avr.IRQ_PCINT0] == nil { + intr := interrupt.New(avr.IRQ_PCINT0, handlePCINT0Interrupts) + interrupts[IRQ-avr.IRQ_PCINT0] = &intr } + case pin >= PC0 && pin <= PC7: + // PCMSK1 - PCINT8-14 + PCMSK_REG = avr.PCMSK1 + PCIE = avr.PCICR_PCIE1 + PIN0 = PC0 + PCINT = 1 << (pin - PIN0) + IRQ = avr.IRQ_PCINT1 + if interrupts[IRQ-avr.IRQ_PCINT0] == nil { + intr := interrupt.New(avr.IRQ_PCINT1, handlePCINT1Interrupts) + interrupts[IRQ-avr.IRQ_PCINT0] = &intr + } + case pin >= PD0 && pin <= PD7: + // PCMSK2 - PCINT16-23 + PCMSK_REG = avr.PCMSK2 + PCIE = avr.PCICR_PCIE2 + PIN0 = PD0 + PCINT = 1 << (pin - PIN0) + IRQ = avr.IRQ_PCINT2 + if interrupts[IRQ-avr.IRQ_PCINT0] == nil { + intr := interrupt.New(avr.IRQ_PCINT2, handlePCINT2Interrupts) + interrupts[IRQ-avr.IRQ_PCINT0] = &intr + } + default: + return ErrInvalidInputPin + } - PCMSK_REG.SetBits(PCINT) - avr.PCICR.SetBits(PCIE) - - return nil + if pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] != nil { + return ErrCallbackAlreadyDefined } + + pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] = callback + + PCMSK_REG.SetBits(PCINT) + avr.PCICR.SetBits(PCIE) + + return nil } From 06e2f95098fcc11927cd65a8bde29f98daaeac84 Mon Sep 17 00:00:00 2001 From: Tyler Bell Date: Thu, 22 Sep 2022 10:25:53 -0500 Subject: [PATCH 6/7] avr: pin change interrupt - optimizations and API conformance --- src/machine/machine_atmega328p.go | 68 +++++++++++-------------------- 1 file changed, 23 insertions(+), 45 deletions(-) diff --git a/src/machine/machine_atmega328p.go b/src/machine/machine_atmega328p.go index 0066cdc13f..b1c85619ef 100644 --- a/src/machine/machine_atmega328p.go +++ b/src/machine/machine_atmega328p.go @@ -476,8 +476,6 @@ var SPI0 = SPI{ // Pin Change Interrupts var ( pinCallbacks [3][8]func(Pin) - interrupts [3]*interrupt.Interrupt - previous [3]uint8 ) func handlePCINTInterrupts(intr uint8, port *volatile.Register8) { @@ -487,7 +485,6 @@ func handlePCINTInterrupts(intr uint8, port *volatile.Register8) { pinCallbacks[intr][i](Pin(i * (intr + 1))) } } - previous[intr] = current } func handlePCINT0Interrupts(intr interrupt.Interrupt) { @@ -502,63 +499,44 @@ func handlePCINT2Interrupts(intr interrupt.Interrupt) { handlePCINTInterrupts(avr.IRQ_PCINT2-avr.IRQ_PCINT0, avr.PIND) } -func SetInterrupt(pin Pin, callback func(Pin)) (err error) { +type PinChange uint8 + +// Pin change interrupt constants for SetInterrupt. +const ( + PinBoth PinChange = nil +) + +func (pin Pin) SetInterrupt(pinChange PinChange, callback func(Pin)) (err error) { if callback == nil { // Disable this pin interrupt return ErrFeatureNotImplemented } - var PCMSK_REG *volatile.Register8 - var PCIE uint8 - var PCINT uint8 - var IRQ uint8 - var PIN0 Pin switch { case pin >= PB0 && pin <= PB7: // PCMSK0 - PCINT0-7 - PCMSK_REG = avr.PCMSK0 - PCIE = avr.PCICR_PCIE0 - PIN0 = PD0 - PCINT = 1 << (pin - PIN0) - IRQ = avr.IRQ_PCINT0 - if interrupts[IRQ-avr.IRQ_PCINT0] == nil { - intr := interrupt.New(avr.IRQ_PCINT0, handlePCINT0Interrupts) - interrupts[IRQ-avr.IRQ_PCINT0] = &intr - } + pinIndex := pin - PD0 + pinCallbacks[0][pinIndex] = callback + avr.PCMSK0.SetBits(1 << pinIndex) + avr.PCICR.SetBits(avr.PCICR_PCIE0) + interrupt.New(avr.IRQ_PCINT0, handlePCINT0Interrupts) case pin >= PC0 && pin <= PC7: // PCMSK1 - PCINT8-14 - PCMSK_REG = avr.PCMSK1 - PCIE = avr.PCICR_PCIE1 - PIN0 = PC0 - PCINT = 1 << (pin - PIN0) - IRQ = avr.IRQ_PCINT1 - if interrupts[IRQ-avr.IRQ_PCINT0] == nil { - intr := interrupt.New(avr.IRQ_PCINT1, handlePCINT1Interrupts) - interrupts[IRQ-avr.IRQ_PCINT0] = &intr - } + pinIndex := pin - PC0 + pinCallbacks[1][pinIndex] = callback + avr.PCMSK1.SetBits(1 << pinIndex) + avr.PCICR.SetBits(avr.PCICR_PCIE1) + interrupt.New(avr.IRQ_PCINT1, handlePCINT1Interrupts) case pin >= PD0 && pin <= PD7: // PCMSK2 - PCINT16-23 - PCMSK_REG = avr.PCMSK2 - PCIE = avr.PCICR_PCIE2 - PIN0 = PD0 - PCINT = 1 << (pin - PIN0) - IRQ = avr.IRQ_PCINT2 - if interrupts[IRQ-avr.IRQ_PCINT0] == nil { - intr := interrupt.New(avr.IRQ_PCINT2, handlePCINT2Interrupts) - interrupts[IRQ-avr.IRQ_PCINT0] = &intr - } + pinIndex := pin - PD0 + pinCallbacks[2][pinIndex] = callback + avr.PCMSK2.SetBits(1 << pinIndex) + avr.PCICR.SetBits(avr.PCICR_PCIE2) + interrupt.New(avr.IRQ_PCINT2, handlePCINT2Interrupts) default: return ErrInvalidInputPin } - if pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] != nil { - return ErrCallbackAlreadyDefined - } - - pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] = callback - - PCMSK_REG.SetBits(PCINT) - avr.PCICR.SetBits(PCIE) - return nil } From 96af5c3d5aa3d05356438e99c1bdabb60f75f5ce Mon Sep 17 00:00:00 2001 From: Tyler Bell Date: Thu, 22 Sep 2022 17:27:29 -0500 Subject: [PATCH 7/7] avr: PinToggle, not PinBoth --- src/machine/machine_atmega328p.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_atmega328p.go b/src/machine/machine_atmega328p.go index b1c85619ef..5005636450 100644 --- a/src/machine/machine_atmega328p.go +++ b/src/machine/machine_atmega328p.go @@ -503,7 +503,7 @@ type PinChange uint8 // Pin change interrupt constants for SetInterrupt. const ( - PinBoth PinChange = nil + PinToggle PinChange = 1 ) func (pin Pin) SetInterrupt(pinChange PinChange, callback func(Pin)) (err error) {