www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR AT32UC3A Problem


Autor: Christian Popp (Firma: IR-Systeme) (poppirs)
Datum:

Bewertung
0 lesenswert
nicht 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:
U8 usbReadData[64]; 
U8 usbWriteData[64]; 

int main(void) 
{ 
   // Local variables 
   int i; 

   // Initializations 
   init(); 
   usb_task_init(); // init usb 

   for (i = 0; i < 64; i++) 
   { 
      usbWriteData[i] = i; 
   } 

   asm volatile ("nop"); 

   while(TRUE) 
   { 
      usb_task(); 

      if (usb_readData(usbReadData)) 
          usb_writeData(usbWriteData); 
   } 
   return 0; 
} 

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

Autor: Thomas Rudloff (thomas-rudloff)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian Popp (Firma: IR-Systeme) (poppirs)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christian Popp (Firma: IR-Systeme) (poppirs)
Datum:

Bewertung
0 lesenswert
nicht 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

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.