xmega_tutorial.jpg

Xmega Tutorial - USART

Bewertung:  / 4
SchwachSuper 
  • xmega_block_diagram3D

Der USART vom XMega ermöglicht wie bei allen anderen Controllern von Atmel eine einfache Möglichkeit eine Kommunikation mit einem Pc Terminal Programm aufzubauen um seine Programm zu debuggen, Daten zu loggen oder sonstige Kommunkationen zu realisieren.

Features

  • more than 5 identical USART peripherals
  • Full-duplex operation
  • Asynchronous or synchronous operation
    – Synchronous clock rates up to 1/2 of the device clock frequency
    – Asynchronous clock rates up to 1/8 of the device clock frequency
  • Supports serial frames with 5, 6, 7, 8, or 9 data bits and 1 or 2 stop bits
  • Fractional baud rate generator
    – Can generate desired baud rate from any system clock frequency
    – No need for external oscillator with certain frequencies
  • Built-in error detection and correction schemes
    – Odd or even parity generation and parity check
    – Data overrun and framing error detection
    – Noise filtering includes false start bit detection and digital low-pass filter
  • Separate interrupts for
    – Transmit complete
    – Transmit data register empty
    – Receive complete
  • Multiprocessor communication mode
    – Addressing scheme to address a specific devices on a multidevice bus
    – Enable unaddressed devices to automatically ignore all frames
  • Master SPI mode
    – Double buffered operation
    – Operation up to 1/2 of the peripheral clock frequency
  • IRCOM module for IrDA compliant pulse modulation/demodulation

Um eine USART Kommunikation zu realisieren muss die Schnittstelle im Controller vorher noch dementsprechend konfiguriert werden. Dafür stellt Atmel einen spezielle Treiber-Library zur Verfügung. Mit diesem USART Treiber lässt sich sehr schnell und einfach eine Kommunikation realisieren. Da im Bereich der Atmegas die USART Library von Peter Fleury sehr verbreitet war, habe ich die typischen Befehle aus der Fleury Bibliothek in die Library von Atmel integriert. Das hat den Vorteil, dass man beim beim parallelen Arbeiten von Xmegas und Atmegas nicht komplett umdenken muss. Zudem den Treiber habe ich den Treiber so erweitert, dass man nicht nur einzelne Zeichen, sondern auch gleich ganze Strings mit der Funktion "usart_puts(USART_data_t * usart_data, const char *str );" versenden kann.

Die parallele Koordination der vielen USARTs erfolgt in der Library über die Struktur "USART_data_t". Diese wird für jeden verwendeten USART erstellt und enthält alle vorgenommenen Einstellungen der jeweiligen Schnittstelle. Die Kommunikation in der Library ist komplett interrupt gesteuert realisiert. Alle empfangenen und gesendeten Daten werden jeweils in einen Ringbuffer geschrieben und dann nacheinander abgearbeitet. Die Größe der Ringbuffers kann in der Header-Datei des Treibers vorgenommen werden. Die Dateien dafür kann man am Ende des Artikels downloaden.

Im folgenden Beispiel wird der USARTD0 von PortD verwendet.

Xmega Tutorial - USART
#include "usart_driver.h"
 
//#################################### UART
#define USART USARTD0 /* Define select Usart */
USART_data_t USART_data; /* USART data struct */
 
//####################################################### init_usart
void init_usart( void )
{
 PORTD.DIRSET = PIN3_bm; /* PD3 (TXD0) as output. */
 PORTD.DIRCLR = PIN2_bm; /* PD2 (RXD0) as input. */
 
 /* Use USARTC0 and initialize buffers. */
 USART_InterruptDriver_Initialize(&USART_data,&USART,USART_DREINTLVL_LO_gc);
 /* USARTC0, 8 Data bits, No Parity, 1 Stop bit. */
 USART_Format_Set(USART_data.usart,USART_CHSIZE_8BIT_gc,
 USART_PMODE_DISABLED_gc,false); 
 /* Enable RXC interrupt. */
 USART_RxdInterruptLevel_Set(USART_data.usart, USART_RXCINTLVL_LO_gc); 
 
 /* calculate Baudrate = (1/(16*(((I/O clock frequency)/Baudrate)-1) = 12 */
 /* 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, 51 , 0);
 
 /* Enable both RX and TX. */
 USART_Rx_Enable(USART_data.usart);
 USART_Tx_Enable(USART_data.usart);
 
 /* Enable PMIC interrupt level low. */
 PMIC.CTRL |= PMIC_LOLVLEN_bm; 
}
//####################################################### Int RXD
ISR(USARTD0_RXC_vect) // Interrupt Daten empfangen
{
 USART_RXComplete(&USART_data);
}
//####################################################### Int TXD
ISR(USARTD0_DRE_vect) // Interrupt Daten senden
{
 USART_DataRegEmpty(&USART_data);
}
 

Hinweis:
Das Tutorial wird nach und nach von mir ergänzt. Wenn ihr Fehler in dem Tutorial findet, würde ich mich freuen wenn ihr mir diese mitteilt, damit ich diese korrigieren kann. Wenn jemand eigene Tips, Informationen oder Code-Schnipsel hat kann er mir diese gern zusenden, damit ich sie anschließend in das Tutorial einbinden kann.

Links

 
Atmel Appnote
Xmega USART
Terminal Software
AVR1307: Using the XMEGA USART (pdf)
AVR1307: Using the XMEGA USART (Software)

Terminal HTerm

Downloads

Kommentar hinzufügen

Neuste Beiträge

30/08/2016
Es gibt nun endlich ein Update für die Tinyg CNC Controller Hardware und der dazu gehörenden PC Software...
03/09/2015
In den letzten Monaten habe ich lange das CAD Programm und meinen kleinen Ultimaker 3D Drucker gequält....
15/05/2015
Zuerst wurde eine kleine Katze am Computer konstruiert. Der erste Druck mit 0,3mm Schichtstärke war...
06/05/2015
Da beim Ultimaker keine Beleuchtung des Arbeitstisches vorgesehen ist, muss ich mir hier selber eine...
10/03/2015
Nach vielen Überlegungen habe ich mich nun endlich dazu entschieden meinen Machinenpark mit einem 3D...
01/02/2015
Diese Hardware besteht aus einem mächtigem Hardwarecontroller und vier leistungsstarken...
123135