mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Globale Variablen / Interrupt


Autor: soundmachine (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, habe hier im Formum jetzt knapp eine Stunde gesucht und nicht so 
recht fündig geworden, da ihr mir das letzte mal super helfen konntet, 
hoffe ich es ist dieses mal auch der Fall.
Folgendes Problem:
ich definiere 2 globale Variablen....In der main werden diese einmal mit 
leben gefüttert
z.B. P=255-PINB;
danach werden die Interrupts freigeschaltet über sei(); im interrupt 
wird der timer t1 mit dem wert P vorgeladen und toggelt so eine led.
in der while schleife der main schreibe ich nun folgendes:

while(1)
{
cli();
pneu=255-PINB;
if(pneu!=P)
P=pneu;
sei();
}

dummerweise lädt er den timer nicht mit dem neuen p sondern mit dem was 
in der main am anfang eingelesen wurde munter weiter.

was kann das denn sein???er müsste doch beim nächsten interrupt mit dem 
neuen P vorladen,

(P ist global definiert)

Dabke für eure Hilfe

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

Bewertung
0 lesenswert
nicht lesenswert
> ich definiere 2 globale Variablen....

Du hast das volatile vergessen.

Autor: soundmachine (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm...kannst du mir das etwas genauer erklären...habe vor 4 wochen das 
erste mal einen atmega8 in der hand gehabt...programmiere mit winavr 
gcc...

in der main den wert übernimmt er ja auch....

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

Bewertung
0 lesenswert
nicht lesenswert
PS

Schreibs doch einfach so
  while(1)
  {
    cli();
    P = 255-PINB;
    sei();
  }

macht genau dasselbe mit weniger Aufwand

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

Bewertung
0 lesenswert
nicht lesenswert
soundmachine schrieb:
> hmmm...kannst du mir das etwas genauer erklären...

Dann zeig dein komplettes Programm.
Dann hat man auch etwas, das man verbessern kann.

> habe vor 4 wochen das
> erste mal einen atmega8 in der hand gehabt...programmiere mit winavr
> gcc...

Goggle mal nach volatile oder benutze die Forumssuche. Das Thema globale 
Variablen und volatile taucht jeden Tag mindestens 3 mal auf

Autor: soundmachine (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das geht leider nicht, da in der isr noch zähler laufen die im falle 
eines umschaltens der taktfrewuenz auf 0 gesetzt werden sollen....dies 
würde er bei deiner sache aber ständig machen und der zähler würde 
garnicht hochlaufen....kann man kurz und knapp den sinn von volantile 
erklären

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
soundmachine schrieb:
> kann man kurz und knapp den sinn von volantile
> erklären

Das kannst du kurz und knapp selber raus finden. Tz...

Autor: soundmachine (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alles klar...vielen dank schonmal

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

Bewertung
0 lesenswert
nicht lesenswert
soundmachine schrieb:
> das geht leider nicht, da in der isr noch zähler laufen die im falle
> eines umschaltens der taktfrewuenz auf 0 gesetzt werden sollen....dies
> würde er bei deiner sache aber ständig machen und der zähler würde
> garnicht hochlaufen....kann man kurz und knapp den sinn von volantile
> erklären

Zeig deinen Code.
Das ist Unsinn was du da plapperst.

P verändert seinen Wert nur dann, wenn von PINB ein anderer Wert 
eingelesen wird. Ob du da vorher noch mit pneu operierst oder nicht. Die 
ganze Operation, mach eine Zuweisung nur dann, wenn sich der neue Wert 
vom alten Wert unterscheidet, ist 0-Operation, weil im Endeffekt IMMER 
dass gleiche Ergebnis rauskommt: P hat entweder den alten Wert (wenn 
sich PINB nicht verändert hat) oder es hat den neuen Wert (wenn sich 
PINB verändert hat).

Autor: soundmachine (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo kark-heinz....habs mir im  tutorial durchgelesen...klingt 
schlüssig...vielen dank nochmal...ich werds gleich ausprobieren.
Nur schonmal top wenn man weis wo man den hebel ansetzen muss.

is halt immer ein unterschied zwischen theorie und praxis  ;-)


also danke nochmal

Autor: soundmachine (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sooooo.....habs grad mal ausprobiert...es funzt...super sache...das mit 
dem volatile kannte ich halt nicht...
@ karl heinz...unsinn war das nur bedingt, denn wenn PINB umgeschaltet 
wird sollen noch weitere aktionen durchgeführt werden (aber eben nur 
wenn was umgeschaltet wird) deshalb die if anweisung


aber danke nochmal

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

Bewertung
0 lesenswert
nicht lesenswert
soundmachine schrieb:
> sooooo.....habs grad mal ausprobiert...es funzt...super sache...das mit
> dem volatile kannte ich halt nicht...
> @ karl heinz...unsinn war das nur bedingt, denn wenn PINB umgeschaltet
> wird sollen noch weitere aktionen durchgeführt werden (aber eben nur
> wenn was umgeschaltet wird) deshalb die if anweisung

Was lernen wir daraus:
Poste deinen Code so wie er bei dir im Editor steht.

Insbesondere: Vermeide es, Code nur in Auszügen zu präsentieren. 
Kürzeren Code kann man direkt einfügen (Copy&Paste). Längeren Code hängt 
man als Dateianhang an. In beiden Fällen hat man jedoch weniger Arbeit, 
als wie wenn man den vermeintlich relevanten Codeabschnitt abtippt. Von 
Tippfehlern, die während des Abtippens entstehen reden wir erst mal gar 
nicht.
Und nein: Für die meisten hier ist alles unter 100 Zeilen Peanuts. Viele 
hier arbeiten beruflich an Projekten die ein paar Zehntausend Zeilen 
umfassen, manchmal noch mehr (1 oder 2 Nullen hinten drann). Wir sind 
gewohnt mit solchen Codemengen umzugehen. Ein Programm aus 200 Zeilen 
stellt die meisten noch lange nicht vor irgendwelche Probleme.

Aber: Wir hätten gerne möglichst vollständigen Code. Alles was du nicht 
explizit postest, müssen wir raten. Wenn du verhindern willst, dass wir 
uns das Schwarze unter den Fingernägeln erraten, dann zeig ganz einfach 
alles.

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.