LED-Matrix -> Multiplex und jetzt PWM?

Gast #2099045
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?
Angehängte Dateien:
#2099084
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
Gast #2099170
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.
Gast #2099404
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.
#2099436
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
#2100813
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren