mikrocontroller.net

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


Autor: dspic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Albert ... (albert-k)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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:
  switch( i ){
    case 0: PORTCbits.RC1 = 1; break;
    case 1: PORTCbits.RC2 = 1; break;
    case 2: PORTCbits.RC13 = 1; break;
    case 3: PORTCbits.RC14 = 1; break;
  }


Peter

Autor: Thomas K. (thkusch)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dspic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
#define PIN_1     1
#define PIN_2     2
#define PIN_3    13
#define PIN_4    14

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

...

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

( 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:
#define PIN_1     1
#define PIN_2     2
#define PIN_3    13
#define PIN_4    14

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

...

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

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.