Forum: Mikrocontroller und Digitale Elektronik [ERLEDIGT] Arduino - 74HC165 einlesen


von Wolfram F. (mega-hz)


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.

: Bearbeitet durch Moderator
von Schaltplanleser (Gast)


Lesenswert?

Wolfram F. schrieb:
> Weiss jemand einen Rat?

Der Aufbau ist scheisse.

von Brain 2.0 (Gast)


Lesenswert?

Schaltplanleser schrieb:
> Wolfram F. schrieb:
>> Weiss jemand einen Rat?
>
> Der Aufbau ist scheisse.

Von dir redet doch keiner.

von Peter D. (peda)


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
}

von Wolfram F. (mega-hz)


Lesenswert?

Danke Peter, aber ich bekomme trotzdem nur 111111111111111111 geliefert.
ganz selten aber auch mal eine 0 !

von Wolfram F. (mega-hz)


Angehängte Dateien:

Lesenswert?

so sieht es dann aus...

von Peter D. (peda)


Lesenswert?

Zeig mal den Schaltplan.

von Wolfram F. (mega-hz)


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.

: Bearbeitet durch User
von Wolfram F. (mega-hz)


Lesenswert?

noch ne Frage:
Ob die ursprünglich verwendeten 100K Pulldowns an den Eingängen der 
74HC165 auch reichen würden?

von Wolfram F. (mega-hz)


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
//-----------------------------------------------------------------------------------------------------------------

von holger (Gast)


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
      }

von Christian M. (Gast)


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

von Wolfram F. (mega-hz)


Lesenswert?

@holger: danke, ich hatte        val |= 0x80000000;
 vergessen...

@Christian:
Was meinst Du mit "Problematisch sind sind die Kontakte davor" ?
Ich habe nur die Pulldowns an den 165ern dann gleich Stiftleisten....

von Christian M. (Gast)


Lesenswert?

Das was Du an den Stiftleisten angeschlossen hast! Ich nehme an, dass es 
mechanische Kontakte sind!

Gruss Chregu

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.