mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-05 03:27:48 +00:00
d62dda8140
* machine/attiny85: add PWM support for Timer0 and Timer1 Add complete PWM implementation for ATtiny85, supporting both Timer0 and Timer1 with their respective output channels: - Timer0: 8-bit timer for pins PB0 (OC0A) and PB1 (OC0B) - Timer1: 8-bit high-speed timer for pins PB1 (OC1A) and PB4 (OC1B) Timer1 provides more flexible period control with configurable top value (OCR1C) and extended prescaler options (1-16384), making it well-suited for LED PWM control and other applications requiring variable frequencies. Implements full PWM interface including Configure, SetPeriod, Channel, Set, SetInverting, Top, Counter, and Period methods. * machine/digispark: document PWM support on pins Add documentation to the Digispark board file indicating which pins support PWM output: - P0 (PB0): Timer0 channel A - P1 (PB1): Timer0 channel B or Timer1 channel A - P4 (PB4): Timer1 channel B Includes package comment explaining Timer0 vs Timer1 capabilities, with Timer1 recommended for more flexible frequency control. * machine/attiny85: optimize PWM prescaler lookups Replace verbose switch statements with more efficient implementations: - SetPeriod: Use bit shift (top >>= prescaler-1) instead of 15-case switch for dividing uint64 by power-of-2 prescaler values - Period: Replace switch statements with compact uint16 lookup tables for both Timer0 and Timer1, casting to uint64 only when needed This addresses review feedback about inefficient switch-based lookups. On AVR, this approach is significantly smaller: - Bit shifts for uint64 division: ~34 bytes vs ~140 bytes - uint16 tables: 22 bytes code + 32/16 bytes data vs ~140 bytes - Total savings: ~190 bytes (68% reduction) * examples/pwm: add digispark support and smoketest Add digispark.go configuration for PWM example using Timer1 with pins P1 (LED) and P4. Also add digispark PWM example to GNUmakefile smoketests. ---------
29 lines
671 B
Go
29 lines
671 B
Go
//go:build digispark
|
|
|
|
package machine
|
|
|
|
// Digispark is a tiny ATtiny85-based board with 6 I/O pins.
|
|
//
|
|
// PWM is available on the following pins:
|
|
// - P0 (PB0): Timer0 channel A
|
|
// - P1 (PB1): Timer0 channel B or Timer1 channel A (LED pin)
|
|
// - P4 (PB4): Timer1 channel B
|
|
//
|
|
// Timer1 is recommended for PWM as it provides more flexible frequency control.
|
|
|
|
// Return the current CPU frequency in hertz.
|
|
func CPUFrequency() uint32 {
|
|
return 16000000
|
|
}
|
|
|
|
const (
|
|
P0 Pin = PB0 // PWM available (Timer0 OC0A)
|
|
P1 Pin = PB1 // PWM available (Timer0 OC0B or Timer1 OC1A)
|
|
P2 Pin = PB2
|
|
P3 Pin = PB3
|
|
P4 Pin = PB4 // PWM available (Timer1 OC1B)
|
|
P5 Pin = PB5
|
|
|
|
LED = P1
|
|
)
|