Forum: Mikrocontroller und Digitale Elektronik Re: Schieberegister ansprechen; Code verstehen


von Duda D. (ruma)


Lesenswert?

Ich arbeite seit gestern mit drei Schieberegistern, die an 24 LEDs 
verbunden sind. Ich verstehe auch schon größtenteils den Code zur 
Schaltung der Schieberegister. Nun möchte ich aber noch die Register mit 
einer Variabel voll schieben.

Folgendes soll passieren:
Ich möchte mit einer Variable bestimmen wie die Schieberegister gesetzt 
werden. Sprich wenn ich meine Variable hier Pin auf 1 setze soll LED 1 
angehen. Bei 2 LED 2. Bei 3 LED 3 usw.

Bei meinem aktuellen Code bleiben lediglich alle LEDs aus, woran liegt 
das? Wie kann ich mein Vorhaben richtig umsetzen?
1
int shiftPin = 5;  // Pin SCK an 74HC595
2
int storePin = 6; // PIN RCK an 74HC595
3
int dataPin  = 7;  // Pin SER an 74HC595
4
5
int Pin = 1;
6
 
7
unsigned long binOutput[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
8
 //Stellenn____________________{1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8}
9
void setup() {
10
  pinMode(storePin, OUTPUT);              // Pin auf Output setzen
11
  pinMode(shiftPin, OUTPUT);              // Pin auf Output setzen
12
  pinMode(dataPin, OUTPUT);               // Pin auf Output setzen
13
 
14
  digitalWrite(storePin, LOW);            // Wir ziehen den RegisterClockPin auf Low
15
16
if (Pin == 0)
17
 {   
18
    unsigned long binOutput[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
19
 }
20
  if (Pin == 1)
21
 {   
22
    unsigned long binOutput[24] = {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
23
 }
24
 
25
 if (Pin == 2)
26
 {   
27
    unsigned long binOutput[24] = {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
28
 }
29
  for (int i=24; i>=0; i--) {            
30
    digitalWrite(shiftPin, LOW);          // Wir ziehen den StoreClockPin auf Low und ...
31
    digitalWrite(dataPin, binOutput[i]);  // ... aus unserem Int-Array uebergeben wir binOutput[i] an das Register und setzen ...
32
    digitalWrite(shiftPin, HIGH);         // ... StoreClockPin auf HIGH, damit die vorhandenen Werte um eine Stelle wandern ...
33
                                          // ... koennen und binOutput[i] an der ersten Stelle im Register eingefuegt werden kann.
34
  }
35
 
36
  digitalWrite(storePin, HIGH);           // Wir ziehen den RegisterClockPin auf High, somit wird das Register an Output kopiert ...
37
                                          // ... und die LEDs leuchten entsprechend unserem binOutput[]-Muster
38
}
39
 
40
void loop () {
41
}

von Och nöö (Gast)


Lesenswert?

so etwa:
1
unsigned char binOutput[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
2
//-------^^^^^
3
4
..........
5
6
for (i=0; i<24; i++)
7
{
8
  if (Pin == i)  binOutput[i] = 1;
9
  else           binOutput[i] = 0;
10
}

von m.n. (Gast)


Lesenswert?

Warum machst Du nicht hier weiter? 
Beitrag "Schieberegister ansprechen; Code verstehen"
Gestern Schrittmotore, heute LEDs und morgen vielleicht schon 
Nähmaschinen?
Da hilft man doch gerne.

von Peter D. (peda)


Lesenswert?

Duda D. schrieb:
> if (Pin == 0)
>  {
>     unsigned long binOutput[24] =
> {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
>  }

Abgesehen von der Leistung, für nur 24 Bits stolze 96 Byte RAM zu 
verschwenden, wird das der Compiler wohl komplett wegoptimieren, da 
binOutput innerhalb seines Gültigkeitsbereiches nirgends verwendet wird.

Verwende besser die Typen aus der stdint.h, dann fällt sofort auf, daß 
für 24 Bits ein einzelnes uint32_t (= 4 Byte) dicke ausreichend ist.
Und lese nochmal nach, welchen Gültigkeitsbereich Variablen haben, die 
innerhalb eines Blocks {} definiert werden.

Bits lassen sich zwar nicht als Arrayindex zugreifen, aber kein Problem, 
man kann einzelne Bits über ein AND-Verknüpfung testen:
1
  if( val & (1<<n) ){
2
  }

: 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.