Forum: Mikrocontroller und Digitale Elektronik Wie effizienten Code schreiben?


von Kirsche (Gast)


Lesenswert?

Guten Abend
ich bin gerade dran eine Rollo Steurung zu Programmieren!
Dazu habe ich eine Platine gebaut die 16 Digitale Eingänge hat und 16 
Digitale Ausgänge hat! Nun habe ich die 18 Eingänge mit der Danegger 
Entprellung entprellt!
Nun zu meiner Frage ich möchte eine Funktion schreiben die den Ablauf 
des Rollo steuert!
Wie macht man das am besten das es kein Spagetti Code wird?

Danke für die Hilfe

von o_O (Gast)


Lesenswert?

do

loop until 1=2

von PittyJ (Gast)


Lesenswert?

Mal schnell gegoogelt:

Also Funktion:

 Rückgabetyp  Funktionsname(Parameterliste)
 {
    Anweisungen
 }


Dann müssen nur noch die passenden Namen, Parameter und Anweisungen 
rein.

Und gegen Spagetti hilft
#define goto /**/
ganz oben im Code.

von Ivan Kuznec (Gast)


Lesenswert?

while(1)
{
if( nach_unten && anschlag_unten !=1 )
{
fahre_nach_unten() ;
}

if(nach_oben && anschlag_oben !=1 )
{
fahre_nach_oben() ;
}
}


versuch damit ;--)))

von Kirsche (Gast)


Lesenswert?

Ich glaube ich habe mich nicht Deutlich ausgedrückt!
Ich möchte eine Funktion für alle Rollo! Ich möchte aber nicht 8 mal die 
Taten Abfragen und die passenden Ausgänge übergeben!
Geht es nicht einfacher und besser?

Danke

von Ivan Kuznec (Gast)


Lesenswert?

>Kirsche schrieb:
> Ich glaube ich habe mich nicht Deutlich ausgedrückt!
Ganz, ruhig,
> Ich möchte eine Funktion für alle Rollo! Ich möchte aber nicht 8 mal die
> Taten Abfragen und die passenden Ausgänge übergeben!
 Es ist schon klar das ein µC sequentiell arbeitet? :-)))
> Geht es nicht einfacher und besser?
>
> Danke

 was ist das für Platine? Ist da ein AVR drauf? die 16 digitale Eingänge 
liegen die an zwei PORT´s?

von (Gast)


Lesenswert?

Was willst du dann?

von eingänge (Gast)


Lesenswert?

also erstmal will er in der software eine gpio erweiterung / expander 
machen. er hat ja nur 16 dig. eingänge entprellt jedoch 18 in der 
software ... vlt. multiplexe ^^^

ducken und tüsch

von Ivan Kuznec (Gast)


Lesenswert?

>eingänge schrieb:
> also erstmal will er in der software eine gpio erweiterung / expander
> machen. er hat ja nur 16 dig. eingänge entprellt jedoch 18 in der
> software ... vlt. multiplexe ^^^
>
> ducken und tüsch

expander gehen über MUX wie du schon sagst, man kann aber auch GPIO 
Expander über SPI ansteuern, funkzioniert auch ganz gut ;-)))

von Klaus R. (klara)


Lesenswert?

Hallo,
schreib die Methode für einen Kanal. Dann springe die Methode mit 
Parameter gesteuert für jeden Kanal an.
mfg klaus

von PittyJ (Gast)


Lesenswert?

Womit wir wieder beim guten C-Buch wären...

von Kirsche (Gast)


Lesenswert?

Sorry das ich mich erst jetzt wider melde aber habe es erst jetzt 
geschafft!
1
                if( get_key_short( 1<<IN_R1_Auf ) )
2
    {
3
      Rollo_kommpletAuf(O_Roll_1_Auf)
4
    }
5
    if ( get_key_long( 1<<IN_R1_Auf ))
6
    {
7
      RolloPort|=(1<<O_Roll_1_Auf)
8
    }
9
    else
10
    {
11
      RolloPort &=~(1<<O_Roll_1_Auf)
12
    }
13
    if( get_key_short( 1<<IN_R1_Zu ) )
14
    {
15
      Rollo_kommpletAuf(O_Roll_1_Zu)
16
    }
17
    if ( get_key_long( 1<<IN_R1_Zu ))
18
    {
19
      RolloPort|=(1<<O_Roll_1_Zu)
20
    }
21
    else
22
    {
23
      RolloPort &=~(1<<O_Roll_1_Zu)
24
    }

Mir gefäält es einfach nicht diese Wurst 8 mal hin zu schreiben!

Danke für Eure Hilfe

von Kirsche (Gast)


Lesenswert?

Wäre die frage besser unter Gcc aufgehoben?

von PittyJ (Gast)


Lesenswert?

for(int i=0;i<8;i++)
{
   -- hier kommt dein Code --
}

von Kirsche (Gast)


Lesenswert?

Funktioniert die Entprellung auch in einer for Schleife?

von COBOL-Hasser (Gast)


Lesenswert?

Ich sehe mehrere Antworten.

1. Effizienz im Sinne von kurzer Arbeitszeit. Du hast funktionierenden 
Code, jedes weitere Feilen daran wäre ineffizient (es sei denn, es 
leichtere Wartung oder Wiederverwendung spielen eine Rolle).


2. Effizienz im Sinne von geringer Sourcecode-Länge (siehe Wartbarkeit):

Voraussetzung: IN_R1_Auf ... IN_R8_Auf, O_Roll_1_Auf ... O_Roll_8_Auf, 
usw gehen jeweils in 1er-Schritten aufwärts, dann geht das so:

#define ROLLO_HIN_UND_HER(ROLLO) \
   if( get_key_short( 1<<(IN_R1_Auf+ROLLO) ) ) \
  { \
      Rollo_kommpletAuf(O_Roll_1_Auf+ROLLO) \
...
      RolloPort &=~(1<<O_Roll_1_Zu+ROLLO) \
    }

ROLLO_HIN_UND_HER(0)
ROLLO_HIN_UND_HER(1)
...
ROLLO_HIN_UND_HER(8)


3. Effizienz im Sinne von geringer Objectcode-Länge (Flash sparen) 
(wobei ich mir nicht ganz sicher bin, dass der Overhead von der Loop und 
der Parametrisierung nicht die Ersparnis kaputtmacht)

void rollo_hin_und_her_1(int rollo)
  if( get_key_short( 1<<(IN_R1_Auf+rollo) ) )
  {
      Rollo_kommpletAuf(O_Roll_1_Auf+rollo)
...
      RolloPort &=~(1<<O_Roll_1_Zu+rollo)
    }

void rollo_hin_und_her_alle(void)
{
  for (int i=0; i<8; i++)
    rollo_hin_und_her_1(i);
}


4. Effizienz im Sinne von geringem Ram/Registerverbrauch

void rollo_hin_und_her_1(int rollo)
  if( get_key_short( 1<<(IN_R1_Auf+rollo) ) )
  {
      Rollo_kommpletAuf(O_Roll_1_Auf+rollo)
...
      RolloPort &=~(1<<O_Roll_1_Zu+rollo)
    }

rollo_hin_und_her_1(1);
rollo_hin_und_her_1(2);
...
rollo_hin_und_her_1(8);


Die Effizienzkriterien können, müssen aber nicht, einander 
widersprechen.


/***
Rein typographische Anmerkung: Viele Techniker machen das und Du wurdest 
offenbar infiziert, aber Rufzeichen! braucht man nur, wenn es wirklich 
um Ausrufe oder Schreie geht, nicht für normale Aussagen oder 
Fehlermeldungen.

"Kein Artikel mit der Nummer 3829 in der Datenbank."
"Domain mikkrokkontroller.net exisitiert nicht."

aber:

"Du Trottel hast schon wieder das Passwort flasch eingegeben!"

mit mehr Schmackes:

"Du hast den Mistkübel schon wieder nicht hinuntergetragen!!11!"
***/

von PittyJ (Gast)


Lesenswert?

Welche Entprellung.
Ist da etwa noch mehr Code?
Woher sollen wir das wissen, was da alles noch ist.

Achja, heute ist Samstag. Die Buchhandlungen haben noch auf. Meistens 
gibt es da auch gute C-Bücher. Mit Erlärungen zu Array und Schleifen.

von Kirsche (Gast)


Lesenswert?

PittyJ schrieb:
> Welche Entprellung.
> Ist da etwa noch mehr Code?

Ich möchte auf den ersten Beitrag in diesem Faden verweißen!

Kirsche schrieb:
> Nun habe ich die 18 Eingänge mit der Danegger
> Entprellung entprellt!

Ich kenne Array und schleifen bin mir aber vom Konzept nicht sicher!

LG

von Kirsche (Gast)


Lesenswert?

COBOL-Hasser schrieb:
> . Effizienz im Sinne von geringer Sourcecode-Länge (siehe Wartbarkeit):


Ich glaube dieser Weg wäre der meine
Danke!

von COBOL-Hasser (Gast)


Lesenswert?

Off by one, zwei Mal. Ich korrigiere:

ROLLO_HIN_UND_HER(0)
ROLLO_HIN_UND_HER(1)
...
ROLLO_HIN_UND_HER(7) /* nicht 8 */


rollo_hin_und_her_1(0);  /* nicht 1..8, sondern 0..7 */
rollo_hin_und_her_1(1);
...
rollo_hin_und_her_1(7);

Complexity kills :-)

von Forumsfrustrierter (Gast)


Lesenswert?

PittyJ schrieb:
> Welche Entprellung.
> Ist da etwa noch mehr Code?
> Woher sollen wir das wissen, was da alles noch ist.
>
> Achja, heute ist Samstag. Die Buchhandlungen haben noch auf. Meistens
> gibt es da auch gute C-Bücher. Mit Erlärungen zu Array und Schleifen.

Diese herablassende Art bringt niemanden weiter.

Welches gute C-Buch würdest Du empfehlen, wenn Du schon so gscheit bist?

Was aber wahrscheinlich nicht der Fall ist: Es fehlt je ein Fragezeichen 
hinter "Entprellung" und "noch ist". Wer nicht einmal die einfachsten 
Grundregeln von Kommunikation und Satzzeichen versteht, kann auch keine 
guten Programme schreiben und schon gar nicht gut im Geschäft sein.

Hey, die Flamerei macht ja richtig Spaß!

von Falk B. (falk)


Lesenswert?

@ Forumsfrustrierter (Gast)

>Welches gute C-Buch würdest Du empfehlen, wenn Du schon so gscheit bist?

Der Klassiker, "Programmieren in C". Entweder die originale K&C Ausgabe, 
oder ein der vielen "Kopien" anderer Autoren.

Damit kommt man schon SEHR weit, wenn man das Buch schritt für Schritt 
WIRKLICH durchARBEITET. Sprich, die Beispiele auch mal selber mit einem 
einfachen Kompiler auf der Kommandozeile nachvollzieht und ggf. 
erweitert.

von FH-Student (Gast)


Lesenswert?

PittyJ schrieb:
> Und gegen Spagetti hilft
> #define goto /**/
> ganz oben im Code.

Quatsch, goto kann man oft genug sinnvoll verwenden.

Spaghetticode produzieren die Leute, die einfach los programmieren ohne 
nachzudenken was sie eigentlich machen wollen.

von PittyJ (Gast)


Lesenswert?

Diese herablassende Art bringt niemanden weiter.
>
> Welches gute C-Buch würdest Du empfehlen, wenn Du schon so gscheit bist?
>
> Was aber wahrscheinlich nicht der Fall ist: Es fehlt je ein Fragezeichen
> hinter "Entprellung" und "noch ist". Wer nicht einmal die einfachsten
> Grundregeln von Kommunikation und Satzzeichen versteht, kann auch keine
> guten Programme schreiben und schon gar nicht gut im Geschäft sein.

gscheit

Glashaus

von Noch einer (Gast)


Lesenswert?

Also Leute,
in diesem Fall tut es doch auch der ineffizienteste Spagetticode.

Letztendlich kann man gutes Softwaredesign nur auf einem Weg lernen - 
erst mal Fehler machen und dann darüber nachdenken, warum das System im 
Chaos versunken ist. Und dafür ist das Projekt zu klein.

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.