mikrocontroller.net

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


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Berti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da wäre die gesmatstruktur des Programmes gut zu sehen... Eventuell 
gibts da redundanzen die sich durch
switch(){ cases }
oder
if(){
else if(){
else{
}
 vermeiden lassen...

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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..

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kontrolliers noch mal.
Meiner Meinung nach müsste deine Funktion äquivalent sein
zu:
void motor(){


  if( PWM_data > 128 ) {
    if( PWM_value < 120 )
      PWM_value += 10;

    else if( PWM_value <= PWM_data - 7 && PWM_value < 249 )
      PWM_value += 7;
  }

  else if( PWM_data < 128 ) {

    if( PWM_value > 136 )
      PWM_value -= 10;

    else if( PWM_value >= (PWM_data + 7) &&  PWM_value > 6 )
      PWM_value -= 7:
  }

  else {
    if( PWM_value < 119 )
      PWM_value += 10;

    if( PWM_value > 137 )
      PWM_value -= 10;
  }
}

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ziemlich wirrer Code und Variablennamen...

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du willst, daß der eine Wert dem anderen verzögert nachläuft, bis er 
gleich ist.
Wozu dann die Sonderbehandlung für 128?


void motor( void )
{
  int diff = PWM_data - PWM_value;

  if( diff > 10 )
    diff = 10;

  if( diff < -10 )
    diff = -10;

  PWM_value += diff;
}


Peter

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll das eigentlich werden?
  PWM_value = (PWM_value += 10);

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.