mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schieberegister lesen vs. Array / Variable mit C


Autor: Stefan R. (quark48) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich lese mein Schieberegister mit nem kleinen C-Programmschnipsel ein:
void inp_read()
{
  INP_PORT |= (1<<INP_PL);
  INP_PORT &= ~(1<<INP_PL);  // An /PL neg. stroben!
  INP_PORT |= (1<<INP_PL);  // = Eingänge in Speicher lesen!

  unsigned char bits;

  // 8 Bits einlesen!
  for (bits = 8; bits > 0; bits--)
  {
    INP_PORT |= (1<<INP_CLK);
    INP_PORT &= ~(1<<INP_CLK);  // An Clock neg. stroben!
    INP_PORT |= (1<<INP_CLK);  // = Eins weiterschieben!

    if (INP_PORT2 & (1<<INP_DIN))
    {
      inp_data[0] |= (1<<bits);
    } else {
      inp_data[0] &= ~(1<<bits);
    }
  }


}

Das Programm funktioniert übrigens, wenn ich zur Diagnose einfach 
anstatt "inp_data[0] |= (1<<bits);" die Eins oder Null am LCD ausgebe. 
Also die Verkabelung ist Ok, der Programmablauf auch.

Nur die Sache mit dem Array ist etwas doof. Ich würde gern die acht Bits 
reinstopfen und dann später abfragen können.

Und im Hauptprogramm versuche ich so, den Array zu lesen:
  
    while(1)
    {
  inp_read();

  unsigned char bit;
    for (bit = 8; bit > 0; bit--)
    {
      if (inp_data[0] & (1<<bit))
      {
        lcd_data('1');
      } else {
        lcd_data('0');
      }
  }
  lcd_home();
    }

Das Problem liegt im Handling des Arrays in C.

Wie kann ich also die in der Einlese-Prozedur gemerkten Bits irgendwie 
möglichst stinkeinfach in ner Variable/Array speichern und auch wieder 
stinkeinfach abfragen?

Danke schonmal für eure hoffentlich hilfreichen Tipps! :-)

Stefan

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anders gehts nicht, es gibt in C keinen Datentyp, der ein Bit lang ist, 
also auch keine Arrays desselben.

Spendier jedem Bit ein eigenes Byte und dann hat sichs, oder sind wir 
auf einem AVR? Falls ja, hast du dir mit (1<<bit) mit Abstand eine 
unglaublich aufwendige Operation eingehandelt :-)

Denk also mal über Makros und/oder ganze Bytes nach.

Autor: Stefan R. (quark48) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Ding läuft auf nem AVR! ^^
Du hast recht, vielleicht probier ichs mit ganzen Bytes: 
inp_data[BYTENUMMER].

Wie meinst du das mit "hast du dir mit (1<<bit) mit Abstand eine
unglaublich aufwendige Operation eingehandelt"?

Stefan

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, im Befehlssatz der AVR gibts nur Instruktionen, die um eine Stelle 
verschieben. Wenn du jetzt sowas wie (1<<bits) machst, wird daraus eine 
Schleife, die 'bits'-Mal diese Schiebeinstruktion aufruft.

Autor: Stefan R. (quark48) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso.
Danke übrigens, das mit dem Byteweise-Arbeiten funktioniert wunderbar! 
:-)

Stefan

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.