Forum: Digitale Signalverarbeitung / DSP / Machine Learning Variablenübergabe bei einem Interrupt


von Stefanie (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

Ich kenne nur die "Übergabe" per globaler Variable.
Aber als volatile deklarieren!

von Stefanie (Gast)


Lesenswert?

danke, das probier ich gleich mal...
nur volatile oder dann volatile extern?

von Stefanie (Gast)


Lesenswert?

Hallo,
kann mir noch bitte jemand sagen wie und wo ich das genau deklariere...

von Norgan (Gast)


Lesenswert?

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

von Norgan (Gast)


Lesenswert?

> kann mir noch bitte jemand sagen wie und wo ich das genau deklariere...

Wird Zeit für

http://www.amazon.de/Programmieren-ANSI-Mit-C-Reference-Manual/dp/3446154973/

von Stefanie (Gast)


Lesenswert?

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

von PS (Gast)


Lesenswert?

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

von Stefanie (Gast)


Lesenswert?

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

von Stefanie (Gast)


Lesenswert?

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

von Norgan (Gast)


Lesenswert?

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

von J. T. (smarty)


Lesenswert?

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!

von Stefanie (Gast)


Lesenswert?

@J. T.
Vielen Dank, das probier ich gleich mal aus...

von Jan (Gast)


Lesenswert?

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

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.