Re: Schieberegister ansprechen; Code verstehen

OP #5353649
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
}
Gast
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
}
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
  }

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.