Forum: Compiler & IDEs Problem mit Schieberegister


von ben (Gast)


Lesenswert?

Hallo,

möchte pber ein 74xx165 Schieberegister Daten einlesen und verwende dazu 
folgenden Code, der auch funktioniert (Ich möchte dafür kein SPI 
verwenden).:
1
//--Schnipp
2
3
M_LATCH_L;            //Paralell in 
4
M_LATCH_H; 
5
6
unsigned char in=0;
7
      
8
   for(unsigned char i=0; i< 8; i++)
9
   {
10
      M_CLK_H; //Clock high
11
      
12
      //read bit
13
      in = (in << 1);
14
      in |= ((M_IN_PIN >> M_IN_PINNR) & 1);
15
      
16
      M_CLK_L;
17
   }
18
              
19
//--Schnapp

Nun wollte ich noch ein weiteres neuntes bit einlesen und habe gedacht 
ich löse das so:
1
//--Schnipp
2
3
M_LATCH_L;            //Paralell in 
4
M_LATCH_H; 
5
6
unsigned char in=0;
7
unsigned char in2=0;
8
9
      
10
   for(unsigned char i=0; i< 9; i++)
11
   {
12
      M_CLK_H; //Clock high
13
      
14
      if(i < 8)
15
      {
16
         //read bit
17
         in = (in << 1);
18
         in |= ((M_IN_PIN >> M_IN_PINNR) & 1);
19
      }
20
      else
21
      {
22
         in2 = ((M_IN_PIN >> M_IN_PINNR) & 1);
23
      }
24
      M_CLK_L;
25
   }
26
              
27
//--Schnapp

Doch leider funktioniert es nicht richtig, das Problem ist nicht, dass 
das neunte Bit nicht richtig gelesen wird, sondern, dass die ersten 8 
bit nun derart geshifetet sind, dass das Höchstwertige fehlt.
Wahrscheinlich irgendein kleiner Denkfehler aber ich komme gerade 
einfach nicht drauf...
Danke

von Assemblerfan (Gast)


Lesenswert?

Dieses Bitgemurkse in C ist doch wirklich widerlich.
Sowas sollte man in Assembler schreiben.

von Karl H. (kbuchegg)


Lesenswert?

ben wrote:

> Doch leider funktioniert es nicht richtig, das Problem ist nicht, dass
> das neunte Bit nicht richtig gelesen wird, sondern, dass die ersten 8
> bit nun derart geshifetet sind, dass das Höchstwertige fehlt.
> Wahrscheinlich irgendein kleiner Denkfehler aber ich komme gerade
> einfach nicht drauf...

Klingt für mich nach:
Du hast nicht berücksichtigt, dass die Bits ja im Gänsemarsch
daherkommen. Das erste Bit, welches die liest, ist eigentlich
das Bit 9, und erst dann kommen die restlichen 8 Bit.
1
   for(unsigned char i=0; i< 9; i++)
2
   {
3
      M_CLK_H; //Clock high
4
      
5
      if( i == 0 )
6
      {
7
         in2 = ((M_IN_PIN >> M_IN_PINNR) & 1);
8
      }
9
10
      else
11
      {
12
         //read bit
13
         in = (in << 1);
14
         in |= ((M_IN_PIN >> M_IN_PINNR) & 1);
15
      }
16
      M_CLK_L;
17
   }

von ben (Gast)


Lesenswert?

nein, leider nicht, das verhalten ist jetzt so, dass die werte sogar 
noch eines weiter geshiftet sind, also um 2 nach links.

ich möchte auch nur ein weiteres bit einlesen, dass am seriellen eingang 
des schieberegisters anliegt. die ersten 8 bits sind ja die selben

von Karl H. (kbuchegg)


Lesenswert?

ben wrote:
> nein, leider nicht, das verhalten ist jetzt so, dass die werte sogar
> noch eines weiter geshiftet sind, also um 2 nach links.

OK. Dann ist deine Variante die Richtige.

Allerdings sehe ich nichts in deinem Code, was das beschriebene
Verhalten erklären könnte. Könnte es sein, dass der Fehler
nicht in dieser Funktion zu finden ist?

von ben (Gast)


Lesenswert?

hatte ich auch gedacht, aber wenn ich den zweiten code gegen den ersten 
oben austausche funktionierts mit den ersten 9 bit

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.