www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik polled SPI am XMega128A1


Autor: Michael Wagner (Gast)
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
Autor: Horst (Gast)
Datum:

Fehlt irgendwo (evtl. auch in den Atmel Headerfiles) ein "volatile"?
Optimierungseinstellungen?
Autor: Gerhard G. (xmega)
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
Autor: Michael Wagner (Gast)
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
Autor: Matthias Sch. (Firma: Matzetronics) (mschoeldgen)
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'.
Autor: Anon Ymous (avion23)
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net