[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

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.

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.