mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zwischen 2 LEDs faden


Autor: Markus Fender (markus1689)
Datum:

Bewertung
0 lesenswert
nicht 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):
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht 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]);

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann hatte das spärliche Codeposten von Markus doch was Gutes :)

Autor: Markus Fender (markus1689)
Datum:

Bewertung
0 lesenswert
nicht 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

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.