Forum: Mikrocontroller und Digitale Elektronik Globale Variablen / Interrupt


von soundmachine (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

> ich definiere 2 globale Variablen....

Du hast das volatile vergessen.

von soundmachine (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

PS

Schreibs doch einfach so
1
  while(1)
2
  {
3
    cli();
4
    P = 255-PINB;
5
    sei();
6
  }

macht genau dasselbe mit weniger Aufwand

von Karl H. (kbuchegg)


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

von soundmachine (Gast)


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

von Klaus (Gast)


Lesenswert?

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

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

von soundmachine (Gast)


Lesenswert?

alles klar...vielen dank schonmal

von Karl H. (kbuchegg)


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

von soundmachine (Gast)


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

von soundmachine (Gast)


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

von Karl H. (kbuchegg)


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.

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.