Forum: Mikrocontroller und Digitale Elektronik Interrupt und Gültigkeitsbereiche


von Gast_Gast (Gast)


Lesenswert?

Hallo zusammen,
kann mir einer vielleicht helfen und zwar würde ich gerne wissen, ob 
eine Variable gesetzt bleibt, wenn ich sie während eines Interruptes 
setze?
Ich sezte zum Beispiel a = 77 und dann verlasse ich meinen Interrupt, 
danach möchte ich in einem anderen Interrupt mit a = 77 weiter rechnen, 
geht das?

von Kanzler Gorkon (Gast)


Lesenswert?

Wenns eine globale Variable ist schon (je nach Anwendung und Compiler 
kann volatile oder static erforderlich sein)

von Karl H. (kbuchegg)


Lesenswert?

Gast_Gast wrote:
> Hallo zusammen,
> kann mir einer vielleicht helfen und zwar würde ich gerne wissen, ob
> eine Variable gesetzt bleibt, wenn ich sie während eines Interruptes
> setze?
> Ich sezte zum Beispiel a = 77 und dann verlasse ich meinen Interrupt,
> danach möchte ich in einem anderen Interrupt mit a = 77 weiter rechnen,
> geht das?

Wenn a eine globale Variable ist, geht das.
Eine ISR ist aus Sicht des C-Compilers auch nichts anderes
als eine ganz normale Funktion.

Je nachdem, wie die genauen Umstände sind, kann (wird) es
sinnvoll sein, die globale Variable noch mit einem 'volatile'
zu versehen.
1
volatile uint8_t a;
2
3
ISR( ... )
4
{
5
  a = 77;
6
}
7
8
int main()
9
{
10
  ...
11
12
  i = 2 * a;
13
}

von STK50-Besitzer (Gast)


Lesenswert?

>geht das?

Ja, man muß nur gewisse Bedingungen erfüllen.

von Gast_Gast (Gast)


Lesenswert?

<volatile uint8_t a;>
So einen Befehl kenn ich leider nicht.
Bei mir ist a einfach unsigned int und ist schon global deklariert, also 
so:

unsigned int a = 0x0000; Da schreib ich den Inhalt eines Timers rein.
Wie soll ich das mit volatile deklarieren? Es soll auf jeden Fall eine 
16bit Variable bleiben

von Kanzler Gorkon (Gast)


Lesenswert?

Hauptsache der Compiler kennts, würd ich meinen.
Volatile ändert den Datentype ja auch nicht.

von Johannes M. (johnny-m)


Lesenswert?

> So einen Befehl kenn ich leider nicht.
Dann solltest Du Dir mal ein C-Buch oder -Tutorial vornehmen und das 
nachholen.

volatile ist kein Befehl sondern ein Typqualifizierer und fester 
Bestandteil der Sprache C. volatile teilt dem Compiler mit, dass die so 
gekennzeichnete Variable sich außerhalb des Programmablaufs (also 
außerhalb dessen, was der Compiler "sieht") ändern kann und dass er 
deshalb keine Zugriffe auf diese Variable wegoptimieren darf. Bei 
globalen Variablen, die in Interrupt Handlern und im laufenden 
Programm (Hauptprogramm) verwendet werden, kann das essentiell wichtig 
sein, da ein Interrupt Handler aus Compilersicht nie aufgerufen wird 
(der Compiler weiß ja nichts von asynchron auftretenden 
Hardware-Ereignissen).

Eine Änderung der Variable im Interrupt Handler kann ohne volatile dem 
Hauptprogramm entgehen, da der Compiler auf die Idee kommen kann, die 
Variable im Hauptprogramm in einem Register abzulegen und nicht zu 
aktualisieren, denn aus seiner Sicht ändert sie sich ja nie...

von Gast_Gast (Gast)


Lesenswert?

also wie ich das verstanden habe kann ich meine Variable so deklarieren:
volatile uint16_t CC7alt;  Das ist eine 16bit Variable.
Ich tue sie da deklarieren, wo meine normalen Deklarationen und 
Prototypen drin sind, also kurz vor Main().
Wenn ich die Variable CC7alt verwende (in der Interrupt Routine), dann 
mekert der Compiler..:-(
Was mach ich falsch?????

von Johannes M. (johnny-m)


Lesenswert?

Tja, dann wird an Deinem Programmaufbau etwas nicht in Ordnung sein. Da 
Du keinen Code postest, kann man nur vermuten, dass die Definition des 
Interrupt Handlers vor der Deklaration der Variable steht. Und dass 
das nicht geht, ist hoffentlich klar...

von Kanzler Gorkon (Gast)


Lesenswert?

Eventuell ists auch wichtig, was dem Compiler genau nicht passt...

von Gast_Gast (Gast)


Lesenswert?

<Tja, dann wird an Deinem Programmaufbau etwas nicht in Ordnung sein. Da
Du keinen Code postest, kann man nur vermuten, dass die Definition des
Interrupt Handlers vor der Deklaration der Variable steht. Und dass
das nicht geht, ist hoffentlich klar...>

also der Programmaufbau wurde mir von DAVE erzeugt!
Es sind dann nur ein paar Stellen frei, wo der "User Code" rein kann:

Makros
Defines
Typedefs
Imported Global Variables
Global Variables
External Prototyps und
Prototyps of local Funktions

Also ich hab die Var. bei den Global Variables mit rein.
Muss doch so passen.....

von Johannes M. (johnny-m)


Lesenswert?

Kanzler Gorkon wrote:
> Eventuell ists auch wichtig, was dem Compiler genau nicht passt...
Ja, das wäre nicht verkehrt... "...dann mekert der Compiler..:-(" ist 
eine außerordentlich unpräzise Aussage.

von Gast_Gast (Gast)


Lesenswert?

<Kanzler Gorkon wrote:
> Eventuell ists auch wichtig, was dem Compiler genau nicht passt...
Ja, das wäre nicht verkehrt... "...dann mekert der Compiler..:-(" ist
eine außerordentlich unpräzise Aussage.>

Compiler sagt :
CC7 not in formal parameter list

von Johannes M. (johnny-m)


Lesenswert?

Gast_Gast wrote:
> also der Programmaufbau wurde mir von DAVE erzeugt!
> Es sind dann nur ein paar Stellen frei, wo der "User Code" rein kann:
Ist das ein Grund, den Code nicht zu posten (und die Fehlermeldung des 
Compilers)? Wenn ja, dann kann ich Dir leider nicht weiterhelfen, weil 
meine hellseherischen Fähigkeiten derzeit nicht so gut funktionieren.

von Johannes M. (johnny-m)


Lesenswert?

Gast_Gast wrote:
> Compiler sagt :
> CC7 not in formal parameter list
Das könnte bedeuten, dass er die Variable CC7 nicht kennt, was 
zumindest darauf schließen ließe, dass meine obige Vermutung zutrifft. 
Aber es kann doch nicht so schwer sein, den Code mal eben wenigstens 
durchzusehen und zu überprüfen, ob die Variable vor ihrer ersten 
Benutzung überhaupt deklariert ist...

Und wenn Du keine Ahnung von der C-Programmierung hast, ist die "Arbeit" 
mit einem Code Generation Wizard wie DAvE die denkbar schlechteste 
Methode. So wird das nie was, v.a. wenn man nicht mal versucht, zu 
verstehen, was DAvE da fabriziert hat...

von Kanzler Gorkon (Gast)


Lesenswert?

>also der Programmaufbau wurde mir von DAVE erzeugt!

Du hast ein C-Programm, das Du nicht selber erzeugt hast, das nicht 
funktioniert und wo Du nur bestimmte Stellen ändern kannst?
'tschuldigung, aber so wird das nichts...

von Niels H. (monarch35)


Lesenswert?

Wer oder Was ist DAVE?

von Gast_Gast (Gast)


Lesenswert?

<Du hast ein C-Programm, das Du nicht selber erzeugt hast, das nicht
funktioniert und wo Du nur bestimmte Stellen ändern kannst?
'tschuldigung, aber so wird das nichts...>

also das ist beim Dave normal, dass man nur an bestimmten Stellen 
eigenen Code einfügen kann! Hat bis jetzt auch supper hingehauen! Denn 
den Code schreib ich schon selber, nur bestimmte Sachen initialisieren 
und best. Register werden mit Hilfe von DAVE gesetzt.

von Gast_Gast (Gast)


Lesenswert?

<Und wenn Du keine Ahnung von der C-Programmierung hast, ist die 
"Arbeit"
mit einem Code Generation Wizard wie DAvE die denkbar schlechteste
Methode. So wird das nie was, v.a. wenn man nicht mal versucht, zu
verstehen, was DAvE da fabriziert hat...>

also du bist schon ziemlich gemein, findest du nicht?
Außerdem hab ich das Problem schon behoben!!!!

von Kanzler Gorkon (Gast)


Lesenswert?

Na dann, stell mal den Code rein. Oder ists eine Sache der nationalen 
Sicherheit?

von Johannes M. (johnny-m)


Lesenswert?

Gast_Gast wrote:
> also das ist beim Dave normal, dass man nur an bestimmten Stellen
> eigenen Code einfügen kann!
Stimmt doch gar nicht! Alles was DAvE produziert, kann man auch ändern! 
Und man kann überall Code einfügen.

Niels Hüsken wrote:
> Wer oder Was ist DAVE?
DAvE ist der Digital Application Virtual Engineer, ein Code Generation 
Wizard, der von Infineon herausgegeben wird und der in der Lage ist, 
über eine grafische Eingabeoberfläche den Programmrumpf zu erzeugen.

von Johannes M. (johnny-m)


Lesenswert?

Kanzler Gorkon wrote:
> Na dann, stell mal den Code rein. Oder ists eine Sache der nationalen
> Sicherheit?
Den Eindruck hab ich langsam auch...

von Oliver (Gast)


Lesenswert?

>Du hast ein C-Programm, das Du nicht selber erzeugt hast, das nicht
>funktioniert und wo Du nur bestimmte Stellen ändern kannst?

>also das ist beim Dave normal

Also, wenn das ALLES bei DAVE normal ist, warum fragst du dann noch?

Und was für ein Compiler spuckt denn die Fehelrmeldung aus? "not in 
formal parameter list" klingt nach einem überzähligem Parameter in einem 
Funktionsaufruf, o.ä., aber wie schom mehrfach gesagt, ohne Code ist das 
alles nur wildes rumgerate.

Oliver

von Gast_Gast (Gast)


Lesenswert?

<Stimmt doch gar nicht! Alles was DAvE produziert, kann man auch ändern!
Und man kann überall Code einfügen.>
aber wenn ich dann weiter zu DAVE übergehe und vllt. noch ein Modul 
dazunehmen will z.b. die CC2 oder so. Dann muss ich ja den C-Code 
updaten= neu generieren. Danach sind alle Codeänderungen, die nicht 
innerhalb der dafür vorgesehenen Felder sind, weg!!!!!

von Johannes M. (johnny-m)


Lesenswert?

Gast_Gast wrote:
> aber wenn ich dann weiter zu DAVE übergehe und vllt. noch ein Modul
> dazunehmen will z.b. die CC2 oder so. Dann muss ich ja den C-Code
> updaten= neu generieren. Danach sind alle Codeänderungen, die nicht
> innerhalb der dafür vorgesehenen Felder sind, weg!!!!!
Ich glaub, dazu muss man nichts mehr sagen...

von Kanzler Gorkon (Gast)


Lesenswert?

Trotzdem wärs jetzt schon noch interessant, worans gelegen hat.
Ist das auch Verschlußsache?

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.