This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| pt:avr:usart [2015/12/02 13:45] – artica | pt:avr:usart [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== USART ====== | ||
| + | Um USART é uma interface serial síncrona universal; um UART, é uma versão simplificada - interface serial assíncrono universal. A diferença é que um USART usa também uma linha de sinal do relógio para sincronizar os dados, mas um UART só usa linhas de dados. O USART do AVR permite o uso de comunicação full duplex, com palavras de dados de 5 a 9 bits (8 bits de palavras = byte), 1 ou 2 bits de paragem, três modos de paridade e uma grande variedade de taxas de transmissão. Os microcontroladores AVR têm normalmente até 2 interfaces USART, embora alguns possam não tê-los. A transmissão de dados é realizada usando uma palavra de cada vez - o AVR converte a palavra que recebe do utilizador para bits ao nível de hardware e transmite-a de forma independente e vice-versa. O utilizador controla o USART lendo e escrevendo a configuração, | ||
| + | |||
| + | Cada opção de configuração tem registos correspondentes, | ||
| + | |||
| + | Uma vez que a transmissão de dados ocorre de forma independente do processador e de forma muito mais lenta, é necessário confirmar que a interface está pronta para a próxima palavra antes de a transmitir. Isso pode ser feito tendo em conta o ready bit do buffer de transmissão, | ||
| + | |||
| + | A chegada de uma palavra é sinalizada também por um bit de status especial. Além disso, há bits de status para sinalizar erros de enquadramento, | ||
| + | |||
| + | Os buffers de transmissão e recepção são registos fisicamente separados, mas partilham o mesmo endereço de memória e nome. Quando escrevemos para o registo comum, os dados são armazenados na memória intermédia de transmissão, | ||
| + | |||
| + | < | ||
| + | |||
| + | <box 100% round # | ||
| + | |||
| + | Task: Configure an 8 MHz ATmega128' | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | // Set baud rate to 9600 bps. Formula: | ||
| + | // | ||
| + | // UBRR = 8000000 / 16 / 9600 - 1 = ~51 | ||
| + | UBRR0H = 0; | ||
| + | UBRR0L = 51; | ||
| + | |||
| + | // Allow transmitting | ||
| + | UCSR0B = (1 << TXEN0); | ||
| + | |||
| + | // Configure asynchronous mode, set the word size to 8 bits | ||
| + | // 1 stop bit, no parity bits. | ||
| + | UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); | ||
| + | |||
| + | // Wait for the data buffer to empty (previous word to transmit) | ||
| + | // In this example there is no need to wait, as the first symbol is yet | ||
| + | // to be sent, but it should be done when transmitting more symbols. | ||
| + | while (!(UCSR0A & (1 << UDRE))) continue; | ||
| + | |||
| + | // Write the symbol to the buffer for transmitting | ||
| + | UDR0 = ' | ||
| + | |||
| + | // Endless loop | ||
| + | while (1) continue; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | </ | ||