МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра БТС
Отчет
по Лабораторной работе №5
по дисциплине «Микропроцессорные системы»
Тема: Работа с UART
Студент гр. 7503 _____________________ Марсаль Г. О.
Преподаватель _____________________ Анисимов А. А.
Санкт-Петербург
2020
Цель работы: изучить режимы работы АЦП и передачу данных по интерфейсу UART, использование UART для связи с ПК, работа с datasheet на ATMega328P. Создание программы на языке ассемблера.
Задачи:
1) Вся работа ведётся в обработчиках прерываний, основной цикл остаётся пустым.
2) Первый обработчик - по переполнению таймера, в нём мы запускаем одиночное АЦП преобразование.
3) Второй обработчик - по завершению АЦП преобразования, в нём мы считываем результат, 8 старших бит записываем в регистр передачи данных UART UDR0. Далее в терминале смотрим, что пришло.
4) В блоке инициализации делаем все необходимые настройки для таймера, настраиваем АЦП (ИОН - напряжение питания 5 В) и UART (скорость 9600, 8 бит данных, 1 стоповый бит, без проверки на чётность).
5) В Proteus'е к АЦП подключаем потенциометр (как и в прошлой работе), к выводам RX и TX подключаем COM-порт.
В бесконечном цикле мы считываем данные с АЦП и передаём по UART'у на ПК.
ОБРАБОТКА РЕЗУЛЬТАТОВ РАБОТЫ
Код программы на языке Assembler:
; --- Инициализация таблицы векторов прерываний
.ORG 0x0000
RJMP RESET
.ORG 0x001A
RJMP TIM1_OVF
.ORG 0x002A
RJMP ADC_COMPLETE
.ORG INT_VECTORS_SIZE
RESET:
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
LDI R16, (1 << TOIE1)
STS TIMSK1, R16
LDI R16, (1 << CS11); Предделитель 8
STS TCCR1B, R16
LDI R16, (0 << PORTC0)
STS DDRC, R16
OUT PORTC, R16
LDI R16, (0 << MUX0) | (0 << MUX1) | (0 << MUX2) | (0 << MUX3) | (1 << ADLAR)
STS ADMUX, R16
LDI R16, (1 << RXEN0) | (1 << TXEN0) | (0 << UCSZ02)
STS UCSR0B, R16
LDI R16, (0 << UMSEL00) | (0 << UMSEL01) | (0 << UPM00) | (0 << UPM01) | (0 << USBS0) | (1 << UCSZ00) | (1 << UCSZ01)
STS UCSR0C, R16
LDI R16, 51
STS UBRR0L, R16
SEI
MAIN: RJMP MAIN ; Бесконечный пустой цикл
TIM1_OVF:
LDI R16, (1 << ADEN) | (1 << ADSC) | (1 << ADIE) ; Запускаем АЦП
STS ADCSRA, R16
RETI
ADC_COMPLETE:
LDS R18, ADCH ; Cчитываем данные из старшего регистра АЦП
STS UDR0, R18
RETI
Для проверки кода, произведем моделирование работы МК в САПР Proteus 8.
Разработанная схема приведена на рис. 1.
Рисунок 1 – Вид схемы
На рис. 1 RV1 – потенциометр, предназначенный для моделирования аналогового сигнала; СOMPIM – Макрос для моделирования виртуального COM порта.
Произведем моделирование 2-х COM портов (COM1 – передающий, COM2 – принимающий при помощи программы Virtual Serial Port Driver (рис. 2).
Рисунок 2 – Окно настройки пары виртуальных COM портов
Для обработки получаемых значений был написан скрипт на языке Python, выводящий данные, приходящие в COM порт, в диалоговое окно.
Код программы:
import serial ser = serial.Serial('COM2', baudrate=9600, timeout=0) # настройка порта class COMPORTREAD(): while 1: Data = ser.readline() if len(Data) > 0: print(Data)
Произведем моделирование работы схемы. Результат при положении движка потенциометра – 100 (0 В) приведен на рис. 3.
Рисунок 3 – Результат работы схемы при подаче 0 В на АЦП
Как можем заметить, в командную строку Python-программы выводятся значения «b’\x00», что равно напряжению, закодированному в 16 разрядной системе счисления. В десятичной системе это число равно 0, в чем мы можем убедиться, посмотрев значение на цифровом вольтметре.
Увеличим напряжение до 0.15 В. Результат работы – на рис. 4.
Рисунок 4 – Результат работы схемы при подаче 0,15 В на АЦП
Полученное число – 0x07 переведем в десятичное, получим 7.
Произведем расчёт напряжения:
На выходе мы получили число, близкое по значению к исходному. Неточность в данном случае объясняется отбрасыванием двух младших битов (при выставлении бита ADLAR в 1).
Увеличим напряжение до 2,5 В. Результат – на рис. 5.
Рисунок 5 – Результат работы схемы при подаче 2.5 В на АЦП
Полученное число – 0x80 переведем в десятичное, получим 128.
Произведем расчёт напряжения:
Вывод: В данной работе были закреплены навыки работы с АЦП, а также был изучен асинхронный способ передачи данных по UART в мк ATMega328P.