#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
int main(void)
{
DDRA = 0xFF;//Output
DDRD = 0xFF;
ICR1 = 256;
TCCR2 = (1<<WGM20) | (1<<COM21) | (1<<CS20); // PWM, phase correct, 8 bit.
TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1); // PWM, phase correct, 8 bit.
TCCR1B = (1<<CS10);// | (1<<CS10); // Prescaler 64 = Enable counter, sets the frequency
double rCounter = 255;
double rMax=255;
double bCounter = 255;
double bMax = 180;
double gCounter = 0;
double gMax = 70;
int stages = 0;
while(1)
{
switch (stages)
{
case 0:
bCounter --;
if (bCounter <= 0)
{
stages = 1;
}
break;
case 1:
gCounter ++;
if (gCounter >= 255)
{
stages = 2;
}
break;
case 2:
rCounter --;
if (rCounter <= 0)
{
stages = 3;
}
break;
case 3:
bCounter ++;
if (bCounter >= 255)
{
stages = 4;
}
break;
case 4:
gCounter --;
if (gCounter <= 0)
{
stages = 5;
}
break;
case 5:
rCounter ++;
if (rCounter >= 255)
{
stages = 0;
}
break;
}
OCR1B = (int)(bCounter*bMax*bCounter/255/255);
OCR1A = (int)(gCounter*gMax*gCounter/255/255);
OCR2 = (int)(rCounter*rMax*rCounter/255/255);
_delay_ms(5);
}
}
A collection of my projects in the areas of physics, electronics and information science.
AdSense
Thursday, 24 October 2013
Control RGB LED with ATmega16A
(Deutsche Version) RGB LEDs are pretty interesting (e.g. if they are in an LED strip). Today, I want to explain how to control an RGB LED with an ATmega16A. At first a short introduction to the RGB LED: I use this LED from Tayda Electronics. This LED consists of three different LEDs which are all in the same body. Therefore, there are 3 pins for the different LEDs and a common cathode (-). If you apply a PWM signal to these 3 pins, you can control the color of the LED. I use the ATmega16A because the ATmega8 only has 2 PWM channels, this is not enough for 3 pins. This should cover the basics for an RGB LED, here is the code which runs through the whole colour space:
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment