Arduino mit Schieberegister

OP #3692310
Lesenswert?

Hallo, ich habe einen Arudino und habe an ihn ein Schieberegister für 
shiftout(M74HC595B1) und eins für shiftin(74LS165AN) angeschlossen nun 
einzeln funktionieren diese auch einwandfrei nur jetzt wollte ich sie 
beide in einem Programm verwenden und da funktioniert nur noch das 
Einlesen aber das Schieberegister zur Ausgabe macht garnichts(LED´s 
angeschlossen). Nun habe ich das ganze so Programmiert dass in einem 
Programmdurchlauf shiftin und im anderen Programmdurchlauf shiftout 
aktiviert ist. Hier einmal mein Programm vielleicht bin ich nur zu blöd 
um den Fehler zu sehen.
1
int Latch = 2;
2
int Clock = 0;
3
int Dataout = 11;
4
byte out;
5

6
int latchPin = 10;
7
int dataPin = 13;
8
int clockPin = 12;
9
byte switchVar1 = 72;
10

11
int d=0;
12

13

14
void setup() {
15
  pinMode(Latch, OUTPUT);
16
  pinMode(Clock, OUTPUT);
17
  pinMode(Dataout, OUTPUT);
18
  Serial.begin(9600);
19
  pinMode(latchPin, OUTPUT);
20
  pinMode(clockPin, OUTPUT); 
21
  pinMode(dataPin, INPUT);
22
}
23

24
void loop() {
25
 d++;
26
 if(2<d)d=0;
27
 out++;
28
 if(out>255)out=0; 
29
  delay(50);
30
  Serial.println(out);
31
  if(d=1){
32
    digitalWrite(Latch, LOW);
33
    shiftOut(Dataout, Clock, LSBFIRST, out);   
34
    digitalWrite(Latch, HIGH);
35
  }
36

37
if(d=2){
38
  digitalWrite(latchPin,HIGH);
39
  delayMicroseconds(20);
40
  digitalWrite(latchPin,LOW);
41
  switchVar1 = shiftIn(dataPin, clockPin);
42
  Serial.println("-------------------");
43
} 
44
}
45

46

47
byte shiftIn(int myDataPin, int myClockPin) { 
48
  int i;
49
  int temp = 0;
50
  int pinState;
51
  byte myDataIn = 0;
52

53
  pinMode(myClockPin, OUTPUT);
54
  pinMode(myDataPin, INPUT);
55
  for (i=7; i>=0; i--)
56
  {
57
    digitalWrite(myClockPin, 0);
58
    delayMicroseconds(0.2);
59
    temp = digitalRead(myDataPin);
60
    if (temp) {
61
      pinState = 1;
62
      myDataIn = myDataIn | (1 << i);
63
    }
64
    else {
65
      pinState = 0;
66
    }
67

68
    digitalWrite(myClockPin, 1);
69

70
  }
71
  Serial.println();
72
  Serial.println(myDataIn, BIN);
73
  return myDataIn;
74
}
Angehängte Dateien:
OP #3692346
Lesenswert?

Ah doch das gibt es schon wenn ich das hier aufspiele funktioniert das 
Ausgabeschieberegister einwabdfrei.
1
int latchPin = 2;
2
int clockPin = 0;
3
int dataPin = 11;
4
byte out;
5

6

7
void setup() {
8
  pinMode(latchPin, OUTPUT);
9
  pinMode(clockPin, OUTPUT);
10
  pinMode(dataPin, OUTPUT);
11
}
12

13
void loop() {
14

15
 out++;
16
 if(out>255)out=0; 
17
  delay(50);
18
  
19

20
    digitalWrite(latchPin, LOW);
21
    shiftOut(dataPin, clockPin, LSBFIRST, out);   
22
    digitalWrite(latchPin, HIGH);
23

24
}
Angehängte Dateien:
#3692387
Lesenswert?

Hier
1
if(d=2){

nochmal.

Merke: Einigermassen 'schöner' Quellcode hat auch damit zu tun, dass man 
Fehler einigermassen gut sieht und ist keineswegs nur Selbstzweck.
Mir ist klar, dass man am Anfang erst mal zu seiner Linie finden muss. 
Aber im Moment ist dein Code hauptsächlich unübersichtlich und du 
findest selbst keine (bzw. kaum) Fehler da drinnen. Und das liegt zu 
einem nicht unerheblichen Teil darin, dass du noch optisch viel zu dicht 
schreibst. Seit du 6 Jahre alt bist, hast du dein Gehirn darauf 
trainiert, dass zwischen Wörtern Leerraum steht. Benutze diesen 
Automatismus, den du dir eintrainiert hast. Dann brauchst du nicht 
zusätzliche Kapazität aufwenden, um erst mal in beispielsweise
1
 if(2<d)d=0;
mühsam entziffern zu müssen, wo ein 'Wort' aufhört und wo das nächste 
anfängt.
Auch solltest du dich konsequent(!) an die Regel halten: abhängige 
Anweisungen kommen in die nächste Zeile und werden konsequent und immer 
gleich eingerückt. Vom Umdrehen der Bedingung halte ich persönlich 
überhaupt nicht viel. Sie widerspricht unseren gewohnten Denkschemata, 
wonach wir den variablen Teil meistens zuerst 'denken' und dann das 
womit verglichen wird. Wir denken nun mal: Wenn die Anzahl der Socken 
mehr als 50 ist, dann passen sie nicht in die Schublade. Wir denken aber 
nicht: Wenn 50 kleiner als die Anzahl der Socken ist, dann ....

Um wieviel leichter ist
1
   if( d > 2 )
2
     d = 0;
zu erfassen.
In der Programmierung geht es auch darum, einmal Geschriebenes schnell 
und sinnerfassend lesen zu können. Jede beliebige Codezeile wird einmal 
geschrieben und mglw. ein paar mal geändert. Sie wird aber im Laufe der 
Programmentwicklung viele male wieder und immer wieder gelesen. Es lohnt 
sich also, eine Schreibform zu wählen, die leicht ZU LESEN ist, auch 
wenn das etwas Aufwand für ein optisch leicht zu lesendes Ergebnis 
bedeutet. Der Aufwand fürs Schreiben ist hingegen vernachlässigbar.

In diesem Sinne: mit ein wenig Übung sieht man dann auch aus 3 Meter 
Entfernung, dass bei
1
   if( d = 2 )
etwas nicht stimmen kann. Dein optischer Mustererkenner im Gehirn 
spricht irgendwann darauf an, dass da kein einsames "= Wort" stehen 
kann, sondern dass es
1
   if( d == 2 )
lauten muss. Unter anderem auch dadurch, dass du aktiv nicht mehr 
darüber nachdenken musst, welches eigentlich die 'Wörter' in
1
   if(d=2)
sind. Ein paar Leerzeichen machen da einen enormen Unterschied in der 
Erfassbarkeit.
#3692411
Lesenswert?

OK. Dann specke erst mal ab

Zum Testen tut es auch erst mal ein ...
1
void loop() {
2

3
  out++;
4
  if( out > 255 )
5
    out = 0;
6
 
7
  delay( 100 );
8

9
  // Out
10
  Serial.println( out );
11
  digitalWrite( Latch, LOW );
12
  shiftOut( Dataout, Clock, LSBFIRST, out );   
13
  digitalWrite( Latch, HIGH );
14

15
  // In
16
  digitalWrite( latchPin, HIGH );
17
  delayMicroseconds( 20 );
18
  digitalWrite( latchPin, LOW );
19
  switchVar1 = shiftIn( dataPin, clockPin );
20
  Serial.println( switchVar1 );
21

22
  Serial.println("-------------------");
23
}

... ohne die ganze zusätzliche Steuerung.
OP #3692524
Lesenswert?

Okay einfaches Problem mit komplizierter Lösung.
Ich habe festgestellt sobald ich Serial.begin(9600); entfernt habe 
funktioniert alles einwandfrei. Also habe ich mir die Bits auf einem LCD 
Display ausgeben lassen zum schauen welcher Eingang welchen Zustand hat 
falls es jemanden interessiert im Anhang das funktionierende Proramm.
Und an alle trotzdem noch einmal Danke für euere Bemühungen.
Und ich hoffe nun ist es etwas schöner geschrieben.
Angehängte Dateien:

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