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!
PORTCbits.RC1 sieht aus wie eine Methode einer Klasse, ist das richtig? Dann würde ich über Funktionspointer in einem array arbeiten.
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.
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
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
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
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. :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.