Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Добавим в программу код проверяющий исправность и наличие нагрузки





     
  // Нужно проверить исправность цепи // нагрузки полевого транзистора if (PINB.2 == 0) { /* Если на PB2 лог. "0" - нагрузка неисправна или не подключена */ while (1) { // будем быстро мигать (период 0.3 сек // до устранения неисправности и нового // включения питания таймера delay_ms(150); // пауза 150 мС PORTB.0 = 1; // вЫкл светодиод delay_ms(150); // пауза 150 мС PORTB.0 = 0; // вкл светодиод }; // это закрыв. скобка для while } // это закрыв. скобка для if // Если мы в этом месте программы, значит // нагрузка исправна и на PB2 есть "1".  

Добавим код запускающий таймер при изменении SW3
Таймер должен начинать счет при изменении состояния кнопки SW3 - очевидно нужно определить ее состояние и затем ждать когда оно изменится. Процесс ожидания подтверждает так же что МК определил исправность и наличие нагрузки. Для индикации того что мы находимся в ожидании запуска таймера добавим медленное мигание светодиода с периодом 1.4 Сек.

     
  // Нужно определить состояние SW3 SW3_state = PIND.6; /* Если SW3 разомкнут, то подтяжка создаст на PD6 уровень "1", а если SW3 замкнут то на PD6 будет потенциал GND - это "0". Значит в SW3_state будет записана 1 или 0 */ ctr = 0; // обнулить вспомогательный счетчик /* Теперь будем ждать изменения состояния SW3 и мигать не спешно (период 1,4 сек) светодиодом в цикле while */ while (PIND.6 == SW3_state) { // пока SW3 не изменился... delay_ms(20); // пауза 20 мс ctr++; /* увеличить значение переменной на 1 т.е. посчитать еще один интервал в 20 мСек */ // каждые 700 мс... if (ctr == 35){ /* если прошло 35 раз по 20 мСек */ ctr = 0; /* обнулить счетчик для начала отсчета следующих 700 мСек */ PORTB.0 ^= 1; // ПЕРЕключить светодиод }; // скобка для if }; // скобка для while /* Если мы в этом месте программы, значит состояние SW3 изменилось */  
     

Разберем строку:

while (PIND.6 == SW3_state)

Условие выполнения цикла while() это результат сравнения значений считанных с ножки подключенной к SW3 (этоPIND.6) и из переменной SW3_state хранящей прошлое состояние SW3. Пока эти значения равны - в скобках () у while будет истина и тело цикла между { } будет выполнятся.

Опрос кнопки происходит примерно каждые 20 мС. Эти промежутки времени подсчитываются и при насчете 700 мС происходит изменение состояния светодиода.

При изменении состояния SW3 условие у while() станет "ложно" и программа покинет цикл ожидания этого изменения.

Теперь надо запустить отсчет интервалов в 0.2 сек столько раз сколько содержится в переменной time_val

     
  // необязательно, но я добавил 1 // к количеству отсчетов time_val++; ctr = 0; // обнулил счетчик /* для отсчета времени таймера опять используем цикл while - он будет выполняться пока переменная time_val больше 1. */ while (time_val > 1){ delay_ms(194); // я делаю паузу 194 мС вместо 200, так как // различные вычисления тоже потребуют времени // ++++++++++++++++++++++++++++++ /* Следующий кусок программы делает хитрое мигание светодиодом с коротким временем горения и длинным не горением. */ ctr++; // добавить к счетчику 1 if (ctr < 2) { PORTB.0 = 0; // включить светодиод } else { PORTB.0 = 1; // вЫключить светодиод }; if (ctr > 5) { ctr = 0; // обнулить счетчик } // конец кода "хитрого" мигания // ++++++++++++++++++++++++++++++ time_val--; // вычесть 1 из переменной time_val };  
     


В этом куске кода интересно мигание светодиодом с разным временем
горения и не горения. Посмотрите, благодаря строкам:

ctr++;

и

if (ctr > 5) {
ctr = 0; // обнулить счетчик
}

значение переменной ctr меняется от 1 до 6.

А по куску программы:

if (ctr < 2) {
PORTB.0 = 0; // включить светодиод
}
else {
PORTB.0 = 1; // вЫключить светодиод
};

видно, что светодиод зажигается только при ctr равном 1.

Значит светодиод будет гореть 1 прогон цикла while() - это 200 мС, а выключен он будет 5 раз по 200 мС т.е. целую секунду. Таким образом период мигания светодиода составит 1,2 Сек.

Задержка отработана - нужно включать нагрузку

Для этого мы откроем полевой транзистор подав на его затвор
уровень логической "1" и еще включим светодиод.

     
  PORTB.1 = 1; // открыть транзистор PORTB.0 = 0; // включить светодиод  
     

Нагрузку можно включить на 2 секунды или "на совсем" - т.е. пока подается питание на МК. Определяет это ножка PD7 - если она свободна то подтяжка на ней создает "1" и нагрузка будет включаться на 2 секунды. Если PD7 замкнута на землю, на ней будет "0" и нагрузка включится "на совсем".

     
  // Если на PD7 "1" if (PIND.7 == 1) { // можно было бы так написать: if (PIND.7) { // delay_ms(2000); // сделать паузу 2 сек. PORTB.1 = 0; // вЫключить транзистор PORTB.0 = 1; // вЫключить светодиод };  
     

Завершение программы

     
  // программа завершена while (1); // делать эту строчку "вечно" } // закрывающая скобка для main()  

5) "делаем" проект, т.е. компилируем программу нажав соотв. иконку:

Получаем сообщение об успешной компиляции и отсутствии ошибок и "вонингов".

В папке c:\VMLAB\_timerM8\ появилось много разных файлов, нам нужны:

- прошивка main.hex

- исходник Си связанный с файлом.cof для симулятора main__.c

- main.cof файл для симуляции с движением по коду на Си. Он сожержит связь содержимого первых двух файлов.

- cv.prj - это файл проекта CodeVisionAVR

6) для проверки программы в VMLAB

нужно создать файл проекта для VMLAB: c:\VMLAB\_timerM8\vmlab.prj

В нем будет описан применяемый МК и то, что в нем и что к нему подключено.

В этом файле не рекомендуется использовать русский шрифт, поэтому там все по аглицки но думаю понятно.

Напомню, что комментарии в VMLAB пишутся в одну строчку после точки с запятой!

В начале как обычно заголовок

; **************************
; Timer simulation CodeVision + VMLAB

; more info: http://avr123.nm.ru


; ***************************
; Micro + software running
; -----------------------------------

Указываем симулятору какой МК симулировать:
.MICRO "ATmega8"
.TOOLCHAIN "GENERIC"

Указываем симулятору в каких файлах содержится необходимая для симуляции информация.
.TARGET "main.hex"; Proshivka v MK
.COFF "main.cof"
.SOURCE "main__.c"

Date: 2016-01-20; view: 547; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию