Forum: Mikrocontroller und Digitale Elektronik MUX-Shift LED-Matrix C-Code gesucht


von Wegstaben V. (wegstabenverbuchsler)


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

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

ZUsatz-Frage: Gibts für die dargestellte Zeichnung irgendwo auch die 
zugehörigen Eagle-Files?

von Achim M. (minifloat)


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

von Achim M. (minifloat)


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

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

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.

von Achim M. (minifloat)


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

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

> Ein wenig Eigenleistung wird hier schon verlangt.

ist ja nicht daß ich zu faul dafür bin. Ich hatte optimistischerweise 
angenommen, daß da schon mal jemand die Sachen entsprechend im Einsatz 
hat und seinen Code preisgeben mag.

wenn nicht, werde ich mich mal drangeben

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.