PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c-Programmierung: in ausgelagerter Funktion auf Port-Pin zugreifen



changlee
14.11.2015, 22:29
Hallo,

ich würde gern eine Funktion so in eine eine eigene .c-Datei auslagern, dass diese für viele Projekte wiederverwendbar ist.
Die Funktion soll aber auf ein Portpin zugreifen können, welches sich je nach Projekt ändern kann.
Also z.B. so etwas:



// Datei blink.c
//#define led PORTBbits.RB0;

void blink(char anzahl){
while(anzahl-->0){
led=1;
warte();
led=0
warte();
}
}

Die Definition von "led" möchte ich aber nicht auslagern, da in einem anderen Projekt die LED an einem anderen Pin angeschlossen sein könnte.
Im Prinzip möchte ich also genau das machen, was von Haus aus auch schon mit _delay_us() geht. Um das delay nutzen zu können, muss ich zuvor _XTAL_FREQ definiert haben.
Wenn ich "led" aber nicht im ausgelagerten Teil, sondern im Projekt-c-File definiere beschwert sich der Compiler, weil ihm die Definition dort fehlt, wo er sie braucht.

Weiß jemand, wass man tun muss, damit sowas funktioniert?

(Ich möchte natürlich nicht in blink.c ein include einbauen, dass dann die jeweilige Definition einliest. Denn dann kann ich ja nicht ein und dieselbe blink.c für verschiebdene Projekte nutzen.)

Viele Grüße
Stefan

shedepe
15.11.2015, 11:41
Etwas andere Lösung als mit _delay_us(), aber sollte trotzdem funktionieren.
Du übergibst der blink Funktion als Argument welchen Pin sie benutzen soll.


void blink(char anzahl, PORTBbits pin)
{

}


Das ist jetzt nur mal geraten, sollte aber funktionieren wenn PORTBbits ein Enum oder Struct ist.

changlee
18.11.2015, 22:55
ja, das geht natürlich auch. An die Option hatte ich noch gar nicht gedacht. Danke.
Allerdings sind die auszulagernden Routinen etwas größer als das LED-Beispiel und benötigen mehrer Hardwareelemente (2 Pins, 1 Timer).
Für kleine Routinen werde ich das bestimmt auch mal so machen.
Für größere Sachen habe ich mir jetzt überlegt, dass ich Pinzuweisungen o.ä. immer in eine config.c schreibe, die ich dann jeweils bei allen ausgelagerten routinen standardmäßig mit einbinde.
Nich so schön, aber erfülllt auch die Anforderungen.

Falls jemand doch noch weiß, warum sich der Comiler bei _XTAL_FREQ nicht beschwert, würde das aber trotzdem gern noch wissen ;-)

(PS: späte Antwort wegen Dienstreise)

Klebwax
19.11.2015, 07:55
Für größere Sachen habe ich mir jetzt überlegt, dass ich Pinzuweisungen o.ä. immer in eine config.c schreibe, die ich dann jeweils bei allen ausgelagerten routinen standardmäßig mit einbinde.

Ich würd das eher config.h oder auch hardware.h nennen. Wenn man Definitionen Fileübergreifend benutzen will, ist das IMHO der richtige Weg.

MfG Klebwax

changlee
19.11.2015, 19:27
ja, config.h meinte ich auch :-)
Ich schreibe jetzt in die config.h sämtliche configuration-bits sowie alle Hardware-Definitionen rein, und in die zugehörige config.c die Initialisierungsroutinen.
Danke un viele Grüße
Stefan