INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Hilfe bei 7-Segmentanzeige und Shift-Register
31.05.2014, 18:36
Beitrag #1
Hilfe bei 7-Segmentanzeige und Shift-Register
Erstmal Hallo an alle Smile

Ich bastel gerade an einem kleinen Projekt, aber leider versteh ich nicht, wo mein Fehler ist.

Ich möchte eine 7-Segment-Anzeige mit Hilfe eines shift-Registers ansteuern. Eigentlich sollte das ja auch kein Problem sein.

Nur leider bekomme ich manchmal "merkwürdige" Ergebnisse. Im array "state" habe ich mir die Werte gespeichert, um die Zahlen "1" und "2" anzeigen zu lassen. Das klappt auch. Aber eben nur manchmal.

Als erstes steht auf meiner Anzeige "1".
Dann sind alle Elemente an, aber sehr schwach.
Dann sind die unteren zwei Werte bei der 7-Segment-Anzeige an.
Dann sind wieder alle Elemente an, aber sehr schwach.
Und dann wird erst die "2" Angezeigt.

Kann es sein, dass ich noch irgendwo noch ein "delay" brauche? Mir kommt es so vor, als ob ich irgendwo ein Zeitproblem mit den zwei Funktionen habe.

Evtl. kann mir ja einer Helfen Smile
Danke schonmal im Voraus.

Hier mein Code:

Code:
int state[2][8] = {1, 1, 1, 0, 1, 0, 1, 1,
                   0, 1, 0, 0, 1, 1, 0, 0};
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
      
    digitalWrite(latchPin, LOW);
    shiftOut();
    digitalWrite(latchPin, HIGH);
    delay(1000);
}

void shiftOut() {
  
  static int x = 0;

  digitalWrite(dataPin, LOW);
  digitalWrite(clockPin, LOW);
      
    for (int i=0; i<=7; i++) {
            
      digitalWrite(clockPin, LOW);
      digitalWrite(dataPin, state[x][i]);
      digitalWrite(clockPin, HIGH);
    }
    x++;
    if (x == 3) {
      x=0;
    }
    
    digitalWrite(clockPin, LOW);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.06.2014, 09:21 (Dieser Beitrag wurde zuletzt bearbeitet: 01.06.2014 09:25 von rkuehle.)
Beitrag #2
RE: Hilfe bei 7-Segmentanzeige und Shift-Register
Moin knut,

versuche es mal so:
Code:
const int state[2][8] = {{1, 1, 1, 0, 1, 0, 1, 1},
  {0, 1, 0, 0, 1, 1, 0, 0}
};
const unsigned int latchPin = 8;
const unsigned int clockPin = 12;
const unsigned int dataPin = 11;

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  digitalWrite(latchPin, LOW);
  shiftOut();
  digitalWrite(latchPin, HIGH);
  delay(1000);
}

void shiftOut() {
  for (unsigned int x = 0; x <= 1; x++)
  {
    digitalWrite(dataPin, LOW);
    digitalWrite(clockPin, LOW);
    for (int i = 0; i <= 7; i++) {
      digitalWrite(clockPin, LOW);
      digitalWrite(dataPin, state[x][i]);
      digitalWrite(clockPin, HIGH);
    }
    digitalWrite(clockPin, LOW);
  }
}
Das Array war nicht richtig dimensioniert, der max. Wert für x zu hoch.
Den x-static-Kram + Rücksetzen auf 0 spart man sich durch die x-Schleife.
Hope it helps!
Grüße Ricardo
PS: Nicht getestet, da keine Hardware!

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.06.2014, 11:31 (Dieser Beitrag wurde zuletzt bearbeitet: 01.06.2014 11:32 von knut.)
Beitrag #3
RE: Hilfe bei 7-Segmentanzeige und Shift-Register
Hi rkuehle,

danke für deine Antwort.
So wie du es geschrieben hast, kann es glaub ich nicht gehen. Die äußere for-Schleife in der Funktion "shiftOut" stimmt glaub ich nicht.

Ich habe die for-schleife jetzt mal in die loop Funktion, und die Variable x als globale Variable deklariert. Leider bekommen ich dann immer noch den selben Fehler.

Code:
const int state[2][8] = {{1, 1, 1, 0, 1, 0, 1, 1},
  {0, 1, 0, 0, 1, 1, 0, 0}
};
const unsigned int latchPin = 8;
const unsigned int clockPin = 12;
const unsigned int dataPin = 11;
unsigned int x;

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  for ( x = 0; x <= 1; x++) {
  digitalWrite(latchPin, LOW);
  shiftOut();
  digitalWrite(latchPin, HIGH);
  delay(1000);
  }
}

void shiftOut() {
    digitalWrite(dataPin, LOW);
    digitalWrite(clockPin, LOW);
    for (int i = 0; i <= 7; i++) {
      digitalWrite(clockPin, LOW);
      digitalWrite(dataPin, state[x][i]);
      digitalWrite(clockPin, HIGH);
    }
    digitalWrite(clockPin, LOW);
}

Kann es sein, dass mein Aufbau falsch ist?

Arduino(3,5V) -> (Vor)widerstand -> das geht auf Pin 3,8(7-Segment-Anzeige) -> Ausgang 7-Segment-Anzeige(7, 6, 4, ...10, 5) geht auf shift-register. Müsste schon so passen, oder? Wenn ich den Vorwiderstand weg lasse und dann zwischen 7-Segment-Anzeige und Eingang shift-register den Widerstand installiere, kann es ja sein, dass zu viel Strom fließt, was mein Arduino nicht liefert kann.

(Foto die Beschaltung der 7-Segment-Anzeige)
[Bild: screenshot201ceh6pnx954.png]
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.06.2014, 12:14
Beitrag #4
RE: Hilfe bei 7-Segmentanzeige und Shift-Register
Hallo knut,

dein Code bringt im Ergebnis das gleiche wie meiner, da es unerheblich ist ob die x-Schleife in Loop() oder in ShiftOut() läuft.
Da ich keine 7-Segment habe, habe ich den Code reduziert und statt dessen ein Serial.print() genutzt. Wie gesagt bei beiden Versionen das gleiche Ergebnis.
Kann es sein, dass du dich an diesem Beispiel orientierst?: http://popovic.info/html/arduino/arduino...nt-Anzeige
Wenn ja, wundert mich, dass du eine eigene ShiftOut() schreibst, da die Funktion von Hause aus beim Arduino gegeben ist.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.06.2014, 15:58
Beitrag #5
RE: Hilfe bei 7-Segmentanzeige und Shift-Register
Hey,
noch mal danke für die Antwort. Den Code, wie man einen shift-Register ansteuert, habe ich von Earthshine Electronics(sehr Empfehlenswertes Tutorial für Einsteiger! Wink)

Zu deinem Code: Man muss doch immer erst einmal x hochzählen, dann Ausgeben(digitalWrite(latchPin, HIGH)). Bei deinem Code zählst du doch bis zum Ende der fortschleife(x=1) hoch und setzt dann erst den LatchPin auf High.

Aber dein Link scheint genau das zu sein, was ich versuche. Danke dafür! Das "shiftOut" eine eigene Funktion von Arduino ist, wusste ich gar nicht. Das werde ich mir auf jeden fall mal anschauen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Sad Hilfe bei 2.4 TFT Display Harry Hirsch 40 2.064 22.04.2018 15:34
Letzter Beitrag: Tommy56
  hilfe bei callback ausgabe per knopfdruck merz 5 230 15.04.2018 14:16
Letzter Beitrag: Tommy56
  Hilfe bei Fehlermeldung TroyPan 3 340 23.03.2018 23:38
Letzter Beitrag: Tommy56
  Hilfe beim skript Devtris 24 1.342 12.03.2018 18:19
Letzter Beitrag: Tommy56
  Hilfe bei einen kleinen Programm FPV 9 922 11.03.2018 20:42
Letzter Beitrag: Tommy56
  Hilfe beim Programmieren Klawino 28 1.610 10.03.2018 13:36
Letzter Beitrag: hotsystems
  Hilfe bei der Programmierung Digitaluhr ,mit Anzeige 32x8 Lora 1 311 10.03.2018 11:44
Letzter Beitrag: hotsystems
  Hold Button - Doppel Klick Hilfe GSA1150 8 652 08.03.2018 16:24
Letzter Beitrag: Tommy56
  Brauch hilfe bei einnem Sketch MrMagoo 10 616 11.02.2018 13:49
Letzter Beitrag: hotsystems
  Hilfe bei diesen Fehler MrMagoo 22 1.037 06.02.2018 20:03
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste