Forum: Mikrocontroller und Digitale Elektronik Arduino probleme bei shiftIn mit HC165


von Philipp (Gast)


Lesenswert?

Guten Abend....

Ich bin Anfänger auf dem Gebiet der Microcontroller und C-Programmieren. 
Vor ca. " Wochen habe ich mir einen Arduino UnoR3 und das Buch "Die 
Elektronische Welt mir Arduino" zugelegt und mit diversen Bauteilen und 
Sketches experimentiert.
Jetzt stehe ich vor dem Problem, 8 Schalter über ein "M74HC165AN" mit 
meinem Arduino zu speisen.
Ich habe mir schon einige Anleitungen im Internet angesehen und auch 3 
verschiedene davon aufgebaut und damit experimentiert.

Schlussendlich bin ich auf die Idee gekommen den "shiftIn"-Befehl in 
einem ganz einfachen Code zu verwenden.
1
int PLOADPIN = 13;
2
int CLOCKPIN = 12;
3
int DATAPIN = 11;
4
int VAR1;
5
void setup(){
6
  Serial.begin(9600);
7
  pinMode(PLOADPIN, OUTPUT);
8
  pinMode(CLOCKPIN, OUTPUT);
9
  pinMode(DATAPIN, INPUT);
10
}
11
12
void loop(){
13
  digitalWrite(PLOADPIN, LOW);
14
  delayMicroseconds(20);
15
  digitalWrite(PLOADPIN, HIGH);
16
 
17
  VAR1 = shiftIn(DATAPIN, CLOCKPIN, MSBFIRST);
18
  Serial.println(VAR1, BIN);
19
  Serial.println("--------");
20
  delay(1000);
21
}
...Clock-Enable des "165" habe ich an Masse geschlossen...

Leider klappt das nicht so ganz:
Es scheint als würde erst ein LOW eingelesen und dann erst die Schalter. 
Das letzte Bit(7) wird nicht mal mehr berücksichtigt.

Kann mir bitte jemand erklären was hier passiert? Kann den Fehler nicht 
erkennen.

Danke schon mal!

Gruß
Philipp

von Karl H. (kbuchegg)


Lesenswert?

Philipp schrieb:

> Kann mir bitte jemand erklären was hier passiert? Kann den Fehler nicht
> erkennen.

Die Polarität des Clock Signales, welches ShiftIn erzeugt, ist genau 
verkehrt rum zu dem wie es sein sollte.

D.h. du wirst dir für den 165 selbst eine Funktion schreiben müssen.

von Philipp L. (khz-tone)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Die Polarität des Clock Signales, welches ShiftIn erzeugt, ist genau
> verkehrt rum zu dem wie es sein sollte.
>
> D.h. du wirst dir für den 165 selbst eine Funktion schreiben müssen.

Danke für die rasche Antwort. Hatte mir schon einige Stunden den Kopf 
zerbrochen...
verstehe ich dich hier richtig: "das Clock welches die shiftIn-Funktion 
verwendet ist "LOW" wenn es für den 165er "HIGH" sein sollte und 
umgekehrt?

Welche Shift-Register wären denn für diese Funktion geeignet?

Gruß
Philipp

von Philipp L. (khz-tone)


Lesenswert?

HI,

Hab mich nochmal dahinter gesetzt und mir einen CODE geschrieben der für 
den 165er funktioniert. Vielleicht macht nicht alles einen Sinn, jedoch 
hat es mir nach dem langen suchen und probieren sehr geholfen die 
Funktion von Shift-Registern besser zu verstehen.
Aus Fehlern lernt man doch am besten :)

hier noch der CODE:
1
int PLOADPIN = 13;
2
int CLOCKPIN = 12;
3
int DATAPIN = 11;
4
int DATA;
5
6
void myShiftIn(){
7
  digitalWrite(PLOADPIN, LOW);      
8
  delayMicroseconds(20);
9
  digitalWrite(PLOADPIN, HIGH);
10
  DATA = digitalRead(DATAPIN);
11
  for(int i=0;i<7;i++){
12
    digitalWrite(CLOCKPIN, HIGH);
13
    delayMicroseconds(20);
14
    digitalWrite(CLOCKPIN, LOW);
15
    DATA = (DATA << 1) | digitalRead(DATAPIN);
16
  }
17
}
18
19
void setup(){
20
  Serial.begin(9600);  
21
  pinMode(DATAPIN, INPUT);
22
  pinMode(PLOADPIN, OUTPUT);
23
  pinMode(CLOCKPIN, OUTPUT);
24
}
25
26
void loop(){
27
  myShiftIn();
28
  Serial.println(DATA,BIN);
29
  delay(1000);
30
}

danke nochmal für den Tipp mit dem Clock-Signal!

Gruß
Philipp

von Mathias B. (mathias_b103)


Lesenswert?

Ich habe auch mit dem 75HC165 geübt, dann bin ich auf diesen Thread 
gestossen.

Da habe ich den obigen Code ein bisschen abgeändert, so das es am 
Schluss noch mal einen Clock ausführt, ich denken dies wird nötig sein, 
wen man mehrere 165er hintereinander schaltet.
1
byte ShiftIn74HC165(byte dataPin , byte clockPin)
2
{
3
  byte data;
4
  for(byte i = 0; i < 8; i++)
5
  {
6
    data = (data << 1) | digitalRead(dataPin);
7
    digitalWrite(clockPin, HIGH);
8
    delayMicroseconds(20);
9
    digitalWrite(clockPin, LOW);
10
  }
11
  return data;
12
}

Ich werde es bei Gelegenheit mit einem zweiten 165er testen.

: Bearbeitet durch User
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.