www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Vereinfachung des Terms


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich bräuchte mal eure Hilfe bei der vereinfachung des angehängten Terms.

Der ist ziemlich lang und vieleicht hat jemand von euch ne Idee, wie man 
das etwas verkürzen kann.

Gruß

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einer Look-Up-Tabelle?

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

Bewertung
0 lesenswert
nicht lesenswert
Eine erste Möglichkeit zur Verkürzung, ohne das grundsätzliche
System zu verändern, könnte so aussehen:
void Blaulicht()
{
  if(Blau == 0xBB) {
    switch( delay3 ) {
      case 2:
      case 28:
      case 39:
      case 55:
      case 85:
        PORTC &= ~(1 << PC3);
        break;
      
      case 3:
      case 29:
      case 40:
      case 56:
      case 86:
        PORTC |=  (1 << PC3);
        break;

      default:
        ;
    }

    switch( delay3 ) {
      case 18:
      case 45:
      case 55:
      case 70:
      case 100:
        PORTC &= ~(1 << PC5);
        break;

      case 19:
      case 46:
      case 56:
      case 71:
      case 101:
        PORTC |=  (1 << PC5);
        break;

      default:
        ;
    }
  }


  else {
    PORTC |=  (1 << PC5);
    PORTC |=  (1 << PC3);
  }
}

Eine andere Möglichkeit wären Tabellen, in denen die Werte
abgelegt werden.

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

treten nur diese beschriebenen Zustände bei 'delay3' auf oder gibt es 
noch andere? Um die Sache flüssiger zu machen solltest du else-if oder 
switch-case verwenden. Denn jedes mal die ganze Latte if's durchzustepen 
macht keinen Sinn. Kannst du es vllt so mauscheln, dass du bei 
gradzahahligen 'delay3' einheitlich den Pin setzt/löschst; dann wäre 
eine Variante mit Modulo praktikabel.

pumpkin

Autor: Eckhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich würde da eine switch anweisung nehmen

in etwa so :

void blaulicht () {

if(Blau == 0xBB) {

switch (delay3) {

    case 2:
    case 28:
             PORTC &= ~(1 << PC3);
             break;

    case 3:
    case 29:
             PORTC |=  (1 << PC3);
            break;
   }
}
}
die anderen Werte halt entsprechend dazu.

Eckhard


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

Bewertung
0 lesenswert
nicht lesenswert
> Eine andere Möglichkeit wären Tabellen, in denen die Werte
> abgelegt werden.

Könnte zb so aussehen
uint8_t TurnOff3[] = { 2, 28, 39, 55, 85 };
uint8_t TurnOn3[]  = { 3, 29, 40, 56, 86 };
#define NR_ENTRIES_3 5

uint8_t TurnOff5[] = { 18, 45, 55, 70, 100 };
uint8_t TurnOn5[] =  { 19, 46, 56, 71, 101 };
#define NR_ENTRIES_5 5

uint8_t Find( uint8_t What, uint8_t* Where, uint8_t WhereLen )
{
  utin8_t i;

  for( i = 0; i < WhereLen; ++i ) {
    if( Where[i] == What )
      return TRUE;
  }

  return FALSE;
}

void Blaulicht()
{
  if( Blau == 0xBB ) {

    if( Find( delay3, TurnOff3, NR_ENTRIES_3 ) )
      PORTC &= ~( 1 << PC3 );

    if( Find( delay3, TurnOn3, NR_ENTRIES_3 ) )
      PORTC |= ( 1 << PC3 );

    if( Find( delay3, TurnOff5, NR_ENTRIES_5 ) )
      PORTC &= ~( 1 << PC5 );

    if( Find( delay3, TurnOn5, NR_ENTRIES_5 ) )
      PORTC |= ( 1 << PC5 );
  }

  else {
    PORTC |= ( 1 << PC3 );
    PORTC |= ( 1 << PC5 );
  }
}


Eventuell gibt es auch eine Möglichkeit diese "magischen
Zahlen" mit einer Formel auszudrücken, etc...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ja immer im nächsten Zyklus die Pins 1 gesetzt werden, ginge es 
verkürzt so:
//
    switch( delay3 ) {
      case 2:
      case 28:
      case 39:
      case 85:
        PORTC &= ~(1 << PC3);
        break;
      
      case 55:
        PORTC &= ~(1 << PC3);

      case 18:
      case 45:
      case 70:
      case 100:
        PORTC &= ~(1 << PC5);
        break;

      default:
        PORTC |=  (1 << PC3);
        PORTC |=  (1 << PC5);
    }


Peter

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super,

vielen Dank für die schnellen Antworten!

@Karl Heinz: Welche Routine ist den schneller, die Switch/Case oder die 
mit der Tabelle?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andy wrote:
> @Karl Heinz: Welche Routine ist den schneller, die Switch/Case oder die
> mit der Tabelle?

Dürfte für ein Blinklicht sowas egal sein, denn Blinkfrequenzen im 
MHz-Bereich sieht eh keiner mehr.


Peter

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für die Blinkgfrequenz ist das egal, nur meinem Interrupt der Signale im 
unteren µs-Bereich erzeugen soll eventuell nicht....

Daher die Frage....

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

Bewertung
0 lesenswert
nicht lesenswert
Aus dem Bauch heraus ist die switch case wahrscheinlich
schneller.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ganze sieht ein wenig so aus, als ob Blaulicht() von einem
Timer-Interrupthandler aufgerufen würde, in dem delay3 jedesmal
inkrementiert wird (oder vielleicht ist delay3 sogar der Timer-Wert
selbst).

Wenn dies so ist, kannst du die Abfragen enorm beschleunigen, indem du
delay3 immer nur mit den nächsten Wert vergleichst, bei dem eine
Aktion stattfindet. Für den am häufigsten auftretenden Fall, bei dem
delay mit keiner der vorgegebenen Konstanten übereinstimmt, kann damit
die Anzahl der notwendigen Vergleiche von 20 (deine und Karl Heinzs
Lösung) bzw. 9 (Peters Lösung) auf 1 reduziert werden. Und auch in den
anderen Fällen hält sich der Rechenaufwand in akzeptablen Grenzen.

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.