Forum: Mikrocontroller und Digitale Elektronik Enum, Define oder wie?


von dspic (Gast)


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!

von Albert .. (albert-k)


Lesenswert?

PORTCbits.RC1 sieht aus wie eine Methode einer Klasse, ist das richtig? 
Dann würde ich über Funktionspointer in einem array arbeiten.

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

dspic schrieb:

> vernünftige Lösung. Ich habe das Problem das ich 4 Portpins meines
                                                  ***

> for (i=0;i<=4;i++)

Das sind aber 5

von Peter D. (peda)


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

von Thomas K. (thkusch)


Lesenswert?

Ich gehe davon aus, RC1, RC2 usw. sind die einzelnen Bits des Ports.
Wenn die Architektur deiner CPU es zulaesst, mache es doch so:

unsigned char pucPINList[4]={1,2,13,14};

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

Gruss
Thomas

von dspic (Gast)


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. :)

von Karl H. (kbuchegg)


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
  }

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.