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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Duda D. (ruma)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.