ATxMega Stick - First Steps

Wechseln zu: Navigation, Suche
Platine des ATxMega Stick
Schaltplan - Seite 1
Schaltplan - Seite 2

Der ATxMega Stick ist eine kleine Platine (27 mm x 80 mm) mit ATxmega128A3, USB-Device-Anschluss und Micro-SD-Kartenslot.

Eigenschaften

  • Mikrocontroller ATxmega128A3
  • USB-Baustein MCP2200
  • Mini-USB-B-Device-Anschluss
  • Micro-SD-Kartenslot
  • Programmierung via PDI (z.B. AVRISP mkII)
  • Reset-Taster
  • 2 LEDs zur Signalisierung von USB-Transfers
  • 2 frei verwendbare LEDs
  • On-board-Spannungsregler (3.3 V, Versorgung über USB oder extern)
  • 6 x 8-Bit-Ports auf Stiftleisten verfügbar, davon ist ein Port belegt (2-mal LED, RX und TX zum USB-Baustein, SPI zum Micro-SD-Kartenslot)

Hinweise zum Aufbau

Anmerkungen zum Schaltplan vom 15.09.2011 23:08:38

  • Seite 1: C1 hat 22µF
  • Seite 1: C14, C15 haben 3.3µF
  • Seite 2: Verbindungsbezeichnung bei "I/Os" µC Pin 27 und JP4 Pin 4 und bei "LEDs" muss LED3 lauten statt LED1
  • Seite 2: Verbindungsbezeichnung bei "I/Os" µC Pin 26 und JP4 Pin 3 und bei "LEDs" muss LED4 lauten statt LED2

Stromversorgung

Auf JP1 muss ein Jumper bestückt werden:

  • zum Platinenrand hin für Versorgung über USB
  • zur Platinenmitte hin für externe Versorgung

Hinweis:

Der Jumper sollte unbedingt gesteckt sein, wenn USB verwendet wird. Steht dieser auf externer Versorung, muss diese dabei auch anliegen. Wird der MCP2200 per USB versorgt, ohne dass am ATxMega Versorgungsspannung anliegt, kommt es über die UART-Leitung zu einem Stromfluss über das entsprechende I/O-Pin des ATxMega, da dieser sich ohne Spannung intern in einem undefinierten Zustand befindet. Auf VCC liegen dann etwa 2.8 V an. Durch den Stromfluss erwärmt sich der MCP2200 deutlich, was zur eventuellen Beschädigung des ICs führen kann.

Löten des SD-Halters

  • Zuerst muss man den Halten ausrichen und einen Punkt am Rand festlöten.
  • Dann muss man alle 4 Ecken festlöten
  • Jetzt kann man mit der Lötspitze oben durch die Aussparungen und führt den Zinn durch die Öffnung für die SD-Karte.
  • So lötet man dann alle 8 Kontakte.
  • Lötbrücken sind hier nicht schön, lässt sich aber dann noch mit Entlötlitze entfernen (Entlötlitze statt Zinn durch die Öffnung führen)

Betrieb unter Linux

Damit man als User auf den Stick zugreifen kann, empfiehlt es sich, einen UDEV-Eintrag für den Stick anzulegen, z.B. neue Datei /etc/udev/rules.d/15_USB_uC.rules anlegen:

ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="00df", GROUP="MeineGruppe", MODE="0660", SYMLINK+="ATxMegaStick%n"

Für "MeineGruppe" einen geeigneten Werte verwenden, d.h. eine Gruppe, der man selbst angehört.

Jetzt kann man nach dem Anschließen folgende Links sehen:

ls -l /dev/ATxMegaStick*
lrwxrwxrwx 1 root root  7 2011-10-17 00:04 /dev/ATxMegaStick0 -> ttyACM0
lrwxrwxrwx 1 root root 11 2011-10-17 00:04 /dev/ATxMegaStick1 -> usb/hiddev1
lrwxrwxrwx 1 root root  7 2011-10-17 00:04 /dev/ATxMegaStick2 -> hidraw2
lrwxrwxrwx 1 root root 15 2011-10-17 00:04 /dev/ATxMegaStick3 -> bus/usb/001/042

Und die Zugriffrechte sehen so aus:

ls -lL /dev/ATxMegaStick*
crw-rw---- 1 root dialout 166,  0 2011-10-17 00:04 /dev/ATxMegaStick0
crw-rw---- 1 root mgr     180, 97 2011-10-17 00:04 /dev/ATxMegaStick1
crw-rw---- 1 root mgr     251,  2 2011-10-17 00:04 /dev/ATxMegaStick2
crw-rw-r-- 1 root mgr     189, 41 2011-10-17 00:04 /dev/ATxMegaStick3

Fuses

Default-Werte der Fuses:

signature: Signatur

avrdude -Pusb -cavrispmkII -px128a3 -q -q -U signature:r:-:h
0x1e,0x97,0x42
0x1e9742 = ATxmega128A3

fuse0: JTAG User ID

avrdude -Pusb -cavrispmkII -px128a3 -q -q -U fuse0:r:-:h
0xff
JTAG User ID (JTAGUID) = 0xff (das Manual sagt: 0x00)

fuse1: Watchdog Configuration

avrdude -Pusb -cavrispmkII -px128a3 -q -q -U fuse1:r:-:h
0x0
Watchdog Window Timeout Period (WDWPER) = n.a.
Watchdog Timeout Period (WDPER) = n.a.

fuse2: Reset Configuration

avrdude -Pusb -cavrispmkII -px128a3 -q -q -U fuse2:r:-:h
0xff
Reset Vector (BOOTRST) = Application Reset
BOD operation in power-down mode (BODPD) = BOD disabled

fuse4: Start-up Configuration

avrdude -Pusb -cavrispmkII -px128a3 -q -q -U fuse4:r:-:h
0xfe
External Reset Disable (RSTDISBL) = no
Start-up time (STARTUPTIME) = 0
Watchdog Timer lock (WDLOCK) = no
JTAG enabled (JTAGEN) = yes

Bei Bedarf ändern:

avrdude -Pusb -cavrispmkII -px128a3 -q -q -U fuse4:w:0xff:m
avrdude -Pusb -cavrispmkII -px128a3 -q -q -U fuse4:r:-:h
0xff
JTAG enabled (JTAGEN) = no

fuse5: BODACT, BODLEVEL, EESAVE

avrdude -Pusb -cavrispmkII -px128a3 -q -q -U fuse5:r:-:h
0xff
BOD operation in active mode (BODACT) = BOD disabled
EEPROM memory is preserved through the Chip Erase (EESAVE) = no
BOD voltage level (BODLEVEL) = 1.6V

Bei Bedarf ändern:

avrdude -Pusb -cavrispmkII -px128a3 -q -q -U fuse5:w:0xf7:m
avrdude -Pusb -cavrispmkII -px128a3 -q -q -U fuse5:r:-:h
0xf7
EEPROM memory is preserved through the Chip Erase (EESAVE) = yes

Software

Clock System

Takt zu Testzwecken auf Port C Pin 7 (d.h. JP3 Pin 3) ausgeben.

PORTC.DIRSET = 0x80;
PORTCFG.CLKEVOUT = 0x01;

32 MHz mit dem externen Quarz

Unter Verwendung der Software zu AVR1003 (-> Siehe auch) kann man den Takt auf 32 MHz einstellen:

#include "clksys_driver.h"
void init_clock( void )
{
   CLKSYS_XOSC_Config( OSC_FRQRANGE_12TO16_gc, false, OSC_XOSCSEL_XTAL_16KCLK_gc );
   CLKSYS_Enable( OSC_XOSCEN_bm );
   CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 2 );
   CLKSYS_Enable( OSC_PLLEN_bm );
   CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );
   do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );
   CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );
   CLKSYS_Disable( OSC_XOSCEN_bm );
} /* init_clock() */

USART

USART über USB

So stellt man unter Verwendung der Software zu AVR1307 (-> Siehe auch) bei 32 MHz Takt den USART für die Übertragung per USB ein:

#include "usart_driver.h"

#define USART USARTD0

void init_usart( void )
{
   PORTD.DIRSET = PIN3_bm;
   PORTD.DIRCLR = PIN2_bm;
   USART_Format_Set( &USART, USART_CHSIZE_8BIT_gc, USART_PMODE_DISABLED_gc, false );
   /*
    * BSEL[11:0]-Wert bei 32MHz Takt und BSCALE[3:0]==0:
    *   207 :   9600
    *   103 :  19200
    *    51 :  38400
    *    34 :  57600
    *    16 : 115200
    */
   USART_Baudrate_Set( &USART, 34 , 0 );
   USART_Rx_Enable( &USART );
   USART_Tx_Enable( &USART );
} /* init_usart() */

Siehe auch