Forum: Mikrocontroller und Digitale Elektronik && Verküpfungen vereinfachen?


von Frank (Gast)


Lesenswert?

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?

von Berti (Gast)


Lesenswert?

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...

von Niels H. (monarch35)


Lesenswert?

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.

von Frank (Gast)


Angehängte Dateien:

Lesenswert?

@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..

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Frank (Gast)


Lesenswert?

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.

von Unbekannter (Gast)


Lesenswert?

Ziemlich wirrer Code und Variablennamen...

Da scheint die Grundstruktur des Programms bzw. Algorithmus schon mies 
zu sein...

von Peter D. (peda)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

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.

von Andreas K. (a-k)


Lesenswert?

Was soll das eigentlich werden?
  PWM_value = (PWM_value += 10);

von Niels H. (monarch35)


Lesenswert?

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