Xmega USB String senden

Gast #3590834
Lesenswert?

HI
Ich arbeite momentan an meiner Technikerarbeit und stehe momentan vor 
folgendem Problem:


Ich verwende den Controller Atxmega128A1U, dieser besitzt ein 
USB-Interface. Für meine Zwecke genügt es einzelne Strings zwischen dem 
Controller und einem PC austauschen zu können. Software am PC wäre 
hierfür Lapwiew oder Profilap.

Ich finde hierfür aber kaum Beispiele. Gibt es irgendwo eine fertige 
Library? Irgendwie kann man das USB doch auch als virtuellen Com-Port 
verwenden (so wie bei einem FT232RL beispielsweiße)?
Wenn ich eine fertige Bibliothek oder Lösungsansatz hätte wäre mir sehr 
geholfen.
#3590972
Lesenswert?

Hallo,

ob wohl das nach Meinung vieler Leute die einfachste Sache der Welt 
wäre,findet man kaum Brauchbares.

Ich verwende bei USB gerne das Stellaris® LM4F120 LaunchPad.
Da kann man mit einen "drei Zeiler" einen virtuellen Com-Port verwenden.
Und das Ganze ist absolut  auch für Anfänger geeignet!

Hier im Forum kann ich dir für den ATXMEGA U Type nur den Artikel 
empfehlen:

Beitrag "CDC für xmega"

Gruß G.G.
Gast #3591158
Lesenswert?

Danke für die Hilfe :P

Bei dem Beitrag welchen du mir geschickt hast:

ich hab jetzt dieses das Beispielprogramm auf meinen Controller geladen.
mein PC erkennt jetzt etwas am USB Anschluss.

Er kennt aber keinen passenden Treiber.
Wähle ich die Inf datei welche in der Zip Datei enthalten ist aus, kommt
nur die Meldung, dass das "CDC Virtual Com konnte nicht installiert
werden"
Gast #3599707
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren