Programm kommt aus ISR nicht mehr raus

Gast #4028877
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
Angehängte Dateien:
#4029207
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.
Gast #4029268
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?
Gast #4029281
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren