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
@ 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.
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.
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
|
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.
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.
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.
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.