Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаба 5 / LAB_5_MPS

.docx
Скачиваний:
2
Добавлен:
08.04.2022
Размер:
711.11 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра БТС

Отчет

по Лабораторной работе №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.

Соседние файлы в папке Лаба 5