From 7c845895e824ac187138c396e9d4292c7d183a61 Mon Sep 17 00:00:00 2001 From: Cristian Maglie <c.maglie@arduino.cc> Date: Fri, 21 Nov 2014 22:04:56 +0100 Subject: [PATCH] Fixed analogWriteResolution behaviour --- cores/arduino/wiring_analog.c | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/cores/arduino/wiring_analog.c b/cores/arduino/wiring_analog.c index 9a647de7..c720c2b8 100644 --- a/cores/arduino/wiring_analog.c +++ b/cores/arduino/wiring_analog.c @@ -194,11 +194,6 @@ uint32_t analogRead( uint32_t ulPin ) void analogWrite( uint32_t ulPin, uint32_t ulValue ) { uint32_t attr = g_APinDescription[ulPin].ulPinAttribute ; -// uint32_t pwm_name = g_APinDescription[ulPin].ulTCChannel ; - uint8_t isTC = 0 ; - uint8_t Channelx ; - Tc* TCx = 0 ; - Tcc* TCCx = 0 ; if ( (attr & PIN_ATTR_ANALOG) == PIN_ATTR_ANALOG ) { @@ -207,10 +202,12 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue ) return; } + ulValue = mapResolution(ulValue, _writeResolution, 10); + syncDAC(); DAC->DATA.reg = ulValue & 0x3FF; // DAC on 10 bits. syncDAC(); - DAC->CTRLA.bit.ENABLE = 0x01; //Enable ADC + DAC->CTRLA.bit.ENABLE = 0x01; // Enable DAC syncDAC(); return ; } @@ -222,15 +219,15 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue ) pinPeripheral( ulPin, g_APinDescription[ulPin].ulPinType ) ; } - Channelx = GetTCChannelNumber( g_APinDescription[ulPin].ulPWMChannel ) ; + Tc* TCx = 0 ; + Tcc* TCCx = 0 ; + uint8_t Channelx = GetTCChannelNumber( g_APinDescription[ulPin].ulPWMChannel ) ; if ( GetTCNumber( g_APinDescription[ulPin].ulPWMChannel ) >= TCC_INST_NUM ) { - isTC = 1 ; TCx = (Tc*) GetTC( g_APinDescription[ulPin].ulPWMChannel ) ; } else { - isTC = 0 ; TCCx = (Tcc*) GetTC( g_APinDescription[ulPin].ulPWMChannel ) ; } @@ -264,12 +261,14 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue ) break ; } + ulValue = mapResolution(ulValue, _writeResolution, 8); + // Set PORT - if ( isTC ) + if ( TCx ) { // -- Configure TC - // DISABLE TCx - TCx->COUNT8.CTRLA.reg &=~(TC_CTRLA_ENABLE); + // Disable TCx + TCx->COUNT8.CTRLA.reg &= ~TC_CTRLA_ENABLE; // Set Timer counter Mode to 8 bits TCx->COUNT8.CTRLA.reg |= TC_CTRLA_MODE_COUNT8; // Set TCx as normal PWM @@ -284,16 +283,15 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue ) else { // -- Configure TCC - - // DISABLE TCCx - TCCx->CTRLA.reg &=~(TCC_CTRLA_ENABLE); + // Disable TCCx + TCCx->CTRLA.reg &= ~TCC_CTRLA_ENABLE; // Set TCx as normal PWM TCCx->WAVE.reg |= TCC_WAVE_WAVEGEN_NPWM; // Set TCx in waveform mode Normal PWM TCCx->CC[Channelx].reg = (uint32_t)ulValue; // Set PER to maximum counter value (resolution : 0xFF) TCCx->PER.reg = 0xFF; - // ENABLE TCCx + // Enable TCCx TCCx->CTRLA.reg |= TCC_CTRLA_ENABLE ; } @@ -302,9 +300,7 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue ) // -- Defaults to digital write pinMode( ulPin, OUTPUT ) ; - ulValue = mapResolution(ulValue, _writeResolution, 8); - if ( ulValue < 128 ) { digitalWrite( ulPin, LOW ) ; -- GitLab