mikrocontroller.net

Forum: Compiler & IDEs Code optimieren


Autor: Loipe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgenden Codeausschnitt, und weiß nicht wie ich diesen in 
einer Schleife abarbeiten kann. Kann mir da jemand helfen ??
#define PortOut1  PORTB
#define PortOut2  PORTB
#define PortOut3  PORTB
#define PortOut4  PORTB
#define PortOut5  PORTD
#define PortOut6  PORTB
#define PortOut7  PORTD
#define PortOut8  PORTD

#define Out1  PB3
#define Out2  PB4
#define Out3  PB1
#define Out4  PB2
#define Out5  PD7
#define Out6  PB0
#define Out7  PD5
#define Out8  PD6


if(Counter_2ms == Out_count_ON[0])
{
  PortOut1 |= _BV(Out1);
  Out_count_ON[0] = 0;
}
if(Counter_2ms == Out_count_ON[1])
{
  PortOut2 |= _BV(Out2);
  Out_count_ON[1] = 0;
}
if(Counter_2ms == Out_count_ON[2])
{
  PortOut3 |= _BV(Out3);
  Out_count_ON[2] = 0;
}
if(Counter_2ms == Out_count_ON[3])
{
  PortOut4 |= _BV(Out4);
  Out_count_ON[3] = 0;
}

... Bis Index 7

einen Teil weiß ich wie es geht, aber bei der Ausgangszuweisung weiß ich 
nicht wie es geht !
unsigned char i;

for (i=0;i<=7;i++)
{
  if(Counter_2ms == Out_count_ON[i])
  {
    ?????            //PortOut1 |= _BV(Out1);
    Out_count_ON[i] = 0;
  }
}

Danke schon mal für die Hilfe.

Gruß Alex

Autor: Michael K. (kichi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal damit:
PortOut1 |= (1 << i);    //PortOut1 |= _BV(Out1);
Hab das noch nie gemacht, sollte aber funktionieren. Ist aber 
wahrscheinlich langsamer als wenn du es ausschreibst.

Für eine Erklärung such mal bei Google nach _bv.

Autor: Klaus Me (meinzinet)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Alex
was soll der code denn genau machen?

_BV(n) ist ein Makro und gleichzusetzten mit 1 << n.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da deine ports und outbits nicht in einer natürlichen Reihenfolge 
verteilt sind, die man in einer for-schleife ausnutzen könnte, geht das 
so einfach gar nicht. Man könnte die Port-und Pins jeweils in ein Array 
packen, am besten gleich als {port,pin} struct, und die Schleife über 
das Array laufen lassen. Aber kürzer als deine Version ohne Schleife 
wird das auch nicht.

Lass es so, wie es ist. Da vermutlich nur immer genau einer der 
Vergleiche
if(Counter_2ms == ...
 wahr werden kann, könnte man noch ab den zweiten if ein else if 
verwenden. Das spart unnötige Vergleiche.

Wenn dir der Code zu unübersichtlich ist, oder mehrfach verwedet wird, 
pack in in eine eigene Funktion.

Oliver

Autor: Loipe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Code soll ,wenn eine IF Abfrage erfüllt ist, den entsprechenden 
Ausgang schalten.
Aber wie Oliver schon richtig erkannt hat, sind die Ausgangsports nicht 
von einem bestimmten Port, wie z.B. PORTB und auch nicht in der 
richtigen Reihenfolge. So wie es aussieht muss ich dann wohl den Code so 
lassen.
Aber mich würde es trotzdem noch interessieren, wie das mit der Struct 
funktioniert.
Kannst Du mit da ein Beispiel liefern ?

Gruß Alex

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

Bewertung
0 lesenswert
nicht lesenswert
Ungefähr so:
const struct {
   volatile unsigned char *port;
   unsigned char           mask;
} ports[] = {
   { &PORTA, 1<<PA1 },
   { &PORTB, 1<<PB1 },
   ...
};
und dann
*ports[i].port |= ports[i].mask;

Autor: Loipe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ja, muss mal testen ob das funktioniert.
Vielen Dank für eure Hilfe.

Gruß Alex

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.