Продолжаем тему программирования микроконтроллеров AVR. Сегодня мы попробуем сделать устройство которое можно уже применять в каких-то устройствах. — КиберПедия 

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Продолжаем тему программирования микроконтроллеров AVR. Сегодня мы попробуем сделать устройство которое можно уже применять в каких-то устройствах.

2017-12-21 189
Продолжаем тему программирования микроконтроллеров AVR. Сегодня мы попробуем сделать устройство которое можно уже применять в каких-то устройствах. 0.00 из 5.00 0 оценок
Заказать работу

Давайте посмотрим на нашу задачу. У нас будет кнопка и лампочка. Нажали на кнопку, лампочка включилась. Еще раз нажали и лампочка погасла. Ну с ТЗ все ясно, приступим к железной части. Первое что нам нужно это собрать схему. Ну так вот она.

Давайте взглянем на рисунок по подробнее. Для подключения кнопки и лампы используется порт В. На вход РВ0 подключаем кнопку. Резистор 4к7 подключен к общему проводу для подтяжки к нулю вход порта. Это нужно для того чтобы при не нажатой кнопке (нормально разомкнута), на нулевой вход порта В приходил логический ноль. Если резистор исключить из схемы, то вход при отпущенной кнопке как бы повиснет в воздухе и какой там уровень будет не известно никому. Другой контакт кнопки подключаем к плюсу(+5в). Теперь если нажать на кнопку, то на вход МК придет логическая единица, а если отпустить, то логический ноль. Ну с кнопкой вроде разобрались, давайте рассмотрим теперь часть схемы с лампочкой. Лампу будем включать работающую от сети ~220 вольт. Ну на прямую через порт пропускать 220 в нельзя. (Конечно для эксперимента можно, но я не ручаюсь за последствия). Чтобы включить лампу нам понадобится реле с управляющим напряжением 5 вольт. Ведь МК запитан от источника постоянного тока равного 5 вольт. Вот и появился соблазн этим воспользоваться. Но я немного разочарую вас. Напрямую к МК реле подключать нельзя. Выход есть. Обычный биполярный транзистор в ключевом режиме даст нам возможность согласовать реле с МК. Давайте рассмотрим этот кусочек схемы. Транзистор VT1 имеет три контакта. Контакт справа с прямоугольником - эта БАЗА. На базу в режиме ключа приходит управляющий ток. Да, да именно ток, а не напряжение. Как раз для этих целей установлен между базой и выходом порта резистор R1. Контакт слева наверху называется КОЛЛЕКТОР. При открытии транзистора через него протекает ток к ЭМИТТЕРу (нижний контакт в виде стрелочки). Резистор R3 нужен для подтяжки эмиттера к общему проводу. Это нужно для того чтобы при отсутствии МК база не висела в воздухе. Транзистор очень чувствителен и если базу повесить в воздухе, есть вероятность его частичного открытия вызванные наводками. Поэтому всегда включайте транзистор в ключе по такой схеме, а то можно долго думать, почему при снятии МК со схемы лампочка сама включается. Ну вроде все. Теперь если подать логическую единицу на первый выход порта, лампочка включится, а при логическом нуле выключится. Схема вроде готова, теперь давайте приступим к программной части. Я буду писать только код без картинок, так как многое будет повторяться из описанного в предыдущей статье.

И так начнем. Первое что нам нужно, так это сконфигурировать порт В. Мы знаем что к нулевому входу у нас подключена кнопка, значит вход работает как вход (простите за тавтологию). В окошке генератора проекта в разделе Ports нам нужно выбрать порт В и выставить значение Pin 0 в In. А первый вход, к которому подключена лампочка, должен работать на выход. Значит Port 1 выставляем в Out. Далее сохраняем проект и генерируем начальный код. Все готова для дальнейшей работы. Вот что у нас получилось.


#include <mega8.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=T
PORTB=0x00;
DDRB=0x02;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

Если вы заметили то генератор кода записал в регистр DDRB значение 0x02. Я выделил красным. Если число 0х02 рассмотреть в бинаре то получится 0b00000010. Если кто-то забыл, то я напомню что для того чтобы какой-то разряд порта ввода/вывода работал как вход, то соответствующий бит должен быть единицей, а если на выход то нулем. Теперь понятно почему второй справа разряд равен единице. Теперь давайте начнем писать уже нашу программу. Первое что мы сделаем, так это создадим флаг работы лампы. Назовем его Lamp. Для этого пропишем перед главной функцией такую строчку: unsigned char Lamp = 0x00;

// Declare your global variables here


unsigned char Lamp = 0x00;
void main(void)

В данной строчке говорится компилятору что мы хотим создать глобальную без знаковую переменную типа (char) с именем Lamp и значением 0х00. Данная переменная нам потребуется для использования ее как флаг работы лампы. Если переменная равна 0х00, значит лампа не горит, а если 0х01, то горит. Это конечно не идеальный вариант но для начала пойдет. Далее спускаемся в основной цикл программы.

while (1)
{
// Place your code here

};

Это в самом низу. Надпись между скобками гласит: "Место для вашего кода здесь". Если она вам мозолит глаза, то ее можно стереть. Самое главное что весь ваш код должен находиться этими между фигурными скобками. Поехали дальше.

while (1) {

1 while(!PINB.0);
2 if(Lamp == 0x00)
3 {
4 PORTB.1 = 1;
5 Lamp = 0x01;
6 }
7 else
8 {
9 PORTB.1 = 0;
10 Lamp = 0x00;
11 }
12 while(PINB.0);

};

Вот и весь код. Он конечно не идеален но все же для первого раза довольно прост. Давайте рассмотрим его по ближе. Я специально расставил номера строк, в программе их нумеровать не надо.

Строка с номером 1 - это бесконечный цикл который ничего не делает. Зачем спросите вы. Давайте сначала рассмотрим работу цикла while(). Полная запись цикла выглядит так:

While(условие)

{

Тело цикла

};

Сначала цикл проверяет условие. Если условиеравно true (правда), это любое значение кроме 0 или false (ложь), то цикл выполняет по кругу все операторы которые расположены внутри его тела, то есть между фигурными скобками до тех пор пока условие истенно. Как только условие стало равно 0 или false (ложь), то цикл тут же прекращает выполнять операторы в своем теле и передает работу следующему за ним оператору. Короче цикл проверяет условие, ели правда то выполняет все операторы по очереди в своем теле, а потом снова смотрит условие. Если правда то выполняет все операторы еще раз. И так до тех пор пока условие не станет неправдой.

Возвращаемся к нашим баранам. Строка под номером 1 while(!PINB.0); В скобках стоит условие !PINB.0. Шо сиё означает? Восклицательный знак как бы переворачивает значение в другую сторону. Можно перевести его как приставку НЕ. Если в условии написано !true подставляем приставку НЕ и получаем НЕправда то есть ложь. Надпись PINB.0 говорит МК чтобы тот прочитал из порта В со входа 0 значение. Так как у нас к нему подключена кнопка, то мы можем получить значение либо 0, либо 1. Если кнопка не нажата, то значение 0, а если нажата, то 1 (если не понятно смотрим схему). Отсюда становиться понятно смысл цикла. Так как у цикла нет тела, то он просто будет проверять условие и ждать до тех пор пока оно не станет ложью и гордо выйдет из него. Раз мы условились что при отжатой кнопке у нас на входе 0, а это для цикла ложь, то тут нам и поможет восклицательный знак. Пока кнопка не нажата цикл считает что это правда и крутится по кругу, но как только мы нажали на кнопку, условие сменилось на правду с восклицательным знаком, то есть стала ложью и цикл передал работу следующему за ним оператору. Это строка под номером 2. Рассмотрим ее.

Оператор условия:

If(условие)

{


Поделиться с друзьями:

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.01 с.