
All the AVRs that I've looked at had the same pin/port structure, with the possible states being input/floating, input/pullup, low, and high (with the same PORT/DDR registers). The main difference is the number of available ports and pins. To reduce the amount of code and avoid duplication (and thus errors) I decided to centralize this, following the design used by the atmega2560 but while using a trick to save tracking a few registers. In the process, I noticed that the Pin.Get() function was incorrect on the atmega2560 implementation. It is now fixed in the unified code.
23 строки
356 Б
Go
23 строки
356 Б
Go
// +build attiny85
|
|
|
|
package machine
|
|
|
|
import (
|
|
"device/avr"
|
|
"runtime/volatile"
|
|
)
|
|
|
|
const (
|
|
PB0 Pin = iota
|
|
PB1
|
|
PB2
|
|
PB3
|
|
PB4
|
|
PB5
|
|
)
|
|
|
|
// getPortMask returns the PORTx register and mask for the pin.
|
|
func (p Pin) getPortMask() (*volatile.Register8, uint8) {
|
|
// Very simple for the attiny85, which only has a single port.
|
|
return avr.PORTB, 1 << uint8(p)
|
|
}
|