Where do I find the pins relative to timers of each individual Arduino microcontroller?
As I like Arduino's I already have various samples of them. The one I mostly use is the Uno and Micro for now... I'm planning to also get 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 shift registers, 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 (I wrote a lot in 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 two lines to set my three (RGB) pins.
//Arduino Uno timer setup for pin 9, 10, and 11
TCCR1B=TCCR1B&0b11111000|0x01; // Pin 9,10
TCCR2B=TCCR2B&0b11111000|0x01; // Pin 11
Correct, I need to set
TCCR1B
only one time?What does the
0b11111000
refer to?
In the setup function there is also this line:
TIMSK2 = 1<<TOIE2;
- What does this do?
While the above three 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 boards.
On Arduino Micro
There is no timer 2
Do pin 9, 10, and 12 have the same timer?
??????=??????&0b11111000|0x01;
Also if I understand correctly the Arduino Micro has:
- A higher PWM range 1024 vs 255 (UNO)??
- A much higher frequency available 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
}
}