Pages: [1]   Go Down
Author Topic: Problem shiftin und shift out  (Read 1276 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,


meine Aufgabenstellung sieht folgendes vor. Ich muss digitale Eingänge einlesen (Taster) und nutze, um Arduino Eingänge zu sparen das 4021 BE Schieberegister. Mit diesem kann ich ins Arduino den Zustand der Taster (8 Stück) einlesen und über Serialprint anzeigen. Das funktioniert einwandfrei.

Nun will ich das Byte seriell->parallel wandeln und habe dazu einen 74HC164 eingesetzt. Hat damit schon jemand experimentiert?
Weise ich der shiftOut funktion einfach das Byte zu so z.B. --> shiftOut(switchVar1, clockPin, latchPin, MSBFIRST, bits)?
Kann ich den Clockpin und den Latchpin des Eingangsregisters für das 74HC164 nutzen?

Ich habe den Code vom Arduino Tut genommen und das shiftout eingefügt, jedoch fällt mir nun nichts mehr ein was ich machen kann.

Ich danke euch im Voraus.

Grüße
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,


meine Aufgabenstellung sieht folgendes vor. Ich muss digitale Eingänge einlesen (Taster) und nutze, um Arduino Eingänge zu sparen das 4021 BE Schieberegister. Mit diesem kann ich ins Arduino den Zustand der Taster (8 Stück) einlesen und über Serialprint anzeigen. Das funktioniert einwandfrei.

Nun will ich das Byte seriell->parallel wandeln und habe dazu einen 74HC164 eingesetzt. Hat damit schon jemand experimentiert?
Weise ich der shiftOut funktion einfach das Byte zu so z.B. --> shiftOut(switchVar1, clockPin, latchPin, MSBFIRST, bits)?
Kann ich den Clockpin und den Latchpin des Eingangsregisters für das 74HC164 nutzen?

Ich habe den Code vom Arduino Tut genommen und das shiftout eingefügt, jedoch fällt mir nun nichts mehr ein was ich machen kann.

Ich danke euch im Voraus.

Grüße

hier das listing  vom seriell-->parallel und parallel-->seriell



//define where your pins are
int latchPin = 8;
int dataPin = 9;
int clockPin = 7;
int clockPin_new = 10;
int latchPin_new = 11;


//Define variables to hold the data
//for each shift register.
//starting with non-zero numbers can help
//troubleshoot
byte switchVar1 = 72;  //01001000
byte switchVar2 = 159; //10011111

void setup() {
  //start serial
  Serial.begin(9600);

  //define pin modes
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, INPUT);
}

void loop() {

  //Pulse the latch pin:
  //set it to 1 to collect parallel data
  digitalWrite(latchPin,1);
  //set it to 1 to collect parallel data, wait
  delayMicroseconds(20);
  //set it to 0 to transmit data serially 
  digitalWrite(latchPin,0);

  //while the shift register is in serial mode
  //collect each shift register into a byte
  //the register attached to the chip comes in first
  switchVar1 = shiftIn(dataPin, clockPin);
 // switchVar2 = shiftIn(dataPin, clockPin);
 
  for (int vers = 0; vers < 2; vers++){ //Für was ist die Zählschleife da?
  digitalWrite(latchPin, LOW);
  shiftOut(switchVar1, clockPin, MSBFIRST, vers);
  digitalWrite(latchPin, HIGH);
}
 
 

  //Print out the results.
  //leading 0's at the top of the byte
  //(7, 6, 5, etc) will be dropped before
  //the first pin that has a high input
  //reading 
  Serial.println(switchVar1, BIN);
  //Serial.println(switchVar2, BIN);

//white space
Serial.println("-------------------");
//delay so all these print satements can keep up.
delay(500);

}

//------------------------------------------------end main loop

////// ----------------------------------------shiftIn function
///// just needs the location of the data pin and the clock pin
///// it returns a byte with each bit in the byte corresponding
///// to a pin on the shift register. leftBit 7 = Pin 7 / Bit 0= Pin 0

byte shiftIn(int myDataPin, int myClockPin) {
  int i;
  int temp = 0;
  int pinState;
  byte myDataIn = 0;

  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, INPUT);

//we will be holding the clock pin high 8 times (0,..,7) at the
//end of each time through the for loop

//at the begining of each loop when we set the clock low, it will
//be doing the necessary low to high drop to cause the shift
//register's DataPin to change state based on the value
//of the next bit in its serial information flow.
//The register transmits the information about the pins from pin 7 to pin 0
//so that is why our function counts down
  for (i=7; i>=0; i--)
  {
    digitalWrite(myClockPin, 0);
    delayMicroseconds(2);
    temp = digitalRead(myDataPin);
    if (temp) {
      pinState = 1;
      //set the bit to 0 no matter what
      myDataIn = myDataIn | (1 << i);
    }
    else {
      //turn it off -- only necessary for debuging
     //print statement since myDataIn starts as 0
      pinState = 0;
    }

    //Debuging print statements
    //Serial.print(pinState);
    //Serial.print("     ");
    //Serial.println (dataIn, BIN);

    digitalWrite(myClockPin, 1);

  }
  //debuging print statements whitespace
  //Serial.println();
  //Serial.println(myDataIn, BIN);
  return myDataIn;
}
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21869
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Kann ich den Clockpin und den Latchpin des Eingangsregisters für das 74HC164 nutzen?
Nein, das bringt die beiden durcheinander. Du brauchst verschedene voneinander unabhängige Leitungen.

Wenn Du Pins sparen mußt rate ich Dir einen I2C Expander (2X 8 bit PCF8574 oder MCP23008 und 18 BIT MCR23016) Die MCP sind vorzuziehen da der PCF bei HIGH Ausgang nur wenige µA geben kann.

Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Uwe,


danke für deine schnelle und praktische Antwort.

Ich werde die die Idee mit dem Chip in Erwägung ziehen.

Ich melde mich später nocheinmal, wenn ich den 74HC595 ausprobiert habe.

Grüße

Logged

Pages: [1]   Go Up
Jump to: