Общение

russian-robots@conference.jabber.ru - Чат, в котором можно поболтать об электронике, создании роботов и программировании.
Как мне зайти в чат?

 Обсуждение

Не стесняйтесь оставлять комментарии, мне интересно и важно ваше мнение!
  • Wadimka: Подскажу где взять недорого строчники, идете/едите в любую контору которая ...
  • Vladimir: Об этом датчике я тоже знаю, хотелось с чегото начать изучать МК, а не слеп ...
  • Vladimir: Спсиба
  • Евгений: Стоит поставить инфракрасный датчик движения и не городить ничего :) Литера ...
  • Vladimir: Добрый день Евгений. Это мне для дома в кладовку. При входе на двери стоит ...
  • Евгений: Фотобарьер? По подробнее расскажите.
  • Vladimir: Добрый день. Прошу вас помочь в реализации пректа фотобарер на Tiny45, со с ...
  • Евгений: С таким кодом даже http://caxapa.ru/codebook/?search=BLSH ничего не находит ...
  • Пример работы с USART (atmega16)

    17th Июнь 2010 | Метки:

    Настройка USART

    Для того, чтобы включить USART нужно правильно сконфигурировать его. Настройки зависят от данных в 5 8 битных регистрах:

    UCSRA
    UCSRB } Control and Status Registers
    UCSRC
    UBRRH }  Baud Rate registers
    UBRRL

    На страницах 157-161 даташита приводится описание каждого бита всех регистров, поэтому если что не понятно, достаточно глянуть в даташит.

    Удобно конфигурировать USART при помощи Code Wizard AVR, он сам расчитает значения регистров и сгенерит для вас код, это намного удобнее, чем писать с нуля. Но иметь представление как это делается без Code Wizard’a всетаки нужно.

    И так, давайте попробуем сгенерить код:

    atmega16 8 MHz

    Настройка USART в Code Wizard Avr (Code Vision)

    Далее нажимаем File -> Program Preview

    Code Wizard AVR настройка USART

    В Появившемся окне с кодом ищем USART Initialization и копируем код. Должно получится следующее:

    UCSRA=0×00;
    UCSRB=0×18;
    UCSRC=0×86;
    UBRRH=0×00;
    UBRRL=0×33;

    Пишем простейшую программу для проверки USART

    И так, настраивать USART мы научились, осталось научиться пользоваться им. Напишем для этого простую программу:

    #include<mega16.h>
    #include<stdio.h>
     
    void main (void)
    {
    UCSRA=0x00;    //инициализируем USART
    UCSRB=0x18;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x33;
     
    while(1)//бесконечный цикл
    {
    putchar(getchar()); //эта строка отправляет обратно принятые данные
    }
    }

    Подключаем МК к MAX232 или FT232 и к компьютеру.  Запускаем терминал, выставляем скорость 9600, биты данных 8, стоп биты 1, режим передачи асинхронный, четность – none. Отправляем что-нибудь микроконтроллеру и вуаля! Данные приходят обратно, значит все работает!

    О функциях для работы с USART

    В Code Vision AVR C Compiler есть несколько функция для работы с USART, перечислю их:

    • putchar() – позволяет передать 1 символ (8 бит)
    • getchar() – читает из буфера 1 последний символ (8 бит)
    • puts(char *str) – передает строку символов
    • putsf(char flash *str) – передает строку (массив символов), хранящуюся во flash памяти.
    • printf(char flash *fmtstr [ , arg1, arg2, ...]) – позволяет передать форматированный текст
    • printf() - позволяет передавать через USART строки ( printf(«sample»); )
    • sprintf(char *str, char flash *fmtstr [ , arg1, arg2, ...])
    • snprintf(char *str, unsigned char size, char flash *fmtstr [ , arg1, arg2, ...]) – для микроконтроллеров с малым объемом памяти
    • snprintf(char *str, unsigned int size, char flash *fmtstr [ , arg1, arg2, ...]) – для остальных типов памяти

    Более подробно смотрите в help в Code Vision AVR, раздел – Standard C Input/Output Functions.

    На этом все. Успехов!

    Понравилась статья? Нажмите на любую из кнопок:

    0
    1. Sergey
      16th Январь 2011 в 00:27

      А в АВР студио этот код вообще не работает :(

      Подскажите что нужно сделать, чтобы сделать его рабочим авр студио?

      Спасибо!

      Thumb up 0 Thumb down 0

      [Ответить]

      Евгений Reply:

      Должно быть переписать на ассемблере, если не установлен WinAVR.
      Если WinAVR есть, то возьмите отсюда только регистры.
      Функции getchar() и putchar() содержат около трех строчек кода, их можно самому написать, насколько я помню там смысл в том, что сначала ждем в цикле пока закончится передача данных по USART (или приём) и потом возвращаем число из регистра UDR.

      [Ответить]

      Валера Reply:

      //вот заветные строчки:
      char getchar(void)
      {
      char status,data;
      while (1)
      {
      while (((status=UCSRA) & RX_COMPLETE)==0);
      data=UDR;
      if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
      return data;
      };
      }

      void putchar(char c)
      {
      while ((UCSRA & DATA_REGISTER_EMPTY)==0);
      UDR=c;
      }

      Thumb up 0 Thumb down 0

      [Ответить]

      Евгений Reply:

      Скорей вот эти строчки:
      #define UDRE 5
      #define RXC 7
      void putchar(char c)
      {
      while ((UCSRA & (1<<UDRE))==0);
      UDR=c;
      }

      char getchar(void)
      {
      while ((UCSRA & (1<<RXC))==0);
      return UDR;
      }

    :D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: