Skip to main content
2 of 3
edited tags
cocco
  • 431
  • 5
  • 7
  • 16

Arduino Uno vs Arduino Micro Timers -> pins

Where to find the pins relative to timers of each individual Arduino Microcontroller.

As i like Arduino's i already have various of them. The one i mostly use is the uno and micro for now.. i'm planning to get also a mega and others. Most simple things work on all devices but if you start with complex code to fasten up things every device is a little different. A problem i could not solve for days now is the relation between pins and timers. I cannot find any information about the arduino micro. I also don't know exactly what the proper keywords are that i need to find the relation between timers and pins.

Example: A PWM Driver multiplexing

As i for now just got some stuff from my local dealer i have no access to shifregisters, pwm drivers and other proper integrated circuits.

So i used the arduino as a pwm driver for 8 rgb or 24(3*8) white leds. The code works on Arduino Uno. But as the Arduino Micro has no Timer2 TCCR2B i cannot use the same code on the arduino micro.

Even if i understand the code (wrote alot of other languages...), some of the Atmel chip specific parameters are not clear.

This function sets the prescaler of the timer.

void setPwmFrequency(int pin, int divisor){
 byte mode;
 if(pin==5||pin==6||pin==9||pin==10){
  switch(divisor){
   case 1:mode=0x01;break;
   case 8:mode=0x02;break;
   case 64:mode=0x03;break;
   case 256:mode=0x04;break;
   case 1024:mode=0x05;break;
   default:return;
  }
  if(pin==5||pin==6){
   TCCR0B=TCCR0B&0b11111000|mode;
  }else{
   TCCR1B=TCCR1B&0b11111000|mode;
  }
 }else if(pin==3||pin==11){
  switch(divisor){
   case 1:mode=0x01;break;
   case 8:mode=0x02;break;
   case 32:mode=0x03;break;
   case 64:mode=0x04;break;
   case 128:mode=0x05;break;
   case 256:mode=0x06;break;
   case 1024:mode=0x7;break;
   default:return;
  }
  TCCR2B=TCCR2B&0b11111000|mode;
 }
}

First of all i probably don't even need this function as soon i know what frequency i want and so i probably need only 2 lines to set my 3(RGB) pins.

//Arduino Uno timer setup for pin 9,10,11
TCCR1B=TCCR1B&0b11111000|0x01; //pin 9,10
TCCR2B=TCCR2B&0b11111000|0x01; //pin 11
  1. Correct, i need to set TCCR1B only one time?

  2. What do the 0b1111000 refer to?

In the setup function there is also this line:

TIMSK2=1<<TOIE2;
  1. what does this ?

While the above 3 questions are not so important until it works, i need to understand how i can convert those timers to work with Arduino Micro, but also later with other Arduino devices.


On Arduino Micro

There is no timer 2

Pin 9,10,12 have the same timer ?

??????=??????&0b11111000|0x01;

Also if i understand correctly the Arduino micro has:

  1. a higher PWM range 1024 vs 255 (UNO)??
  2. a much higher frequency aviable in on timer4 only for pin 13

So is there somewhere a table describing the differences between all Arduino timers?

Full working (On Arduino UNO) code.

unsigned char Prescaler=0;
unsigned char CurrentLED=0;
unsigned char LEDValues[8][3];
unsigned char ports[8]={
 0b00000100,
 0b00001000,
 0b00010000,
 0b00100000,
 0b01000000,
 0b10000000,
 0b00000001,
 0b00010000
};//PINS 2,3,4,5,6,7,8,12
#define PrescalerOverflowValue 4
ISR(TIMER2_OVF_vect){
 if(Prescaler<PrescalerOverflowValue){
  Prescaler++;
 }else {
  Prescaler=0;
  Multiplex();
 }
}
void Multiplex(void){    
 PORTD&=0b00000011;
 PORTB&=0b11101110;
 analogWrite(9,255-LEDValues[CurrentLED][0]);  
 analogWrite(10,255-LEDValues[CurrentLED][1]);
 analogWrite(11,255-LEDValues[CurrentLED][2]);
 CurrentLED<6?(PORTD|=ports[CurrentLED]):(PORTB|=ports[CurrentLED]);
 CurrentLED++;
 if(CurrentLED>7)CurrentLED=0;  
}
void setPwmFrequency(int pin, int divisor){
 byte mode;
 if(pin==5||pin==6||pin==9||pin==10){
  switch(divisor){
   case 1:mode=0x01;break;
   case 8:mode=0x02;break;
   case 64:mode=0x03;break;
   case 256:mode=0x04;break;
   case 1024:mode=0x05;break;
   default:return;
  }
  if(pin==5||pin==6){
   TCCR0B=TCCR0B&0b11111000|mode;
  }else{
   TCCR1B=TCCR1B&0b11111000|mode;
  }
 }else if(pin==3||pin==11){
  switch(divisor){
   case 1:mode=0x01;break;
   case 8:mode=0x02;break;
   case 32:mode=0x03;break;
   case 64:mode=0x04;break;
   case 128:mode=0x05;break;
   case 256:mode=0x06;break;
   case 1024:mode=0x7;break;
   default:return;
  }
  TCCR2B=TCCR2B&0b11111000|mode;
 }
}
void setup(void){
 pinMode(2,OUTPUT);//1
 pinMode(3,OUTPUT);//2
 pinMode(4,OUTPUT);//3
 pinMode(5,OUTPUT);//4
 pinMode(6,OUTPUT);//5
 pinMode(7,OUTPUT);//6
 pinMode(8,OUTPUT);//7
 pinMode(12,OUTPUT);//8
 pinMode(9,OUTPUT);//red
 pinMode(10,OUTPUT);//green
 pinMode(11,OUTPUT);//blue
 setPwmFrequency(9,8);
 setPwmFrequency(10,8);    
 setPwmFrequency(11,8);
 TIMSK2=1<<TOIE2;
}
void loop(void){
 for(int i=0;i<8;i++){
  //LEDValues[i][0];//red
  //LEDValues[i][1];//green
  //LEDValues[i][2];//blue
 }
}
cocco
  • 431
  • 5
  • 7
  • 16