1
+ use avr_hal_generic:: simple_pwm:: Prescaler ;
2
+
3
+ use crate :: port:: * ;
4
+
5
+ #[ cfg( feature = "attiny85" ) ]
6
+ avr_hal_generic:: impl_simple_pwm! {
7
+ /// Use `TC0` for PWM (pins `PB0`, `PB1`)
8
+ ///
9
+ /// # Example
10
+ /// ```
11
+ /// let mut timer0 = Timer0Pwm::new(dp.TC0, Prescaler::Prescale64);
12
+ ///
13
+ /// let mut d0 = portd.d0.into_output().into_pwm(&mut timer0);
14
+ /// let mut d1 = portd.d1.into_output().into_pwm(&mut timer0);
15
+ ///
16
+ /// d0.set_duty(128);
17
+ /// d0.enable();
18
+ /// ```
19
+ pub struct Timer0Pwm {
20
+ timer: crate :: pac:: TC0 ,
21
+ init: |tim, prescaler| {
22
+ tim. tccr0a. modify( |_r, w| w. wgm0( ) . pwm_fast( ) ) ;
23
+ tim. tccr0b. modify( |_r, w| match prescaler {
24
+ Prescaler :: Direct => w. cs0( ) . direct( ) ,
25
+ Prescaler :: Prescale8 => w. cs0( ) . prescale_8( ) ,
26
+ Prescaler :: Prescale64 => w. cs0( ) . prescale_64( ) ,
27
+ Prescaler :: Prescale256 => w. cs0( ) . prescale_256( ) ,
28
+ Prescaler :: Prescale1024 => w. cs0( ) . prescale_1024( ) ,
29
+ } ) ;
30
+ } ,
31
+ pins: {
32
+ PB0 : {
33
+ ocr: ocr0a,
34
+ into_pwm: |tim| if enable {
35
+ tim. tccr0a. modify( |_r, w| w. com0a( ) . match_clear( ) ) ;
36
+ } else {
37
+ tim. tccr0a. modify( |_r, w| w. com0a( ) . disconnected( ) ) ;
38
+ } ,
39
+ } ,
40
+
41
+ PB1 : {
42
+ ocr: ocr0b,
43
+ into_pwm: |tim| if enable {
44
+ tim. tccr0a. modify( |_r, w| w. com0b( ) . match_clear( ) ) ;
45
+ } else {
46
+ tim. tccr0a. modify( |_r, w| w. com0b( ) . disconnected( ) ) ;
47
+ } ,
48
+ } ,
49
+ } ,
50
+ }
51
+ }
52
+
53
+ #[ cfg( feature = "attiny85" ) ]
54
+ avr_hal_generic:: impl_simple_pwm! {
55
+ /// Use `TC1` for PWM (pins `PB4`)
56
+ ///
57
+ /// # Example
58
+ /// ```
59
+ /// let mut timer1 = Timer1Pwm::new(dp.TC1, Prescaler::Prescale64);
60
+ ///
61
+ /// let mut d4 = portd.d4.into_output().into_pwm(&mut timer1);
62
+ ///
63
+ /// d4.set_duty(128);
64
+ /// d4.enable();
65
+ /// ```
66
+ pub struct Timer1Pwm {
67
+ timer: crate :: pac:: TC1 ,
68
+ init: |tim, prescaler| {
69
+ tim. gtccr. modify( |_, w| w. pwm1b( ) . bit( true ) ) ;
70
+
71
+ tim. tccr1. modify( |_r, w| match prescaler {
72
+ Prescaler :: Direct => w. cs1( ) . direct( ) ,
73
+ Prescaler :: Prescale8 => w. cs1( ) . prescale_8( ) ,
74
+ Prescaler :: Prescale64 => w. cs1( ) . prescale_64( ) ,
75
+ Prescaler :: Prescale256 => w. cs1( ) . prescale_256( ) ,
76
+ Prescaler :: Prescale1024 => w. cs1( ) . prescale_1024( ) ,
77
+ } ) ;
78
+ } ,
79
+ pins: {
80
+ PB4 : {
81
+ ocr: ocr1b,
82
+ into_pwm: |tim| if enable {
83
+ tim. gtccr. modify( |_, w| w. com1b( ) . bits( 0b10 ) ) ;
84
+ } else {
85
+ tim. gtccr. modify( |_, w| w. com1b( ) . disconnected( ) ) ;
86
+ } ,
87
+ } ,
88
+ } ,
89
+ }
90
+ }
0 commit comments