printf("ledMatrix[%d][%d] ist %d\n",o,i, ledMatrix[o][i]);
67
} else if(ledMatrix[o][i] ==9) {
68
printf("ledMatrix[%d][%d] ist %d -> ueberspringe\n", o,i,ledMatrix[o][i]);
69
}
70
71
if(q == 3){q=0;}else{q++;}
72
}
73
}
74
75
76
for (int wa = 0; wa != 4; wa++)
77
{
78
for (int ui = 0; ui != 6; ui++) {
79
80
printf("%d\t", ledMatrix[wa][ui]);
81
82
}
83
printf("\n\n");
84
}
85
}
86
}
So sieht die binZeit dann aus. 6x4
1000
1100
1010
0000
1000
0100
und das soll in eine 4x6 Matrix.. dabei komm ich nicht weiter. Ich hatte
es mal so weit, dass die Zahlen horizontal eingetragen wurden, aber ich
brauch sie vertikal.
Die 1. Spalte sollte dann so aussehen:
9
9
0
1
Vielleicht kann mir jemand helfen.
Hmm, mich würde mal interessieren, was genau denn das für eine Anwendung
sein soll? Also multiplizieren willst Du die beiden Matrizen binZeit und
led-Matrix nicht miteinander, oder?
Hallo
Da ist erstmal ein Fehler drin:
int binZeit[6][4] = {
{ 0, 0, 0, 0, },
{ 0, 0, 0, 0, },
{ 0, 0, 0, 0, },
{ 0, 0, 0, 0, }
};
6*4 Matrix sieht anders aus.
Ansonsten wird deine Zeit doch ausgegeben. LSB - MSB vertauscht.
Ich verstehe das Problem noch nicht so richtig.
Gruß
Joachim
Schau mal - an dieser Stelle definierst Du ledMatrix mit [4][6]
Luke Skywalker schrieb:> int ledMatrix[4][6] = {Luke Skywalker schrieb:> for (int o=0; o!=6; o++) {>> int q = 3;>> for (int i=3; i!=1; i--) {>>>> if (ledMatrix[o][i] !=9) {
o geht von 0 bis 5, du hast aber oben die erste
Klammer bis 4 gesetzt, da scheint irgendwo der Wurm vielleicht drinnen
zu sein. Vertausch doch einfach mal o und i
if (ledMatrix [i][o] ... dann stimmt zumindest schon mal die Dimension)
>> ledMatrix[o][i] = binZeit[o][q];
Das ganze soll eine Binäruhr werden, ich hätte gern die Matrix direkt
wie die Anzeige später sein soll.
Multiplizieren möchte ich sie nicht. Ich poste mal den gesamten output
mit dem veränderten Teil:
1
for (int o=0; o!=6; o++) {
2
int q = 3;
3
for (int i=3; i!=1; i--) {
4
5
if (ledMatrix[i][o] !=9) {
6
ledMatrix[i][o] = binZeit[o][q];
7
printf("ledMatrix[%d][%d] ist %d\n",o,i, ledMatrix[o][i]);
8
} else if(ledMatrix[i][o] ==9) {
9
printf("ledMatrix[%d][%d] ist %d -> ueberspringe\n", o,i,ledMatrix[o][i]);
10
}
11
12
if(q == 3){q=0;}else{q++;}
13
}
14
}
13:50:12
1000
1100
1010
0000
1000
0100
ledMatrix[0][3] ist 0
ledMatrix[0][2] ist 9
ledMatrix[1][3] ist 0
ledMatrix[1][2] ist 0
ledMatrix[2][3] ist 0
ledMatrix[2][2] ist 1
ledMatrix[3][3] ist 0
ledMatrix[3][2] ist 0
ledMatrix[4][3] ist 0
ledMatrix[4][2] ist 0
ledMatrix[5][3] ist 2
ledMatrix[5][2] ist 1
9 0 9 0 9 0
9 0 0 0 0 0
1 1 1 0 1 0
0 0 0 0 0 0
Blickt ihr genauso wenig durch wie ich?
Luke Skywalker schrieb:> Blickt ihr genauso wenig durch wie ich?
Ja. Aber ich habe den Verdacht, dass hier etwas kompliziert gemacht
werden soll, was anders wesentlich einfacher geht...
Wenn ich das sehe, dann frage ich mich, warum hier nicht einfach
Bitoperationen verwendet werden:
1
while(dezimalzahl!=0){
2
dezimalzahl_rest=dezimalzahl%2;
3
dezimalzahl_new=dezimalzahl/2;
4
dezimalzahl=dezimalzahl_new;
5
binZeit[ix][durchlauf]=dezimalzahl_rest;
6
durchlauf++;
7
}
Und zudem: was passiert denn da, wenn die dezimalzahl schon von herein
mal 0 ist? Klar: die alten Werte bleiben im Array stehen...
Ich würde das mal so probieren:
Luke Skywalker schrieb:> Blickt ihr genauso wenig durch wie ich?
Allerdings.
Ich werde das Gefühl nicht los, dass du dich komplett verrannt hast und
das alles eigentlich sehr viel einfacher gemacht werden kann. Aber ich
hab noch nicht durchschaut was dann weiter mit dem LED Array passieren
soll, daher halte ich meinen Mund.
Bzw. Ich denke, dass du dieses ganze 2D Array gar nicht brauchst.
Bin noch nicht so lang am uC programmieren, deswegen beherrsche ich die
Bitmanipulation noch nicht so recht. Ich denke, dass sich das Array gut
fürs multiplexen eignet, was ich aber auch noch nie gemacht habe.
Lothars Variante scheint zu funktionieren.
Luke Skywalker schrieb:> Ich denke, dass sich das Array gut fürs multiplexen eignet,> was ich aber auch noch nie gemacht habe.
Aber das willst du nicht auf einem uC zum Laufen bekommen, oder? :-o
Stichwort Speicherplatz:
1
intZeit[6];
2
intbinZeit[6][4]={...
3
intledMatrix[4][6]={...
> Lothars Variante scheint zu funktionieren.
Dann war das Problem im frühzeitigen Abbruch der inneren Schleife...
Für diese Anwendung hier könnte ich mir sogar Bitfelder ganz gut
vorstellen, denn im binZeit-Array werden ja nur Bits (0 und 1)
gespeichert...
Luke Skywalker schrieb:> Bin noch nicht so lang am uC programmieren, deswegen beherrsche ich die> Bitmanipulation noch nicht so recht.
Solltest du aber.
Gerade auf einem µC ist das das A und O
> Ich denke, dass sich das Array gut> fürs multiplexen eignet,
wie sind denn deine LED angeschlossen?
(Hoffentlich kommt jetzt keine wilde Verteilung über 25 Ports :-)
Von Bitfeldern hab ich noch nie etwas gehört. :D
Meinst du, dass es mit den Arrays nicht klappen wird? Der Quelltext wird
sich höchstens noch verdoppeln. Das Projek soll auf einem mega16 laufen.
Die Ausgabe ist nun:
13:50:12
1000
1100
1010
0000
1000
0100
ledMatrix[0][3] ist 0
ledMatrix[0][2] ist 0
ledMatrix[1][3] ist 0
ledMatrix[1][2] ist 0
ledMatrix[2][3] ist 0
ledMatrix[2][2] ist 1
ledMatrix[3][3] ist 0
ledMatrix[3][2] ist 0
ledMatrix[4][3] ist 0
ledMatrix[4][2] ist 0
ledMatrix[5][3] ist 2
ledMatrix[5][2] ist 1
1 0 0 0 0 1
0 0 0 0 0 0
1 1 1 0 1 0
0 0 0 0 0 0
Und der Quelltext:
1
#include <stdio.h>
2
#include <stdlib.h>
3
//Variablen für die Zeit
4
volatile unsigned int millisekunden;
5
volatile unsigned int sekunde;
6
volatile unsigned int minute;
7
volatile unsigned int stunde;
8
9
int Zeit[6];
10
int binZeit[4][4] = {
11
{ 0, 0, 0, 0, },
12
{ 0, 0, 0, 0, },
13
{ 0, 0, 0, 0, },
14
{ 0, 0, 0, 0, }
15
};
16
int ledMatrix[4][6] = {
17
{ 9, 0, 9, 0, 9, 0, },
18
{ 9, 0, 0, 0, 0, 0, },
19
{ 0, 0, 0, 0, 0, 0, },
20
{ 0, 0, 0, 0, 0, 0, }
21
};
22
int counter = 0;
23
int dezimalzahl,dezimalzahl_rest,dezimalzahl_new,durchlauf = 0;
printf("ledMatrix[%d][%d] ist %d\n",o,i, ledMatrix[o][i]);
64
} else if(ledMatrix[i][o] ==9) {
65
printf("ledMatrix[%d][%d] ist %d -> ueberspringe\n", o,i,ledMatrix[o][i]);
66
}
67
68
if(q == 3){q=0;}else{q++;}
69
}
70
}
71
72
73
for (int wa = 0; wa != 4; wa++)
74
{
75
for (int ui = 0; ui != 6; ui++) {
76
77
printf("%d\t", ledMatrix[wa][ui]);
78
79
}
80
printf("\n\n");
81
}
82
}
83
}
LED? Angeschlossen? Öhm, nunja.. dachte ich probier erstmal ein bisschen
mit der Grundstruktur und mach mir dann Gedanken über die Ansteuerung.
Wie gesagt soll sie über Multiplexing laufen.
Luke Skywalker schrieb:> Von Bitfeldern hab ich noch nie etwas gehört. :D
Die brauchst du hier auch nicht.
Aber mit einem uint8_t hast du automatisch 8 Bit bekommen, die entweder
0 oder 1 sind.
Wenn du an einen µC Port 8 Led anschliest und einen uint8_t hast
uint8_t wert;
und diesen wert auf 0 setzt und auf den Port ausgibst, an dem die LED
sind
wert = 0;
PORTB = wert;
dann leuchtet gar keine LED (oder alle, je nachdem wie rum die LED
angeschlossen sind)
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| | | | | | | | |
+---+---+---+---+---+---+---+---+
gibst du 1 aus
wert = 1;
PORTB = wert;
dann leuchtet 1 LED
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| | | | | | | | * |
+---+---+---+---+---+---+---+---+
gibst du 2 aus
wert = 2;
PORTB = wert;
dann leuchtet die nächste LED
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| | | | | | | * | |
+---+---+---+---+---+---+---+---+
bei einer 3, leuchten dann alle beide
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| | | | | | | * | * |
+---+---+---+---+---+---+---+---+
und so weiter und so weiter. Dies deshalb, weil die Binärdarstellungen
der Zahlen (also so wie sie im µC tatsächlich gespeichert sind) so
aussehen:
0 00000000
1 00000001
2 00000010
3 00000011
4 00000100
5 00000101
6 00000110
7 00000111
8 00001000
9 00001001
etc. etc.
schliesst du an jedes der 8 Bit eines Ports direkt eine LED an, dann
zeigt dir jede LED von sich aus an, ob an einer bestimmten Bitposition
ein 0-Bit oder ein 1-Bit vorliegt.
Das heisst aber auch: Du brauchst eine Zahl gar nicht selber in Bits
aufdröseln. Du gibst die Zahl einfach an den Port aus und die LED zeigen
von selbst die Binäre Darstellung dieser Zahl an. Dies deshalb, weil die
Zahl intern sowieso als Bitmuster vorliegt.
> Meinst du, dass es mit den Arrays nicht klappen wird?
Schon. Aber du brauchst kein 2D Array
> LED? Angeschlossen? Öhm, nunja.. dachte ich probier erstmal ein bisschen> mit der Grundstruktur und mach mir dann Gedanken über die ansteuerung.
Wie wärs, wenn du erst mal einfach nur 8 LED an einem Port anschliesst
und dann damit ein bischen experimentierst?
Zb wie muss eine Zahl aussehen (welches Bitmuster muss sie haben) damit
LED x, LED y und LED z leuchten. Was machen die LED wenn man
nacheinander einfach alle Zahlen von 0 bis 255 auf den Port ausgibt. Was
muss ich tun, wenn ich ein Lauflicht haben will. etc. etc.
Du wirst dabei viel über Zahlensysteme lernen und wie wir eigentlich
rechnen. Du wirst auch lernen, was es mit dem Binärsystem auf sich hat,
und dass Dezimal-, Hex- und Binär einfach nur verschiedene Schreibweisen
desselben Sachverhalts sind und das dir die LED den Sachverhalt
anzeigen, unabhängig davon ob du jetzt Dezimal-, Hex- oder
Binärschreibweise bevorzugst.
Von der Übung in Programmieren mal ganz abgesehen.
> Meinst du, dass es mit den Arrays nicht klappen wird?
int Zeit[6] = 6*4 = 24 Byte
int binZeit[4][4] = 16*4 = 64 Byte
int ledMatrix[4][6] = 24*4 = 96 Byte
Das würde vom Speicherplatz her schon noch gehen, aber ich sehe arge
Zeitprobleme (auf dem uC) wegen der Pointermanipulationen auf dich
zukommen. Verwende doch besser gleich die Datentypen, die der uC am
besten kann. Im Falle AVR sind das char (aka. uint8_t).
Du willst doch eine Zahl zwischen 60 bzw. 24 binär als LEDs ausgeben.
Warum verteilst Du diese binäre Zahl auf verschiedene Variablen.
Wenn Du in einem Byte (ich glaube der C-Datentyp auf dem AVR ist
"uint_8t") zum Beispiel 55 für 55 Sekunden stehan hast ist das binär
00110111.
Wenn Du jetzt an einem PortX deine 6 LEDs anschliesst und den Wert aus
deiner Variablen in das Port Ausgaberegister schreibst, dann sind genau
die Portausgänge logisch high, die du brauchst. Also nur die LEDs an die
6 niederwertigen Portbits anschliessen und Du hast automatisch deine
Sekunden LEDs.
Du brauchst also nichts weiter als 3 Bytes für Stunden, Minuten und
Sekunden, und entweder 3Ports für die LEDs oder 1 Port und weitere 3
Bits um die Gruppen für St. Min. und Sek. zu multiplexen.
Vielen Dank für diese ausführliche Erlärung.
Anfangs habe ich einfach PORTB = z.B. 13 geschrieben. Problem ist aber
doch, dass ich 6 "Spalten" hab, die ich unabhängig von einander
ansteuern muss. (hh:mm:ss)
Hätte ich 6 Ports, würde es ja aufgehen :D
Ich benötige also diese Aufteilung um die Ansteuerung zu erledigen.
Luke Skywalker schrieb:> Anfangs habe ich einfach PORTB = z.B. 13 geschrieben. Problem ist aber> doch, dass ich 6 "Spalten" hab, die ich unabhängig von einander> ansteuern muss. (hh:mm:ss)> Hätte
Nein, Du hast 3 Reihen, nämlich Stunden, Minuten und Sekunden.
Luke Skywalker schrieb:> Vielen Dank für diese ausführliche Erlärung.> Anfangs habe ich einfach PORTB = z.B. 13 geschrieben. Problem ist aber> doch, dass ich 6 "Spalten" hab, die ich unabhängig von einander> ansteuern muss. (hh:mm:ss)
Warum?
> Hätte ich 6 Ports, würde es ja aufgehen :D
Du multiplext doch?
> Ich benötige also diese Aufteilung um die Ansteuerung zu erledigen.
Brauchst du nicht.
Ob du deine 4 zusammengehörenden LED optisch in Form einer Zeile oder
optisch in Form einer Spalte anordnest, ist doch eine reine Frage
dessen, wie du die LED in das Brett mit den Löchern setzt und diese LED
verkabelst.
Genau darum hab ich gefragt, wie deine LED angeschlossen sind.
An einem Port hast du alle 4 LED einer Stelle (ob du die dann als
nebeneinaderliegende LED in Form einer Zeile oder als
übereinanderliegende LED in Form einer Spalte präsentierst ist eine
reine Frage der Verkabelung)
Weist du also dem Port die Zahl 9 zu, dann brennen dort die LED
X O O X
und an einem anderen Port wählst du aus, welche der 6 Zeilen dieses
Muster anzeigen muss. Aber auf jeden Fall brauchst du nur einen uint8_t
um diese 9 zu speichern. Für alle 6 Stellen also 6 Stück uint8_t
(Und die kann man natürlich in einem Array realisieren)
Du machst dir hier viel zu viel Arbeit, indem du versuchst die Bits zu
"drehen" um Zeilen mit Spalten zu vertauschen.
U.R. Schmitt schrieb:> Luke Skywalker schrieb:>> Anfangs habe ich einfach PORTB = z.B. 13 geschrieben. Problem ist aber>> doch, dass ich 6 "Spalten" hab, die ich unabhängig von einander>> ansteuern muss. (hh:mm:ss)>> Hätte>> Nein, Du hast 3 Reihen, nämlich Stunden, Minuten und Sekunden.
Er will Zehner und Einer trennen.
Dagegen ist auch nichts zu sagen.
Daher 6 Zeilen
Luke Skywalker schrieb:> Problem ist aber doch, dass ich 6 "Spalten" hab, die ich unabhängig> von einander ansteuern muss. (hh:mm:ss)
Zeichne doch mal einen Schaltplan (oder eine Skizze), wie du das
realisieren willst. Erst mit einem vernünftigen Hardwarekonzept kann ein
sinnvolles Softwarekonzept erstellt werden...
Ich kann keien Schaltpläne zeichenen, hab das noch nie gemacht und bin
kein Hobbyelektroniker. Wie genau das multiplexen geht weiß ich auch
nicht, ich hab einfach mit der der Software eingefangen bis zu diesem
Punkt der Ansteuerung, jetzt mach ich mir erst Gedanken darüber. Bisher
hab ich ja nur erstmal die Grundlagen gesetzt..Uhr geschriben mit
Timerinterrupt, Umwandlung in Binärzahlen(was ja nun anscheinend nicht
mehr nötig ist).
Luke Skywalker schrieb:> Punkt der Ansteuerung, jetzt mach ich mir erst Gedanken darüber. Bisher> hab ich ja nur erstmal die Grundlagen gesetzt..Uhr geschriben mit> Timerinterrupt, Umwandlung in Binärzahlen(was ja nun anscheinend nicht> mehr nötig ist).
Mit scheint, du hast ein paar nicht ganz unwesentliche
Grundlagenprogramme komplett ausgelassen. Und das rächt sich jetzt.
Daher auch weiter oben der Vorschlag, das jetzt alles nachzuholen und
einfach mal 8 LED an einen Port anzuschliessen.
> Ich kann keien Schaltpläne zeichenen, hab das noch nie gemacht
Aber du willst einen uC programmieren, der das später auf LEDs anzeigt?
> Bisher hab ich ja nur erstmal die Grundlagen gesetzt..
Deine Vorgehensweise ist bestenfalls suboptimal zu nennen...
8 LED anzuschließen werd ich ja hinbekommen und sie gezielt zu schalten.
Hätte ich angenommen 6 Ports würde ich es auch so hinbekommen. Das
Problem ist aber doch, dass ich eine Methode brauch über wenig Ports
viele LED zu schalten. Das ist einfach eine andere Dimension im
Vergleich dazu jeder LED einen Pin auf einem Port zu reservieren.
Luke Skywalker schrieb:> 8 LED anzuschließen werd ich ja hinbekommen und sie gezielt zu schalten.
offenbar aber nicht, nach dem was du weiter oben gezeigt hast.
> Hätte ich angenommen 6 Ports würde ich es auch so hinbekommen.
Vergiss das einfach mal.
Nimm an du hättest die 6 Ports.
Du hast 6 Variablen, die jede für sich einen 'virtuellen Port'
realisieren.
1
utin8_tDigits[6];
da sind sie.
Wie du dann diese 6 'virtuellen Ports' an die tatsächlichen Ports
bekommst (per Multiplex) ist ein anderes Thema.
> viele LED zu schalten. Das ist einfach eine andere Dimension im> Vergleich dazu jeder LED einen Pin auf einem Port zu reservieren.
Du denkst zu kompliziert.
>> Das Problem ist aber doch, dass ich eine Methode brauch über wenig Ports>> viele LED zu schalten.
Ist hier im Thread das Thema "Multiplexen" eigentlich schon mal
angesprochen worden?
Karl heinz Buchegger schrieb:> Luke Skywalker schrieb:>> 8 LED anzuschließen werd ich ja hinbekommen und sie gezielt zu schalten.>> offenbar aber nicht, nach dem was du weiter oben gezeigt hast.
Sachen wie PORTD = (0 << PD7) usw. bekomm ich grade noch so hin.
Das Multiplexen kam von mir, da ich weiß, dass man das Problem damit
lösen kann. Ich denke ich muss in wenig in der Elektronik nachholen und
klären wie Multplexing funktioniert.
Luke Skywalker schrieb:> Karl heinz Buchegger schrieb:>> Luke Skywalker schrieb:>>> 8 LED anzuschließen werd ich ja hinbekommen und sie gezielt zu schalten.>>>> offenbar aber nicht, nach dem was du weiter oben gezeigt hast.>> Sachen wie PORTD = (0 << PD7) usw. bekomm ich grade noch so hin.
:-)
Das von dir angegebene Statement verändert den Port D nicht.
Passt wie die Faust aufs Auge, dass dir einiges an Grundlagenwissen
fehlt.
Wäre trotzdem jemand so nett und könnte mir das multiplexing speziell
auf dieses Problem erklären? Was brauch ich dafür an Grundkenntnissen in
der Elektronik?
@Karl heinz Buchegger:
fail! Auf jedenfall kann ich aber Pins schalten, glaub mir. Hier mal
mein bisher bestes Projekt
http://il.youtube.com/watch?v=klT28RR5xfM&feature=related :D
Luke Skywalker schrieb:> Wäre trotzdem jemand so nett...
Wärst du mal so nett, wenigstens zu versuchen dich mal ein wenig selber
zu infomieren? :-/
Du bist schliesslich nicht der erste, der sowas macht.
Such doch mal hier im Forum nach "LED-Matrix" und "multiplexen"
Oder sieh dir wenigstens den Artikel zum Thema an:
http://www.mikrocontroller.net/articles/LED-Matrix
Karl heinz Buchegger schrieb:> Luke Skywalker schrieb:>>> fail! Auf jedenfall kann ich aber Pins schalten, glaub mir. Hier mal>> mein bisher bestes Projekt>> http://il.youtube.com/watch?v=klT28RR5xfM&feature=related :D>> OK.> Das beruhigt mich wieder ein bischen.
Puh, dachte schon ich bin unten durch :D
Ich denke ich habs nun so weit verstanden mit dem multiplexen. Werde nun
erstmal ein bisschen schauen wie es mit der Stromversorgung für so viele
LED aussieht und was ich für Widerstände brauch...Hab bisher immer LED +
Batterie gemacht und dann haben meine Elektrokentnisse aufgehört. (Also
im Klartext, immer i.wie hingefriemelt)
Melde mich dann wieder mit Problemen. Vielen Dank.
Luke Skywalker schrieb:> Ich kann keien Schaltpläne zeichenen, hab das noch nie gemacht und bin> kein Hobbyelektroniker.
Dann solltest Du damit anfangen. wenn Du Schaltpläne verstehst, kannst
Du auch welche zeichnen. Wund wenn Du keine verstehst, kannst Du auch
keine eigene µC Schaltung entwerfen und bauen.
Karl heinz Buchegger schrieb:> Er will Zehner und Einer trennen.> Dagegen ist auch nichts zu sagen.>> Daher 6 Zeilen
Ok, sorry hatte ich nicht gesehen, kann man machen ist aber
ungewöhnlich.
@Luke:
Dann versuche doch erst mal einfach 4 oder 6 LEDs an einen Port
anzuschliessen und dann mal nur die Stunden oder Minuten oder Sekunden
auszugeben. Wenn das funktioniert, dann kommt der nächste Schritt,
nämlich die Aufteilung in Zehner und Einer.
Wenn das funktioniert kommt das Multiplexing. Aber dazu musst Du etwas
Ahnung von Schaltungstechnik und Elektronik haben, ausser du erwartet
vom Forum eine fertige Lösung die man einfach ohne Kenntnisgewinn
nachbauen kann. Möglichst noch mit fertigem Programm.