Hallo, ich bastel an einer Uhr mit Wecker, und bin grade dabei, eine Funktion zu schreiben, die auf Knopfdruck die Minuten weiterzählt (also zum Stellen ;-) ). An sich keine große Sache, nur dass ich diese Funktion führ's Stellen der Uhr sowie für den Wecker verwenden möchte. Das bedeutet, dass das "plusrechnen" sich mal auf die Variable minuten, mal auf w_min bezieht. Bisher habe ich das so wie im Anhang gemacht, und jetzt frage ich mich, ob man das nicht optimieren/eleganter machen kann?
ohne mir jetzt direkt über die "Stell"-Funktion gedanken gemacht zu haben, pointer wären ne möglichkeit:
1 | int min_stell(void) |
2 | {
|
3 | int *temp; |
4 | if (flags.wecker_stellen==1) //wecker wird gestellt |
5 | {
|
6 | temp=&w_min; |
7 | }
|
8 | else //uhrzeit... |
9 | {
|
10 | temp=&min; |
11 | }
|
12 | _delay_ms(100); |
13 | |
14 | if (bit_is_set(PINC,0)) |
15 | {
|
16 | (*temp)++; |
17 | if (*temp==60) |
18 | {
|
19 | *temp=0; |
20 | }
|
21 | }
|
22 | loop_until_bit_is_clear(PINC,0); |
23 | _delay_ms(100); |
24 | |
25 | }
|
Und wo du schon einen Rückgabewert-Datentyp angegeben hast:
1 | int min_stell(int temp) |
2 | {
|
3 | |
4 | _delay_ms(100); |
5 | |
6 | if (bit_is_set(PINC,0)) |
7 | {
|
8 | temp++; |
9 | if (temp==60) |
10 | {
|
11 | temp=0; |
12 | }
|
13 | }
|
14 | loop_until_bit_is_clear(PINC,0); |
15 | _delay_ms(100); |
16 | |
17 | return temp; |
18 | }
|
Aber auch ohne Rückgabewert:
1 | void min_stell(int *temp) |
2 | {
|
3 | |
4 | _delay_ms(100); |
5 | |
6 | if (bit_is_set(PINC,0)) |
7 | {
|
8 | (*temp)++; |
9 | if (*temp==60) |
10 | {
|
11 | *temp=0; |
12 | }
|
13 | }
|
14 | loop_until_bit_is_clear(PINC,0); |
15 | _delay_ms(100); |
16 | |
17 | return; |
18 | }
|
.. sollte es gehen. Funktionaufruf einmal mit z.B.:
1 | w_min = min_stell(w_min); |
oder doch etwas hübscher:
1 | min_stell(&w_min); |
hoffe, das stimmt so ... mfg see4far
hm... kann man wohl maximal 3mal diesen C-befehl im forum anwenden.. also: ... Funktionaufruf einmal mit z.B.:
1 | w_min = min_stell(w_min); |
oder doch etwas hübscher:
1 | min_stell(&w_min); |
... bzw. wurde nur nicht angezeigt (bei mir zumindest)
check ich nicht... sehe die beiden zeilen immer noch nicht ... am besten einfach die 4 zeilen woanders hinkopieren .. dann klappts.
hmm was du noch machen könntest: statt der unnötigen if abfrage: ( *temp++ ) % 60;
@Mathias Falsch. Modulo erfordert eine Division, und die ist beim AVR vermutlich um den Faktor 100 langsamer als ein einfacher Vergleich. Es gibt echt jeden Scheiß im AVR, aber nicht mal die Grundrechenarten kann das Ding... Ich verwende eigentlich nie Module, sondern immer Vergleiche, das reduziert die Codegröße um >100Bytes (wenn nirgendwo anderst eine Divison benötigt wird), und beschleunigt den Code je nach Häufigkeit des Aufrufs um einiges (bei meinem Speichetest in dem ein String mit möglichst nie durch 2^n Teilbarer Länge in den Speicher geschrieben wurde, beschleunigte das etwa um den Faktor 5 !)
Hab auch schon Probleme mit Modulo-Operationen gehabt. Für zeitkritische Sachen sind die einfach nix ... so meine Erfahrung!
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.