hi, hab da ein großes problem mit einer variable, ungefähr so: unsigned char cnt = 0; // eine globale variable ... SIGNAL(SIG_INTERRUPT1) { ... cnt++; // variable wird erhöht, sehe ich an einem lcd ... } ... void funk1(void) { ... while(cnt == 0) PORTA = cnt+1; // am porta hängen 8 leds ... } also mein problem: es wird die variable cnt bei einem externen interrupt eindeutig erhöht, den zählerstand sehe ich an einem lcd, in der funktion funk1 bleit dieselbe variable aber immer 0, was ich an den leds sehe. eigentlich sollte irgendwann während die while-schleife in funk1 läuf die variable durch den externen interrupt erhöht werden, was dazu führt dass die while-schleife abgebrochen wird, dem ist aber nicht so, arg, ich hab keine ahnung wieso? wenn nötig könnte ich ev. den ganzen source zur verfügung stellen. danke, Martin
Hallo Martin! Dein Problem ist schon öfter hier beschrieben: das Schlüsselwort heist "volatile". Kurz: es sorgt dafür, daß jeder Zugriff auf Deine Variable sicher gestellt wird (keine Optimierung seitens Compiler). Den Rest kannst Du ja in den anderen Threads nachlesen... Gruß, Patrick... P.S.: volatile unsigned char cnt = 0; // eine globale variable
Normalerweise müsste das so gehen. Poste doch bitte mal einen kompletten Quelltext, dann lässt sich da eher etwas finden. MfG Sascha
Gern geschehen! Lies den Rest aber auf jeden fall mal nach, da wirst Du einige Tips und Hinweise bekommen. Gruß, Patrick...
Und warum geht das hier nicht mit dem AVR-GCC: unsigned char cnt = 0; // eine globale variable void funk1(void) { ... while( (unsigned char volatile)cnt == 0) // <- das hier !!! PORTA = cnt+1; // am porta hängen 8 leds ... } Man kann doch alles mögliche casten, warum dann nicht auch volatile ? Peter
Hallo Peter! Ich würde mal vermuten das es daran liegt, dass volatile nur dem Compiler beim compilieren "sagt" dass er die Variable nicht mit (weg-)optimieren soll. Zur laufzeit würde ein Cast auf volatile also keinen sinn machen, und deshalb auch nicht gehen. MfG Sascha
Oder mit den Worten des Standards (6.5.4 Cast operators): ``A cast does not yield an lvalue. Thus, a cast to a qualified type has the same effect as a cast to the unqualified version of the type.'' (`const' und `volatile' sind type qualifiers.)
...wobei (volatile unsigned char) oder (volatile unsigned char *) zumindest keine Fehlermeldung bringt... Allerdings gibts ne Fehlermeldung, wenn man Versucht, beispielsweise ein volatile unsigned char an eine Funktion zu übergeben, die einfach nur ein schlichtes unsigned char erwartet... Irgendwo wiederspricht sich das doch, oder? Klar ist volatile ein type qulaifier, aber dann sollte das bei der Übergabe auch keine Rolle spielen, oder bin ich da jetzt auf dem Holzweg? Patrick...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.