Große Uhr Flackert Arduino uno

Gast #5548063
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.
Gast #5548070
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren