Forum: Mikrocontroller und Digitale Elektronik mehrdimensionales array bitweise auslesen


von Mar B. (mar_bu)


Lesenswert?

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 :)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Mar B. (mar_bu)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Mar B. (mar_bu)


Lesenswert?

Danke ich habe es hinbekommen :)

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.