www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt und Gültigkeitsbereiche


Autor: Gast_Gast (Gast)
Datum:

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

Autor: Kanzler Gorkon (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
volatile uint8_t a;

ISR( ... )
{
  a = 77;
}

int main()
{
  ...

  i = 2 * a;
}

Autor: STK50-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>geht das?

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

Autor: Gast_Gast (Gast)
Datum:

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

Autor: Kanzler Gorkon (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Gast_Gast (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Kanzler Gorkon (Gast)
Datum:

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

Autor: Gast_Gast (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Gast_Gast (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Kanzler Gorkon (Gast)
Datum:

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

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wer oder Was ist DAVE?

Autor: Gast_Gast (Gast)
Datum:

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

Autor: Gast_Gast (Gast)
Datum:

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

Autor: Kanzler Gorkon (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Gast_Gast (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Kanzler Gorkon (Gast)
Datum:

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

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.