Datum:
Hallo, Ich entwickle als Maturaprojekt einen Autopiloten für ein Modellflugzeug. Dabei verwende ich die SPI-Schnittstelle um mit einem Gyroskop (ADIS16405) zu kommunizieren, was auch schon funktionierte. Aber auf Grund unerklärbarer Fehler (Arbeitsspeicher war ab und zu falsch addressiert)bin ich auf eine andere Version von AVR-Studio 5 umgestiegen. Jetzt springt der Controller bei folgender Schleife:
//Addresse an Gyro schicken, higher Bits SPID_DATA = (DIN >> 8); while(!(SPID.STATUS & SPI_IF_bm)); //Addresse an Gyro schicken, Lower Bits SPID_DATA = DIN & 0xFF; |
zurück an den Anfang des Hauptprogramms und beginnt erneut mit der Initialisierung. Das Verwunderliche dabei ist, dass der Controller das einmal nach dem Starten des Debugging macht, d.h. nach dem er einmal zum Anfang gesprungen ist funktioniert die Warteschleife. Kann mir bitte jemand erklären, wie das zustande kommt, bzw. wie man das Problem löst? Ich verwende: AVR Studio 5.0.1163 JTAG ICE MKII per JTAG-Schnittstelle Xmega128A1 Mit freundlichen Grüßen Michael Wagner aus Oberösterreich
Datum:
Fehlt irgendwo (evtl. auch in den Atmel Headerfiles) ein "volatile"? Optimierungseinstellungen?
Datum:
Hallo,
> DIN >> 8
wie groß ist die Variable DIN definiert?
uint8_t.. dann sehe ich schwarz!
uint16_t sollten es wegen des Schiebens schon sein..
Gruß xmega
Datum:
Guten Morgen, @xmega: DIN ist ein uint16_t. @Horst: Optimierungen habe ich gerade von O0 bis Os alle durchprobiert, leider kein anderes Ergebnis. Hast du eine Idee, wo genau ein volatile fehlen könnte? Ich verwende von Atmel folgende Headerfiles:
#include <avr/io.h> #include <clksys_driver.h> #include <clksys_driver.c> #include <avr/delay.h> |
Das komische dabei ist, dass in der älteren Version von AVR Studio, das alles kein Problem war und in der neueren, springt er dabei an den Anfang des Programmes. Bei der USART-Schnittstelle hatte ich das gleiche Problem, allerdings war es nur dann vorhanden wenn man RX und TX zur selben Zeit eingeschaltet hatte. Vielen Dank für eure Antworten! Mit freundlichen Grüßen Michael Wagner
Datum:
'volatile' solltest du auf alle Variablen anwenden, die in Interrupts benutzt werden. Da Interrupts ja nicht explizit als Unterprogramm aufgerufen werden, tendiert der Compiler dazu, diese Variablen 'wegzurationalisieren'.
Datum:
Michael Wagner schrieb: > while(!(SPID.STATUS & SPI_IF_bm)); Hi Michael, überprüfst du in diesem Code Stück ob das Interrupt flag gesetzt wird? Wenn ja, bist du dir 100% sicher, dass du den SPI Interrupt nicht angeschaltet hast? Du könntest einen leeren Interrupt handler einführen. Der macht einfach nichts, d.h. return zum Hauptprogramm, wenn ein ungültiger Interrupt angesprungen wird. Default ist ein reset.
#include <avr/interrupt.h>
ISR(BADISR_vect)
{
// user code here
} |
Quelle: http://www.nongnu.org/avr-libc/user-manual/group__... Einfach irgendwo copy & pasten. Wenn es dann funktioniert war es das.