Forum: Compiler & IDEs Programm kommt aus ISR nicht mehr raus


von Neuling (Gast)


Angehängte Dateien:

Lesenswert?

Hi Leute,

bin ein Neuling, also bitte nicht steinigen wenn ich irgendwelche 
gravierende Fehler mache oder gemacht habe.

Das Projekt was wir machen behinaltet eine Platine mit einem ATMega88, 
einem Flashspeicher (SPI), Beschleunigungssensor (SPI) und einem 
Drucksensor (TWI).
Wir sind noch ziemlich am Anfang, also ist noch nicht viel da.
Woran es hakt ist die Initialiserung des Flashs.
Wir haben von unseren Projektbetreuern Bibliotheken bekommen für die 
Bauteile, daher dachten wir, das wird nicht sooo schwer.

In der Initialiserungsfunktion für den Flash ist am Ende eine Funktion, 
welche das Status-Register komplett mit Nullen überschreiben soll.
Sobald in dieser Funktion die Schleife:"
while(!(SPSR & (1 << SPIF)));
"
kommt, springt er in die ISR des Timers und kommt da aber nicht mehr 
raus...
leider seh ich nicht, woran das liegt

ich glaube, ich habe alles nötige angehängt was man eventuell braucht
geschrieben hab ich das noch in AVR Studio 4.iwas (18 oder 19)

weiß nicht, wie ich hier als Gast ansehnlich Code einfügen kann
ansonsten einfach sagen wenn noch was fehlen sollte oder so

von Neuling (Gast)


Lesenswert?

Ja sorry, die erste rar-Datei nicht beachten, da hat das Datenblatt vom 
Flash gefehlt.

von Klaus F. (kfalser)


Lesenswert?

Vermutung, ohne das Programm angeschaut zu haben.
Der SS Port des SPI Interfaces ist als Input deklariert oder sonst 
verwendet, sodass ein Low-Pegel das SPI Interface von Master auf Slave 
Modus umkonfiguriert. Deshalb wird das SPIF Flag nicht mehr gesetzt.
SS Pin nicht verwenden, bzw. sicher auf 1 setzen, mit aktivem Pullup.
Hatte einmal so einen Fehler.

: Bearbeitet durch User
von MWS (Gast)


Lesenswert?

Variablen, auf die im Hauptcode und in der ISR zugegriffen wird, müssen 
als "volatile" deklariert werden.

von Neuling (Gast)


Lesenswert?

@Klaus:

oh mist, mir fällt erst jetzt auf, dass da wo die Ports für die Ausgänge 
definiert werden es so da steht:"
DDRB = (1<<DDB3) | (1<<DDB5);  //Setzt MOSI, SCK auf Ausgang
DDRC = (1<<DDC1) | (1<<DDC0);   //Setzt CS und WP auf Ausgang
"

das ist natürlich falsch und sollte so aussehen:"
DDRB |= (1<<DDB3) | (1<<DDB5);  //Setzt MOSI, SCK auf Ausgang
DDRC |= (1<<DDC1) | (1<<DDC0);   //Setzt CS und WP auf Ausgang
"

damit war also die Bibliothek falsch und ich Idiot habs nicht gesehen.
wow, nicht mal das kann ich...


@MWS:
also die Variablen die wir in der ISR des Timers verwenden bleiben in 
der Klasse des Timers.
müssen/sollten die da auch als volatile deklariert werden?
weil der Timertest mit der LED hat damals funktioniert
was aber wohl er Glück war, oder?

von MWS (Gast)


Lesenswert?

Neuling schrieb:
> also die Variablen die wir in der ISR des Timers verwenden bleiben in
> der Klasse des Timers.
> müssen/sollten die da auch als volatile deklariert werden?
> weil der Timertest mit der LED hat damals funktioniert
> was aber wohl er Glück war, oder?

Welcher "Klasse"? Lies Dich halt mal über volatile und Interrupts ein, 
auch hier im Forum zu finden.

von Neuling (Gast)


Lesenswert?

Ich habe das zu den Volatiles gelesen.
Aber entsprechend dem was da steht, muss man generell immer die 
Variablen die in der ISR vorkommen als "volatile" deklarieren, da man 
mit dieser Variable in der Regel nachher etwas anfangen will was 
außerhalb der ISR ist.

Bzgl. Klasse ist das hier natürlich der falsche Begriff.

von MWS (Gast)


Lesenswert?

Ist doch hier ganz ordentlich erklärt:
http://www.mikrocontroller.net/articles/FAQ#Was_hat_es_mit_volatile_auf_sich
Anonsten: probier's einfach aus.

von Neuling (Gast)


Lesenswert?

werd ich
euch schonmal vielen Dank!

von Klaus F. (kfalser)


Lesenswert?

Neuling schrieb:
> das ist natürlich falsch und sollte so aussehen:"
> DDRB |= (1<<DDB3) | (1<<DDB5);  //Setzt MOSI, SCK auf Ausgang
> DDRC |= (1<<DDC1) | (1<<DDC0);   //Setzt CS und WP auf Ausgang

Aber PB2 (mit der Funktion SS) scheint ein Eingang zu sein und das mag 
die SPI Schnittstelle nicht.

von Neuling (Gast)


Lesenswert?

das heißt ich sollte genrell den Port PB2, welcher als SS definiert ist, 
vorsichtshalber auch schonmal auf Ausgang stellen, oder?

von Falk B. (falk)


Lesenswert?

JA!

von Neuling (Gast)


Lesenswert?

Ja sorry, ich sagte doch ich bin ein Neuling.
Auf der anderen Seite mit etwas überlegen sollte das eigentlich klar 
sein...^^

Immerhin geht er den Programm-Code jetzt soweit durch.
Dank euch schonmal :)

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.