Forum: Mikrocontroller und Digitale Elektronik ISRs in Include / C-File ausgliedern


von Mike (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich schreibe gerade ein Programm für die Eingabe über ein Tastenfeld und 
die Anzeige über ein 4x7 Display. Das Programm besteht aus folgenden 
Komponenten:

- global.h: an mehreren Stellen verwendete globale Variablen etc.
- main.c: übergreifende Steuerung
- Key_panel.c: Entprellung des Tastenfelds und zwei weiterer Tasten
- LED_display.c: Multiplexing eines 4x7 Displays
- LED_row.c: Steuerung zweier LED-Reihen über SPI

Das Programm funktioniert soweit. Nun versuche ich, die ISRs 
(Entprellung und Multiplexing) in ein File ISR.c auszugliedern. (Grund 
ist u. a., dass ich später eine gemeinsame ISR für beide Funktionen 
machen möchte - und dann möchte ich die Funktion in einer "neutralen" 
Datei).

Wenn ich die ISRs ausgliedere, funktioniert zeigt das LED Display keine 
Reaktion mehr. --> Code siehe IR_Multi_Test01.zip

Zum Vergleich auch die Originalversion: IR_Multi_Test02.zip

Der einzige Unterschied ist, dass die beiden ISRs (aus Key_panel.c und 
aus LED_display.c) in das File ISR.c verschoben wurden.

Irgendetwas passt wohl nicht mit der Verknüpfung der Datein über die 
includes? Oder ein sonstiger Denk-/Strukturfehler? Habe schon die 
verschiedensten Konstellationen getestet, aber finde nicht den 
Fehler....

Vielen Dank

von Falk B. (falk)


Lesenswert?

In deinem global.h gehören nur DEKLARATIONEN rein, also das 
Bekanntmachen von Variablen. Die DEFINITIONEN, also das Anlegen im 
Speicher, gehören in ein noch nicht existentes global.c

Und dann müssen dein globalen Variablen in globals.h als extern 
definiert werden. Das klappts auch mit den ausgelagerten ISRs.

globals.h

extern volatile uint16_t key_state;
extern volatile uint16_t key_press;



globals.c

volatile uint16_t key_state;
volatile uint16_t key_press;

von Fabian O. (xfr)


Lesenswert?

Eine "global.h" ist grundsätzlich eine schlechte Idee. Pack die 
Definitionen der globalen Variablen in die c-Dateien der Module und die 
Deklaration (mit extern) in die dazugehörige h-Datei. Dann brauchst Du 
keine global.h.

Die ISRs gehören in der Form auch nicht in eine eigene Datei. Wenn Du 
eine ISR für beide Module (Display und Tasten) nutzen willst, wäre es 
sinnvoller, von der gemeinsamen ISR aus zwei Funktionen aufzurufen. Die 
ISR ist dann nur zwei Zeilen lang und kann in main.c:
1
ISR(TIMER2_OVF_vect)
2
{
3
  keys_isr_handler();
4
  display_isr_handler();
5
}

Die eigentliche Funktionalität (keys_isr_handler und 
display_isr_handler) kommt in die entsprechenden c-Dateien, wo auch die 
Modulvariablen liegen, die sie nutzen. Dann brauchst Du die globalen 
Variablen überhaupt nicht.

Grundsätzlich: Modularer Code bedeutet lose Kopplung, starke Bindung. 
Sprich: Nicht alles auf so viele Dateien wie möglich aufteilen, sondern 
das zusammen lassen, was zusammen gehört. Alles was mit den Tasten zu 
tun hat, kommt in keys.c/h, alles was mit dem Display zu tun hat in 
display.c/h. Diese Module müssen so weit wie möglich eigenständig sein 
und keine gegenseitigen Abhängigkeiten, vor allem keine zum 
Hauptprogramm haben. Nur so kann man diese Module sinnvoll in anderen 
Programmen wiederverwenden.

von Mike (Gast)


Lesenswert?

Vielen Dank für die beiden Tipps! Beides funktioniert (natürlich) :-)

Schönen Sonntag!

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.