UART-Demoprojekt mit dem AT90PWM316

CP2102 - USB/UART-Wandler

Da keine serielle Schnittstelle am PC zur Verfügung stand, wurde diese mit Hilfe eines USB / UART - Wandlers (CP2102) realisiert.

serielle Kommunikation

 

USB UART Converter

Abbildung: USB/UART Converter mit CP2102

 

Kommunikation mit dem Hyper Terminal:

Mit dem Programm Hyper Terminal wird ein Zeichen an den Mikrocontroller gesendet, anschließend zurück gesendet und im Editorfenster des Hyperterminals angezeigt.

Das Programm Hyper Terminal befindet sich unter Windows (Programme --> Zubehör --> Kommunikation) und muss beim Start auf die jeweiligen Einstellungen (COM Port, Baud Rate, Stop Bits, etc.) eingestellt werden.

In unserem Fall befindet sich die serielle Schnittstelle mit dem USB / UART - Wandler am COM Port 7.

USB UART COM Port

 

Wenn wir nun ein Zeichen senden, in unserem Fall das Zeichen a, wird der entsprechende ASCII-Code des Zeichens an den Mikrocontroller gesendet und dort am PORT B ausgegeben.

Da das empfangene Zeichen sofort zurück gesendet wird, wird es am Hyper Terminal empfangen und angezeigt.

Der ASCII-Code für das Zeichen a ist 61Hex

Dem zu Folge wird am PORT B 61Hex (= binär 0110 0001) angezeigt.

HyperTerminal

 

 

C-Code auf der Seite des Mikrocontrollers: 

 

/*****************************************************************

/* Demoprojekt: UART

/* © HG / 2011

/* Ziel: AT90PWM316, AVR Studio und GCC

/*****************************************************************

// Beschreibung:

// Initialisierung der UART, 9600, 8N1; unter Verwendung von Marcos

// Funktionen zum Senden und Empfangen eines Bytes im Polling

// main: ein empfangenes Zeichen wieder senden und am PortB ausgeben

 

 

#include <avr/io.h>

 

#define FOSC 8000000 // Set clock Speed in Hz

#define BAUD 9600 // Set baud rate

#define UBRR_Value FOSC/16/BAUD-1 // Set baud rate value in baud rate register

 

 

 

void USART_Init( unsigned int ubrr)

{

UBRRH = (unsigned char)(ubrr>>8); // Set baud rate in high- and low-register

UBRRL = (unsigned char)ubrr;

UCSRC = (1<<UCSZ1)|(1<<UCSZ0); // Set frame format: 8data, 1stop bit

UCSRB = (1<<RXEN)|(1<<TXEN); // Enable receiver and transmitter

}

 

 

void USART_Transmit(unsigned char data)

{

while ( !( UCSRA & (1<<UDRE)) ); // Wait for empty transmit buffer

UDR = data; // Put data into buffer, sends the data

}

 

 

unsigned char USART_Receive(void)

{

while ( !(UCSRA & (1<<RXC)) ); // Wait for data to be received

return UDR; // Get and return received data from buffer

}

 

 

void USART_Flush(void) // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)

{

unsigned char dummy;

while (UCSRA & (1<<RXC))

dummy = UDR;

}

 

 

void main( void )

{

unsigned char data;

USART_Init(UBRR_Value); // Init UART

USART_Flush(); // Flush Receive-Buffer

DDRB = 0xFF; // alle PINs an PortB als Ausgänge

 

while(1)

{

USART_Transmit(data = USART_Receive()); // receive on byte, send it

PORTB = data; // and write to Port B

}

 

}