RGB Rainbow Farbwechsler mit ATMEGA168/88/48 und BASCOM-AVR

Anleitungen für "hausgemachte" LED Projekte

Moderator: T.Hoffmann

Benutzeravatar
dedicated
Mega-User
Mega-User
Beiträge: 141
Registriert: Do, 04.01.07, 14:18

So, 20.05.07, 16:00

Hab Neni´s BASIC-text in C ungwandelt.

Dazu die Timereinstellungen an meinen ATMega32 angepasst.

Hab den ganzen Quelltext übernommen was mein Fehler war. Alle 3 LEDs leuchteten durchgehend oder waren aus.
Also am gestrigen Nachmittag und Abend Datenblätter durchgewälzt, gegooglet, Foren durchsucht und Timereinstellungen ausprobiert, aber der Fehler blieb.

Erst heute Vormittag wurde ich fündig:

Code: Alles auswählen

Red_pwm1 = Ocr0
Green_pwm1 = Ocr1a
Blue_pwm1 = Ocr2
Die Variablenzuweisung war falsch. Die PWMvariablen beinhalten die Pulsweite und müssen ins Output Compare
Register geschrieben werden, nichtumgekehrt.

Konrekt ist natürlich diese Zuweisung:

Code: Alles auswählen

OCR0 = Red_pwm1; 
OCR1AL = Green_pwm1;
OCR2 = Blue_pwm1;
Und siehe da Neni´s Hue-System funktionert wunderbar, schönes Fading der LEDs.



Mikrocontroller:

ATmega32
2 8Bit-Timer
1 16Bit-Timer

PWM-Kanäle:
PIN B3 = OC0
PIN D5 = OC1A
PIN D7 = OC2


Programme:

WINAVR mit AVRgcc, AVRlibc, MKfile
Makefile ebenfalls 8mhz Takt und CPU-Typ einstellen

PonyProg 2.06f
Fusebits CKSEL3 CKSEL1 CKSEL0 aktivieren für internen 8MHz



Timereinstellungen:

PWM, Phase Correct beibehalten, also WGMbits 11 auf 0 und 10 auf 1 gestellt. Beim 16bit Timer WGM13 und 12 auf 0 für 8bit PWM.

Clockteiler 64 beibehalten, CS-bits 02=0, 01 und 00=1.

Compare Output Mode auf NICHT-invert geändert. COM01 =1, COM00 =0. Beim 16bitTimer COM1A1 =1 COM1A0 =0 COM1B1 =1 COM1B0 =0.

FOC auf 0

Beim 2ten 8BitTimer AsychronModus aus. ASSR = 0x00



C-Quelltext:

Code: Alles auswählen

#include <avr>       // Registernamen definiert
#include <stdint>       // Definierung von Intergertypen
#define F_CPU 8000000UL   // Prozessortakt muss vor delay.h definiert werden !!! Gleicher Takt muss auch in den    Fusebits eingestellt sein oder mit dem externen übereinstimmen!!!
#include <util>   // Wird für den delay(warte)-Befehl gebraucht

void Color_set1(uint8_t Hue);

uint8_t Red_pwm1;
uint8_t Green_pwm1;
uint8_t Blue_pwm1;

int main(void)
{

DDRA = 0x00;  //0000000 Ausgänge definieren
PORTA = 0x00;
DDRB = 0x08;  //0001000
PORTB = 0x00;
DDRC = 0x00;  //0000000
PORTC = 0x00;
DDRD = 0xA0;  //1010000
PORTD = 0x00;   

//Timer/Counter 0 initialization
TCCR0 = 0x63;
TCNT0 = 0x00;
OCR0 = 0x00;


//Timer/Counter 1 initialization
TCCR1A = 0xA1;
TCCR1B = 0x03;
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH = 0x00;
OCR1AL = 0x00;
OCR1BH = 0x00;
OCR1BL = 0x00;


//Timer/Counter 2 initialization
ASSR = 0x00;
TCCR2 = 0x63;
TCNT2 = 0x00;
OCR2 = 0x00;

uint8_t I=1;


while (1)
{
   
   for (I=0;I<=251;I++)
   {
      Color_set1(I);
      _delay_ms(100);
      OCR0 = Red_pwm1; 
      OCR1AL = Green_pwm1;
      OCR2 = Blue_pwm1;
   }

}
return 0;
}



void Color_set1(uint8_t Hue)
{
   if (Hue < 42){
      Red_pwm1 = 251;
      Green_pwm1 = Hue * 6;
      Blue_pwm1 = 0;}
   else if (Hue < 84){
      Hue = 84 - Hue;
      Red_pwm1 = Hue * 6;
      Green_pwm1 = 251;
      Blue_pwm1 = 0;}
   else if (Hue < 126){
      Hue = Hue - 84;
      Red_pwm1 = 0;
      Green_pwm1 = 251;
      Blue_pwm1 = Hue * 6;}
   else if (Hue < 168){
      Hue = 168 - Hue;
      Red_pwm1 = 0;
      Green_pwm1 = Hue * 6;
      Blue_pwm1 = 251;}
   else if (Hue < 210){
      Hue = Hue - 168;
      Red_pwm1 = Hue * 6;
      Green_pwm1 = 0;
      Blue_pwm1 = 251;}
   else {
      Hue = 252 - Hue;
      Red_pwm1 = 251;
      Green_pwm1 = 0;
      Blue_pwm1 = Hue * 6;} 
}
mfg Martin[/code]
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Mi, 23.05.07, 13:32

Was jetzt noch sehr Interessant wäre, wäre eine hard oder Software RGB steuerung, bei der man auch diverse Farbe direkt per Tastendruck abrufen könnte.
Meinetwegen Taste 1 ist Fader (Rainbowdurchlauf wiederholend)
Taster 2 ist Speichertaste des derzeitigen Farbwertes auf einer definierten Speicheradresse und Taster 3 bis 6 ist Speicherabruf der zuvor gespeicherten farben und Taster 7 meinetwegen ein ausgang freischalten nur für weiß.
Taste 8 und 9 wären dann für alle Kanäle (incl. Weiß und Farbwahltaster) dann die Dimmerfunktion.
Und dann das programm in Bascom schreiben.
Das wäre doch mal eine kleine Herausforderung.
synvox
Mega-User
Mega-User
Beiträge: 147
Registriert: Fr, 27.04.07, 04:40
Wohnort: Schweiz

Do, 31.05.07, 18:11

Zu einer konkreten Applikation siehe folgenden neuen Beitrag von mir ;) .

Gruss
Neni
Antworten