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