Atmel AVR Mikrocontroller
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.
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.
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.
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
}
}