| Die UART - Ein Zeichen empfangen und senden |
|
|
|
Hier ein UART-Demoprojekt mit dem AT90PWM316. 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 - Wandleram 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 }
}
|