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