www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit Schieberegister


Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).:
//--Schnipp

M_LATCH_L;            //Paralell in 
M_LATCH_H; 

unsigned char in=0;
      
   for(unsigned char i=0; i< 8; i++)
   {
      M_CLK_H; //Clock high
      
      //read bit
      in = (in << 1);
      in |= ((M_IN_PIN >> M_IN_PINNR) & 1);
      
      M_CLK_L;
   }
              
//--Schnapp

Nun wollte ich noch ein weiteres neuntes bit einlesen und habe gedacht 
ich löse das so:
//--Schnipp

M_LATCH_L;            //Paralell in 
M_LATCH_H; 

unsigned char in=0;
unsigned char in2=0;

      
   for(unsigned char i=0; i< 9; i++)
   {
      M_CLK_H; //Clock high
      
      if(i < 8)
      {
         //read bit
         in = (in << 1);
         in |= ((M_IN_PIN >> M_IN_PINNR) & 1);
      }
      else
      {
         in2 = ((M_IN_PIN >> M_IN_PINNR) & 1);
      }
      M_CLK_L;
   }
              
//--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

Autor: Assemblerfan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieses Bitgemurkse in C ist doch wirklich widerlich.
Sowas sollte man in Assembler schreiben.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
   for(unsigned char i=0; i< 9; i++)
   {
      M_CLK_H; //Clock high
      
      if( i == 0 )
      {
         in2 = ((M_IN_PIN >> M_IN_PINNR) & 1);
      }

      else
      {
         //read bit
         in = (in << 1);
         in |= ((M_IN_PIN >> M_IN_PINNR) & 1);
      }
      M_CLK_L;
   }

Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ben (Gast)
Datum:

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

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.