//go:build avr && atmega328p package machine import ( "device/avr" "runtime/volatile" ) const irq_USART0_RX = avr.IRQ_USART_RX // I2C0 is the only I2C interface on most AVRs. var I2C0 = &I2C{ srReg: avr.TWSR, brReg: avr.TWBR, crReg: avr.TWCR, drReg: avr.TWDR, srPS0: avr.TWSR_TWPS0, srPS1: avr.TWSR_TWPS1, crEN: avr.TWCR_TWEN, crINT: avr.TWCR_TWINT, crSTO: avr.TWCR_TWSTO, crEA: avr.TWCR_TWEA, crSTA: avr.TWCR_TWSTA, } // SPI configuration var SPI0 = SPI{ spcr: avr.SPCR, spdr: avr.SPDR, spsr: avr.SPSR, spcrR0: avr.SPCR_SPR0, spcrR1: avr.SPCR_SPR1, spcrCPHA: avr.SPCR_CPHA, spcrCPOL: avr.SPCR_CPOL, spcrDORD: avr.SPCR_DORD, spcrSPE: avr.SPCR_SPE, spcrMSTR: avr.SPCR_MSTR, spsrI2X: avr.SPSR_SPI2X, spsrSPIF: avr.SPSR_SPIF, sck: PB5, sdo: PB3, sdi: PB4, cs: PB2, } // getPortMask returns the PORTx register and mask for the pin. func (p Pin) getPortMask() (*volatile.Register8, uint8) { switch { case p >= PB0 && p <= PB7: // port B return avr.PORTB, 1 << uint8(p-portB) case p >= PC0 && p <= PC7: // port C return avr.PORTC, 1 << uint8(p-portC) default: // port D return avr.PORTD, 1 << uint8(p-portD) } }