LED-Matrix -> Multiplex und jetzt PWM?

Gast #2099045
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:
Gast
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.
@  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
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
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
Gast
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.
@  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
Gast
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.
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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.