Урок 4.1: Работаем с UART'ом (делаем конвертер уровней и соединяемся с ПК)

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск

На этом уроке мы научимся обмениваться данными через интерфейс uart. Одно из основных применений этого интерфейса - взаимодействие ПК и микроконтроллера. Мы создадим простейшую программу для микроконтроллера, которая будет обмениваться данными с ПК.

Для начала рассмотрим как это делать без штатных библиотек:

uart_without_libs.c: <source lang="c">#include <avr/io.h>

  1. include <stdint.h>

void usart0_init( uint32_t baudrate ); void usart0_putchar( uint8_t data ); uint8_t usart0_getchar( void ); void usart0_putstr( char *str ); void usart0_getstr( char *str, uint8_t length ) ;

void usart0_init( uint32_t baudrate ) {

  uint16_t bauddiv = ( ( F_CPU + ( baudrate * 8L ) ) / ( baudrate * 16L ) - 1 );
  UBRRL |= bauddiv;
  UBRRH |= ( bauddiv >> 8 ); 
  UCSRB |= ( 1 << TXEN ) | ( 1 << RXEN );

}

void usart0_putchar( uint8_t data ) {

  while( !( UCSRA & ( 1 << UDRE ) ) );
  UDR = data;

}

uint8_t usart0_getchar( void ) {

  while( !( UCSRA & ( 1 << RXC ) ) );
  
  return UDR;

}

void usart0_putstr( char *str ) {

  while( *str ) 
     usart0_putchar( *str++ );

}

void usart0_getstr( char *str, uint8_t length ) {

  while( length )
  {
     *str = usart0_getchar();
     
     if( *str == 'n' || *str == 'r' )
        break;
     
     str++;
     length--;
  }

}

int main( void ) {

  char tmp_str[] = "Hello, world!nr";
  
  usart0_init( 9600 );
  
  usart0_putstr( tmp_str );
  
  while( 1 )
  {
     char buffer[64] = { 0 };
     
     usart0_getstr( buffer, 64 );
     
     usart0_putstr( buffer );      
  }
  
  return 0;

}</source>

А теперь как с использованием штатной библиотеки:

uart_with_lib.c: <source lang="c">тут будет пример</source>