Skip to content

Commit 1d251a3

Browse files
committed
PWM pins 4-13 working
Signed-off-by: Thibaut VIARD <[email protected]>
1 parent a585c3c commit 1d251a3

File tree

5 files changed

+232
-270
lines changed

5 files changed

+232
-270
lines changed

cores/arduino/WVariant.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ typedef enum _ETCChannel
5454
TCC0_CH1 = (0<<8)|(1),
5555
TCC0_CH2 = (0<<8)|(2),
5656
TCC0_CH3 = (0<<8)|(3),
57-
TCC0_CH4 = (0<<8)|(4),
58-
TCC0_CH5 = (0<<8)|(5),
59-
TCC0_CH6 = (0<<8)|(6),
60-
TCC0_CH7 = (0<<8)|(7),
57+
TCC0_CH4 = (0<<8)|(0), // Channel 4 is 0!
58+
TCC0_CH5 = (0<<8)|(1), // Channel 5 is 1!
59+
TCC0_CH6 = (0<<8)|(2), // Channel 6 is 2!
60+
TCC0_CH7 = (0<<8)|(3), // Channel 7 is 3!
6161
TCC1_CH0 = (1<<8)|(0),
6262
TCC1_CH1 = (1<<8)|(1),
6363
TCC2_CH0 = (2<<8)|(0),
@@ -69,7 +69,7 @@ typedef enum _ETCChannel
6969
extern const void* g_apTCInstances[TCC_INST_NUM+TC_INST_NUM] ;
7070

7171
#define GetTCNumber( x ) ( (x) >> 8 )
72-
#define GetTCChannelNumber( x ) ( (x) && 0xff )
72+
#define GetTCChannelNumber( x ) ( (x) & 0xff )
7373
#define GetTC( x ) ( g_apTCInstances[(x) >> 8] )
7474

7575
// Definitions for PWM channels

cores/arduino/wiring_analog.c

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,8 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue )
193193
// uint32_t pwm_name = g_APinDescription[ulPin].ulTCChannel ;
194194
uint8_t isTC = 0 ;
195195
uint8_t Channelx ;
196-
Tc* TCx ;
197-
Tcc* TCCx ;
196+
Tc* TCx = 0 ;
197+
Tcc* TCCx = 0 ;
198198

199199
if ( (attr & PIN_ATTR_ANALOG) == PIN_ATTR_ANALOG )
200200
{
@@ -234,59 +234,45 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue )
234234
switch ( GetTCNumber( g_APinDescription[ulPin].ulPWMChannel ) )
235235
{
236236
case 0: // TCC0
237-
//Enable GCLK for TCC0 (timer counter input clock)
238-
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TCC0_TCC1 )) ;
239-
break ;
240-
241237
case 1: // TCC1
242-
//Enable GCLK for TCC1 (timer counter input clock)
238+
// Enable GCLK for TCC0 and TCC1 (timer counter input clock)
243239
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TCC0_TCC1 )) ;
244-
break ;
245240

246-
case 2: // TCC2
247-
//Enable GCLK for TCC2 (timer counter input clock)
248-
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TCC2_TC3 )) ;
241+
while ( GCLK->STATUS.bit.SYNCBUSY == 1 ) ;
249242
break ;
250243

244+
case 2: // TCC2
251245
case 3: // TC3
252-
//Enable GCLK for TC3 (timer counter input clock)
253-
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TCC2_TC3 ));
246+
// Enable GCLK for TCC2 and TC3 (timer counter input clock)
247+
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TCC2_TC3 )) ;
254248
break ;
255249

256250
case 4: // TC4
257-
//Enable GCLK for TC4 (timer counter input clock)
258-
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TC4_TC5 ));
259-
break ;
260-
261251
case 5: // TC5
262-
//Enable GCLK for TC5 (timer counter input clock)
263-
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TC4_TC5 )) ;
252+
// Enable GCLK for TC4 and TC5 (timer counter input clock)
253+
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TC4_TC5 ));
264254
break ;
265255

266-
case 6: // TC6
267-
//Enable GCLK for TC6 (timer counter input clock)
256+
case 6: // TC6 (not available on Zero)
257+
case 7: // TC7 (not available on Zero)
258+
// Enable GCLK for TC6 and TC7 (timer counter input clock)
268259
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TC6_TC7 ));
269260
break ;
270-
271-
case 7: // TC7
272-
//Enable GCLK for TC7 (timer counter input clock)
273-
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TC6_TC7 )) ;
274-
break ;
275261
}
276262

277263
// Set PORT
278264
if ( isTC )
279265
{
280266
// -- Configure TC
281-
//DISABLE TCx
267+
// DISABLE TCx
282268
TCx->COUNT8.CTRLA.reg &=~(TC_CTRLA_ENABLE);
283-
//Set Timer counter Mode to 8 bits
269+
// Set Timer counter Mode to 8 bits
284270
TCx->COUNT8.CTRLA.reg |= TC_CTRLA_MODE_COUNT8;
285-
//Set TCx as normal PWM
271+
// Set TCx as normal PWM
286272
TCx->COUNT8.CTRLA.reg |= TC_CTRLA_WAVEGEN_NPWM;
287-
//Set TCx in waveform mode Normal PWM
273+
// Set TCx in waveform mode Normal PWM
288274
TCx->COUNT8.CC[Channelx].reg = (uint8_t) ulValue;
289-
//Set PER to maximum counter value (resolution : 0xFF)
275+
// Set PER to maximum counter value (resolution : 0xFF)
290276
TCx->COUNT8.PER.reg = 0xFF;
291277
// Enable TCx
292278
TCx->COUNT8.CTRLA.reg |= TC_CTRLA_ENABLE;
@@ -295,15 +281,15 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue )
295281
{
296282
// -- Configure TCC
297283

298-
//DISABLE TCCx
284+
// DISABLE TCCx
299285
TCCx->CTRLA.reg &=~(TCC_CTRLA_ENABLE);
300-
//Set TCx as normal PWM
286+
// Set TCx as normal PWM
301287
TCCx->WAVE.reg |= TCC_WAVE_WAVEGEN_NPWM;
302-
//Set TCx in waveform mode Normal PWM
288+
// Set TCx in waveform mode Normal PWM
303289
TCCx->CC[Channelx].reg = (uint32_t)ulValue;
304-
//Set PER to maximum counter value (resolution : 0xFF)
290+
// Set PER to maximum counter value (resolution : 0xFF)
305291
TCCx->PER.reg = 0xFF;
306-
//ENABLE TCCx
292+
// ENABLE TCCx
307293
TCCx->CTRLA.reg |= TCC_CTRLA_ENABLE ;
308294
}
309295

0 commit comments

Comments
 (0)