AVR-GCC - UART

From XennisWiki
Jump to: navigation, search

Eine UART-Schnittstelle dient zum Senden und Empfangen von Daten über eine Datenleitung und bildet den Standard der seriellen Schnittstellen an PCs und Mikrocontrollern. (Wikipedia)

Ausführliche Hilfe: AVR-GCC-Tutorial/Der UART

Verwendete Hard- und Software

Crumb168 V2.3 AVR ATmega Modul

Hardware

Software

Einstellungen

Atmel Studio

Im Atmel Studio musst du die Fuses so einstellen, dass der externe Quarz verwendet wird.

  • Tools > Device Programming > in der linken Leiste Fuses
  • Unter Fuse Name SUT_CKSEL suchen und auf EXTXOSC_8MHZ_XX_1KCK_14CK_4MS1 einstellen (siehe Bild)

UART - Atmel Studio Einstellungen.png

Putty

Mithilfe von Putty kannst du Zeichen, die der ATmega über UART verschickt, empfangen. Stelle Putty, wie im folgenden Bild dargestellt, für die oben genannten Spezifikation ein. Den COM-Port findest du im Geräte-Manager unter Anschlüsse (COM & LPT) und dann Silicon Labs CP210x USB to UART Bridge (COMx).

UART - Putty Einstellungen.png

RS232 Terminal

Alternativ zu dem Programm Putty kann auch das RS232 Terminal (siehe oben) mit den folgenden Einstellungen verwendet werden.

UART - RS232 Terminal Einstellungen.png

Code

uart.h

/*
 * uart.h
 *
 * Created: 20.11.2012
 *  Author: Fabi Rosenthal
 */ 
#include <avr/io.h>

#ifndef UART_H_
	#define UART_H_

	#define F_CPU	20000000UL	// Clock Speed = 20.000MHz
	#define BAUD	115200UL	// Baud rate
	#define UBRR_VAL	((F_CPU+BAUD*8)/(BAUD*16)-1) // =??

	/* Register names USART0 */
	#define UBRRnH	UBRR0H
	#define UBRRnL	UBRR0L

	#define UCSRnA	UCSR0A
	#define UCSRnB	UCSR0B
	#define UCSRnC	UCSR0C

	#define UDRn	UDR0
	#define UDREn	UDRE0
	#define UPEn	UPE0

	#define DORn	DOR0
	#define FEn	FE0
	#define RXCn	RXC0
	#define TXB8	TXB80

	void uart_puts( char *s );
	void uart_putc( unsigned char data );
	void uart_init( void);

#endif /* UART_H_ */

uart.c

/*
 * uart.c
 *
 * Created: 20.11.2012
 * Author: Fabi Rosenthal, Florian T.
 */ 
#include "uart.h"

/* 
 * USART Initialization (Datasheet page 178)
 */
void uart_init(void)
{
	/* Set baud rate */
	UBRRnH = UBRR_VAL >> 8;
	UBRRnL = UBRR_VAL & 0xFF;
	/* Enable receiver and transmitter */
	UCSRnB |= (1<<TXEN0);
	/* Set frame format: 8data, 2stop bit */
	UCSRnC |= (1<<USBS0)|(3<<UCSZ00);}

/*
 * Sending Frames with 5 to 8 Data Bit (Datasheet page 179)
 */
void uart_putc( unsigned char data )
{
	/* Wait for empty transmit buffer */
	while ( !( UCSRnA & (1<<UDREn)) );
	/* Put data into buffer, sends the data */
	UDRn = data;
}

/*
 * Sending strings
 */
void uart_puts( char *s )
{
	/* while *s != '\0' so unequally "string-end characters (terminator) */
	while (*s)
	{
		uart_putc(*s);
		s++;
	}
}

Uart_Crumb168_Studio6.c

/*
 * Uart_Crumb168_Studio6.c
 *
 * Created: 20.11.2012
 *  Author: Fabi Rosenthal
 */
#include <avr/io.h>
#include "uart.h"

int main(void)
{
    uart_init();

    while(1)
    {
	uart_puts("Hallo");
    }
}

Tipps

Umwandlung String / Integer (atoi, itao)

Verwende gegebenenfalls die Funktion atoi um einen empfangenen String in einen Integer umzuwandeln. Für weitere Informationen zu der verwendeten uart_gets Methode siehe Empfang von Zeichenketten.

char value[4];
uart_gets(value, sizeof(value));

uint16_t result = atoi(value);

Analog zu dieser Funktion, gibt es die Funktion itao zum Umwandeln eines Integers in einen String.

Resultat

Starte Putty mit den oben genannten Einstellungen und klicke auf Open. Kompiliere das C-Programm und spiele die hex-Datei auf den Microcontroller. Anschließend sollte in der Putty-Konsole immer wieder die Ausgabe Hallo erscheinen.

Siehe auch