Forum: Mikrocontroller und Digitale Elektronik Port Pin an Funktion übergeben??


von S. K. (theodrin)


Lesenswert?

Hallo!

Ich hab grad die Nuss vor mir, mit drei Sensoren zu reden.
Also alle drei die gleichen, kein Problem.
Hab auch schon funktionen geschrieben um mit denen zu reden. 
Funktioniert auch alles schön.

Also im Grunde genommen so, dass ich sage:
1
#define D   LATAbits.LATA0
2
#define SCK LATAbits.LATA1

Also Präprozessor damit ich im .h File meine Pins nur einmal schreiben 
muss. Nur hab ich jetzt 3 Sensoren und will eigentlich nicht jede 
Funktion drei mal schreiben/kopieren müssen. Finde ich braucht mehr 
Platz und ist nicht schön!
Deswegen hab ich gedacht, wärs toll wenn ich nur mit D und SCK arbeite 
aber eben während des Programm der Funktion eben meine zwei Pins 
übergebe mit denen ich grad was tun will - also welcher Sensor.
Und ich mein ich könnt nen Parameter "Sensor_ID" mitgeben der von 1-3 
reicht und dann mit if-Abfragen weiter gehen aber im grunde genommen ist 
das auch drei mal die Funktion schreiben.
dann hab ich halt:
1
void funkion(sruct sensordaten sensor, int sensor_id)
2
{
3
   if(sensor_id == 1)
4
   {
5
   .... arbeite mit Pins D1 und SCK1
6
   }
7
   if(sensor_id == 2)
8
   {
9
   das selbe wie oben nur steht statt D1 D2 und statt SCK1 SCK2
10
   }
11
   .... 3. Sensor
12
13
}

Also im grunde genommen wieder drei mal selbe Funktion.

ich hätt halt gern so was in der art wie:
1
void funktion(struct sensordaten sensor, PORT D, PORT SCK)
2
{
3
.... nur einmal mit D und SCK arbeiten
4
}

geht das irgendwie???

Aja arbeite mit PIC18F2550!!!!

von Klaus W. (mfgkw)


Lesenswert?

Äh, AVR oder was?

Da kann man Ports über ihre Adresse an eine Funktion übergeben,
also etwas so:
1
void f( uint8_t *p_port, uint8_t bitnummer )
2
{
3
  (*p_port) |= 1<<bitnummer;
4
}
5
6
...
7
   f( &PORTD, 1 ); // setzt PORTD.1
8
   f( &PORTA, 5 ); // setzt PORTA.5
9
...

Oder war was anderes gemeint?

[Edit: lese gerade was von PIC...; war das vorhin auch schon?]

von whitenoise (Gast)


Lesenswert?

du kannst die adresse eines pins nicht an eine funktion übergeben, da er 
keine hat, das gilt für avr wie für die pics, das register in dem der 
pin liegt, hat eine adresse und die kannst du an eine funktion 
übergeben.

denkbar wäre eine verteilung wie:

8bit port:
7  6    5    4    3  2  1  0
NC/SCK2/SCK1/SCK0/NC/D2/D1/D0

dann mit shift operator wert maske 0x11 um id schiften und damit in der 
funktion arbeiten...

gruß w

von Daniel R. (zerrome)


Lesenswert?

Ich weiß sowas ist immer lästig, aber machs doch anders ^^
Die Port Pins sind doch global definiert über eine *.h Datei wo die 
Defines für die Pins drin stehen...Also kann man doch von überall darauf 
zugreifen.
Oder speicher den Wert des Ports und übergib diese Variable...

von S. K. (theodrin)


Lesenswert?

hmm, ganz hab ichs noch nicht kapiert...
Also ich hab die Senosren am Port A hängen. Jeweils 0,1; 2,3; 4,5; an 
den letzten zwei hängt mein Quarz.
Aber hmm, so wies dann aussieht kann ich nicht mit meinen 
Präprozessor-konstanten bzw, freiwillig gewählten Namen im Programm was 
tun sondern muss direkt immer wieder den Port ansprechen, also genau 
wissen welchen Port ich hab wo meine Sensoren hängen, ... also wenn ich 
da nur einen Pin umändern sollte sind die ganzen Funktionen nicht mehr 
zu verwenden ohne umarbeiten der Funktion??
Na dann lass ich das und schreib einfach drei mal die selbe Funktion. 
Was solls.
Dann kann ich mir wenigstens aussuchen im .h File wo ich meine Sensoren 
hängen hab..

Oder hab ich was falsch verstanden?

und tschuldige hab das mit dem PIC vergessen und nachträglich schnell 
dazu geschrieben.

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.