Schönen guten Tag zusammen,
ich wollte mich über die Feiertage ein wenig weiter mit meiner 8x8
Matrix beschäftigen, aber stehe vor einem kleinen (in meinen Augen)
Problem.
Zur Aufgabenstellung.
Ich habe den µC 8051 und den Maxim7219, als include Datei dient nur die
reg52.h den rest schreibe ich selbst.
Die Verbindung, Portbelegung etc ist alles vorhanden.
Ich möchte diese mit SPI überttragen.
Nun zum eigentlichem Probelm
Ich habe ein festgelegtes array das wie folgt aussschaut
code char zahl[10][8] = { {0b00000000, 0b00111100, 0b00100100,
0b00100100, 0b00100100, 0b00100100, 0b00100100, 0b00111100},
usw.
}
Das erste Array (in diesem Fall 10) soll von außen anwählbar sein, z.B
durch Dipstellungen oder Sensoren.
Ich muss das 2. Array aber dann auslesen um die Zahl darzustellen.
Mein Problem besteht darin das ich zwar weiß das ich erst das MSB
brauche und diese auch in ein anderes array schreiben sollte aber mir
fällt absolut nichts ein wie ich die Bitfolge umändere und somit später
über die DIN es an die Matrix richtig wieder ausgebe.
Ich hoffe um eine kleine Hilfestellung und bedanke mich schonmal recht
herzlich im voraus :)
Markus Buricke schrieb:
>
> Ich hoffe um eine kleine Hilfestellung und bedanke mich schonmal recht
> herzlich im voraus :)
Leg dir deine 'Vorlagen-Arrays' gleich so zurecht, dass du sie einfach
in den Ausgabetreiber kopieren kannst ohne Bitmanipulationen machen zu
müssen.
Karl Heinz schrieb:
> Markus Buricke schrieb:
>
>>
>> Ich hoffe um eine kleine Hilfestellung und bedanke mich schonmal recht
>> herzlich im voraus :)
>
> Leg dir deine 'Vorlagen-Arrays' gleich so zurecht, dass du sie einfach
> in den Ausgabetreiber kopieren kannst ohne Bitmanipulationen machen zu
> müssen.
Denn ob du mittels 1 | code char zahl[10][8] = { {0b00000000, 0b00111100, 0b00100100, 0b00100100, 0b00100100, 0b00100100, 0b00100100, 0b00111100},
|
dir das auszugebende Zeichen zeilenweise definierst und als Ausgabe
erhalten willst: 1 |
| 2 | ........
| 3 | ..XXXX..
| 4 | ..X..X..
| 5 | ..X..X..
| 6 | ..X..X..
| 7 | ..X..X..
| 8 | ..X..X..
| 9 | ..XXXX..
|
oder ob du selber, ganz einfach die Bits anstatt in Zeilen in Spalten in
deinem Code organisierst 1 | code char zahl[10][8] = { {0b00000000, 0b0000000, 0b01111111, 0b01000001,
| 2 | 0b01000001, 0b1111111, 0b00000000, 0b00000000 },
| 3 | ...
|
ist für dich Jacke wie Hose. Aber Codetechnisch müsstest du im ersten
Fall die Spiegelung im Code vornehmen, während du im zweiten Fall die
Spiegelung schon im Vorfeld gemacht hast und sie daher dein µC nicht
mehr im Code machen muss.
Eine derartige Spiegelung ist zwar codetechnisch jetzt nicht das ganz
große Kino, aber sie ist lästig und mit ein wenig Vorbereitung auch
nicht notwendig.
Karl Heinz erstmal danke für deine schnelle Antwort.
Dieses wäre die einfachste Methode da hast du recht. Nur ich möchte
gerne was dazu lernen und verstehen wie sowas geht.
Ich würde es vielleicht später erweitern indem ich ins Array die ascii
Tabelle hinterlege.
Markus Buricke schrieb:
> Karl Heinz erstmal danke für deine schnelle Antwort.
>
> Dieses wäre die einfachste Methode da hast du recht. Nur ich möchte
> gerne was dazu lernen und verstehen wie sowas geht.
Na. ja. So wie immer.
Bitoperationen halt. Und, Oder, Schiebeoperationen, Negierungen.
Wie setzt du denn 1 Bit in einer Variablen? Wie löscht du 1 Bit in einer
Variablen? Wie prüfst du, ob 1 Bit in einer Variablen gesetzt ist?
Das alles solltest du eigentlich schon längst in den ganzen
vorhergehenden Übungen mit Leds, blinkenden Leds, Lauflichtern bis zum
Erbrechen geübt haben und im Schlaf beherrschen.
Der Rest ist dann nicht mehr als ein paar for-Schleifen drüber gelegt,
in denen alle 7-ten Bits der 8 Einzelbytes abgefragt werden und in die 8
Bits des 7.ten Bytes zusammengefasst werden, das dann an die Matrix
weitergeht. (die 7 ist hier nur beispielhaft)
Mal dir 2 Gitter auf, mit den 8*8 Bit und mal dir Pfeile ein, welches
Bit vom Ausgangsgitter an welche Position im Ergebnisgitter kommen muss.
Dann ergeben sich die Schleifen recht zwangsläufig
1 | for( j = 0; j < 8; j++ )
| 2 | {
| 3 | for( i = 0; i < 8; i++ )
| 4 | {
| 5 | if( Bit_j_vom_Byte_i ist gesetzt )
| 6 | Setze Bit_i_vom_Byte_j im Ergebnis
| 7 | else
| 8 | Lösche Bit_i_vom_Byte_j im Ergebnis
| 9 | }
| 10 | }
|
(optimierungen sind noch möglich, wenn man dann den konkreten Code vor
sich hat)
Karl Heinz schrieb:
> 1 | >
| 2 | > for( j = 0; j < 8; j++ )
| 3 | > {
| 4 | > for( i = 0; i < 8; i++ )
| 5 | > {
| 6 | > if( Bit_j_vom_Byte_i ist gesetzt )
| 7 | > Setze Bit_i_vom_Byte_j im Ergebnis
| 8 | > else
| 9 | > Lösche Bit_i_vom_Byte_j im Ergebnis
| 10 | > }
| 11 | > }
| 12 | >
|
Dafür machst du dir eine Funktion, die das für ein 1-Dimensionales
Ausgangsarray macht.
Und in diese Funktion steckst du dann die 'Arrayzeile' aus deiner
Tabelle rein. Ein 2-d Array ist ja auch nichts anderes, als 10 mal ein
1-d Array bestehend aus 8 zusammengehörenden Bytes, die hintereinander
im Speicher angeordnet sind. Aus diesen 10 Stück 1-d Arrays wählst du
das eine aus, das dich interessiert und übergibst dessen Startadresse an
die Funktion.
1 | void foo( uint8_t codes[8] )
| 2 | {
| 3 | uint8_t i;
| 4 |
| 5 | for( i = 0; i < 8; i++ )
| 6 | mach was mit codes[i]
| 7 | }
| 8 |
| 9 | void bar()
| 10 | {
| 11 | uint8_t totalCodes[10][8] = ...
| 12 |
| 13 | foo( totalCodes[3] ); // die 4.te Zeile
| 14 | foo( totalCodes[5] ); // die 6.te Zeile
| 15 | }
|
Organisation ist in der Programmierung das halbe Leben. "Komplizierte"
Datenstrukturen bricht man sich zur Verarbeitung eben runter auf die
Teile, die man tatsächlich braucht. Bei dir ist das eben dann genau die
eine Zeile aus dem kompletten Array, welche dich im Moment interessiert.
Danke ich habe es hinbekommen :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|