Forum: Mikrocontroller und Digitale Elektronik Arduino mit 74HC595 und LEDs, mit einem Signalproblem


von t800w (Gast)


Lesenswert?

Hallo,
ich habe mit meinem Freund eine Schaltung aufgebaut, die aus zwei
Schieberegistern, 74HC595, besteht und an diesen sind LEDs 
angeschlossen, um die Signalausgabe zu kontrollieren. Die 
Schieberegister und die LEDs
funktionieren mit anderen Codes Bsp. 0B0101010101010101 perfekt. Doch
jetzt lassen wir den Code automatisch hochzählen. Dabei sind die letzten 
8 Ziffern gleich. Nachdem die 8 Ziffern gemeinsam den Wert 11111111 
erreicht haben Schaltet der vorhergehende Code eins hoch. Die ersten 
vier Ziffern
bleiben dabei immer konstant.

Somit lautet die Zusammensetzung folgendermaßen:

0B   1001          0000         0001       0001
   konstant    Mothercode     zwei gleiche Codes

dazu die Tabelle des Arduinos zur Veranschaulichung:

=====================================
MotherCode: 0
=====================================
1001000000000000
1001000000010001
1001000000100010
1001000000110011
1001000001000100
1001000001010101
1001000001100110
1001000001110111
1001000010001000
1001000010011001
1001000010101010
1001000010111011
1001000011001100
1001000011011101
1001000011101110
1001000011111111
=====================================
MotherCode: 1
=====================================
1001000100000000
1001000100010001
1001000100100010
1001000100110011
1001000101000100
1001000101010101
1001000101100110
1001000101110111
1001000110001000
1001000110011001
1001000110101010
1001000110111011
1001000111001100
1001000111011101
1001000111101110
1001000111111111
=====================================
MotherCode: 10
=====================================
1001001000000000
1001001000010001
1001001000100010
1001001000110011
1001001001000100
1001001001010101
1001001001100110
1001001001110111
1001001010001000
1001001010011001
1001001010101010
1001001010111011
1001001011001100
1001001011011101
1001001011101110
1001001011111111
=====================================
MotherCode: 11
=====================================
1001001100000000
1001001100010001
1001001100100010
1001001100110011
1001001101000100
1001001101010101
1001001101100110
1001001101110111
1001001110001000
1001001110011001
1001001110101010
1001001110111011
1001001111001100
1001001111011101
1001001111101110
1001001111111111


Doch wenn ich diesen Code zum Schieberegister schicke, werden alle LEDs
auf HIGH gesetzt, sobald der Mothercode um eins aufgewertet wird, woran 
liegt das?
Das ist das Programm:

---------------------------------------------------------


int speicherPin = 10;
int taktPin     = 11;
int datenPin    = 9;
long motherCode = 0;

void setup() {

  Serial.begin(9600);

}

void loop() {

  Serial.println("=====================================");
  Serial.print("MotherCode: ");
  Serial.println(motherCode, BIN);
  Serial.println("=====================================");

  sendBytes(65499);
  delay(1000);

  for(int regalCodeCounter = 0; regalCodeCounter < 16;
regalCodeCounter++) {

    long fullCode = (0B1001 << 4) + motherCode;  // 1001 + motherCode
    fullCode = fullCode << 8;                   // 1001 + motherCode +
0000 0000
    fullCode += getRegalCode(regalCodeCounter); // 1001 + motherCode +
regalCode


    sendBytes(fullCode);
    Serial.println(fullCode,BIN);
    delay(1000);


  }

  delay(1000);   // Eine Sekunde Verzögerung für jeden neuen MotherCode

  motherCode++; // MotherCode hochzählen

  if(motherCode == 16) // MotherCode zurücksetzen
    motherCode = 0;

}

// Generiere den RegalCode, welcher aus zwei identischen Zahlen besteht
int getRegalCode(long regalCodeCounter) {

  long sendRegalCode = 0B11111111;

  sendRegalCode = regalCodeCounter << 4;
  sendRegalCode += regalCodeCounter;

  return sendRegalCode;

}

void sendBytes(long data) {

  digitalWrite(speicherPin, LOW);
  shiftOut(datenPin, taktPin, MSBFIRST, data >> 8);
  shiftOut(datenPin, taktPin, MSBFIRST, data & 255);
  digitalWrite(speicherPin, HIGH);

}

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

t800w schrieb:
> auf HIGH gesetzt, sobald der Mothercode um eins aufgewertet wird, woran
> liegt das?

Das du ein Moron bist ?
Beitrag "Re: Arduino mit Schieberegister 74HC595 + LEDs , warum funktioiert dieses Programm nicht?"

von Joe F. (easylife)


Lesenswert?

t800w schrieb:
> Doch wenn ich diesen Code zum Schieberegister schicke, werden alle LEDs
> auf HIGH gesetzt, sobald der Mothercode um eins aufgewertet wird, woran
> liegt das?

Naja, 2 LED dürften aus bleiben, wenn

sendBytes(65499);

ausgeführt wurde.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

@Marc
Könnte auch einfach nur Unkenntnis sein - statt die Seite erneut 
anzufordern, einfach nur F5 gedrückt und ein neues/weiteres Thema 
erstellt.

So was KÖNNTE man sich überlegen, statt Jedem zuerst Schwachsinn 
vorzuwerfen.
Anbei hat der Post auch unten drunter einen 'Meldeknopf' ... aber wem 
sage ich Das ...

MfG

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Dein Code lässt sich übrigens ohne Probleme auf das hier eindampfen, und 
wird damit meiner Meinung nach um einiges verständlicher.
1
int speicherPin = 10;
2
int taktPin     = 11;
3
int datenPin    = 9;
4
5
void setup() 
6
{
7
  Serial.begin(9600);
8
}
9
10
void loop() 
11
{
12
  unsigned char code[2];
13
14
  for (int mother = 0; mother < 16; mother++)
15
  {
16
    Serial.println("=====================================");
17
    Serial.print("MotherCode: ");
18
    Serial.println(mother, BIN);
19
    Serial.println("=====================================");
20
21
    for(int regal = 0; regal < 16; regal++) 
22
    {
23
      code[1] = 0B10010000 | mother;
24
      code[0] = regal << 4 | regal;
25
26
      digitalWrite(speicherPin, LOW);
27
      shiftOut(datenPin, taktPin, MSBFIRST, code[1]);
28
      shiftOut(datenPin, taktPin, MSBFIRST, code[0]);
29
      digitalWrite(speicherPin, HIGH);
30
31
      delay(1000);
32
    }
33
  }
34
}

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Joe F. schrieb:
> Dein Code lässt sich übrigens ohne Probleme auf das hier eindampfen, und
> wird damit meiner Meinung nach um einiges verständlicher.

 Und wird weiterhin nicht funktionieren.

 Kein Pin wird als Ausgang deklariert.

von Gerald B. (gerald_b)


Lesenswert?

Wie sieht eigentlich die Verkabelung aus? Mit 30 cm Jumperleitungen auf 
dem Breadboard und ohne Abblockkondensatoren, vermute ich mal...
Faustregel: am IC KÜRZESTMÖGLICH einen 100n KerKo und für 3 bis 5 IC's 
nochmal einen Elko von ca. 47µ. Verkabelung so kurz wie möglich. Die 3 
Datenleitungen gehen parallel an alle Schieberegister, die 
Leitungslängen von Seiten des Arduinos addieren sich also. 2x 30 cm 
ergeben 60 cm Länge und das kann für digitale Signale schon zu viel 
sein. Da geht es um Nanosekunden. Bei derartigen Leitungslängen kann ein 
Signal am Ende reflektiert werden und als Echo zurückkommen. Dazu 
Leitungsübersprechen und Spannungseinbrüche, weil die Betriebsspannung 
nich vernünftig am IC abgeblockt wurde.
Gib den IC's doch wenigstens eine Chance, zu funktionieren ;-)

von Joe F. (easylife)


Lesenswert?

Marc V. schrieb:
> Und wird weiterhin nicht funktionieren.
>
>  Kein Pin wird als Ausgang deklariert.

Ja OK, muss man dann noch machen.
Mir ging es dabei auch mehr um die unnötige Verwendung von Funktionen 
und die komplizierte Art die äussere Schleife zu bauen und die 
unübersichtliche Art und Weise, wie der Ausgabecode zusammengebastelt 
wird.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Joe F. schrieb:
> Mir ging es dabei auch mehr um die unnötige Verwendung von Funktionen
> und die komplizierte Art die äussere Schleife zu bauen und die
> unübersichtliche Art und Weise, wie der Ausgabecode zusammengebastelt
> wird.

 Nichts gegen deinen Vorschlag einzuwenden...

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.