diff --git a/cores/arduino/wiring_analog.c b/cores/arduino/wiring_analog.c
index 5ccf3236d6b1fca1f34f10fe26b9bd78f6a4c0de..861a94c5a9ee3d91e36d47cd9e1c8c304d45269e 100644
--- a/cores/arduino/wiring_analog.c
+++ b/cores/arduino/wiring_analog.c
@@ -25,7 +25,8 @@ extern "C" {
 #endif
 
 static int _readResolution = 10;
-static int _writeResolution = 10;
+static int _ADCResolution = 10;
+static int _writeResolution = 8;
 
 // Wait for synchronization of registers between the clock domains
 static __inline__ void syncADC() __attribute__((always_inline, unused));
@@ -43,20 +44,23 @@ static void syncDAC() {
 
 void analogReadResolution( int res )
 {
+  _readResolution = res ;
   syncADC();
-  switch ( res )
+  if (res > 10)
   {
-    case 12:
-      ADC->CTRLB.bit.RESSEL = ADC_CTRLB_RESSEL_12BIT_Val;
-      break;
-    case 8:
-      ADC->CTRLB.bit.RESSEL = ADC_CTRLB_RESSEL_8BIT_Val;
-      break;
-    default:
-      ADC->CTRLB.bit.RESSEL = ADC_CTRLB_RESSEL_10BIT_Val;
-      break;
+    ADC->CTRLB.bit.RESSEL = ADC_CTRLB_RESSEL_12BIT_Val;
+    _ADCResolution = 12;
+  }
+  else if (res > 8)
+  {
+    ADC->CTRLB.bit.RESSEL = ADC_CTRLB_RESSEL_10BIT_Val;
+    _ADCResolution = 10;
+  }
+  else
+  {
+    ADC->CTRLB.bit.RESSEL = ADC_CTRLB_RESSEL_8BIT_Val;
+    _ADCResolution = 8;
   }
-  _readResolution = res ;
 }
 
 void analogWriteResolution( int res )
@@ -179,7 +183,7 @@ uint32_t analogRead( uint32_t ulPin )
   ADC->CTRLA.bit.ENABLE = 0x00;             // Disable ADC
   syncADC();
 
-  return valueRead;
+  return mapResolution(valueRead, _ADCResolution, _readResolution);
 }
 
 
@@ -190,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 )
   {
@@ -203,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 ;
   }
@@ -218,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 ) ;
     }
 
@@ -263,12 +264,12 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue )
     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
@@ -283,16 +284,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 ;
     }
 
@@ -301,9 +301,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 ) ;