Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

8-logoНаступила очередь рассказать о довольно интересной теме — о том, как подключить AVR микроконтроллер к компьютеру. Для этого, у микроконтроллеров есть приемопередатчик. У некоторых их, даже два.  У Atmega8 он один, PD0 — Rx, receiver (приемник) и PD1 — Tx, transmitter (передатчик).

Usart2

Аналогичные ножки есть на нашем переходнике FT232. Соединяем микроконтроллер и переходник между собой. В протеусе это будет выглядеть так:

Usart3

Напишем программу, которая по сигналу от компьютера будет включать светодиод и выключать. В CodeVision создаем новый проект, микроконтроллер atmega8, частота 8МГц (тактирование от кварца), на закладке  USART включаем приемник и передатчик.

usart4

Обратите внимание, при текущей частоте микроконтроллера и скорости передачи, ошибка составляет 0,2%. Порт B настроим как выход — к нему подключим светодиод.

#include <mega8.h>
#include <stdio.h>
 
void main(void)
{
char data;
 
PORTB=0x00;
DDRB=0xFF;
 
PORTD=0x00;
DDRD=0x00;
 
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x10;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
 
while (1)
      {
      data=getchar();
 
      if(data=='1')
      {
      PORTB=0xFF;
      }
      if(data=='0')
      {
      PORTB=0x00;
      }
 
      };
}

Алгоритм: читаем приходящие байты, записываем их в переменную data; если пришла единичка, зажигаем светодиод; если 0, то выключаем его.

Собираем схемку и прошиваем. Подключаем к компьютеру. Запускаем программу KeTerm или другой терминал. Подсоединяемся к нужному com порту. Шлем единичку — светодиод включается, шлем 0 светодиод выключается.

Урок был бы неполным, если не применить наши знания по C#.

Создадим проект, нарисуем 2 кнопки и последовательный порт
vusb21

В свойствах последовательного порта не забудьте настроить PortName, он должен соответствовать номеру порта переходника FT232. Добавим события: по клику на 1 кнопку — отсылаем 1, по клику на 2 кнопку — отсылаем 0, при загрузке формы — открытие порта, при выходе из формы — закрытие порта.

 private void button1_Click(object sender, EventArgs e)
  {
    serialPort1.WriteLine("1");
  }
 
  private void button2_Click(object sender, EventArgs e)
  {
     serialPort1.WriteLine("0");
  }
 
  private void Form1_Load(object sender, EventArgs e)
  {
     serialPort1.Open();
  }
 
  private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  {
     serialPort1.Close();
  }

И напоследок, видео работы всего этого безобразия)

Update: По просьбе Евгения программа немного изменена, теперь при запуске программа автоматически проверяет все ком порты, если есть активные, то они заносятся в comboBox1.

1
2
3
4
5
6
private void Form1_Load(object sender, EventArgs e)
 {
  string[] myPort; //создаем массив строк
  myPort = System.IO.Ports.SerialPort.GetPortNames(); // в массив помещаем доступные порты
  comboBox1.Items.AddRange(myPort); //теперь этот массив заносим в список(comboBox) 
 }

vusb3

Исходники программы

102 комментария: Урок 8. Передача данных через UART в AVR микроконтроллерах

  • суть уловил, но почему нельзя передать сразу число 67? а надо его передавать по разрядам и в виде символа?

    вот так например передадим: UDR=67;
    и примем вот так: temperarure=UDR;
    и получится в переменной temperarure десятичное число 67, и его спокойно на экранчик выводим на число, а не как символ

  • Правильнее делать именно так как вы и говорите. Только для не забывайте для дисплея ваше число 67 это 1 байт = 1 символ, если у дисплея шрифт встроенный то что под номером 67 записано, то он и выведет. Поэтому придется 67 переводить в 2 байта = 2 символа.

  • Зачем по разрядам? 67 влезает в байт, вот и передавайте его как число. А в приемнике разбиваете на разряды и переведя в символы выводите.

  • Добрый день! Подскажите, пожалуйста, если использовать для подключения к USB порту стандартный преобразователь уровней COM-USB UPort 1110 фирмы MOXA, а для подключения к МК микросхему MAX232, получится ли реализовать Ваш проект? Просто нет микросхемы FT232R, и COM порта тоже нет.

  • получится

  • Спасибо за статью http://avr-start.ru/?p=4557, теперь стало понятно как из буфера считать нужные байты, но не могу никак понять следующее:

    Когда мы с терминальной программы отправляем символ «1» (единицу) по UART, то по ASCII в буфер записывается число 0x31 (или 39 в десятичной). А чтобы 0x31 записать в переменную в виде той же единицы, что нужно сделать? То есть отправил с терминальной программы 1 и в переменную temp тоже записалось 1 (а не 39).

  • точнее 0x31 = 49 в десятичной.

  • +0x30

  • Спасибо большое, за ответы. Сделал вот так data=UDR-0x30; и теперь в буфер записываются числа в нужном виде. )

  • сделал тупой до безобразия код(крутиться в бесконечном цикле)
    chislo=UDR;
    if (chislo==0x30) PORTC.0=0; else PORTC.0=1;
    и приём байта осуществляется с задержкой в один байт, то есть отправил один байт, ничего не происходит, отправляю второй байт, получай первый, отправляю третий байт, получаю второй, и тд
    а вот если через флаг принимать байты, то всё пучком
    if (UCSRA>>7==1) {
    chislo=UDR;
    if (chislo==0x30) PORTC.0=0; else PORTC.0=1; }
    что я делаю не так, и откуда в первом случает задержка образуется?

  • если посмотреть даташит атмела, то в нем рекомендуют именно сначала читать бит статуса, а потом забирать данные. почему именно так, а не иначе — возможно, что только после того как прочитан бит статуса данные из сдвигового регистра попадают в UDR

  • понял, спасибо, а я думал что фик с ним с флагом, мне нужен был код кое что проверить, вот и не заморачиваясь с флагами и всякими фишками тупо в лоб постоянно опрашивал UDR

  • по пробовал не много редактировать и кол-во светодиодов увеличить, получилось, интререстно стало , а как цифру 10 послать например и что бы зажёгся светодиод номер 10?
    {
    data=getchar();

    if(data==’1′)
    {
    PORTB=0b00000001;
    }
    if(data==’2′)
    {
    PORTB=0b00000010;
    }
    if(data==’3′)
    {
    PORTB=0b00000100;
    }
    if(data==’4′)
    {
    PORTB=0b00001000;
    }
    if(data==’5′)
    {
    PORTB=0b00010000;
    }
    if(data==’6′)
    {
    PORTB=0b00100000;
    }
    if(data==’0′)
    {
    PORTB=0x00000000; //все выкл //

  • слать можно только побайтово, если нужно 2 символа, то каждый нужно отдельно отправлять. если же нужно отправлять просто число, то отправляйте 10 без кавычек

  • можно ли через UART осуществить радиоуправление роботом? например я в компьютер забиваю план комнаты, а компьютер посылает сигнал на радиопередатчик, где через юарт управляется микроконтроллер робота — пылесоса, т.е компьютер просто посылает роботу маршрут движения, а робот основываясь так же на собственные чувства(на ультразвуковые датчики) корректирует маршрут(мало ли что ждет его в пути следования), то есть обходит препятствия, ножки стульев и столов и тд. Как думаете, можно ли вообще такую систему вообще осуществить, такому профану как я? :cry:

  • сделать можно, было бы желание

  • какие бы вы посоветовали микросхемы передатчики для данного дела?

  • Берите bluetooth, им можно управлять с телефона или планшета. Если планируются много данных передавать, то можно взять HC-05, если мало то можно взять low energy HC-08, или что то подобное.

  • Спасибо Админ за хороший сайт !
    Если можно приведите пример работы USART с прерываниями RX TX
    и отправкой и принятием чисел к примеру от 0 до 400.
    Спасибо вам огромное

  • Подскажите пожалуйста,как на стороне С# принять и отобразить информацию с мк

  • там есть событие data received, создаете обработчик и забираете инфу

  • Спасибо огромное,попробую! :smile:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Свежие записи
Последние комментарии
  • Загрузка...
Архивы
Счетчик
Яндекс.Метрика