mikrocontroller.net

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


Autor: Wolfram Fischer (mega-hz)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Hallo,
ich habe Probleme 4 Stück 74HC165 Schieberegister (in einer Reihe) 
einzulesen.
Die Routine sieht so aus:
  byte i;
  byte i1;
  byte Sbyte;
  byte shiftNo;       
  uint32_t val;
  #define BYTES_VAL_T unsigned int
  BYTES_VAL_T bytesVal = 0;
    shiftNo = 24;
        for (i1 = 0; i1 < 4; i1++) 
        {
          Sbyte = val >> shiftNo;
          for (i = 0; i < 8; i++)  
          {
            digitalWrite(loadPin, LOW);
            delayMicroseconds(5);
            digitalWrite(loadPin, HIGH);
            Data = digitalRead(data_in);
            bytesVal = !!(Sbyte & (1 << (7 - i)));
            digitalWrite(clockPin, HIGH);
            digitalWrite(clockPin, LOW);
            Serial.print(Data,BIN);
          }
          shiftNo -= 8;
        }
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
Autor: Schaltplanleser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfram F. schrieb:
> Weiss jemand einen Rat?

Der Aufbau ist scheisse.

Autor: Brain 2.0 (Gast)
Datum:

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

Von dir redet doch keiner.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint32_t read4hc165( void )
{
  uint32_t val=0;

  digitalWrite(loadPin, LOW);
  digitalWrite(loadPin, HIGH);
  for( uint8_t i = 32; i; i-- ){
    val <<= 1;
    if( digitalRead(data_in))
      val |= 1;
    digitalWrite(clockPin, HIGH);
    digitalWrite(clockPin, LOW);
  }
  return val;
}

Autor: Wolfram Fischer (mega-hz)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Danke Peter, aber ich bekomme trotzdem nur 111111111111111111 geliefert.
ganz selten aber auch mal eine 0 !

Autor: Wolfram Fischer (mega-hz)
Datum:
Angehängte Dateien:

Bewertung
-1 lesenswert
nicht lesenswert
so sieht es dann aus...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal den Schaltplan.

Autor: Wolfram Fischer (mega-hz)
Datum:

Bewertung
1 lesenswert
nicht 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
Autor: Wolfram Fischer (mega-hz)
Datum:

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

Autor: Wolfram Fischer (mega-hz)
Datum:

Bewertung
0 lesenswert
nicht 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?
//-----------------------------------------------------------------------------------------------------------------
// 32 Bit ShiftOut Routine für 4x 74HTC595
//-----------------------------------------------------------------------------------------------------------------
void shiftOut32(byte data_out, byte clockPin, uint32_t val)
{
  byte i;
  byte i1;
  byte Sbyte;
  byte shiftNo;       
  digitalWrite(latchPin, LOW);    // Latch-Output disablen, während übertragen wird
        Sbyte = val;
        for (i1 = 0; i1 < 4; i1++) 
        {
          for (i = 0; i < 8; i++)  
          {
            digitalWrite(data_out, !!(Sbyte & (1 << i)));
            digitalWrite(clockPin, HIGH);
            digitalWrite(clockPin, LOW);
          }
          shiftNo += 8;
          Sbyte = val >> shiftNo;
        }
  digitalWrite(latchPin, HIGH);    // Latch-Output enablen, nach der Übertragung
delay(20);
}
//-----------------------------------------------------------------------------------------------------------------
// 32 Bit ShiftIn Routine für 4x 74HC165 
//-----------------------------------------------------------------------------------------------------------------
uint32_t shiftIn32( void )
{
  uint32_t val=0;

  digitalWrite(loadPin, LOW);
  digitalWrite(loadPin, HIGH);
  for( uint8_t i = 32; i; i-- )
  {
    val <<= 1;
    if( digitalRead(data_in))
      {
        val |= 1;
      }
    digitalWrite(clockPin, HIGH);
    digitalWrite(clockPin, LOW);
  }
Serial.println(val,BIN);
return val;
}
//-----------------------------------------------------------------------------------------------------------------


Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
    val >>= 1;
    if( digitalRead(data_in))
      {
        val |= 0x80000000;
      }

Autor: Christian Müller (Firma: magnetmotor.ch) (chregu) Benutzerseite
Datum:

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

Autor: Wolfram Fischer (mega-hz)
Datum:

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

Autor: Christian Müller (Firma: magnetmotor.ch) (chregu) Benutzerseite
Datum:

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

Gruss Chregu

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.