Xmega-A1-USB: Schnellstart

Dirk

Administrator
Teammitglied
28. Jan. 2007
4.328
166
63
Mittelhessen, Giessen
Sprachen
  1. ANSI C
  2. C++
  3. C#
  4. Java
  5. Kotlin
  6. Pascal
  7. Assembler
  8. PHP
Hallo zusammen,

wie bereits im vorherigen Beitrag erwähnt, möchte ich euch ein wenig Beispielcode an die Hand geben, mit dem ihr den Xmega128A1 auf dem Mikrocontrollermodul schnell zum laufen bekommt.


Betrachten wir zuerst die Hardware auf dem Mikrocontrollermodul. Wir haben hier folgende Bereiche, die wir in unserer Software berücksichtigen müssen:
  • Quarz 16MHz an XTAL1/2, der Systemtakt (32MHz) soll aus diesem Takt erzeugt werden.
  • Quarz 32,768kHz an TOSC1/2 (der Ozillator kann für Systemtakt, RTC und als Referenz für die digital frequency locked loops (DFFL) genutzt werden, im Beispiel behandel ich diese Features noch nicht).
  • Sub-Miniaturtaster an PQ2, diesen wollen wir abfragen (Wenn der Bootloader einmal fertig ist, wird diese Taste für die Zwangsaktivierung des Bootloaders nach einem Reset verwendet werden).
  • Status LED an PQ3, diese wollen wir ansteuern
  • USART0 von PORTF ist das Interface zum CP2102 (USB-UART-Bridge), dieser muss initialisiert werden.
Zur Initialisierung der Module System Clock device und USART nutzen wir die Initialisierungsroutinen von Atmel.

Im folgenden findet ihr den Kern-Beispielcode, dieser ist kommentiert, so dass ich hier nicht weiter auf den Sourcecode eingehen werde.


Code:
#define F_CPU 32000000UL

#include "avr_compiler.h"
#include "clksys_driver.h"
#include "usart_driver.h"

/* LED */
#define LEDPORT PORTQ        // Port PORTQ
#define LEDMASK (1<<PIN3)    // Status LED an PQ3

/* Taster */
#define SWITCHPORT PORTQ     // Port PORTQ
#define SWITCHMASK (1<<PIN2) // Taster an PQ2

/* USART */
#define USART USARTF0        // USART0 von PORTF wird als Interface zu der
                             // USB-UART-Bridge CP2102 genutzt.

int main( void )
{

  /* Set up user interface. */
  LEDPORT.DIRSET = LEDMASK;
  LEDPORT.OUTSET = LEDMASK;
  SWITCHPORT.DIRCLR = SWITCHMASK;
  SWITCHPORT.PIN2CTRL |= ( 0b011 << 3 ); // Pullup PQ2 aktivieren

  /* Variable definition */
  uint8_t buffer[512];        // wird für Testroutine 2 benötigt
  uint16_t i;


  /******************************************************************
   * System Clock 32MHz (XOSC Quarz 16MHz, PLL Faktor 2)
   ******************************************************************/

  /* Nach dem Reset ist die Quelle des Systemtaktes der interne
     2MHz RC-Oszillator (System Clock Selection: RC2MHz)
  */

  // Oszillator XOSC konfigurieren (12..16MHz, 256 clocks startup time)
  CLKSYS_XOSC_Config( OSC_FRQRANGE_12TO16_gc,
                      false,
                      OSC_XOSCSEL_XTAL_256CLK_gc );

  // Oszillator XOSC enable
  CLKSYS_Enable( OSC_XOSCEN_bm );

  // Warten bis der Oszillator bereit ist
  do {} while ( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );

  // PLL source ist XOSC, Multiplikator x2
  CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 2 );

  // Enable PLL
  CLKSYS_Enable( OSC_PLLEN_bm );

  // Prescalers konfigurieren
  CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );

  // Warten bis PLL locked
  do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );

  // Main Clock Source ist Ausgang von PLL
  CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );

  // Nun ist der System Clock 32MHz !

  /* Hinweis:
     32kHz TOSC kann nicht in Verbindung mit PLL genutzt werden, da
     die minimale Eingangsfrequenz des PLLs 400kHz beträgt.
  */


  /******************************************************************
   * Usart initialisieren, 8N1 250kBit
   ******************************************************************/

  PORTF.DIRSET = PIN3_bm;  // Pin3 von PortF (TXD0) ist Ausgang

  PORTF.DIRCLR = PIN2_bm;  // Pin2 von PortF (RXD0) ist Eingang

  // USARTF0, 8 Data bits, No Parity, 1 Stop bit.
  USART_Format_Set(&USART, USART_CHSIZE_8BIT_gc, USART_PMODE_DISABLED_gc, false);

  /* Bitrate einstellen

     Beispiele BSEL in Abhängigkeit von der Bitrate, fck = 32MHz, Error < 0,8%
     
        7 = 250.000bps
       30 = 128.000bps
       34 =  57.600bps
       51 =  38.400bps
       68 =  28.800bps
      103 =  19.200bps
      138 =  14.400bps
      207 =   9.600bps
      416 =   4.800bps
      832 =   2.400bps
     1666 =   1.200bps

     Bemerkung: Geprüft wurde mit 250.000bps im USBxpress Modus
  */  

  USART_Baudrate_Set(&USART, 7 , 0);  // 250.000bps (BSEL = 7)

  /* Enable RX and TX. */
  USART_Rx_Enable(&USART);
  USART_Tx_Enable(&USART);

  USART_GetChar(&USART);             // Flush Receive Buffer


  /******************************************************************
   * Test 1
   ******************************************************************/

  /* Testroutine 1

     Mit dieser Testroutine kann man den Taster (PQ2) und die
     Status LED (PQ3) überprüfen. Man erkenn auch schnell, 
     ob der System Clock driver richtig konfiguriert ist.

  */

  while(1) {

    LEDPORT.OUTTGL = LEDMASK;

    if (( SWITCHPORT.IN & SWITCHMASK ) == SWITCHMASK ) {
      // Taste PQ2 nicht betätigt, Status LED blinkt langsam
      delay_us( 500000 );    // 500ms  
    } else {
      // Taste PQ2 betätigt, Status LED blinkt schnell
      delay_us( 100000 );    // 100ms 
    }   

  }



  /******************************************************************
   * Test 2
   ******************************************************************/

  /* Testroutine 2
     Diese Routine wird im Beispiel Sourcecode nicht ausgeführt, sie diente
     zum Testen der Signalqualität. Übertragen wurde hierbei mit 250.000bps.

     Beschreibung des Tests:
     Ein PC-Programm erzeugt ein 512 Byte großes Byte-Array mit Zufallszahlen,
     die 512 Byte werden mit einer Bitrate von 250.000bps zum Mikrocontrollermodul
     übertragen. Der XmegaA1 empfängt diese Daten und legt sie in einem Array (buffer)
     ab. Danach sendet der XMegaA1 die Daten wieder zuürck, das PC-Programm empfängt
     diese Daten und vergleicht sie mit den zuvor gesendeten Daten. Wird ein Fehler
     festgestellt, wird der Test abgebrochen und es erfolgt eine Fehlermeldung.

     Bemerkung:
     Wenn man große Datenpakete ohne Software-Handshaking übertragen möchte, muss
     man den maximal verfügbaren Fifo-Buffer im CP2102 beachten:
     576 Byte Receive Buffer, 640 Byte Transmit Buffer
  */

  while(1) {

    // Receive 512 byte and copy to buffer array
    for (i=0; i<512; i++) {
      while(!USART_IsRXComplete(&USART));
      buffer[i] = USART_GetChar(&USART);
    }

    // Send 512 byte content of buffer array 
    for (i=0; i<512; i++) {
      while(!USART_IsTXDataRegisterEmpty(&USART));
      USART_PutChar(&USART, buffer[i]);
    }
  
    // Toggle Status LED
    LEDPORT.OUTTGL = LEDMASK;       
  }


  return 0;
}



Das gesamte Projekt (AVRStudio + WinAVR) habe ich angehängt.

Im Beispielcode habe ich bereits einige Konfigurationswerte für unterschiedliche Baudraten angegeben, diese gelten für einen Systemtakt von 32MHz. Wenn ihr Baudraten benötigt, die ich nicht aufgeführt habe oder wenn ihr einen anderen Systemtakt verwendet, könnt ihr das Excel-File Baudrate_Calculations.xls nutzen, um die gewünschte Baudrate einzustellen. Das Excel-File befindet sich im angehängten Projektverzeichnis (zip).

Wenn ihr das Hex-File Xmega-A1-USB.hex programmiert, sollte die Status LED mit einer Periodendauer von 1 Sekunde blinken, bei Betätigung des Sub-Miniaturtasters PQ2, verringert sich die Periodendauer (200ms), die LED blinkt hier also schneller.

Ich hoffe, euch erleichtert der Beispiel-Sourcecode den Einstieg in die Xmega-Familie.

Schöne Grüße,
Dirk

Projektstruktur:

project_files.png


Projekt Optionen und Konfiguration:

project_options.png
 

Anhänge

  • xmega-a1-usb.zip
    79,3 KB · Aufrufe: 330
Oszillogramme

Hier sind noch einige Messungen, die während des oben beschriebenen Übertragungstests entstanden sind.

Die Oszillogramme zeigen die Signale RXD und TXD zwischen CP2102 und USARTF0 des Xmega128A1 nach dem Leveltranslator.

Übertragungsrate: 250.000bps.
Betriebsspannungen: 3,6V, 2,7V und 1,8V


VCC = 3,6V

xmega-a1-usb_osc1.png


xmega-a1-usb_osc2.png



VCC = 2,7V

xmega-a1-usb_osc3.png


xmega-a1-usb_osc4.png



VCC = 1,8V

xmega-a1-usb_osc5.png


xmega-a1-usb_osc6.png
 
Schnellstart Xmega

Hallo Dirk,
über Dein Schnellstart Projekt habe ich mich gefreut, jedoch scheitere ich bereits zu Beginn. In Deinem Beispiel ist keine Projektdatei
für WINAVR bzw Programmers Notepad vorhanden.

Wird das Beispiel manuell zusammengebaut ?

Mit freundlichen Grüßen
Nora
 
Hallo Nora,

ich nutze WinAVR mit AVR Studio. Im AVR Studio kann man das Projekt manuell folgendermaßen erstellen:
  1. Du startest AVR Studio und wählst im ProjectWizard "New Project" aus (oder im Programmmenü "Project").
  2. Im folgenden Dialog wählst du aus ...
    • Project Type: AVR GCC
    • den Projektnamen
    • Checkbox "create initial file" aus
    • den Pfad des Projektes
  3. Danach bestätigst du mit Button "Finish".
  4. Auf der Linken Seite siehst du nun die Projektstruktur, du gehtst mit der Maus auf "Source Files" und mit der rechten Taste wählst du "Add Existing Source File" aus, du wählst zuerst "main.c" und danach alle anderen .c Files aus.
  5. Das selbe machst du mit Herder Files (.h)
Die Projektstruktur sollte dann so aussehen:

project_files.png


Noch die Frequenz und den Mikrocontroller einstellen:

project_options.png



So, nun müsstest du das Projekt fehlerfrei kompilieren können.

Ich hoffe, ich konnte dir etwas weiterhelfen.

Grüße,
Dirk
 
PC-Prg. zum "Xmega-A1-USB. Schnellstart"-Projekt

Hallo Dirk,
als Neuling in diesem Forum wüßte ich gerne, wie ich an das/ein PC-Prg. für WinXP komme ( xxx.exe und moglichst C-Code zB. für Borland-Builder), um das Projekt "Xmega-A1_USB: Schnellstart" von Dirk zu testen.
Gibt es ein USB-Terminal-PC-Prg. ähnlich Term95.exe oder ByVacTerminator statt für RS232 auch für USB (2.0).
:adore: graffu:rolleyes:
 
Hallo Graffu,

Willkommen im AVR-Praxis-Forum :ciao:


So wie ich dich verstanden habe, möchtest du mit dem Modul über einen USB-Treiber kommunizieren und nicht über den virtuellen COM Port VCP, also nicht über ein COM Terminal.

Wenn du Silabs USBxpress installierst, findest du unter
C:\SiLabs\MCU\USBXpress\Examples\CP210x\Source
ein C Beispiel, wie man mit Hilfe der Silabs DLL mit dem CP2102 "direkt" kommunizieren kann.

In meinem Xmega-A1-USB-Programmer kannst du zumindest Daten vom Mikrocontrollermodul mit der Monitorfunktion empfangen und zwar recht schnell (Datenpakete senden habe ich noch nicht realisiert). So könntest du schonmal prüfen, ob dein Sourcecode funktioniert. Die Ausgabe im Monitor kannst du auch gut zum debuggen verwenden.

Grüße,
Dirk
 
Hallo Dirk,
ganz herzlichen Dank für die super-rasche Antwort und Hilfe! Ja, ich möchte direkt über einen USB-Treiber mit dem PC <--> xmega128A1 Daten tauschen. Ich habe daher sofort Deinen Hinweis zu Silabs USBXpress aufgenommen und diesen installiert. Da sind tatsächlich C-Code-Beispiele dabei, die ich bestimmt mit dem Borland-Builder verwenden kann, um eine erste Test.exe zu gestalten. Muß mich aber erst noch genauer damit befassen.
Dein "xmega-A1-USB" konnte ich auf Anhieb fehlerfrei compilieren und linken zur ...hex-Datei und den xmega damit programmieren (mit AVR-Studio4 und AVR-ISP mkII).
Sobald ich weiter bin mit meiner Datenübertragung melde ich mich gerne wieder.
Nochmal großen Dank
und Gruß graffu:adore:
 
XmegaA1-USB <-->PC

Hallo Dirk und alle Interessierte,
wie angekündigt kann ich jetzt berichten, daß Dank Deiner
Hilfe, d.h nach der Installation des "Silabs USBXpress-Treibers"
auf den WinXP-PC, ALLE meine .exe-Dateien, die bisher via
Serieller RS232 Daten PC<-->xmega (hier SDCard) austauschten,
fehlerfrei mit USB statt RS232 arbeiten. Nur die COM-Port-Nr mußte
im PC-Quellcode geändert werden (bei mir von COM1 --> COM5; was
wohl der Treiber als nächst freien COM-Port ermittelt hat.
Daher nochmals besten Dank für Deine Hilfe.
Frdl. Gruß graffu
 
Hallo Graffu,

es freut mich zu hören, dass es nun funktioniert. Noch viel Spaß mit dem Mikrocontrollermodul und viel Erfolg bei deinem Projekt.

Grüße,
Dirk
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)