www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED-Matrix -> Multiplex und jetzt PWM?


Autor: JVogel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich habe mir eine LED matrix zusammen gelötet und diese funktioniert 
auch sehr gut, jedoch möchte ich jetzt nicht nur an und aus haben 
sondern auch verscheidene helligkeiten. Hierzu habe ich einene LED 
würfel Code umgebaut.

Verwendet wird ein Atmega32 mit 8mhz intern.

ISR(TIMER2_COMP_vect)
{
  PORTC = 0xFF; // Turn all cathode layers off. (all transistors off)
  PORTA = 0x00;//Turn off output
  PORTA = cube[current_layer]; //Load bytes unsigned char CUBE[8]
  PORTC ^= (1 << current_layer);

    if (current_layer == 8)
    {
       current_layer = 0;
    }
}


void ioinit (void)
{
  DDRA = 0xff;  // DATA bus output
  DDRC = 0xff;  // Layer select output  

  PORTA = 0x00; // Set data bus off
  PORTC = 0x00; // Set layer select off

  OCR2 = 10;   // interrupt at counter = 10
      TCCR2 |= (1 << CS20) | (1 << CS22); // Prescaler = 128.
  TCCR2 |= (1 << WGM21); // CTC mode. Reset counter when OCR2 is reached.
  TCNT2 = 0x00;  // initial counter value = 0;
  TIMSK |= (1 << OCIE2); // Enable CTC interrupt
}


jetztiges Fake pwm. Funktioniert aber nur bedingt und die leds sind 
trozdem noch relativ hell oder flakern.
volatile unsigned char cubebrightness[CUBE_SIZE][CUBE_SIZE];
volatile unsigned char cubebrightnesscount[CUBE_SIZE][CUBE_SIZE];

Im Timer interrupt:

temp  = cube[current_layer];
      for(i = 0;i<8;i++)
      {
        cubebrightnesscount[i][current_layer]++;
          if(cubebrightnesscount[i][current_layer]<cubebrightness[i][current_layer])
          {
            temp &= ~(1<<i);
            
          }
          else
          {
            cubebrightnesscount[i][current_layer]=0;
          }
      }
      PORTA = temp;


Wie kann ich das hier besser machen?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit Soft-PWM, allerdings ist bei 8:1 Multiplex keine sonderlich hohe 
Auflösung mehr drin, 16 odef vielleicht 32 Stufen sind aber sicher 
machbar.

MFG
Falk

Autor: JVogel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
16 würde reichen jedoch waren meine implementierungs versuche nicht der 
hit, kann mir jemand ein denkanstoß geben?

Autor: JVogel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sinddie 16 stuffen dann zwischen 0 und voll an?

Weil so wie ich es immoment habe habe ich ~16 stuffen jedoch nur von An 
bis halb hell, ab da flakkert es.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  JVogel (Gast)

>Sinddie 16 stuffen dann zwischen 0 und voll an?

Was sonst?

>Weil so wie ich es immoment habe habe ich ~16 stuffen jedoch nur von An
>bis halb hell, ab da flakkert es.

Weil deine Software noch Fehler hat. Du musst die Multiplexzeit einer 
Zeile in 16 Teile teilen und entsprechend deiner Dimmstufe der einzelnen 
LEDs diese vorher abschalten, ist grob auch im Artikel LED-Matrix 
beschrieben.

MFG
Falk

Autor: JVogel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also die Frquenz des interrupts auf das 16 fache erhöhen?

Autor: JVogel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab jetzt:
  TCCR2 |= (1 << CS21);
gemacht und folgenden code in den interrupt gestopft

    for(i = 0;i<8;i++)
      {
        
        if((cube[0][current_layer]& 1<<i) &&( dimcount<cubebrightness[i][current_layer]))
        {
           temp |= (1<<i);
        }
      }
      PORTA = temp;

funktionieren tut es allerdings leider nicht.

Autor: JVogel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei brightness 0 aus und bei brightness 1 schon fst volle helligkeit

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  JVogel (Gast)

>Also die Frquenz des interrupts auf das 16 fache erhöhen?

Ja, aber das allein bringt nichts, du musst auch die PWM-Logik dort 
unterbringen.

MFG
Falk

Autor: JVogel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok dann teste ich das nochmal ;D mit der SOFT-PWM code aus dem beitrag.

Autor: jvogel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die kacke will nicht, ich geh erstma irgendwo was zU abend essen und 
versuch mich nachher nochmal, wenn das nix hilft poste ich mal meine 
vollstaendige source. Danke trozxdem schonmal

Autor: JVogel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also es läuft jetzt nur ein problem habe ich noch. Ich hab es den 
beispielcode aus dem softpwm artikel genommen.

ich bekomme nur eine anzeige, wenn ich
 uint8_t t2[8]={255, 40, 3, 17, 150, 99, 5, 9};
 memcpy(pwm_setting,t2 , 8);
    pwm_update();

in die Main packe, jedoch funktioniert es nicht wenn ich es in

ISR(TIMER2_COMP_vect)
{

}


mache.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  JVogel (Gast)


>ich bekomme nur eine anzeige, wenn ich

> uint8_t t2[8]={255, 40, 3, 17, 150, 99, 5, 9};
> memcpy(pwm_setting,t2 , 8);
>    pwm_update();

>in die Main packe,

ist doch OK.

> jedoch funktioniert es nicht wenn ich es in

>ISR(TIMER2_COMP_vect)

>mache.

Dort gehört es auch nicht hin!

Sooooo einfach ist es nicht mit PWM mischbar!

MFG
Falk

Autor: JVogel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja dann kann ich es ja garnicht in animationen verwenden, weil ich ja 
nur spalte für spalte dimmen kann.

hmm :( das funktioniert dann wohl nicht so wie ich mit das gedacht habe.

Autor: JVogel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weil meine ISR(TIMER2_COMP_vect)

gibt den content auf meiner matrix wieder, bzw ebene für ebene.

Autor: domi nik (dodu3112)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich hab mich mal angemeldet. Kann mir wer sagen wie ich die pwm 
routine jetzt i benutzung der led matrix bekomme? Denn wenn ichh sie 
nicht in meiner isr verwenden kann (die eigentlich die 8 ledsder 
aktuellen reihe setzen soll + gnd fuer die aktuelle reihe). So wie ich 
es momentan habe (in der main) mann ich immer nur eine reihe komplett 
dimmen und nicht die led einzeln. Kann ich irgendwie die methode so 
deklarien, sodass sie in der isr verwendet werden kann und auch 
funktionieren?

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.