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


von Stefan R. (quark48) Benutzerseite


Lesenswert?

Hallo!

Ich lese mein Schieberegister mit nem kleinen C-Programmschnipsel ein:
1
void inp_read()
2
{
3
  INP_PORT |= (1<<INP_PL);
4
  INP_PORT &= ~(1<<INP_PL);  // An /PL neg. stroben!
5
  INP_PORT |= (1<<INP_PL);  // = Eingänge in Speicher lesen!
6
7
  unsigned char bits;
8
9
  // 8 Bits einlesen!
10
  for (bits = 8; bits > 0; bits--)
11
  {
12
    INP_PORT |= (1<<INP_CLK);
13
    INP_PORT &= ~(1<<INP_CLK);  // An Clock neg. stroben!
14
    INP_PORT |= (1<<INP_CLK);  // = Eins weiterschieben!
15
16
    if (INP_PORT2 & (1<<INP_DIN))
17
    {
18
      inp_data[0] |= (1<<bits);
19
    } else {
20
      inp_data[0] &= ~(1<<bits);
21
    }
22
  }
23
24
25
}

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:
1
  
2
    while(1)
3
    {
4
  inp_read();
5
6
  unsigned char bit;
7
    for (bit = 8; bit > 0; bit--)
8
    {
9
      if (inp_data[0] & (1<<bit))
10
      {
11
        lcd_data('1');
12
      } else {
13
        lcd_data('0');
14
      }
15
  }
16
  lcd_home();
17
    }

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

von Sven P. (Gast)


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.

von Stefan R. (quark48) Benutzerseite


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

von Sven P. (Gast)


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.

von Stefan R. (quark48) Benutzerseite


Lesenswert?

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

Stefan

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.