AVR AT32UC3A Problem

OP (Firma: IR-Systeme) #1904829
Lesenswert?
• ▲
▼
Hallo!
Ich weiß, der Titel ist nicht gerade aussagekräftig, aber ich bin mir 
nicht wirklich sicher, wo mein Problem überhaupt liegt...
Ich benutze den AT32UC3A1256 Mikrocontroller der Firma Atmel und will 
eine USB Verbindung mit einem Rechner herstellen. Als USB Klasse soll 
die HID Klasse zum Einsatz kommen. Ein Ausschnitt aus meinem Source-Code 
sieht etwa so aus:
1
U8 usbReadData[64]; 
2
U8 usbWriteData[64]; 
3

4
int main(void) 
5
{ 
6
   // Local variables 
7
   int i; 
8

9
   // Initializations 
10
   init(); 
11
   usb_task_init(); // init usb 
12

13
   for (i = 0; i < 64; i++) 
14
   { 
15
      usbWriteData[i] = i; 
16
   } 
17

18
   asm volatile ("nop"); 
19

20
   while(TRUE) 
21
   { 
22
      usb_task(); 
23

24
      if (usb_readData(usbReadData)) 
25
          usb_writeData(usbWriteData); 
26
   } 
27
   return 0; 
28
}

Ich habe nun das Problem, dass dieser Code so wunderbar funktioniert, 
d.h. das Device meldet sich am Rechner über USB an, und ich kann Daten 
in beide Richtungen verschicken. Wenn ich aber die Zeile "asm volatile 
("nop")" entferne, funktioniert die Anmeldung am Rechner nicht mehr. Das 
Programm auf dem Mikrocontroller läuft allerdings prinzipiell (bestätigt 
durch eine Blink-Funktion einer LED...). Allerdings scheint es nicht 
wirklich an dem nop Befehl zu liegen, auch ein anderer "nutzloser" 
Befehl könnte den gleichen Effekt haben (z.B. Zuweisen einer Variable, 
die aber später nicht mehr verwendet wird). Genauso ist es z.B. egal an 
welcher Stelle in der Main Funktion dieser nop Befehl steht...
Das Problem ist leider sogar noch viel "willkürlicher". Ändere ich 
irgendwo etwas am Code, etwa in einer Funktion, oder füge ich etwas 
hinzu, kann es sein, dass danach die USB Anmeldung funktioniert, oder 
eben auch nicht. Ein Hinzufügen eines nop Befehles, oder auch von zwei 
nop Befehlen, könnte das wieder ändern. Der Kompiler meldet keine Fehler 
oder Warnungen.
Hat irgendjemand eine Idee, woran das liegen könnte? Ich bin für jede 
Hilfe dankbar, weiß gerade nicht mehr was ich noch versuchen soll...
Ach ja, die Entwicklungsumgebung ist AVR32 Studio 2.6.0, ich verwende 
das Software Framework 1.7.0.

Vielen Dank und viele Grüße
Christian
#1921751
Lesenswert?
• ▲
▼
Hi,

klingt sehr stark nach einem Alignment Problem. Dabei verrutscht irgend 
etwas dahinter und macht Probleme. Ich hatte damit sehr viel "Spaß" mit 
einem Cypress FX-II, bei dem dann die Descriptoren auf ungerade Adressen 
gerutscht sind. Schaue Dir einfach mal den Symbol Table an, was dann 
noch so alles passiert.
OP (Firma: IR-Systeme) #1940082
Lesenswert?
• ▲
▼
Hallo!

Für alle, die einmal ein ähnliches Problem haben... In meinem Fall war 
die Lösung der flash wait state. Dieser muss bei CPU-Clocks >33 MHz auf 
1 gesetzt werden (das steht eigentlich auch im Datenblatt ;-), wenn man 
weiß wo das Problem liegt findet man das auch...). Tut man das nicht, 
macht der Mikrocontroller nicht nachvollziehbare Fehler. Eine andere 
Sache, die im Datenblatt eher schwer zu finden ist, ist, dass der PBA 
clock für die Peripherie nicht größer als 33 MHz sein sollte.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.