МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра БТС
ИДЗ №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>
int main(void) |
|
|
{ |
|
|
DDRB |= (1<<DDB5); |
// PORTA, 5 вывод на |
выход |
DDRB &=~ (1<<DDB1); |
// PORTB, вывод 1 на |
выход |
PORTB |= (1<<PB1); |
// активируем подтяжку по питанию |
while (1)
{
if (!(PINB & (1<<PINB1))) { PORTB &=~ (1<<PB5); } else {
PORTB |= (1<<PB5);
}
}
}
Рисунок 4 – Кнопка не нажата, диод погас
Рисунок 5 – Кнопка нажата, диод загорелся
Преимущество данного кода заключается в его компактности, простоте написания и легкой читаемости, по сравнению с кодом на Assembler, хотя по
выполняемым функциям она идентичная предыдущей программе, за
исключением появившихся здесь логических побитовых операций.
Выводы
В ходе выполнения работы мы познакомились с таким приемом как включение подтяжки Pull UP – PUE для используемой кнопки, во избежание попадания данного вывода в режим Hi-Z. Состояние высокого импеданса или
Z – состояние ( в англоязычной литературе Hi-Z ) – это такое состояние контакта логической схемы, при котором сопротивление между этим контактом и остальной схемой очень велико. Физически данный режим реализуется закрытым полевым транзистором, работающем в ключевом режиме.
Вывод, переведенный в состояние Hi-Z, ведет себя как оторванный от схемы. Внешние устройства, подключенные к этому выводу, могут изменять напряжение на нем по своему усмотрению ( в некоторых пределах ), не влияя на работу остальной схемы. Этот режим в большинстве МК включен по умолчанию, после сброса по питанию. Все переключатели разомкнуты, а
сопротивление порта очень велико, т.е. электрически вывод как будто вообще никуда не подключён и ни на что не влияет. Но при этом он постоянно считывает свое состояние в регистр PINxn, и мы всегда можем узнать, что находится на входе – логическая единица или ноль.