MUX-Shift LED-Matrix C-Code gesucht

OP #2390636
gibt es hier irgendwo ein C-Code-Schnipsel, um die dargestellte 
LED-Matrix mit Schieberegister anzusteuern? Am liebsten wäre mir eine 
"nicht-SPI-Version".

Ich wäre interssiert an
a) reiner "binärbetrieb" (aus, an)
b) 3 Helligkeitsstufen (LED aus, 20%, an)
c) kontinuierliche PWM

b und c ist jedoch eher Kür als wirklich notwendig

http://www.mikrocontroller.net/attachment/123772/LED_Matrix_8x5.png

Das ganze soll initial auf einem ATTiny4313 zu laufen kommen
1
#define MYPORT PORTB
2
#define MYDDR  DDRB
3

4
#define CLK   (1<<PB7)
5
#define DAT   (1<<PB6)
6
#define LATCH (1<<PB5)
7

8
uint8_t displaypuffer[5];
9

10
void port_init(void)
11
{
12
   MYPORT = 0x00;
13
   MYDDR  = CLK | DAT | LATCH;
14
}
15

16
void schieb_raus(uint16_t data)
17
{
18
   uint8_t mask = 0b0001000000000000;
19

20
   while(mask)
21
   {
22
      if(mask & data)
23
      {
24
         MYPORT |= DAT;
25
      }
26
      else
27
      {
28
         MYPORT &= ~DAT;
29
      }
30
      MYPORT |= CLK;
31
      mask = mask >> 1;//diese operation verlaengert den shift-puls
32
      MYPORT &= ~CLK;
33
   }
34
   //Latchpuls erzeugen
35
   MYPORT |= LATCH;
36
   asm("nop");//reicht das?
37
   MYPORT &= ~LATCH;
38
}
39

40

41
void stueckel_zusammen(uint8_t spaltennummer, uint8_t welche_LEDs_sind_an)
42
{
43
   //spaltennummer zu passendem bitmuster konvertieren
44
   spaltennummer = 1 << spaltennummer;
45
   
46
   //raus damit
47
   schieb_raus((uint16_t) (spaltennummer << 8) | welche_LEDs_sind_an));
48
}
49

50
void display_aktualisieren(void)
51
{
52
   uint8_t i;
53
   for(i = 0; i < 5; i++)
54
      stueckel_zusammen(i, displaypuffer[i]);
55
}
Ich hoffe das funktioniert einigermaßen.
mfg mf
Anmerkung hinterher: es funktioniert natürlich nur, wenn man im mainloop 
nur display_aktualisieren aufruft. Das Problem ist, dass eine Spalte 
direkt hinter der anderen gezeichnet wird. Zu Ende der Funktion bleibt 
nur die letzte Spalte an. Besser wäre es da, in einem Timerinterrupt 
einen Spaltenzähler hochzuzählen und pro Timerinterrupt nur eine Spalte 
auszugeben.
mfg mf
OP
ja, ich hatte mir das schon "kombiniter" vorgestellt (ISR und 
Hauptprogramm getrennte Routinen)

Von Ulrich Radig gibt es ja Code und Schaltung in reiner 
parallel-Ansteuerung (Ohne Schiebregister).

Ich hatte jedoch gehofft, daß jemand mal die Hardware und Software auf 
"Schieberegister-Variante" erweitert hat.
Wegstaben Verbuchsler schrieb:
> Ich hatte jedoch gehofft, daß jemand mal die Hardware und Software auf
> "Schieberegister-Variante" erweitert hat.

Wenn du jetzt die Radig Variante hernimmst und statt auf Ports zu 
schreiben in zwei Variablen, dann musst du diese zwei Variablen wie in 
der Stueckel-zusammen-Funktion in der zweiten Zeile zusammensetzen.
Ein wenig Eigenleistung wird hier schon verlangt.

BTW, SPI wird wesentlich schneller gehen, da man bei einem ATmega mit 
der SPI-Frequenz bis F_CPU/2 gehen kann.

mfg mf

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.