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
ZUsatz-Frage: Gibts für die dargestellte Zeichnung irgendwo auch die zugehörigen Eagle-Files?
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
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.