Forum: Mikrocontroller und Digitale Elektronik Outsourcen von Programmcode = Programmtod


von Stephan R. (Gast)


Lesenswert?

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?

von Marco (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stephan R. schrieb:
> Wie sieht eine vernünftige Lösung hierfür aus?

. Trennung von Deklaration und Definition
. Deklaration gehört in eine Headerdatei

von Stephan R. (Gast)


Lesenswert?

Deklarationen, die ich in -gleich welche- Header-Datei schreibe sind 
doch autoatisch global- oda?

von Marco (Gast)


Lesenswert?

Nur wenn du diese Headerdatei überall einbindest.

von Stephan R. (Gast)


Lesenswert?

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..

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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).

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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?

von Stephan R. (Gast)


Lesenswert?

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!

von Kaila (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.