Datum:
Hallo Leute! Ich habe ein Problem! Und zwar möchte ich zwischen 2 LEDs hin- und her-faden. Sprich: (1) LED1 an, LED2 aus (2) LED1 langsam ausfaden, ->gleichzeitig<- LED2 einfaden (3) LED1 aus, LED2 an dafür hab ich jetzt folgende Funktion (für den ATtiny2313) auf Basis des Fading-tuts mit 2 Timern (es sollen insgesamt 4 LEDs werden, die untereinander durchfaden, aber erstmal nur für 2):
void fade() {
int16_t tmp;
TCCR1A = 0xA1; // non-inverted PWM on OC1A, 8 Bit Fast PWM
TCCR0A = 0xA3;
TCCR1B = 0x08;
TCCR0B &= ~0x08;
TCCR1B &= ~0x7; // clear clk setting
TCCR1B |= 4; // precaler 256 -> ~122 Hz PWM frequency
TCCR0B &=~0x07;
TCCR0B |= 4;
for(tmp=0; tmp<=31; tmp++){
OCR0B = pgm_read_word(pwmtable_8D+31-tmp); //(2): LED1 ausfaden
OCR1A = pgm_read_word(pwmtable_8D+tmp); //(2): gleichzeitig LED2 einfaden
_delay_ms(50);
}
_delay_ms(1000);
for(tmp=0; tmp<=31; tmp++){
OCR0B = pgm_read_word(pwmtable_8D+tmp); //LED1 wieder einfaden
OCR1A = pgm_read_word(pwmtable_8D+31-tmp); //LED2 ausfaden
_delay_ms(50);
}
}
|
Das Ergebnis ist allerdings folgendes: (1) LED1 an, LED2 an (2) LED1 fadet aus (3) LED1 fadet ein (4) LED2 fadet aus (5) LED2 fadet ein Wieso? Wo genau liegt mein Denkfehler? Oder ist das so gar nicht realisierbar? Ich sitz jetzt schon Stunden über den Code und ich komm einfach nich mehr weiter :( Wäre cool, wenn mir hier jemand auf die Sprünge helfen könnte :) Danke schonmal! markus1689
Datum:
Schreib deinen Code mal um á la
DDRC |= (1<<PC3) |
statt
DDRC = 0x08 |
und poste ihn nochmal. Sonst hat hier keiner Lust sich durch die Bytes zu quälen...
Datum:
Sorry! Klar!
void fade() {
int16_t tmp;
TCCR1A |= (1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(0<<WGM11)|(1<<WGM10);
TCCR0A |= (1<<COM0A1)|(0<<COM0B0)|(1<<COM0B1)|(0<<COM0B0)|(1<<WGM01)|(1<<WGM00);
TCCR1B |= (1<<WGM12)|(1<<CS12)|(0<<CS11)|(0<<CS10);
TCCR0B |= (0<<FOC0A)|(0<<FOC0B)|(1<<WGM02)|(1<<CS02)|(0<<CS01)|(0<<CS00);
for(tmp=0; tmp<=31; tmp++){
OCR1A = pgm_read_word(pwmtable_8D+tmp);
OCR0A = pgm_read_word(pwmtable_8D+31-tmp);
_delay_ms(50);
}
_delay_ms(1000);
for(tmp=0; tmp<=31; tmp++){
OCR0A = pgm_read_word(pwmtable_8D+tmp);
OCR1A = pgm_read_word(pwmtable_8D+31-tmp);
my_delay(50);
}
_delay_ms(500);
}
|
Und einen Fehler hab ich jetzt gefunden! Und zwar war WGM02 im T0 auf 0 statt auf 1. Jetzt faden aber immer beide LEDs gleichzeitig aus! Sollte das nich eigentlich duch das "pwmtable_8D+31-tmp" im gegensatz zu "pwmtable_8D+tmp" umgedreht werden? Also eine geht aus wären die andere angeht!? Vielleicht noch die pwmtable_8D:
uint16_t pwmtable_8D[32] PROGMEM = {0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11,
13, 16, 19, 23, 27, 32, 38, 45, 54, 64, 76,
91, 108, 128, 152, 181, 215, 255};
|
Datum:
> OCR0A = pgm_read_word(pwmtable_8D+tmp); > OCR1A = pgm_read_word(pwmtable_8D+31-tmp); OCR0A = pgm_read_word(&pwmtable_8D[tmp]); OCR1A = pgm_read_word(&pwmtable_8D[31-tmp]);
Datum:
Angehängte Dateien:Bei mir klappt dein Programm grundsätzlich. Die fehlenden Teile habe ich auf das Pollin Funk-AVR-Evaluationsboard (Attiny2313 @ 8 MHz) angepasst. Eine LED passte bereits von der Hardware her, die andere musste ich per Jumper kontaktieren. Wie steht in der Source (Anhang) EEPROM-Code habe ich weggelassen und die Tabelle hatte ich mir zunächst ausgedacht (linear, Delta=8). Deine Tabelle habe ich jetzt auch probiert. Geschmackssache sagt der Affe :) Bei der Initialisierung habe ich mal deine Doppelinitialisierung stehen lassen, auch wenn ich nur 2 LEDs habe.
Datum:
>Bei mir klappt dein Programm grundsätzlich. >unsigned char pwmtable_8D[32] = { Die Tabelle steht ja auch im RAM und die Elemente sind unsigned char und nicht uint16_t;)
Datum:
Hi Stefan! Vielen Dank für die Mühe! Das beruhigt mich in soweit, dass ich wohl keinen technischen Fehler gemacht habe ;) Sieht leider so aus, als ob eine LED ausgeht, wieder angeht, dann die andere aus und wieder an, weißt du, was ich meine? Liegt wohl daran, dass LEDs nunmal im unteren Bereich sehr schnell und im oberen bereich sehr langsam dimmen -.- da wurde ja versucht durch die angepasste Tabelle zu verhindern... Ich bin gerade am Überlegen, ob ich nich einfach die LEDs durchwechsel... Dann bin ich auch nich auf 4 Kanäle beschränkt... Und vom sichtbaren Effekt is das wohl nahezu das gleiche, wenn ich z. B. einen solchen Übergang mache: (500ms) 1 -> 1 -> 1 0 -> 1 -> 1 1 -> 1 -> 0 1 -> 1 -> 1 Trotzdem natürlich an alle, die sich hier reingedacht haben, vielen, vielen Dank! :) markus1689