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
Stefan schrieb: > Kann sich mal einer den Code anschauen ob da alles in Ordnung ist ? Die Schaltung dazu solltest Du auch zeigen.
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.
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.
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).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.