Содержание
Урок 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

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

92 комментария: Урок 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

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

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

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

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