Forum: Mikrocontroller und Digitale Elektronik AVR AT32UC3A Problem


von Christian P. (Firma: IR-Systeme) (poppirs)


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

von Thomas R. (thomas-rudloff)


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.

von Christian P. (Firma: IR-Systeme) (poppirs)


Lesenswert?

Hallo,

vielen Dank für deine Antwort. Bei mir sind tatsächlich einige 
Descriptoren an ungeraden Adressen. Allerdings gibt es Fälle, bei denen 
der Code dann trotzdem funktioniert... Ich dachte auch, dass das kein 
Problem sein sollte. Oder doch?

von Christian P. (Firma: IR-Systeme) (poppirs)


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.

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.