Forum: Mikrocontroller und Digitale Elektronik Zwischen 2 LEDs faden


von Markus F. (markus1689)


Lesenswert?

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):
1
void fade() {
2
 
3
    int16_t tmp;
4
 
5
    TCCR1A = 0xA1;          // non-inverted PWM on OC1A, 8 Bit Fast PWM
6
    TCCR0A = 0xA3;
7
8
    TCCR1B = 0x08;
9
    TCCR0B &= ~0x08;
10
 
11
    TCCR1B &= ~0x7;         // clear clk setting
12
    TCCR1B |= 4;            // precaler 256 -> ~122 Hz PWM frequency 
13
 
14
    TCCR0B &=~0x07;
15
    TCCR0B |= 4;
16
17
    for(tmp=0; tmp<=31; tmp++){
18
      OCR0B = pgm_read_word(pwmtable_8D+31-tmp); //(2): LED1 ausfaden
19
      OCR1A = pgm_read_word(pwmtable_8D+tmp);    //(2): gleichzeitig LED2 einfaden
20
      _delay_ms(50);
21
    }
22
    
23
    _delay_ms(1000);
24
    
25
    for(tmp=0; tmp<=31; tmp++){
26
      OCR0B = pgm_read_word(pwmtable_8D+tmp);    //LED1 wieder einfaden
27
      OCR1A = pgm_read_word(pwmtable_8D+31-tmp); //LED2 ausfaden
28
      _delay_ms(50);
29
    }
30
31
}

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

von LordZiu (Gast)


Lesenswert?

Schreib deinen Code mal um á la
1
DDRC |= (1<<PC3)
 statt
1
DDRC = 0x08

und poste ihn nochmal.

Sonst hat hier keiner Lust sich durch die Bytes zu quälen...

von Markus F. (markus1689)


Lesenswert?

Sorry! Klar!
1
void fade() {
2
 
3
    int16_t tmp;
4
 
5
    TCCR1A |= (1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(0<<WGM11)|(1<<WGM10);
6
7
  TCCR0A |= (1<<COM0A1)|(0<<COM0B0)|(1<<COM0B1)|(0<<COM0B0)|(1<<WGM01)|(1<<WGM00);
8
9
  TCCR1B |= (1<<WGM12)|(1<<CS12)|(0<<CS11)|(0<<CS10);
10
   TCCR0B |= (0<<FOC0A)|(0<<FOC0B)|(1<<WGM02)|(1<<CS02)|(0<<CS01)|(0<<CS00);
11
12
    for(tmp=0; tmp<=31; tmp++){
13
      OCR1A = pgm_read_word(pwmtable_8D+tmp);
14
      OCR0A = pgm_read_word(pwmtable_8D+31-tmp);
15
      _delay_ms(50);
16
    }
17
 _delay_ms(1000);
18
    for(tmp=0; tmp<=31; tmp++){
19
      OCR0A = pgm_read_word(pwmtable_8D+tmp);
20
      OCR1A = pgm_read_word(pwmtable_8D+31-tmp);
21
      my_delay(50);
22
    }
23
_delay_ms(500);
24
25
}

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:
1
uint16_t pwmtable_8D[32]  PROGMEM = {0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11,
2
                                    13, 16, 19, 23, 27, 32, 38, 45, 54, 64, 76,
3
                                    91, 108, 128, 152, 181, 215, 255};

von holger (Gast)


Lesenswert?

>      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]);

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von holger (Gast)


Lesenswert?

>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;)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Dann hatte das spärliche Codeposten von Markus doch was Gutes :)

von Markus F. (markus1689)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.