Problem mit Schieberegister

Gast #799989
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.