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

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

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

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

2017-12-21 188
Продолжаем тему программирования микроконтроллеров 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.015 с.