polled SPI am XMega128A1

Gast #2532952
Lesenswert?

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:
1
  //Addresse an Gyro schicken, higher Bits
2
  SPID_DATA = (DIN >> 8);  
3
  while(!(SPID.STATUS & SPI_IF_bm));
4
  
5
  //Addresse an Gyro schicken, Lower Bits
6
  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
Gast #2533094
Lesenswert?

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:
1
#include <avr/io.h>
2
#include <clksys_driver.h>
3
#include <clksys_driver.c>
4
#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
#2533208
Lesenswert?

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.
1
#include <avr/interrupt.h>
2

3
ISR(BADISR_vect)
4
{
5
    // user code here
6
}
Quelle: 
http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

Einfach irgendwo copy & pasten. Wenn es dann funktioniert war es das.

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