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
7-Segment Multiplex, überblendet
17.11.2015, 17:54
Beitrag #1
7-Segment Multiplex, überblendet
Code:
#include <TimerOne.h>

#define firstLEDPin 2

byte digits[][7] = {
  { 1, 1, 1, 1, 1, 1, 0 }, // = 0
  { 0, 1, 1, 0, 0, 0, 0 }, // = 1
  { 1, 1, 0, 1, 1, 0, 1 }, // = 2
  { 1, 1, 1, 1, 0, 0, 1 }, // = 3
  { 0, 1, 1, 0, 0, 1, 1 }, // = 4
  { 1, 0, 1, 1, 0, 1, 1 }, // = 5
  { 1, 0, 1, 1, 1, 1, 1 }, // = 6
  { 1, 1, 1, 0, 0, 0, 0 }, // = 7
  { 1, 1, 1, 1, 1, 1, 1 }, // = 8
  { 1, 1, 1, 0, 0, 1, 1 }, // = 9

  { 1, 1, 1, 0, 1, 1, 1 }, // = a
  { 0, 0, 1, 1, 1, 1, 1 }, // = b
  { 1, 0, 0, 1, 1, 1, 0 }, // = c
  { 0, 1, 1, 1, 1, 0, 1 }, // = d
  { 1, 0, 0, 1, 1, 1, 1 }, // = e
  { 1, 0, 0, 0, 1, 1, 1 }  // = f
};

int seg[] = { 11, 12 };

int zahl1 = 3;
int zahl2 = 1;

void LEDOutput() {
  zahl1 += 1;
  if (zahl1 == 10) {
    zahl1 = 0;
  };
}

void setup() {
  Timer1.initialize(500000);
  Timer1.attachInterrupt(LEDOutput);

  for (int i = firstLEDPin; i <= 8 + firstLEDPin ; i++) {
    pinMode(i, OUTPUT);
  };
  pinMode(seg[0], OUTPUT);
  pinMode(seg[1], OUTPUT);
}

void writeSeg(int nr, int wert) {
  digitalWrite(seg[0], LOW);
  digitalWrite(seg[1], LOW);
  digitalWrite(seg[nr], HIGH);
  delay(5);
  for (byte b = 0; b < 7; ++b) {
    digitalWrite(b + firstLEDPin, digits[wert][b]);
  }
}

void loop() {
  writeSeg(0, zahl1);
  writeSeg(1, zahl2);
}

Die Schaltung sieht etwa so aus, nur das ich 2 Segment anstelle 4 verbaut habe.

[Bild: 7s.png]

Eine Stelle hat immer konstant eine "1", die andere zählt endlos von "0-9".
Auf den ersten Blick sieht alle gut aus.
Das Problem, die Anzeigen überblenden leicht.
Einfacher gesagt, beim Segment mit der "1", sieht man leicht den Zähler durchschimmern.

Was mache ich falsch ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.11.2015, 23:24
Beitrag #2
RE: 7-Segment Multiplex, überblendet
Ich vermute, die Taktgeschwindigkeit ist zu hoch für die Led's, bzw. diese sind zu träge.
Lege mal ein delay in die Loop, um das ganze langsamer zu machen.
Ich denke damit wirst du das Problem erst mal beseitigen können.

Aber warum machst du dir diesen Aufwand, da gibt es doch fertige Decoder-ICs, leider habe ich da keinen Typen parat, da ich Anzeigen überwiegend per I2C ansteuer. Das braucht weniger Leitungen und Ports auf dem Arduino.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.11.2015, 16:43
Beitrag #3
RE: 7-Segment Multiplex, überblendet
Ich habe den Fehler gefunden. Wen ich den GND-Port umschalte, wird logischerweise der alte Wert angezeigt, bevor neu geschrieben wird.

Mit dieser Änderung läuft es ohne Fehler.
Code:
void writeSeg(int nr, int wert) {
  digitalWrite(seg[0], LOW);
  digitalWrite(seg[1], LOW);
  for (byte b = 0; b < 7; ++b) {
    digitalWrite(b + firstLEDPin, digits[wert][b]);
  }
  digitalWrite(seg[nr], HIGH);
}

Zitat:Aber warum machst du dir diesen Aufwand, da gibt es doch fertige Decoder-ICs,
Klar, gibt es dafür welche, aber für Lernzwecke will ich es so lösen.
Man könnte einen BCD-Decoder oder Schieberegister nehmen.
Aber dies werde ich zu einem späteren Zeitpunkt probieren.

Zitat: da ich Anzeigen überwiegend per I2C ansteuer.
I2C werde ich sicher auch mal ausprobieren.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.11.2015, 16:46
Beitrag #4
RE: 7-Segment Multiplex, überblendet
Ja prima, wenn es jetzt funktioniert.

Und lernen ist immer gut, das tun wir alle noch. Wink

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.11.2015, 17:22
Beitrag #5
RE: 7-Segment Multiplex, überblendet
Ich habe den Code noch ein bisschen abgeändert, somit habe ich kein Unterbruch beim multiplexen. So kann ich z.B. auch über Serial etwas einlesen ohne das es flackert. Somit sollte es auch möglich sein ein Sensor einzulesen.
Code:
int seg[] = { 10, 11, 12 };
int zahl[] = { 4, 3, 5 };

int c = 0;
void multiplex()
{
  for (byte i = 0; i < maxSegment; i++) {
    digitalWrite(seg[i], LOW);
  }
  for (byte i = 0; i < 7; ++i) {
    digitalWrite(i + firstLEDPin, digits[zahl[c]][i]);
  }
  digitalWrite(seg[c], HIGH);
  
  c += 1;
  if (c == maxSegment) {
    c = 0;
  };
}

void setup() {
  Timer1.initialize(5000);
  Timer1.attachInterrupt(multiplex);
  Serial.begin(9600);

  for (byte i = firstLEDPin; i <= 8 + firstLEDPin ; i++) {
    pinMode(i, OUTPUT);
  };
  for (byte i = 0; i < maxSegment; i++) {
    pinMode(seg[i], OUTPUT);
  }
}

void loop() {
  while (Serial.available() > 0) {
    zahl[2] = Serial.parseInt();
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Thermometer mit 7 Segment Anzeige ottii50 53 1.531 31.05.2016 18:43
Letzter Beitrag: ottii50
  8 LED , 7-Segment-Elemente einzeln ansteuern beim tm1638 und die Buttons arduinofan 0 502 15.01.2016 22:37
Letzter Beitrag: arduinofan
  8x7 Segment LED Anzeige / Sketch verändern w1ck3d 3 647 23.11.2015 17:56
Letzter Beitrag: hotsystems
  Sieben Segment LED Anzeige Tellen 10 1.818 18.06.2015 21:21
Letzter Beitrag: Tellen
  7 Segment mit MAX7219 - keine 0 Anzeige Viktor93 3 1.313 08.10.2014 14:09
Letzter Beitrag: René Hitz
  7 Segment Anzeige mit Treiber / Programmierung! mullman1 7 2.482 29.06.2014 18:57
Letzter Beitrag: Bitklopfer

Gehe zu:


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