Forum: Mikrocontroller und Digitale Elektronik ISR(SPI_STC_vect) wird nicht verlassen


von Fabian (Gast)


Lesenswert?

Hallo zusammen,
ich habe ein kleines Problem bei ner SPI-Übertragung. Und zwar wird 
(egal ob der SPI-Interrupt enable oder disable is) in die ISR gesprungen 
und diese nicht mehr verlassen, egal was innerhalb der ISR steht. Alles 
was innerhalb der ISR steht wird noch erledigt und dann hängt er 
einfach. Controller is ein Atmega640...
Bin für jeden Hinweis dankbar!
Gruß Fabi

von Marius W. (mw1987)


Lesenswert?

Ich glaub in Zeile 42 der spi.c hast du dich vertippt. Guck dir die 
Stelle nochmal an.

Gruß
Marius

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Da der Stackpointer beim ATmega640 automatisch initialisiert wird, gibts 
noch zwei Möglichkeiten:

1. Du schreibst ins SRAM und überschreibst damit versehentlich die 
Rücksprungadresse.

2. Du hast am Ende der ISR "ret" statt "iret" geschrieben.

Falls beides nicht der Fall ist, liegt es vermutlich doch an der Zeile 
42. Die schaut mir sehr verdächtig aus, da hat Marius recht.

von Fabian (Gast)


Angehängte Dateien:

Lesenswert?

Oke, hab den dezenten Hinweis verstanden, im Anhang mal meine zwei 
Dateien um die es primär geht;-)
Im Prinip soll auf die SD-Karte mit Hilfe von Elm-Chans FAT Treiber 
geschrieben werden. Leider kommt er aber nie aus der disc-initialize 
Funktion raus. Auf der Suche woran es liegt bin ich drauf gestoßen dass 
er in der rcvr_spi Funktion sobald er ins SPI-Register geschrieben hat 
hängt bzw. neustartet.
Um dem ganzen nun mal auf den Grund zu gehn hab ich in der can_sd alle 
ISR mal definiert um zu sehn wo er noch so reinspringt. Macht er aber 
nur in Timer1 Timer2 und eben komischerweise auch in die SPI_STC, obwohl 
die disabled ist...
Wenn im Code nun einige for(;;) schleifen drin sind dann sind das 
überreste von der Fehlersuche. Am PORTC sitzen 8 LEDs. Beim Momentanen 
Programmcode leuchtet am ende jede zweite LED(wie in der ISR(SPI_STC) 
definiert).

Wenn das so zu komplex, oder ich einfach zu wirr schreib, per Forum is, 
gebt mir bescheid, is mein erstes Programmierproblem dass ich per Forum 
versuch zu lösen..;-)
Liebe Grüße,
Fabi

von Fabian (Gast)


Lesenswert?

sorry hab vergessen auf die letzte Antwort einzugehn:
SRAM beschreib ich zumindest Absichtlich nicht, kenn mich da allerdings 
nicht aus. Was das iret angeht... das brauch ich nur wenn ich in 
assembler Programmier oder?
Gruß Fabi

von ... (Gast)


Lesenswert?

void looop_until_bit_is_set(uint8_t addr, BYTE number)

loop_until_bit_is_set(SPSR,SPIF);

looop_until_bit_is_set(SPSR,SPIF);


???

von Fabian (Gast)


Lesenswert?

ich hatte zwischenzeitlich die loop_until_bit_is_set funktion 
verdächtigt dass die probleme macht, aber die scheint wohl meiner 
Meinung nach doch zu tun... Deswegen hab ich da ne eigene funktion 
geschrieben die eben ein "o" mehr hatte...
Gruß Fabi

von Fabian (Gast)


Lesenswert?

keiner ne Idee? Oder fehlen noch Infos meinerseits?
Liebe Grüße,
Fabi

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.