Forum: Mikrocontroller und Digitale Elektronik polled SPI am XMega128A1


von Michael Wagner (Gast)


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

von Horst (Gast)


Lesenswert?

Fehlt irgendwo (evtl. auch in den Atmel Headerfiles) ein "volatile"? 
Optimierungseinstellungen?

von Gerhard G. (xmega)


Lesenswert?

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

von Michael Wagner (Gast)


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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

'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'.

von Anon Y. (avion23)


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.

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.