Sériové komunikačné rozhranie
Zo stránky SensorWiki
Sériové komunikačné rozhranie (UART)
Úlohy
- Nahrajte si knižnice pre prácu so sériovou linkou, preštudujte využitie knižnice <stdio.h> a demonštrujte.
- Oboznámte sa s programom StampPlot a zobrazte časový priebeh teploty z termistora.
- Vyhodnotením prechodového deja identifikujte veľkosť kondenzátora vo výstupnom filtri.
Literatúra:
- Using the USART with AVR-GCC
- Interrupt driven USARTs
- Ako používať USART: knižnica a príklady...
USART
Ukážkový program s vysvetlivkami
#include <avr/io.h>
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
int main (void)
{
char ReceivedByte;
UCSRB |= (1 << RXEN) | (1 << TXEN); // Turn on the transmission and reception circuitry
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // Use 8-bit character sizes
UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
for (;;) // Loop forever
{
while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been recieved and is ready to be read from UDR
ReceivedByte = UDR; // Fetch the recieved byte value into the variable "ByteReceived"
while ((UCSRA & (1 << UDRE)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it
UDR = ReceivedByte; // Echo back the received byte back to the computer
}
}
#include <avr/io.h>
#define BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (BAUDRATE * 16UL))) - 1)
int main (void)
{
char ReceivedChar;
/* Initialize UART */
// Set baud rate:
UBRR0H = (unsigned char)(BAUD_PRESCALE >> 8); // Load lower 8-bits
UBRR0L = (unsigned char)BAUD_PRESCALE; // Load upper 8-bits of the UBRR register
UCSR0B = (1 << RXEN0) | (1 << TXEN0); // Enable receiver and transmitter
UCSR0C = (1<<USBS0)|(3<<UCSZ00); // Set format: 8data, 2stop bit
for (;;) // Loop forever
{
while ((UCSR0A & (1 << RXC0)) == 0) // Wait for data to be received
{
// Do nothing until data have been recieved and is ready to be read from UDR
};
ReceivedChar = UDR0; // Fetch the recieved byte
while ( !( UCSR0A & (1<<UDRE0)) ) // Wait for empty transmit buffer
{
// Do nothing until UDR is ready for more data to be written to it
};
UDR0 = ReceivedChar; // Echo back the received byte back to the computer
}
}
printf() na jednočipe?
Ak si napíšete vlastnú funkciu na zobrazenie jedného znaku na displej, alebo pre vyslanie jedného znaku po sériovej linke, potom môžete používať naozaj aj funkciu printf so všetkými jej vymoženosťami. Využívame pre tom knižnicu stdio.h, ktorá sa používa takto:
...
#include <stdio.h>
FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);
// 'sendchar' je nova funkcia pre jeden znak
int main(void)
{
inituart(); // Inicializacia seriovej linky
stdout = &mystdout; // Odteraz funguje printf();
printf("Hello, world!");
return 0;
}
Takto potom môžete používať naozaj aj funkciu printf() so všetkými jej vymoženosťami... Úplne rovnako sa dá implementovať printf() aj na LCD displej, len ho treba na začiatku zinicializovať a namiesto funkcie sendchar napísať niečo ako LCDsendchar().
Nebudeme sa zaoberať detailmi implementácie sériového komunikačného rozhrania procesorov
AVR, pre naše účely postačí jednoduchá knižnica, ktorá obsahuje základné funkcie odladené
pre dosku MiniMEXLE s procesorom ATmega88 a oscilátorom 18,432 MHz.
Máte k dispozícii jednoduchú knižnicu pre prácu so sériovou linkou na procesore
ATmega88, stiahnite a pozrite si príklady...
Parametre prenosu pre túto knižnicu sú 9600,n,8,1.
Na prácu so sériovou linkou na vašom PC odporúčame program Terminal by Bray, ale môžete to skúsiť aj s Hyperterminálom.
Keby niekoho zaujímalo, ako je realizovaný prevod TTL úrovní na RS-232, tak tu je schéma zapojenia, ktorá vychádza z tohoto návodu.
Vizualizácia
Vizualizáciu dát môžeme robiť rozlične. Jeden z možných spôsobov je vypisovať po sériovej linke v pravidelných intervaloch holé data a tie potom uložiť ako maticu do Matlabu a tam nakresliť graf, priebeh, čo treba...
Iná možnosť je použiť napr. program StampPlot, ktorý kreslí prichádzajúce data priamo ako graf, s výnimkou reťazcov, ktoré začínajú znakom '!', tie považuje za konfiguračné príkazy.
Download: StampPlotLite1.7
Príklad: AVR StampPlotExample.c Manual: Stamp Plot Manual
Download