www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Outsourcen von Programmcode = Programmtod


Autor: Stephan R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan R. (Gast)
Datum:

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

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur wenn du diese Headerdatei überall einbindest.

Autor: Stephan R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
#include "my_int.h"

// Globale Variable für den Datenaustausch 
// zwischen ISR und main()
volatile char foo; 

ISR(TIMER2_COMP_vect)
{
  foo = 1;
}

my_main.c:
#include "my_int.h"

int main(void)
{
  // TIMER2_COMP aufsetzen...
  while (1)
  {
    if (foo != 0)
    {
      // auf TIMER2_COMP reagieren...
      // Gemeinsame Variable zurücksetzen
      foo = 0;
    }
  }
}

my_int.h:
#include <avr/io.h>
#include <avr/interrupt.h>
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?

Autor: Stephan R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Kaila (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
 ...
}
-------------------------------

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.