МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра БТС
Идз №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, и мы всегда можем узнать, что находится на входе – логическая единица или ноль.