MUX-Shift LED-Matrix C-Code gesucht

OP #2390636
Lesenswert?

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
#2390702
Lesenswert?

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
#2390714
Lesenswert?

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
#2391272
Lesenswert?

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

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