Forum: Compiler & IDEs Code optimieren


von Loipe (Gast)


Lesenswert?

Hallo,

ich habe folgenden Codeausschnitt, und weiß nicht wie ich diesen in 
einer Schleife abarbeiten kann. Kann mir da jemand helfen ??
1
#define PortOut1  PORTB
2
#define PortOut2  PORTB
3
#define PortOut3  PORTB
4
#define PortOut4  PORTB
5
#define PortOut5  PORTD
6
#define PortOut6  PORTB
7
#define PortOut7  PORTD
8
#define PortOut8  PORTD
9
10
#define Out1  PB3
11
#define Out2  PB4
12
#define Out3  PB1
13
#define Out4  PB2
14
#define Out5  PD7
15
#define Out6  PB0
16
#define Out7  PD5
17
#define Out8  PD6
18
19
20
if(Counter_2ms == Out_count_ON[0])
21
{
22
  PortOut1 |= _BV(Out1);
23
  Out_count_ON[0] = 0;
24
}
25
if(Counter_2ms == Out_count_ON[1])
26
{
27
  PortOut2 |= _BV(Out2);
28
  Out_count_ON[1] = 0;
29
}
30
if(Counter_2ms == Out_count_ON[2])
31
{
32
  PortOut3 |= _BV(Out3);
33
  Out_count_ON[2] = 0;
34
}
35
if(Counter_2ms == Out_count_ON[3])
36
{
37
  PortOut4 |= _BV(Out4);
38
  Out_count_ON[3] = 0;
39
}
40
41
... Bis Index 7

einen Teil weiß ich wie es geht, aber bei der Ausgangszuweisung weiß ich 
nicht wie es geht !
1
unsigned char i;
2
3
for (i=0;i<=7;i++)
4
{
5
  if(Counter_2ms == Out_count_ON[i])
6
  {
7
    ?????            //PortOut1 |= _BV(Out1);
8
    Out_count_ON[i] = 0;
9
  }
10
}

Danke schon mal für die Hilfe.

Gruß Alex

von M. K. (kichi)


Lesenswert?

Versuchs mal damit:
1
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.

von Klaus M. (meinzinet)


Lesenswert?

Hallo Alex
was soll der code denn genau machen?

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

von Oliver (Gast)


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

von Loipe (Gast)


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

von Andreas K. (a-k)


Lesenswert?

Ungefähr so:
1
const struct {
2
   volatile unsigned char *port;
3
   unsigned char           mask;
4
} ports[] = {
5
   { &PORTA, 1<<PA1 },
6
   { &PORTB, 1<<PB1 },
7
   ...
8
};
und dann
1
*ports[i].port |= ports[i].mask;

von Loipe (Gast)


Lesenswert?

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

Gruß Alex

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.