Hi :P
danke für die Hilfe bis hier hin.
dass mit dem Treiber hat jetzt funktioniert.
Der ATxmega128A3U ist leider keine Option für mich. Meine bis jetzt
aufgebaute Schaltung mit dem ATxmega128A1U funktioniert nämlich bereits
fast komplett außer die USB Schnittstelle.
Ich bin inzwischen weitergekommen, aber so ganz zurecht komm ich noch
nicht ganz.
Ich schildere euch mal meine aktuelle Lage, vlt fällt ja noch jemanden
etwas ein :P
Ich bin auf folgende Applikation Note gestoßen:
http://www.atmel.com/Images/doc8447.pdf
Obwohl ASF für mich absolutes Neuland ist hab ich es trotzdem mal
versucht.
Geöffnet habe ich folgendes Beispielprogramm:
Device Familiy: xmega 8bit
Category: Services
Dann auf Technologie: ASF 3.11.0
USB
USB Device CDC Example - STK600 - ATxmega 128A1U
So sieht meine Main aus:
int main(void)
{
//war im Beispielprogramm bereits enthalten. Funktion weiß ich nicht
irq_initialize_vectors();
//war im Beispielprogramm bereits enthalten. Funktion weiß ich nicht
cpu_irq_enable();
// Initialize the sleep manager
//war im Beispielprogramm bereits enthalten. Funktion weiß ich nicht
sleepmgr_init();
//war im Beispielprogramm bereits enthalten. Funktion weiß ich nicht
sysclk_init();
//war im Beispielprogramm bereits enthalten. Funktion weiß ich nicht
board_init();
//war im Beispielprogramm bereits enthalten. Funktion weiß ich nicht
ui_init();
//war im Beispielprogramm bereits enthalten. Funktion weiß ich nicht
ui_powerdown();
// Start USB stack to authorize VBus monitoring
udc_start();
//udc_attach();
// The main loop manages only the power mode
// because the USB management is done by interrupt
while (true) {
//war im Beispielprogramm bereits enthalten. Funktion weiß ich nicht
sleepmgr_enter_sleep();
//löst aus, wenn etwas empfangen wurde
if (udi_cdc_is_rx_ready())
{
//gibt die Anzahl der empfangenen bytes aus (meist 1)
leng = udi_cdc_get_nb_received_data();
for (i =0; i<leng; i++ )
{
//string wird im Array test gespeichert
test[j] =udi_cdc_getc();
j++;
if (j >= 200) i=0;
}
}
//Wenn sendebereit: sende "C"
if (udi_cdc_is_tx_ready) udi_cdc_putc('c');
//Wenn sendebereit: sende "$"
if (udi_cdc_is_tx_ready) udi_cdc_putc('$');
}
}
Ich verwende Profilap zur Kommunikation am PC.
Baudrate habe ich hier 9600 und in der conf_usb.h habe ich auch 9600
angegeben.
So verkehrt was ich gerade mache kann es nicht sein xD
die Funktion udi_cdc_putc() sendet nämlich scheinbar erfolgreich zum
PC!!!
Das Empfangen klappt allerdings nicht so.
Ich Sende zum Controller folgenden String:
####1230A$$
ich empfange allerdings (allso im array namens Test):
#230A$
Die Ansätze sind allso da. Aber wieso einzelne Zeichen fehlen verstehe
ich nicht.
Allerdings gibt es auch einige Dinge bei denen ich mir auch nicht ganz
richtig bin ob es so richtig gemacht habe. Möglicherweiße ist hier der
Fehler.
In der Applikation Note steht der genaue Ablauf zum Empfangen. Folgende
Funktionen werden hier zusätzlich verwendet:
udc_attack() habe ich auskommentiert, da keinen Unterschied gemacht hat
ob die Funktion enthalten war.
UDI_CDC_ENABLE_EXT()
UDI_SET_CODING_EXT(cfg)
UDI_CDC_RX_NOTIFY()
Ich habe die Funktionen weggelassen, da sie einen Übergabewert namens
Port benötigen. Schreibe ich allerdings PORTD sagt mir Atmel Studio,
dass das ungültig wäre. Keine Ahnung was sonst damit gemeint sein
könnte.
Aber vlt benötige ich diese Funktionen auch gar nicht....
Den zum Beispielprogramm gibt es folgenden Link:
http://asf.atmel.com/docs/3.11.0/xmegaau/html/udi_cdc_quickstart.html
und
http://asf.atmel.com/docs/3.11.0/xmegaau/html/group__udi__cdc__group.html
und hier wird auch keine dieser Funktionen verwendet.
So wie ich das verstehe, waren diese nur bei einer älteren Version von
ASF notwendig.
Achja einen Quarz habe ich keinen auf meiner Schaltung verbaut. Benötige
ich auch nicht, da das Senden ja funktioniert?
Also macht das denke ich auch keinen Unterschied.
Wäre cool, wenn jemand mal drüber schauen könnte und ihm noch was
einfällt. Schließlich funktioniert es ja so halber.
Von der Theorie müsste ich dann mein bereits bestehendes
Funktionierendes Programm nur noch in dieses Programm hineinkopieren,
sobald die USB Schnittstelle funktionieren würde.