Moin! Mein Problem: nachdem ich nun verschiedene Interrupts auf dem Atmega8535 hinbekommen habe, möchte ich die ISRs in eine eigene Interrupts.c Datei verlagern. Doch der Compiler meckert, klagt über fehlende Deklarationen, egal, wo ich die Variablendeklarationen hinschiebe, ausser, sie stehen direkt "über" der main-loop als globale Variable. Wie sieht eine vernünftige Lösung hierfür aus?
http://www.cplusplus.com/doc/tutorial/functions2/ - Declaring functions. Die Prototypen für Interrupts.c gehören in die Interrupts.h und müssen dann in deiner main-Datei über #include "Interrupts.h" eingebunden werden.
Stephan R. schrieb: > Wie sieht eine vernünftige Lösung hierfür aus? . Trennung von Deklaration und Definition . Deklaration gehört in eine Headerdatei
Deklarationen, die ich in -gleich welche- Header-Datei schreibe sind doch autoatisch global- oda?
Es will nicht klappen!! Wenn nicht ISR und Variablendekaration direkt nebeneinanderstehen, behauptet er, die Variable wäre nicht deklariert! Nebenbei: muss ich für eine ausgelagerte ISR einen Prototypen im Headerfile anlegen? Und ohne Auslagerung? Sähe der Prototyp für ISR(TIMER0_COMP_vect) dann so ISR(TIMER2_COMP_vect); aus? Fragen über Fragen. Zeit fürs erste Flens..
Stephan R. schrieb: > Wenn nicht ISR und Variablendekaration direkt nebeneinanderstehen, > behauptet er, die Variable wäre nicht deklariert! Dann mach Nägel mit Köpfen und poste (minimalen!) Code, der das Problem aufzeigt. > Nebenbei: muss ich für eine ausgelagerte ISR einen Prototypen im > Headerfile anlegen? Nein. Eine ISR ist komplett eigenständig und wird nur durch ihren Vektornamen eindeutig zugeordnet (das macht erst der Linker).
Stephan R. schrieb: > Es will nicht klappen!! > Wenn nicht ISR und Variablendekaration direkt nebeneinanderstehen, > behauptet er, die Variable wäre nicht deklariert! Code zeigen wäre hilfreich. my_int.c:
1 | #include "my_int.h" |
2 | |
3 | // Globale Variable für den Datenaustausch
|
4 | // zwischen ISR und main()
|
5 | volatile char foo; |
6 | |
7 | ISR(TIMER2_COMP_vect) |
8 | {
|
9 | foo = 1; |
10 | }
|
my_main.c:
1 | #include "my_int.h" |
2 | |
3 | int main(void) |
4 | {
|
5 | // TIMER2_COMP aufsetzen...
|
6 | while (1) |
7 | {
|
8 | if (foo != 0) |
9 | {
|
10 | // auf TIMER2_COMP reagieren...
|
11 | // Gemeinsame Variable zurücksetzen
|
12 | foo = 0; |
13 | }
|
14 | }
|
15 | }
|
my_int.h:
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | extern volatile char foo; |
> Nebenbei: muss ich für eine ausgelagerte ISR einen Prototypen im > Headerfile anlegen? Und ohne Auslagerung? > Sähe der Prototyp für ISR(TIMER0_COMP_vect) dann so > ISR(TIMER2_COMP_vect); > aus? > Fragen über Fragen. Zeit fürs erste Flens.. Nein für die ISR brauchst du keinen Prototypen anzulegen. Die avr/interrupt.h hast du includiert, damit ISR und TIMER2_COMP_vect beim Kompilieren bekannt sind?
Super. Mein liebevoll zusammengeschnipelter Code ist wieder weg. Aber nach einpaar Experimenten mit "extern" wurden sie Fehler immer weniger und sind schließlich ale weg, muss mir noch bissel was über extern und volatile anlesen, dnek ich. Vielen Dank!
Moin, also ich pflege immer folgendes: - die main-Funktion und der ISR in ein Main-Modul. - da kommen dann auch die globalen Attribute hin. - in der ISR kannst Du dann eine Funktion aus einem anderen Modul aufrufen und Parameter uebergeben oder Attribute importieren. ungefaehr so: main.c ------------------------------- #include "my_int.h" char foo; ISR(...){ ... what_ever(foo); ... } int main(void){ ... foo='c'; .. } ------------------------------- my_int.c ------------------------------- // extern char foo; int what_ever(int param){ ... // Zugriff auf importiertes foo oder param ... } -------------------------------
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.