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
  Hilfe: IR Remote Steuerung, MSGEQ7 + RGB-LED Streifen dastob 1 122 14.10.2016 21:40
Letzter Beitrag: hotsystems
Sad Ich brauche Hilfe Prosac 4 235 09.10.2016 18:39
Letzter Beitrag: Prosac
  at24c256 Hilfe Gandalf 6 249 29.08.2016 18:59
Letzter Beitrag: MKc
Smile Progammier Neuling Codeschloss bittet um Hilfe Donalonso 2 287 27.08.2016 18:23
Letzter Beitrag: Binatone
  Hilfe gesucht. Webserver Statsiche und Dynamische HTMl Seite b3ta 11 452 22.08.2016 08:07
Letzter Beitrag: b3ta
  Hilfe: Mega2560 - ENC 28J60 - MYSQL Gandalf 1 181 28.07.2016 16:30
Letzter Beitrag: Gandalf
  Selbstfahrender Roboter Programm änderung hilfe ? arekklone 11 547 06.07.2016 14:59
Letzter Beitrag: Binatone
  Hilfe beim Arduino Shield reimundko 6 459 05.06.2016 11:28
Letzter Beitrag: rpt007
Smile Datum Anzeige mit 7 Segmentanzeige ottii50 11 900 16.05.2016 19:12
Letzter Beitrag: Mathias
  Brauche etwas Hilfe bei der Umsetzung einer Idee raspido 3 535 23.04.2016 10:26
Letzter Beitrag: rkuehle

Gehe zu:


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