Enum, Define oder wie?

Gast #1855523
Lesenswert?

Hallo Zusammen,
Ich zerbreche mir schon den ganzen morgen den Kopf und komme auf keine 
vernünftige Lösung. Ich habe das Problem das ich 4 Portpins meines 
Controllers der Reihe nach setzten bzw rücksetzen möchte, am besten mit 
einer For-Schleife. Das Problem die liegen nicht hintereinander. Es 
handelt sich um PortPin C1, C2, C13 und C14. Ansprechen kann ich sie mit 
zb: PORTCbits.RC1 PORTCbits.RC2 usw.
Wie bekomme ich das jetzt in eine For-Schleife die so aussieht:
for (i=0;i<=4;i++)
{
  Port[i] = 1;
}

Port[i] sollte dabei wie gesagt durch PORTCbits.RC1, PORTCbits.RC2, 
PORTCbits.RC13 und PORTCbits.RC14 ersetzt werden.

Danke für eure Ideen!
#1855550
Lesenswert?

dspic schrieb:

> handelt sich um PortPin C1, C2, C13 und C14. Ansprechen kann ich sie mit
> zb: PORTCbits.RC1 PORTCbits.RC2 usw.

Vergiss diese Einzelbitschreibweise über Strukturmember. Die 
verallgemeinert nicht besonders gut. Für manche Fälle ist sie gut, hier 
hindert sie dich.

Mach deine Portzugriffe ganz klassisch mit Bitoperationen am kompletten 
Port, leg dir die dazu benötigten Masken in einem Array ab und du hast 
es.
#1855571
Lesenswert?

dspic schrieb:
> for (i=0;i<=4;i++)
> {
>   Port[i] = 1;
> }
>
> Port[i] sollte dabei wie gesagt durch PORTCbits.RC1, PORTCbits.RC2,
> PORTCbits.RC13 und PORTCbits.RC14 ersetzt werden.

Welcher Compiler, welche CPU?

In der Regel haben CPUs keine indirekten Bitadressen. Daher muß man ein 
Switch verwenden:
1
  switch( i ){
2
    case 0: PORTCbits.RC1 = 1; break;
3
    case 1: PORTCbits.RC2 = 1; break;
4
    case 2: PORTCbits.RC13 = 1; break;
5
    case 3: PORTCbits.RC14 = 1; break;
6
  }


Peter
Gast #1855586
Lesenswert?

Karl heinz Buchegger schrieb:
> Mach deine Portzugriffe ganz klassisch mit Bitoperationen am kompletten
> Port, leg dir die dazu benötigten Masken in einem Array ab und du hast
> es.

Ok, vielleicht noch ein Tip wie ich das "besonders schön" mache damit 
ich die Zuordnung der einzelnen Pins relative leicht im code wieder 
ändern kann?

Karl heinz Buchegger schrieb:
>> for (i=0;i<=4;i++)
>
> Das sind aber 5

Jup, Flüchtigkeitsfehler. :)
#1855601
Lesenswert?

dspic schrieb:

> Ok, vielleicht noch ein Tip wie ich das "besonders schön" mache damit
> ich die Zuordnung der einzelnen Pins relative leicht im code wieder
> ändern kann?

Im Grunde so wie Thomas das weiter oben schon geschrieben hat

(Aus deinen Bitnummern schliesse ich, dass du 16 Bit Ports hast, stimmt 
das?)

Also entweder so
1
#define PIN_1     1
2
#define PIN_2     2
3
#define PIN_3    13
4
#define PIN_4    14
5

6
unsigned char pucPINList[4] = { PIN_1, PIN_2, PIN_3, PIN_4 };
7

8
...
9

10
  for (i = 0; i < 4; i++ )
11
  {
12
    PORTC |= 1<<pucPINList[i];
13
  }

( anstelle von PIN_1, PIN_2 etc. benutzt du natürlich sprechende 
Makrobezeichnungen. )

oder aber du entlastest den Rechner zur Laufzeit ein wenig, indem du die 
Masken gleich fix&fertig ins Array legst:
1
#define PIN_1     1
2
#define PIN_2     2
3
#define PIN_3    13
4
#define PIN_4    14
5

6
unsigned int pucPINList[4] = { 1<<PIN_1, 1<<PIN_2, 1<<PIN_3, 1<<PIN_4 };
7

8
...
9

10
  for (i = 0; i < 4; i++ )
11
  {
12
    PORTC |= pucPINList[i];
13
  }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren