МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра БТС
ИДЗ №1
ТЕМА: Программирование портов ввода-вывода
Студент гр. 7501 |
|
Исаков А.О. |
|
Преподаватель |
|
Анисимов А.А. |
|
|
|||
|
|
|
|
Санкт-Петербург
2020
Цель работы: Исследование принципов работы микроконтроллера
ATtiny104 на базе отладочной платы “ATtiny104 - Xplained Nano”. Получение начальных навыков программирования МК на языке Assembler и C,
пользования средой разработки AVR Atmel Studio 7.
Используемые инструменты: Отладочная плата ATtiny104 - Xplained Nano; интегрированная среда разработки AVR Atmel Studio 7; методические указания к выполнению работы.
Теоретическое обоснование темы работы
Мигание светодиодом при помощи микроконтроллера подразумевает собой попеременную подачу на один из выходов МК сигналов разных логических уровней.
Логические элементы оперируют сигналами двух типов: "высокий логический уровень" (1) и "низкий логический уровень" (0), которые характеризуются различным уровнем напряжения: полное напряжение питания принимается в качестве уровня "логической единицы", а нулевое напряжение - в качестве уровня "логического нуля".
Видеальном случае все сигналы логических элементов существовали бы
ввиде этих двух предельных уровней напряжения, и никогда бы от них не отклонялись (например, ниже полного напряжения для "высокого уровня",
или выше нуля для "низкого уровня".) Однако в реальности уровни напряжения цифровых сигналов не так часто достигают этих идеальных величин вследствие наличия паразитных падений напряжения в схемах на транзисторах, и поэтому логических схем интерпретируют сигналы как логическую единицу или логический нуль, даже в тех случаях, когда напряжение сигналов лежит в диапазоне между полным напряжением питания и нулём.
Элементы ТТЛ работают при номинальном напряжении питания 5
вольт, +/- 0,25 вольт. В идеале, сигнал высокого логического уровня должен быть равен ровно 5,00 В, а сигнал низкого уровня - ровно 0,00 вольт. Однако в реальных элементах ТТЛ не могут быть обеспечены подобные точные уровни
напряжения, поэтому они могут принимать сигналы высокого и низкого уровней даже при значительном отклонении напряжения от идеальных величин. "Приемлемые" напряжения входного сигнала лежат в диапазоне от 0
до 0,8 вольт для низкого логического уровня, и от 2 до 5 вольт для высокого логического уровня. "Приемлемые" напряжения выходного сигнала (уровни напряжения, гарантируемые производителем элемента в указанных вариантах нагрузки) лежат в диапазоне от 0 до 0,5 вольт для низкого логического уровня,
и от 2,7 до 5 вольт для высокого логического уровня.
Временные задержки в МК, программно, могут быть реализованы по-
разному (например, с помощью счетчика, пропуском команды, библиотек задежрки, либо циклов вычисления). В данной работе был выбран наиболее простой тип задержки – при помощи цикла декрементирования переменных для Assembler и библиотека «delay» для языка С.
Вид используемой платы приведен на рисунке 1.
Рисунок 1 – Схема отладочной платы ATtiny104 Xplained Nano
Ход выполнения лабораторной работы
Автоматическое мигание светодиода (Assembler) для ATTINY104
LDI R16,0b00100000
OUT DDRA,R16
OUT PORTA,R16
MAIN:
LDI R16, 0b11011111 OUT PORTA,R16 RCALL Delay
LDI R16,0b00100000 OUT PORTA,R16 RCALL Delay
rjmp MAIN
.equ Lowbyle=255
.equ Medbyte=255
.equ Hightbyte=2
Delay:
LDI R16,Lowbyte
LDI R17,Medbyte
LDI R18,Hightbyte
loop:
DEC R16 BRNE loop DEC R17 BRNE loop DEC R18 BRNE loop RET
Рисунок 2 – Светодиод горит
Рисунок 3 – Светодиод погас
Как можно понять из кода, задержка при мигании светодиодом в данном случае происходит из-за лагов МК во время выполнения операций декрементирования DEC. Количество арифметических операций, для получения различимой глазом задержки должно быть велико, так как тактовая частота равна 1МГц. В данном случае это число равно 255 * 255 * 2 = 130050.
Мигание светодиодом по нажатию на кнопку (Assembler) для ATTINY104
LDI r16, 0b00000000 |
; устанавливаем все нули в РОН r16 |
|
|
|
||||
OUT DDRB, r16 |
|
; присваем регистру DDRB значение r16 |
|
|
|
|||
LDI r16, 0b00000010 |
; устанавливаем 1 во 1 разр. в РОН r16 |
|
|
|
||||
OUT PUEB, r16 |
|
; присваем регистру PUEB значение r16 (вкл. подтяжку) |
|
|
||||
LDI r16, 0b00100000 ; устанавливаем 1 во 5 разр. в РОН r16 |
|
|
|
|||||
OUT DDRA, r16 |
|
; присваем регистру DDRA значение r16 |
|
|
|
|||
Main: |
|
|
; начало главного цикла |
|
|
|
||
IN r16, PINB |
|
; считываем значения с PINB в r16 |
|
|
||||
SBRC r16, 1 |
|
; если в 1 разр. в r16 единица |
|
|
||||
LDI r17, 0b00100000 |
; присваеваем r17 единицу в 5 разр. |
|
|
|||||
SBRC r16, 1 |
|
; если в 1 разр. в r16 единица |
|
|
||||
OUT PORTA, r17 |
; присваем регистру PORTA значение r17 |
|
|
|||||
SBRS r16, 1 |
|
; если в 1 разр. в r16 ноль |
|
|
||||
LDI r17, 0b00000000 |
; присваеваем r17 нули во всех разр. |
|
|
|||||
SBRS r16, 1 |
|
; сли в 1 разр. в r16 ноль |
|
|
|
|||
OUT PORTA, r17 |
; присваем регистру PORTA значение r17 |
|
|
|||||
RJMP Main |
|
|
|
|
|
|
|
|
Во |
избежание |
того, |
чтобы |
вывод |
находился |
в |
режиме |
|
высокоимпедансного входа Hi-Z, мы включаем подтяжку для используемой
кнопки «OUT PUEB, r16»
Мигание светодиодом по нажатию на кнопку (C) для ATTINY2313
#include <avr/io.h>