www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik Zwischen 2 LEDs faden


Autor: Markus Fender (markus1689)
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
Autor: LordZiu (Gast)
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...
Autor: Markus Fender (markus1689)
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};

Autor: holger (Gast)
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]);
Autor: Stefan B. (stefan) Benutzerseite
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.
Autor: holger (Gast)
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;)
Autor: Stefan B. (stefan) Benutzerseite
Datum:

Dann hatte das spärliche Codeposten von Markus doch was Gutes :)
Autor: Markus Fender (markus1689)
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net