Forum: Mikrocontroller und Digitale Elektronik Große Uhr Flackert Arduino uno


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 Stefan (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe eine Uhr gebaut mit Arduino Uno die auch funktioniert.
Allerdings ist das Flacker durch das Multiplexen recht nervig.

Kann sich mal einer den Code anschauen ob da alles in Ordnung ist ?

Danke

: Verschoben durch Moderator
von Jörg R. (solar77)


Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Kann sich mal einer den Code anschauen ob da alles in Ordnung ist ?

Die Schaltung dazu solltest Du auch zeigen.

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Kann sich mal einer den Code anschauen ob da alles in Ordnung ist ?

Done!

Als erstes muss das multiplexen abgekoppelt werden.
z.B. in einen Timerinterrupt verlagern
Dann flackert nix mehr.

Auch scheinen mir die ganzen delays überflüssig.

von Stefan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
kann die Schaltung gerade nich hochladen weil nicht zu Hause.

Die 7 Ausgänge vom Uno auf einen ULN dann an die 7Sekmente und das 4 
mal.

Die 4 Multiplex Ausgänge über Transistorstufe an den gemeinsammen Plus 
der

Sekmente.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Ich könnte mir vorstellen, dass die vielen Fließkomma-Operationen dein 
Programm zu sehr ausbremsen.

Statt "floor(hour / 10)" kannst du einfach hour/10 schreiben, denn das 
ist eine reine Integer-Operation die ohnehin immer ein abgerundetes 
Ergebnis erzeugt.

Statt "hour - 10 * floor(hour / 10)" kannst du die Einer mit dem Modulus 
Operator berechnen: hour%10

Es es scheint mit sinnlos, die vier Zahlen (Stunden Zehner, Stunden 
Einer, Minuten Zehner, Minuten Einer) zuerst in ein Array zu schreiben, 
und dass dann direkt danach in einer Schleife wieder auszulesen. gehe 
doch einfach den direkten Weg:
1
void printTime(int hour, int min)
2
{
3
  // Stunden Zehner
4
  digitalWrite(digits[3], LOW);  
5
  digitalWrite(digits[0], HIGH);
6
  state = false;
7
  printNum(hour / 10);
8
  delay(5);
9
  
10
  // Stunden Einer
11
  digitalWrite(digits[0], LOW);
12
  digitalWrite(digits[1], HIGH);
13
  state = true;
14
  printNum(hour % 10);
15
  delay(5);
16
17
  // Minuten Zehner
18
  digitalWrite(digits[1], LOW);  
19
  digitalWrite(digits[2], HIGH);
20
  state = false;
21
  printNum(min / 10);
22
  delay(5);
23
24
  // Minuten Einer
25
  digitalWrite(digits[2], LOW);  
26
  digitalWrite(digits[3], HIGH);
27
  state = false;
28
  printNum(min / 10);
29
  delay(5);
30
}

Der Variable state würde ich mindestens einen aussagekräftigeren Namen 
geben. Oder besser keine Variable verwenden, sondern dies als Argument 
der printNum() Funktion übergeben.

Die digitalWrite() Funktion ist dafür bekannt, ziemlich ineffizient zu 
sein. Da verlierst du sehr viel Zeit. Greife besser direkt auf die I/O 
Pins zu. Zum Beispiel so:
1
// Setze ein Bit auf high, wenn value>0 ist, andernfalls setze das Bit auf low
2
#define writeBit(port,bit,value)   { if ((value)>0) (port) |= (1<<bit); else (port) &= ~(1<<bit); }
3
4
// Lese ein Bit. Das Ergebnis ist immer 0 oder 1.
5
#define readBit(port,bit)          (((port) >> (bit)) & 1)
6
7
// Bei Port B alle Bits als Ausgang einstellen
8
DDRB = 0b11111111;
9
10
// Pin PB2 auf High stellen (geht auch mit Werten größer als 1)
11
writeBit(PORTB,2,1);
12
13
// Pin PB4 auf Low stellen
14
writeBit(PORTB,4,0);
15
16
// Beim Lesen muss man das PIN Register benutzen!
17
if (readBit(PINA,7)==1) ...

Bei dieser Methode musst du mit den "echten" Port- und Pin-Bezeichnungen 
des Mikrocontrollers arbeiten, nicht mit den vereinfachten Arduino 
Nummern.

Wenn du writeBit() mit konstanten Parametern aufrufst, wird daraus sogar 
nur ein einziger Assembler-Befehl der in einem einzigen Takt ausgeführt 
wird. Die digitalWrite() Funktion ist ca. 50 mal langsamer (soweit ich 
mich erinnere).

: Bearbeitet durch User
von MaWin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Kann sich mal einer den Code anschauen

Schrecklich.

So ein Arduino ist nicht schnell.

Und 4 Ziffern in einem Rutsch und dann unbekannte Zeit lang eine loop 
macht die Stellen nicht gleichmässig hell.

Der Code zum Setzen ist ja irre aufwändig.

von Jörg R. (solar77)


Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> kann die Schaltung gerade nich hochladen weil nicht zu Hause.

Immer noch unterwegs, oder Problem gelöst?

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.