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


von JVogel (Gast)


Angehängte Dateien:

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.

1
ISR(TIMER2_COMP_vect)
2
{
3
  PORTC = 0xFF; // Turn all cathode layers off. (all transistors off)
4
  PORTA = 0x00;//Turn off output
5
  PORTA = cube[current_layer]; //Load bytes unsigned char CUBE[8]
6
  PORTC ^= (1 << current_layer);
7
8
    if (current_layer == 8)
9
    {
10
       current_layer = 0;
11
    }
12
}
13
14
15
void ioinit (void)
16
{
17
  DDRA = 0xff;  // DATA bus output
18
  DDRC = 0xff;  // Layer select output  
19
20
  PORTA = 0x00; // Set data bus off
21
  PORTC = 0x00; // Set layer select off
22
23
  OCR2 = 10;   // interrupt at counter = 10
24
      TCCR2 |= (1 << CS20) | (1 << CS22); // Prescaler = 128.
25
  TCCR2 |= (1 << WGM21); // CTC mode. Reset counter when OCR2 is reached.
26
  TCNT2 = 0x00;  // initial counter value = 0;
27
  TIMSK |= (1 << OCIE2); // Enable CTC interrupt
28
}


jetztiges Fake pwm. Funktioniert aber nur bedingt und die leds sind 
trozdem noch relativ hell oder flakern.
1
volatile unsigned char cubebrightness[CUBE_SIZE][CUBE_SIZE];
2
volatile unsigned char cubebrightnesscount[CUBE_SIZE][CUBE_SIZE];
3
4
Im Timer interrupt:
5
6
temp  = cube[current_layer];
7
      for(i = 0;i<8;i++)
8
      {
9
        cubebrightnesscount[i][current_layer]++;
10
          if(cubebrightnesscount[i][current_layer]<cubebrightness[i][current_layer])
11
          {
12
            temp &= ~(1<<i);
13
            
14
          }
15
          else
16
          {
17
            cubebrightnesscount[i][current_layer]=0;
18
          }
19
      }
20
      PORTA = temp;

Wie kann ich das hier besser machen?

von Falk B. (falk)


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

von JVogel (Gast)


Lesenswert?

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

von JVogel (Gast)


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.

von Falk B. (falk)


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

von JVogel (Gast)


Lesenswert?

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

von JVogel (Gast)


Lesenswert?

hab jetzt:
  TCCR2 |= (1 << CS21);
gemacht und folgenden code in den interrupt gestopft
1
    for(i = 0;i<8;i++)
2
      {
3
        
4
        if((cube[0][current_layer]& 1<<i) &&( dimcount<cubebrightness[i][current_layer]))
5
        {
6
           temp |= (1<<i);
7
        }
8
      }
9
      PORTA = temp;

funktionieren tut es allerdings leider nicht.

von JVogel (Gast)


Lesenswert?

bei brightness 0 aus und bei brightness 1 schon fst volle helligkeit

von Falk B. (falk)


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

von JVogel (Gast)


Lesenswert?

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

von jvogel (Gast)


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

von JVogel (Gast)


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
1
 uint8_t t2[8]={255, 40, 3, 17, 150, 99, 5, 9};
2
 memcpy(pwm_setting,t2 , 8);
3
    pwm_update();

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

ISR(TIMER2_COMP_vect)
{

}


mache.

von Falk B. (falk)


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

von JVogel (Gast)


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.

von JVogel (Gast)


Lesenswert?

weil meine ISR(TIMER2_COMP_vect)

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

von domi n. (dodu3112)


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?

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.