Forum: Mikrocontroller und Digitale Elektronik Programmsteuerung über eingebundene Dateien


von GAMES (Gast)


Lesenswert?

Hallo Community,
ich sitze gerade an einem Problem und bekomme es einfach nicht gelöst. 
Mein Ziel ist es anhand von eingebundenen Dateien das Verhalten des 
Programmes zu steuern ( genauer die ISR).
Spricht folgendes, wenn ich z.B die Butten-HAL einbinde, möchte ich das 
bei einem Interrupt von der ISR aus die Funktion ButtenISR aufgerufen 
wird, die sich in der Butten-HAL definiert ist. Falls aber die 
Butten-HAL nicht eingebunden ist soll dies nicht geschehen und mögliche 
andere Funktionen aufrufen, die ebenfalls in der ISR definiert sind.

Mein erster Ansatz mit Makros funktioniert leider nicht und nach 
längerer suche im Internet bin ich leider auf keine Lösung gekommen.



Gruß GAMES

Als Eckdaten noch:
Controller : MSP430
Entwicklungsumgebung : CCS 5.3 von TI

von kopfkratzer (Gast)


Lesenswert?

Kopfkratz
Einfach einen Funktionpointer in die ISR und den dann jeweils passend 
setzen ?
Dein nicht funktionierender Code wäre auch nicht schlecht, dann wissen 
wir was Du eigentlich versucht hast :-P

von GAMES (Gast)


Lesenswert?

1
// Stark vereinfacht aber das wesentliche sollte zusehen sein 
2
#ifdef BUTTONHAL_H_
3
#include "ButtonHAL.h"
4
#endif
5
6
#pragma vector=PORT1_VECTOR
7
__interrupt void Port_1 (void)
8
{
9
#ifdef BUTTONHAL_H_
10
  ButtonISR();
11
#endif
12
//Hier können/sollen später weiter Funktionen folgen
13
14
}
15
16
17
/*.... Eine Andere Datei ....*/
18
19
#ifndef BUTTONHAL_H_
20
#define BUTTONHAL_H_
21
22
void initButton();
23
void setISR(void (*interruptSR)(void));   //Dies ist eine Benutzerschnittstelle 
24
void ButtonISR(); // Ruft die von setISR gesetzte Funktion auf 
25
26
#endif
27
28
29
/*.... Main ....*/
30
31
int main()
32
{
33
   initButton();
34
   setISR(&foo());
35
}



So in der Art habe ich es mir vorgestellt.
Ich sehen keine Möglichkeit wie ich das mir Funktionszeiger machen 
könnte. Ich will ja das "automatische" zuschalten in der ISR 
realisieren.
Der Versuch mit den #defines hat leider nicht funktioniert da diese nur 
innerhalb einer Übersetzungseinheit sichtbar sind.

von chris (Gast)


Lesenswert?


von Ralf (Gast)


Lesenswert?

> Ich sehen keine Möglichkeit wie ich das mir Funktionszeiger machen
> könnte. Ich will ja das "automatische" zuschalten in der ISR
> realisieren.
Das geht schon. Wichtig ist die Reihenfolge beim Compilieren.
Es kommt auch darauf an, wie die HAL eingebunden, also ob es eine 
Headerdatei ist, die included wird (oder eben nicht), oder ob die HAL in 
einem C-File liegt (dann ist die Reihenfolge beim Compilieren wichtig).

Den Funktionspointer lässt du dann eben auf NULL zeigen, wenn die HAL 
nicht aktiv ist, andernfalls lässt du den FZ auf die aufzurufende 
Funktion zeigen.
Die HAL selbst macht sich dann z.B. durch ein "#define HAL_ACTIVE" 
bekannt, und das sollte sich dann per #if-Abfrage entsprechend verwerten 
lassen.

Ralf

von kopfkratzer (Gast)


Lesenswert?

Es ist immer noch nicht klar WAS Du WIRKLICH willst ?
Wenn es darum geht während des compilierens die passende ISR einzubauen 
kannst Du das über #define regeln.
Wenn es dynamisch während der Laufzeit geschehen soll mußt Du 
entsprechende Variablen anlegen und darüber dereferenzieren.
Zeige den gesamten Code und was Du WIRKLICH willst und wir schaun mal 
:-P

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.