www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Term vereinfachen


Autor: Guido (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

in meinem Code fällt mir die ganze Zeit eine bestimmte Routine ins Auge, 
die einfach so hingeklatscht aussieht. Hat vielleicht jemand ne Idee wie 
man diese ein bißchen kompakter bekommt?
void battery_routine(void)
{
    if(release_battery_cut_off == on)
    {
      if((battery_count >= 100)&&(battery_count <= 113))
      {
        PORTB &= ~(1 << PB4);
        PORTC &= ~(1 << PC4);
        PORTB &= ~(1 << PB3);
      }

      if((battery_count >= 125)&&(battery_count <= 138))
      {
        PORTB &= ~(1 << PB4);
        PORTC &= ~(1 << PC4);
        PORTB &= ~(1 << PB3);
      }

      if((battery_count >= 151)&&(battery_count <= 164))
      {
        PORTB &= ~(1 << PB4);
        PORTC &= ~(1 << PC4);
        PORTB &= ~(1 << PB3);
      }

      if((battery_count >= 114)&&(battery_count <= 124))
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }

      if((battery_count >= 139)&&(battery_count <= 150))
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }

      if((battery_count >= 165)&&(battery_count <= 180))
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }

      if(battery_count >= 180)
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }

      if(battery_count <= 100)
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }
    }
}

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

erst einmal gibt es einen Fehler in der Funktion.
Bei battery_count = 100 werden erst die Pins gelöscht und dann wieder 
gesetzt. Beim Wert 180 ist es ähnlich unschön, ist jedoch wirkungslos, 
da Pins jedesmal gesetzt werden.
Zur Frage:
VerODERe doch die einzelnen Bedingungen.
if ( ((battery_count >= 100)&&(battery_count <= 113))
  || ((battery_count >= 125)&&(battery_count <= 138))
  || ((battery_count >= 151)&&(battery_count <= 164)) )
{
  PORTB &= ~(1 << PB4);
  PORTC &= ~(1 << PC4);
  PORTB &= ~(1 << PB3);
}

if ( ((battery_count >= 114)&&(battery_count <= 124))
  || ((battery_count >= 139)&&(battery_count <= 150))
  || ((battery_count >= 165)&&(battery_count <= 180))
  || (battery_count > 180)
  || (battery_count <= 100) )
{
  PORTB |= (1 << PB4);
  PORTC |= (1 << PC4);
  PORTB |= (1 << PB3);
}

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vieleicht so:
void battery_routine(void)
{
    if(release_battery_cut_off == on)
    {
      if(((battery_count >= 100)&&(battery_count <= 113))
          | ((battery_count >= 125)&&(battery_count <= 138))
          | ((battery_count >= 114)&&(battery_count <= 124)))
      p = 1;
            
      if(((battery_count >= 114)&&(battery_count <= 124))
          | ((battery_count >= 139)&&(battery_count <= 150))
          | ((battery_count >= 165)&&(battery_count <= 180))
          | (battery_count >= 180) | (battery_count <= 100))
      p = 0;
      
      switch (p)
      {
       case 0: PORTB |= (1 << PB4);
               PORTC |= (1 << PC4);
               PORTB |= (1 << PB3);
               break;
       case 1: PORTB &= ~(1 << PB4);
               PORTC &= ~(1 << PC4);
               PORTB &= ~(1 << PB3);
               break;
      }
    }
}

Oder geht auch einfach
else p = 0;
?

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups,

(battery_count <= 100)

muss natürlich

(battery_count < 100)

sein.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da war einer schneller ;-)

Autor: Funkenschlosser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void PortOn()
{
 PORTC &= ~(1 << PC4);
 PORTB &= ~(1 << PB4) | (1 << PB3);
}

void PortOff()
{
 PORTC |= (1 << PC4);
 PORTB |= (1 << PB4) | (1 << PB3);
}

void battery_routine(void)
{
    if(release_battery_cut_off == on)
    {
      if(( battery_count > = 100 ) && ( battery_count <= 113 ))
      {
        PortOn()
      }

      if(( battery_count >= 125 ) && ( battery_count <= 138 ))
      {
        PortOn()
      }

      if(( battery_count >= 151 ) && ( battery_count <= 164 ))
      {
        PortOn()
      }

      if(( battery_count >= 114 ) &&(battery_count <= 124 ))
      {
        PortOff()
      }

      if(( battery_count >= 139 )&& ( battery_count <= 150 ))
      {
        PortOff()
      }

      if(( battery_count >= 165 ) && ( battery_count <= 180 ))
      {
        PortOff()
      }

      if( battery_count >= 180 )
      {
        PortOff()
      }

      if( battery_count <= 100 )
      {
        PortOff()
      }
    }
}

Nicht effizienter, aber etwas übersichtlicher.

Autor: Luther Blissett (luther-blissett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig sehe, dann kommt immer entweder PortOn oder 
PortOff, daher:
       if((( battery_count > = 100 ) && ( battery_count <= 113 ))
         ||(( battery_count >= 125 ) && ( battery_count <= 138 ))
         ||(( battery_count >= 151 ) && ( battery_count <= 164 )))
          PortOn();
       else 
          PortOff();

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

Bewertung
0 lesenswert
nicht lesenswert
Sortiere mal die Abfragen abfsteigend nach den Wertebereichen
      if(battery_count >= 180)
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }


      if((battery_count >= 165)&&(battery_count <= 180))
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }

      if((battery_count >= 151)&&(battery_count <= 164))
      {
        PORTB &= ~(1 << PB4);
        PORTC &= ~(1 << PC4);
        PORTB &= ~(1 << PB3);
      }

      if((battery_count >= 139)&&(battery_count <= 150))
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }

      if((battery_count >= 125)&&(battery_count <= 138))
      {
        PORTB &= ~(1 << PB4);
        PORTC &= ~(1 << PC4);
        PORTB &= ~(1 << PB3);
      }


      if((battery_count >= 114)&&(battery_count <= 124))
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }

      if((battery_count >= 100)&&(battery_count <= 113))
      {
        PORTB &= ~(1 << PB4);
        PORTC &= ~(1 << PC4);
        PORTB &= ~(1 << PB3);
      }

      if(battery_count <= 100)
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }


Dadurch kannst du jetzt jeweils die Obergrenze in den Bereichen
unter den Tisch fallen lassen und die einzelnen Abfragen mit jeweils
einem else-if aneinanderhängen
      if(battery_count >= 180)
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }


      else if( battery_count >= 165 )
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }

      else if( battery_count >= 151 )
      {
        PORTB &= ~(1 << PB4);
        PORTC &= ~(1 << PC4);
        PORTB &= ~(1 << PB3);
      }

      else if( battery_count >= 139 )
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }

      else if( battery_count >= 125 )
      {
        PORTB &= ~(1 << PB4);
        PORTC &= ~(1 << PC4);
        PORTB &= ~(1 << PB3);
      }


      else if( battery_count >= 114 )
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }

      else if( battery_count >= 100 )
      {
        PORTB &= ~(1 << PB4);
        PORTC &= ~(1 << PC4);
        PORTB &= ~(1 << PB3);
      }

      else 
      {
        PORTB |= (1 << PB4);
        PORTC |= (1 << PC4);
        PORTB |= (1 << PB3);
      }

Jetzt sieht man auch, dass der Fall 'zwischen 165 und 180'
identisch ist zum Fall 'größer 180'. Hier kann also die
Fallunterscheidung raus. Dazu dann noch die beiden bereits
vorgeschlagenen Hilfsfunktionen
      if( battery_count >= 165 )
        PortOn();

      else if( battery_count >= 151 )
        PortOff();

      else if( battery_count >= 139 )
        PortOn();

      else if( battery_count >= 125 )
        PortOff();

      else if( battery_count >= 114 )
        PortOn();

      else if( battery_count >= 100 )
        PortOff();

      else 
        PortOn();

Autor: Guido (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, vielen Dank für die ganzen Antworten!

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.