Hallo zusammen, ich bastele gerade ein wenig an einer Steuerung herum. Leider ist diese Steuerung sehr komplex und von vielen Faktoren abhängig. Im Moment frage ich diese Reihe von Faktoren z.B. folgendermaßen ab: if((Bedingung1 <= Wert) && (Bedingung2 >= Wert) && ((Bedingung3 < Wert)) Da im Programm sehr viele von diesen Abfragen existieren, geht der Speicher von meinem 8kB Controller ganz fix flöten. Kann ich diese Abfragen irgendwie anders schreiben; damit nicht soviel Speicher dafür benötigt wird?
da wäre die gesmatstruktur des Programmes gut zu sehen... Eventuell gibts da redundanzen die sich durch
1 | switch(){ cases } |
oder
1 | if(){ |
2 | else if(){ |
3 | else{ |
4 | }
|
vermeiden lassen...
Eventuell durch Logik- oder wahrheitstabellen.? Das was sich KV-Diagramm nennt lässt sich ziemlich leicht Softwaremässig umsetzen oder zumindest so abwandeln, daß es für den Bedarf passt.
@Berti, Danke für den Tip aber die if/else Geschichte verwende ich schon. Bei der Switch/Case gibt es leider das Problem, dass nur Ausdrücke und keine Bedingungen agefragt werden können. @Niels Hi Niels, das mit dem KV-Diagramm werd ich mir mal anschauen. @All Hab mal ne Funktion aus dem Code angehangen, vielleicht hat noch wer ne Idee..
Kontrolliers noch mal. Meiner Meinung nach müsste deine Funktion äquivalent sein zu:
1 | void motor(){ |
2 | |
3 | |
4 | if( PWM_data > 128 ) { |
5 | if( PWM_value < 120 ) |
6 | PWM_value += 10; |
7 | |
8 | else if( PWM_value <= PWM_data - 7 && PWM_value < 249 ) |
9 | PWM_value += 7; |
10 | }
|
11 | |
12 | else if( PWM_data < 128 ) { |
13 | |
14 | if( PWM_value > 136 ) |
15 | PWM_value -= 10; |
16 | |
17 | else if( PWM_value >= (PWM_data + 7) && PWM_value > 6 ) |
18 | PWM_value -= 7: |
19 | }
|
20 | |
21 | else { |
22 | if( PWM_value < 119 ) |
23 | PWM_value += 10; |
24 | |
25 | if( PWM_value > 137 ) |
26 | PWM_value -= 10; |
27 | }
|
28 | }
|
Danke Karl Heinz, funktioniert einwandfrei und spart knapp 1% Speicherplatz. Dann werd ich die anderen Teile im Code auch mal auf diese Weise umschreiben und schauen was am Ende dabei heraus kommt.
Ziemlich wirrer Code und Variablennamen... Da scheint die Grundstruktur des Programms bzw. Algorithmus schon mies zu sein...
Du willst, daß der eine Wert dem anderen verzögert nachläuft, bis er gleich ist. Wozu dann die Sonderbehandlung für 128?
1 | void motor( void ) |
2 | {
|
3 | int diff = PWM_data - PWM_value; |
4 | |
5 | if( diff > 10 ) |
6 | diff = 10; |
7 | |
8 | if( diff < -10 ) |
9 | diff = -10; |
10 | |
11 | PWM_value += diff; |
12 | }
|
Peter
Hi Peter, die Sonderbehandlung nur weil es zwei verschiedene Fälle sind. Von 128 bis 255 läuft der Motor vorwärts. Bei 127 bis 0 läuft der Motor rückwärts. Dabei ist 127-128 Stillstand und 0/255 die maximale Drehzahl in die jeweilige Richtung. Dazu kommt noch das der Motor schneller abbremsen als beschleunigen soll. Aber dein Ansatz gefällt mir. Werd ich mal ausprobieren.
Frank wrote: > Dazu kommt noch das der Motor schneller abbremsen als beschleunigen > soll. Das würde ich garnicht über eine Steuerlogic machen. Da würde ich eine Beschleunigungstabelle mit jeweils 128 Einträge pro Richtung im Flashspeicher anlegen. Für die 256Byte sollte doch locker Platz sein...
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.