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


von Stefan (Gast)


Angehängte Dateien:

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 User
von Jörg R. (solar77)


Lesenswert?

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

Die Schaltung dazu solltest Du auch zeigen.

von Einer K. (Gast)


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)


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


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).

von MaWin (Gast)


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)


Lesenswert?

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

Immer noch unterwegs, oder Problem gelöst?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.