Hi,
I am trying to read the duty cycle set for pin 6 on the Arduino Wifi Rev2. By default, the timer used is TCB0, used in 8-bit PWM mode. The 16-bit Compare channel CCMP is used as two 8-bit registers, the lowest byte CCMPL is for the period, while the highest byte CCMPH is for the duty cycle.
However, something weird happens when I try to read the Compare channel register, the value of CCMPH is unexpecteadly copied into CCMPL.
// PWM on pin 6, timer TCB0
//TCB_t* timer_B0 = (TCB_t *)&TCB0; // pointer on timer structure
void setup() {
pinMode(6, OUTPUT);
Serial.begin(9600);
}
void loop() {
setPWMValueOnPin6(20);
setPWMValueOnPin6(40);
setPWMValueOnPin6(60);
setPWMValueOnPin6(80);
}
void printCompareChannelValues()
{
Serial.print("Compare channel = ");
unsigned int r = TCB0_CCMP;
//byte r = timer_B0->CCMP;
Serial.println(r);
Serial.print("Compare channel L = ");
byte l = TCB0_CCMPL;
//byte l = timer_B0->CCMPL;
Serial.println(l);
Serial.print("Compare channel H = ");
byte h = TCB0_CCMPH;
//byte h = timer_B0->CCMPH;
Serial.println(h);
}
void setPWMValueOnPin6(byte value)
{
analogWrite(6, value);
printCompareChannelValues();
delay(2000);
}
Here is the serial monitor output:
Compare channel = 5375
Compare channel L = 255
Compare channel H = 20
Compare channel = 10260
Compare channel L = 20
Compare channel H = 40
Compare channel = 15400
Compare channel L = 40
Compare channel H = 60
Compare channel = 20540
Compare channel L = 60
Compare channel H = 80
Compare channel = 5200
Compare channel L = 80
Compare channel H = 20
Compare channel = 10260
Compare channel L = 20
Compare channel H = 40
Compare channel = 15400
Compare channel L = 40
Compare channel H = 60
Compare channel = 20540
Compare channel L = 60
Compare channel H = 80
Compare channel = 5200
Compare channel L = 80
Compare channel H = 20
Problem occurs even when removing the serial functions (by watching at a led intensity on pin 6).
The same behavior occurs on pin 3 (timer TCB1).
Do you guys have any idea what is going on? Thanks for your help.