avr: add support for PinInputPullup
Этот коммит содержится в:
родитель
da505a6b17
коммит
dda576e80b
2 изменённых файлов: 26 добавлений и 1 удалений
|
@ -12,7 +12,7 @@ const (
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
||||||
button.Configure(machine.PinConfig{Mode: machine.PinInput})
|
button.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
|
||||||
|
|
||||||
for {
|
for {
|
||||||
if button.Get() {
|
if button.Get() {
|
||||||
|
|
|
@ -12,6 +12,7 @@ type PinMode uint8
|
||||||
|
|
||||||
const (
|
const (
|
||||||
PinInput PinMode = iota
|
PinInput PinMode = iota
|
||||||
|
PinInputPullup
|
||||||
PinOutput
|
PinOutput
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -34,9 +35,33 @@ func (p Pin) Configure(config PinConfig) {
|
||||||
if config.Mode == PinOutput {
|
if config.Mode == PinOutput {
|
||||||
// set output bit
|
// set output bit
|
||||||
ddr.SetBits(mask)
|
ddr.SetBits(mask)
|
||||||
|
|
||||||
|
// Note: if the pin was PinInputPullup before, it'll now be high.
|
||||||
|
// Otherwise it will be low.
|
||||||
} else {
|
} else {
|
||||||
// configure input: clear output bit
|
// configure input: clear output bit
|
||||||
ddr.ClearBits(mask)
|
ddr.ClearBits(mask)
|
||||||
|
|
||||||
|
if config.Mode == PinInput {
|
||||||
|
// No pullup (floating).
|
||||||
|
// The transition may be one of the following:
|
||||||
|
// output high -> input pullup -> input (safe: output high and input pullup are similar)
|
||||||
|
// output low -> input -> input (safe: no extra transition)
|
||||||
|
port.ClearBits(mask)
|
||||||
|
} else {
|
||||||
|
// Pullup.
|
||||||
|
// The transition may be one of the following:
|
||||||
|
// output high -> input pullup -> input pullup (safe: no extra transition)
|
||||||
|
// output low -> input -> input pullup (possibly problematic)
|
||||||
|
// For the last transition (output low -> input -> input pullup),
|
||||||
|
// the transition may be problematic in some cases because there is
|
||||||
|
// an intermediate floating state (which may cause irratic
|
||||||
|
// interrupts, for example). If this is a problem, the application
|
||||||
|
// should set the pin high before configuring it as PinInputPullup.
|
||||||
|
// We can't do that here because setting it to high as an
|
||||||
|
// intermediate state may have other problems.
|
||||||
|
port.SetBits(mask)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче