Forum: Mikrocontroller und Digitale Elektronik Mein erstes Programm Code kürzen


von Lars L. (zirag)


Angehängte Dateien:

Lesenswert?

Hi again,

ich bin blutiger Einsteiger, habe mir eine kleine Schaltung mit 
Einstelliger 7Segment Anzeige gebastelt und nun eine kleine Animation 
damit programmiert. Klappt auch alles wunderbar.

Nun ist meine Frage, kann man den (angehängten) Code irgendwie noch 
verkürzen, ohne jedes mal die ganzen Ausgänge einzeln setzen zu müssen?

Nicht böse sein, ist mein erstes Programm und mit C hatte ich auch noch 
nie zu tun, hab lediglich Programmier-Erfahrung in ActionScript.


Vielen Dank im Vorraus ;)


mfg

von STK500-Besitzer (Gast)


Lesenswert?

Guck mal nach Arrays oder Vektoren in einem C-Buch.

von Otto (Gast)


Lesenswert?

> kann man den (angehängten) Code irgendwie noch
> verkürzen, ohne jedes mal die ganzen Ausgänge
> einzeln setzen zu müssen?

Du kannst Deine "LED-Muster" als Tabelle in den Flash legen.

Das gesamte Programm besteht dann nur noch aus einer Schleife:

Von 0 bis Länge der Tabelle:

Lade LED-Muster
Muster an Port
Delay

Otto

von Roland P. (pram)


Lesenswert?

UND: Definiere dir die Segemente als aussagekräftige Namen:

#Define SEG_DISP_1  0b11110110

Dann kann man später den Code auch noch lesen, denn unter
"PORTC = 0b11101101;" kann ich mir absolut nichts vorstellen
unter "PORTC = SEG_DISP_1" aber, dass eine 1 dargestellt wird, bzw. 
werden sollte :)
Gruß
Roland

von STK500-Besitzer (Gast)


Lesenswert?

>UND: Definiere dir die Segemente als aussagekräftige Namen:

>#Define SEG_DISP_1  0b11110110

Das braucht man aber auch nur, wenn man nur bestimmte Zeichen ausgeben 
will.
Wenn man die Segmente einzeln ansteuern bzw. Muster ausgeben will, ist 
ein char-Array sinvoller.

von Roland P. (pram)


Lesenswert?

hmm, das stimmt natürlich, scheint auch als ob er Muster ausgibt.

das Array kann man natürlich auch gleich mit den Konstanten 
initialisieren:

int countdown[10] = { SEG_DISP_9, SEG_DISP_8, SEG_DISP_7.....}

(mit den entsprechenden Schlüsselwörtern dass das Array im Flash landet, 
die ich aber jetzt nicht auswendig weiß :-P)

Für die Muster könnte man sich dann u.U. auch mehr oder weniger 
sprechende Namen einfallen lassen. (oder zumindest als Kommentar 
dahinter schreiben)

hier hab ich schon mal folgende Notation gesehen:

1:  " "

2: |"|_|

3: |"|"|

4:  =|"

5: |_|"|

6: |_|=|

7: |" "

8: |=|=|

9: |=|"|

zugegeben, man braucht schon etwas Fantasie :-)
Wenn man zweizeilig arbeitet gehts noch einfacher, z.B.:
     
9: |_| |

Gruß
Roland

von Klaus (Gast)


Lesenswert?

meine Erfahrung:

wenn ein µC das macht was man will, fasse die Quelle nicht mehr an!!!!
Durch opt. Versuche baut man automatisch Fehler ein! All das was mann
vorher getestet hatte seht erneut zum Test an!

Nutzen     -> 52,5 Byte gespart
Nachteil   -> Kunde meckert 2 neue Bugs an


Optimierungen lohnen nur auf Systemen die nicht "geschlossen" sind!

optimieren kann man nach

-  Codegröße
-  Ausführungsgeschwingigkeit

ein µC ist ein geschlossenes System

Scheißegal wenn der Code reinpasst und er macht es


dann: "FINGER WEG"


Klaus

von Tubie (Gast)


Lesenswert?

... oder dahingehend optimieren, sodas der Code auch nach 5 Jahren noch 
lesbar und verständlich ist.

Vieles, was mir gerade im Kopf rumgeht wird schnellstmöglich 
reingetippt. Läuft dann alles so wie ich es will, wird die Routine 
nochmals etwas optimiert, schöner geschrieben und anschließend 
dokumentiert.

Gruß,
Tubie

von Peter D. (peda)


Lesenswert?

Klaus wrote:
> Scheißegal wenn der Code reinpasst und er macht es
>
>
> dann: "FINGER WEG"

Aber nur, wenn man sich wirklich 110%-ig sicher ist, daß man ihn nie 
mehr erweitern muß.

Es ist viel einfacher in einem modular geschriebenen Code die Stelle zu 
finden, an der man einen Parameter ändern muß, als in einem superlangen 
Spaghetticode an tausenden Stellen was zu ändern.

Ganz abgesehen davon, daß man beim nächsten Programm nicht wieder ganz 
von vorne anfangen muß, sondern die einmal erstellten Module weiter 
verwenden kann.

Die Zeit, die man zu Anfang spart, zahlt man beim nächsten Projekt 
zehnfach wieder drauf.


Peter

von markus (Gast)


Lesenswert?

Ich glaube hier geht es nicht darum, wie man später den Code warten 
kann, was natürlich sehr wichtig ist, sondern um Grundlegende 
programmiertechniken.

Ich habe dein Programm nur kurz überflogen, deswegen bitte bei 
eventuelle Fehlern ein Auge zudrücken.

Die Syntax ist von java, da ich bei C immer ein wenig spicken muss und 
mein Spickzettel gerade nicht greifbar ist ;)

for(int i=0; i<ende; i++){  // Mache das Ganze "ende" mal
   _delay_ms(100);          // Verzögere 100ms
   meineVariablen = meineVariabel + meinWert;  // neuenWertBerechen
   PORTC = meineVariabel;  // neuen Wert an 7-SegmentAnzeige ausgeben
}

fertig.

die Variable "meinWert" hab ich hier als feste Größe angenommen, 
natürlich kannst du deine Werte in einer anderen Weise speichern z.B. 
ein Array was auch nicht gerade schön ist, aber es ist eine Möglichkeit.

int meinIndex = 0;
for(int i=0; i<ende; i++){  // Mache das Ganze "ende" mal
   _delay_ms(100);          // Verzögere 100ms
   meineVariablen = meineVariabel + meinArray(meinIndex); 
//neuenWertBerechen
   meinIndex++;             // Nächste Zahl im Array
   PORTC = meineVariabel;  // neuen Wert an 7-SegmentAnzeige ausgeben
}

von Lars L. (zirag)


Lesenswert?

Danke schonmal für die Antworten ...

@Markus, das sieht für mich verständlich aus ;) Mir geht es auch grad so 
... Deine Java Syntax sieht der von ActionScript sehr ähnlich, in C ist 
das aber alles anders.

Ich denke, ich schau mir erstmal ein paar Tutorials über die C 
Programmierung an.

Mfg

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
Noch kein Account? Hier anmelden.