Variablenübergabe bei einem Interrupt

Gast #779335
Hallo Forum,
ich hoffe ihr könnt mir weiterhelfen...
Folgendes Problem, ich arbeite an einem vorhandenen Programm für einen 
TMS320F2812 weiter. Das Programm besteht aus mehreren Dateien.
Da ich in meiner Interruptroutine eine Switch-case Anweisung hab, muss 
ich dieser Funktion eine Variable übergeben, man kann aber einer 
Interruptroutine keine Variable übergeben, zumindest nicht im CCS.
Mein erster Versuch war mit einer globalen Variable, mit "extern" 
deklariert, aber die Variable wurde nicht richtig von Funktion zu 
Funktion übermittelt. Und außerdem ist es ja keine saubere Lösung mit 
globalen Variablen zu arbeiten. Kann mir jemand einen Tip geben, wie ich 
eine Variable an meine Interruptroutine übergebe, oder was es da sonst 
noch für Möglichkeiten gibt.
Vielen Dank schon mal im voraus...

Stefanie
Gast
> nur volatile oder dann volatile extern?

Bei der Deklaration (üblicherweise in einem Header) mit extern. Bei 
der Definition (üblicherweise in einer C-Datei) kann man es lassen.
Gast
Das ist mir momentan keine große Hilfe, ich habe 2 C-Bücher, deren 
Beispiele leider nicht aufschlussreich sind!

Ich hab das ganze mit volatile extern in der main.h deklariert und die 
main.h per include da eingebunden wo ich die Variable nutzen möchte.
Beim kompilieren treten keine Fehler auf, aber wenn ich das build 
erstelle meckert er rum, das da ein undefieniertes Symbol ist...
über einen tip wäre ich sehr dankbar...
Gast
> Ich hab das ganze mit volatile extern in der main.h deklariert und die
> main.h per include da eingebunden wo ich die Variable nutzen möchte.
> Beim kompilieren treten keine Fehler auf, aber wenn ich das build
> erstelle meckert er rum, das da ein undefieniertes Symbol ist...

Das ist auch kein Wunder, denn mit der Speicherklasse "extern" wird
zum Ausdruck gebracht, dass die Variable in irgend einer anderen
Quelltextdatei deklariert wurde.
Gast
Wenn hier jeder bloß einen Brocken der Lösung hinschreibt und man sich 
alles selber zusammenbasteln muss ist das ja kein Wunder das nix bei 
raus kommt...
Gast
Ich habe das ganze jetzt in der main.h so
1
volatile extern unsigned char flag;
deklariert
und in der main.c
1
volatile unsigned char flag;
 so
außerdem benutze ich die Variable "flag" noch in der interrupt.c, aus 
diesem Grund habe ich die main.h per include in die interrutp.c 
eingebunden...

kann mir bitte jemand sagen was da nun noch falsch ist,
in meinem Hauptprogramm setze ich die Variable flag, aber das hat keine 
Auswirkungen auf die switch-case Anweisung in der Interrupt-Routine...

bin für jede Hilfe dankbar...
Gast
> Wenn hier jeder bloß einen Brocken der Lösung hinschreibt und man sich
> alles selber zusammenbasteln muss ist das ja kein Wunder das nix bei
> raus kommt...

Hier wird erwartet, dass man selber denkt und selber an seiner 
Hausarbeit oder gar dem beruflichen Projekt arbeitet und nicht mit dem 
Silberlöffel gefüttert werden möchte.

Solltest du zuverlässige, jederzeit für dich auf dem Sprung stehende 
Beratungsleistung benötigen, dann bezahle einen Berater. Den kannst du 
dann  rumkommandieren wie du willst und der muss dir helfen. Hier muss 
niemand seine Zeit mit deinem Problem verschwenden.
Huhu,

also ich arbeite auch auf nem TMSF2812 unter CCS 3.1. Ich hab auch ne 
Menge globaler Variablen in dem vorgegebenen Code und die sind auch dem 
Interrupt zugänglich. Es soll eine Möglichkeit wie man einer ISR 
Variablen oder Zeiger übergeben kann, aber diese kenne ich leider auch 
nicht. In meinem Programm ist das so organisiert...

BSP:

in main.c

#include ...

int GLOBAL=0;

void main(void)
{
  GLOBAL=25;
}

in T1CINT_ISR.c

#include ...

extern int GLOBAL;

interrupt void T1CINT_ISR(void)
{
  GLOBAL=5;
}


Natürlich muss die ISR erst noch in einer Initialisierungsroutine 
zugewiesen werden, also quasi die Adresse der Funktion in die 
Vektortabelle eintragen.

dies geht z.B. für den T1CINT so:

EALLOW;

/*Interruptadresse für Timer1-Compare-Interrupt angeben (Interrupt 
Adresse in PIE-vector tabelle eintragen)*/

*(volatile long*)0x00000D58 = (long)&T1CINT_ISR;

EDIS;

oder falls man die neuen DSP-Header-Files benutzt auch komfortabler:

void init_interrupt(void)
{
  EALLOW;    /*erlaubt Zugriff auf Register*/

  //Interrupt Adresse in PIE-Vector Tabelle eintragen
  PieVectTable.T1CINT = &T1CINT_ISR;

  EDIS;    /*verbietet den Zugriff auf Register wieder*/

// NICHT VERGESSEN - Gewünschte Interrupts auch freischalten !!!

/*********************************************************************** 
***************
/ Freigabe der Pie Interrupts
************************************************************************ 
**************/

  PieCtrlRegs.PIECRTL.bit.ENPIE=1;
  PieCtrlRegs.PIEACK.bit.ACK2=1;
  PieCtrlRegs.PIEIER2.bit.INTx5=1;

  EvaRegs.EVAIMRA.bit.T1CINT=1;

  IER|=2;
  EINT;

}

Hoffe das hilft dir weiter!

PS: Im Simulator-Betrieb lassen sich Interrupts nicht testen, da die 
Timer nicht simuliert werden. Wenn du z.B. ein eZdsp-board hast kannst 
du das ohne Probleme dort im Step-, oder Run-Betrieb testen. Nicht 
vergessen einen Breakpoint im Interrupt zu setzen, sonst bekommt man 
nicht mit das er dort hineinspringt!
Gast
So sollte es gehen:

main.h:
1
extern unsigned char volatile flag;

main.c:
1
unsigned char volatile flag;

Ansonsten wäre könnte die Fehlermeldung von CCS weiterhelfen.


> Mein erster Versuch war mit einer globalen Variable, mit "extern"
> deklariert, aber die Variable wurde nicht richtig von Funktion zu
> Funktion übermittelt. Und außerdem ist es ja keine saubere Lösung mit
> globalen Variablen zu arbeiten.

Wieso soll das keine saubere Lösung sein?

Gruss, Jan

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.