Forum: Mikrocontroller und Digitale Elektronik Bedingte Anwendung von Interrupts


von herbert (Gast)


Lesenswert?

Hey,

ich bin relativ unbedarft was die Programmierung von Controller angeht, 
darum bitte ich um Entschuldigung, wenn die Fragen etwas trivial sind.

Ich habe 2 Gerät mit relativ ähnlichem Quellcode (in C). Lediglich der 
Zustandsautomat und die Interrupts unterscheiden sich etwas.
Jetzt wollte ich das alles in einen Quellcode packen und abhängig von 
einem Bestückungswiderstand entweder die eine oder die andere 
Softwarevariante nutzen.
Beim Zustandsautomaten fällt mir das relativ leicht. Da kann ich einfach 
den Eingang per If abfragen und dann entweder die eine oder andere 
Automaten ablaufen lassen.
Bei den Interrupts habe ich keine Ahnung wie ich das machen soll. 
If-Abfrage vor die Interrupts funktioniert ja leider nicht. Gibt es da 
ein C-Kontrukt, dass ich evtl. noch nicht kenne?

Viele Grüße

Herbert

von Falk B. (falk)


Lesenswert?

@ herbert (Gast)

>Bei den Interrupts habe ich keine Ahnung wie ich das machen soll.
>If-Abfrage vor die Interrupts funktioniert ja leider nicht.

Jain. Man kann das Pin abfragen und danach die Interrupts freischalten 
oder nicht.

von Dr. Sommer (Gast)


Lesenswert?

Niemand hindert dich, in der Interrupt Routine den Pin abzufragen und 
dementsprechend zu entscheiden, was passieren soll. Wenn die 
Interrupt-Routine in einem Fall einfach nichts tut, ist das nicht weiter 
schlimm.
Ich würde aber empfehlen nicht jedes Mal (auch im Automaten) den Pin 
erneut abzufragen, sondern das einmal beim Starten zu tun und das 
Ergebnis in eine (globale) Variable zu speichern, und immer nur die zu 
verwenden. So kannst du den Modus auch leichter per Software umschalten 
oder den Pin ändern.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

herbert schrieb:
> If-Abfrage vor die Interrupts funktioniert ja leider nicht. Gibt es da
> ein C-Kontrukt, dass ich evtl. noch nicht kenne?

Mit:
1
#define Gerat1
2
//#define Gerat2
3
4
#ifdef Gerat1
5
...
6
...
7
#else
8
...
9
...
10
#endif

von Jürgen D. (poster)


Lesenswert?

Die #ifdef Abfrage wird aber beim kompilieren des Codes ausgewertet und 
nicht zur Laufzeit durch Abfragen eines Pins.
Aber sonst wohl die beste Möglichkeit den gleichen Code für verschieden 
Geräte zu verwenden.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

herbert schrieb:
> Jetzt wollte ich das alles in einen Quellcode packen und abhängig von
> einem Bestückungswiderstand entweder die eine oder die andere
> Softwarevariante nutzen.

Marc V. schrieb:
> Mit:
>
1
> 
2
> #define Gerat1
3
> //#define Gerat2
4
> 
5
> #ifdef Gerat1
6
> ...
7
> ...
8
> #else
9
> ...
10
> ...
11
> #endif
12
>

Ach, der Preprocessor kann den "Bestückungswiderstand in der Schaltung" 
einlesen? Klasse!

@herbert: Schalte die ISR() für das Device halt nur frei, wenn Du sie 
benötigst. Einmal beim Start nachschauen, ob der Bestückungswiderstand 
(ich würde 0 Ohm gegen GND nehmen) vorhanden ist, dies in einer 
Variablen merken und den Interrupt dann nur freigeben, wenn 
beabsichtigt.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Frank M. schrieb:
> Ach, der Preprocessor kann den "Bestückungswiderstand in der Schaltung"
> einlesen? Klasse!

 Wenn es nur darum geht, ob der "Bestückungswiderstand in der Schaltung"
 vorhanden ist, dann verstehe ich sein Problem nicht.

herbert schrieb:
> Lediglich der Zustandsautomat und die Interrupts unterscheiden sich etwas.

 Also haben beide Varianten die ISR.

 Warum dann ein einfaches if mit Pinabfrage in der ISR nicht
 funktionieren soll, ist für mich ein Rätsel.

von Falk B. (falk)


Lesenswert?

@Marc Vesely (Firma: Vescomp) (logarithmus)

>> Ach, der Preprocessor kann den "Bestückungswiderstand in der Schaltung"
>> einlesen? Klasse!

> Wenn es nur darum geht, ob der "Bestückungswiderstand in der Schaltung"
> vorhanden ist, dann verstehe ich sein Problem nicht.

Der OP will eine Software mit 2 leicht verschiedenen Versionen in den uC 
bringen, welche zur Laufzeit an hand des Widerstands erkennen, welche 
Version aktiviert werden soll.

> Warum dann ein einfaches if mit Pinabfrage in der ISR nicht
> funktionieren soll, ist für mich ein Rätsel.

Sie funktioniert. Ob man aber an mehreren Stellen den Pin abfragt oder 
nur einmalig zum Programmstart und dann die Info in einer globalen 
Variable speichert, ist Geschmackssache. Beim einmaligen Abfragen ist 
das Programm gegen ein Abfallen des Widerstands während der Laufzeit 
oder eine massive Störeinkopplung immun.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Falk B. schrieb:
> Sie funktioniert. Ob man aber an mehreren Stellen den Pin abfragt oder
> nur einmalig zum Programmstart und dann die Info in einer globalen
> Variable speichert, ist Geschmackssache.

 Hmm, ich war mir so sicher, dass es sich um dieselben Interrupts
 handelt.
 Falls nicht, ist die Lösung die du vorgeschlagen hast, natürlich
 die Beste. Es werden zwar die beiden Varianten compiliert, aber wenn
 der Zustand zur Laufzeit erkannt werden soll, geht es nicht anders.

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.