mikrocontroller.net

Forum: Projekte & Code Array umformen


Autor: Klmn Oprst (destroyer)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo erstmal,
ich hoffe das das Thema im richtigen Bereich eröffnet habe.

ich habe volgenedes array für die Ausgabe.
volatile uint8_t anzeige[8] = {
  0b00001000,
  0b00010100,
  0b00100010,
  0b01000001,
  0b00111110,
  0b01000001,
  0b01000001,
  0b01000001
};

jedoch wird das auf dem 8x8 LED Dot Matrix um 90 grad nach rechts 
gedreht angezeigt. (siehe bild)
Leider ist meine platine fast schon fertig, und ich möchte nicht alles 
nochmal löten müssen. (auf dem bild ist die ausgabe auf dem steckbrett 
nachgebildet, damit ich rumexperementieren kann um die anzeige zu 
korrigieren).

Wollte mal fragen ob jemand einen guten lösungsweg kennt, damit ich die 
ausgabe so verdrehen kann, dass es wieder stimmt?

sitze schon seit mehreren stunden dran, komme aber irgendwie nicht 
drauf.
Wäre sehr dankbar für eine hilfe.

DANKE!!!

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht so:
#include <stddef.h>
#include <stdio.h>
#include <stdint.h>

// dreht die Bits in einem Feld mit 8 uint8_t um 90 Grad gegen den Uhrzeigersinn
void drehe_volatile8x8_gegenUZS( volatile uint8_t *anzeige )
{
  uint8_t anzeige_tmp[8] =
    {
      0b00000000,
      0b00000000,
      0b00000000,
      0b00000000,
      0b00000000,
      0b00000000,
      0b00000000,
      0b00000000
    };

  size_t iDreh;

  for( iDreh=0; iDreh<8; ++iDreh )
  {
    size_t  iBit;
    // jeweils die rechte Bitspalte aus anzeige[0...7] in
    // anzeige_tmp[iDreh] kopieren:
    for( iBit=0; iBit<8; ++iBit )
    {
      anzeige_tmp[iDreh] <<= 1; // bisheriges Ergebnis nach links
      anzeige_tmp[iDreh] |= ( anzeige[iBit] & 0b00000001 ); // Bit kopieren
      anzeige[iBit] >>= 1; // verbrauchtes Bit rechts rausschieben
    }
  }

  // zurueckkopieren
  for( iDreh=0; iDreh<8; ++iDreh )
  {
    anzeige[iDreh] = anzeige_tmp[iDreh];
  }

}

int main( int nargs, char **args )
{
  volatile uint8_t anzeige[8] =
    {
      0b00001000,
      0b00010100,
      0b00100010,
      0b01000001,
      0b00111110,
      0b01000001,
      0b01000001,
      0b01000001
    };
  size_t iDreh;

  drehe_volatile8x8_gegenUZS( anzeige );

  for( iDreh=0; iDreh<8; ++iDreh )
  {
    printf( "0x%02x\n", (unsigned)anzeige[iDreh] );
  }

  return 0;
}


HTH
mfgkw

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS:
Die Initialisierung von anzeige_tmp[] kann man sich genau genommen
auch sparen, weil sowieso jedes Bit darin irgendwie neu gesetzt wird.

Autor: Klmn Oprst (destroyer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Vielen dank Klaus, hat mir sehr geholfen, du hast mein tag 
gerettet :-)

Funktioniert einwandfrei.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte.

Der Vollständigkeit halber (weil das hier Codesammlung ist,
und vielleicht jemand mal danach sucht) die andere Richtung:
// dreht die Bits in einem Feld mit 8 uint8_t um 90 Grad im Uhrzeigersinn
void drehe_volatile8x8_inUZS( volatile uint8_t *anzeige )
{
  uint8_t anzeige_tmp[8];
 
  size_t iDreh;

  for( iDreh=0; iDreh<8; ++iDreh )
  {
    size_t  iBit;
    // jeweils die rechte Bitspalte aus anzeige[0...7] in
    // anzeige_tmp[7-iDreh] kopieren:
    for( iBit=0; iBit<8; ++iBit )
    {
      anzeige_tmp[7-iDreh] <<= 1; // bisheriges Ergebnis nach links
      anzeige_tmp[7-iDreh] |= ( anzeige[7-iBit] & 0b00000001 ); // Bit kopieren
      anzeige[7-iBit] >>= 1; // verbrauchtes Bit rechts rausschieben
    }
  }

  // zurueckkopieren
  for( iDreh=0; iDreh<8; ++iDreh )
  {
    anzeige[iDreh] = anzeige_tmp[iDreh];
  }

}

Vielleicht macht es jemand mal etwas einfacher; ich habe
einfach mit 7-... jeweils den Drehsinn geändert und ansonsten
nur kopiert.
Wenn nicht, hat der Optimierer etwas mehr zu tun.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.