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
Ich glaub in Zeile 42 der spi.c hast du dich vertippt. Guck dir die Stelle nochmal an. Gruß Marius
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.
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
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
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); ???
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.