[ERLEDIGT] Arduino - 74HC165 einlesen

OP #4727835
Lesenswert?

Hallo,
ich habe Probleme 4 Stück 74HC165 Schieberegister (in einer Reihe) 
einzulesen.
Die Routine sieht so aus:
1
  byte i;
2
  byte i1;
3
  byte Sbyte;
4
  byte shiftNo;       
5
  uint32_t val;
6
  #define BYTES_VAL_T unsigned int
7
  BYTES_VAL_T bytesVal = 0;
8
    shiftNo = 24;
9
        for (i1 = 0; i1 < 4; i1++) 
10
        {
11
          Sbyte = val >> shiftNo;
12
          for (i = 0; i < 8; i++)  
13
          {
14
            digitalWrite(loadPin, LOW);
15
            delayMicroseconds(5);
16
            digitalWrite(loadPin, HIGH);
17
            Data = digitalRead(data_in);
18
            bytesVal = !!(Sbyte & (1 << (7 - i)));
19
            digitalWrite(clockPin, HIGH);
20
            digitalWrite(clockPin, LOW);
21
            Serial.print(Data,BIN);
22
          }
23
          shiftNo -= 8;
24
        }
was ich als Ergebnis bekomme sind immer 
11111111111111111111111111111111
obwohl die Eingänge alle mit 2K gegen GND runtergezogen werden.
Ich hatte vorher 100K Pulldowns dran, aber daran lag es nicht.

Die Schaltung hat auch noch neben den 4x74HC165 4x 74HC595 als Ausgabe,
diese funktionieren prima!
Clock wird von beiden benutzt, also von den 595 und von den 165ern.

Weiss jemand einen Rat?

Gruß,
Wolfram.
#4727853
Lesenswert?

1
uint32_t read4hc165( void )
2
{
3
  uint32_t val=0;
4

5
  digitalWrite(loadPin, LOW);
6
  digitalWrite(loadPin, HIGH);
7
  for( uint8_t i = 32; i; i-- ){
8
    val <<= 1;
9
    if( digitalRead(data_in))
10
      val |= 1;
11
    digitalWrite(clockPin, HIGH);
12
    digitalWrite(clockPin, LOW);
13
  }
14
  return val;
15
}
OP #4728449
Lesenswert?

Hi,

es tut mir leid, Deine Routine und auch meine ursprüngliche 
FUNKTIONIERT!
Ich habe beim löten einen Fehler gemacht und anstatt den letzten Q 
Ausgang den Clock ausgelesen!
Blöder Fehler....
Alles super! Deine Routine ist schön kurz und vereinfacht!

Ich danke Euch (auch den ersten beiden Kommentaren!)

Gruß,
Wolfram.
OP #4728757
Lesenswert?

Peter, so sieht mein Listing jetzt aus,
einziges Problem ist die Reihenfolge der Bits, die müssten genau 
andersrum sein, könntest du das optimieren/anpassen?
1
//-----------------------------------------------------------------------------------------------------------------
2
// 32 Bit ShiftOut Routine für 4x 74HTC595
3
//-----------------------------------------------------------------------------------------------------------------
4
void shiftOut32(byte data_out, byte clockPin, uint32_t val)
5
{
6
  byte i;
7
  byte i1;
8
  byte Sbyte;
9
  byte shiftNo;       
10
  digitalWrite(latchPin, LOW);    // Latch-Output disablen, während übertragen wird
11
        Sbyte = val;
12
        for (i1 = 0; i1 < 4; i1++) 
13
        {
14
          for (i = 0; i < 8; i++)  
15
          {
16
            digitalWrite(data_out, !!(Sbyte & (1 << i)));
17
            digitalWrite(clockPin, HIGH);
18
            digitalWrite(clockPin, LOW);
19
          }
20
          shiftNo += 8;
21
          Sbyte = val >> shiftNo;
22
        }
23
  digitalWrite(latchPin, HIGH);    // Latch-Output enablen, nach der Übertragung
24
delay(20);
25
}
26
//-----------------------------------------------------------------------------------------------------------------
27
// 32 Bit ShiftIn Routine für 4x 74HC165 
28
//-----------------------------------------------------------------------------------------------------------------
29
uint32_t shiftIn32( void )
30
{
31
  uint32_t val=0;
32

33
  digitalWrite(loadPin, LOW);
34
  digitalWrite(loadPin, HIGH);
35
  for( uint8_t i = 32; i; i-- )
36
  {
37
    val <<= 1;
38
    if( digitalRead(data_in))
39
      {
40
        val |= 1;
41
      }
42
    digitalWrite(clockPin, HIGH);
43
    digitalWrite(clockPin, LOW);
44
  }
45
Serial.println(val,BIN);
46
return val;
47
}
48
//-----------------------------------------------------------------------------------------------------------------
Gast #4728768
Lesenswert?

>einziges Problem ist die Reihenfolge der Bits, die müssten genau
>andersrum sein, könntest du das optimieren/anpassen?

Oh Mann, mit ein bisschen nachdenken kommt man da doch selber drauf:
1
    val >>= 1;
2
    if( digitalRead(data_in))
3
      {
4
        val |= 0x80000000;
5
      }
Gast #4728810
Lesenswert?

Wolfram F. schrieb:
> Ob die ursprünglich verwendeten 100K Pulldowns an den Eingängen der
> 74HC165 auch reichen würden?

Hallo Wolfram,

für die ICs ist das kein Problem, die haben einen Lekstrom von 1uA an 
den Eingängen. Problematisch sind sind die Kontakte davor, die brauchen 
einen Mindeststrom um ein sauberes Signal abzugeben.

Hatte dasselbe Problem mit vielen 74HC165 dass wenn alle Eingänge High 
sind, ein relativ grosser Stromverbrauch entsteht. Habe glaub ich 47k 
genommen, als Komromiss.

Gruss Chregu

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