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
Register geschrieben werden, nichtumgekehrt.
Konrekt ist natürlich diese Zuweisung:
Code: Alles auswählen
OCR0 = Red_pwm1;
OCR1AL = Green_pwm1;
OCR2 = Blue_pwm1;
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;}
}


