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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.