Problem mit Schieberegister

Gast #799989
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
#800112
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
   }
Gast #800342
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
#800350
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren