Hi!
Ich bin mit meinem Latein nach 2 Stunden sinnlosem rumprobieren mal
wieder am Ende. Das ganze soll ein Lauflicht mit verschiedenen
Leuchtszenen werden. Die 4 LEDs hängen an PortB. Der Pointer
currentSceneAdress will in der ISR einfach nicht gesetzt werden, man
sieht aber anhand des Verhaltens der LEDs, dass currentStep erfolgreich
auf 0 zurückgesetzt, also die ISR richtig ausgeführt wird.
wenn ich den Codeteil der ISR in die while-Schleife der main-function
verfrachte, dann funktioniert es, also geh ich mal davon aus, dass der
Pointer in der ISR nicht richtig neu gesetzt wird. Aber warum? Sieht
jemand einen Fehler? Immer wieder deprimierend wie man sich an solchen
komischen Dingen aufhält.
Der Code ist bis aufs mindeste reduziert.
Mit Atomarem Zugriff meinst du nicht zufällig, dass es da einen konflikt
zwischen Auslesen in der Main-Function und neu Setzen des Pointers in
der ISR gibt? Das würde aber dann mehr oder weniger zufällig passieren,
das setzen des Pointers klappt nie. Er springt einfach nicht zur
nächsten Szene, wie als könnte er auf den Pointer da nicht zugreifen
aber das ist ja irgendwie auch quatsch. Das ist ein µC, da gibts keine
Speicherbereiche wo irgendein Befehl nicht drauf zugreifen kann, muss
irgendwie am C-Code liegen.
Allerdings habe ich den Pointer ja als volatile deklariert, somit müsste
er auch von der ISR raus zugänglich sein :-(
lg PoWl
Warum untersuchst du das nicht mal im Simulator? Die Methode "scharfes
Hinsehen" ist zwar nett, aber wie du selber merkst, kommt man damit
nicht immer weiter. Für dein Problem reicht der AVR-Studio-Simulator. Am
besten alle delays vorher auskommentieren oder verkleinern, dann einen
breakpoint in die ISR, und laufen lassen.
Sehr zu empfehlen ist auch VMLAB. Am Anfang etwas gewöhnungsbedürftig,
und miserabel dokumentiert (da nicht fertig), aber wenn es dann mal
läuft, bekommst du einen ganz anderen Einblick in deine Programme.
Oliver
Paul Hamacher wrote:
> Allerdings habe ich den Pointer ja als volatile deklariert, somit müsste> er auch von der ISR raus zugänglich sein :-(
Nein, hast du nicht. Der Pointer selber ist nicht volatile, sondern nur
das, worauf er zeigt.
volatile uint8_t *currentSceneAdress;
->
uint8_t* volatile currentSceneAdress;