Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Лабораторная работа № 3. Универсальный таймерЦель задачи: 1) Закрепить навыки программирования и работы в компиляторе CodeVisionAVR 2) Учиться моделировать работу электронного устройства в симуляторе VMLAB - подробности с картинками. 3) Сделать универсальный таймер на микроконтроллере ATMega8 с дискретной установкой времени. Ход выполнения работы: В работе рассматривается пример таймера с дискретной установкой времени (рис. 3.1). Время таймера устанавливается с помощью двух «рояльных» (по 6 контактов в корпусе) переключателей - SW1 и SW2. Всего имеется 12 контактов, которыми можно замкнуть вывод МК на «общий» провод и таким образом закодировать 12 битное двоичное число. Это позволит сделать любую выдержку от 0 до 4095 временных интервалов-отсчетов. Каждый отсчет будем делать по 0,2 сек. Значит, таймер сможет отработать задержку до 13 минут 39 сек. с шагом в 0.2 сек. Таймер начинает счет при изменении состояния кнопки SW3.Если при включении питания таймера кнопка была разомкнута, то таймер начнет отсчет после замыкания кнопки и будет считать уже не зависимо от состояния кнопки. Если при включении питания таймера кнопка была замкнута, то таймер начнет отсчет после размыкания кнопки, и тоже будет считать, уже не зависимо от "состояния кнопки". Напишем программу: Так как программа будет проверяться в симуляторе VMLAB то сделаем одну папку c:\VMLAB\_timerM8 для всех нужных нам файлов симулятора и компилятора. 1) запускаем компилятор CodeVisionAVR и "кликаем" файл -> новый -> проект -> выбираем "CodeWizardAVR". Выбираем микроконтроллер ATmega8 и частоту 1 МГц Рисунок 3.2 Выбор микроконтроллера и частоты тактирования Частота тактирования 1 МГц нас устраивает. 2) переходим в раздел порты Рисунок 3.3 Настройка портов
В этих трех ярлыках-закладках устанавливаем направления работы и PORTB
"Z" - означает вход с высоким сопротивлением - т.е. без подтяжки, PORTD
вход с подтяжкой (или pull-up - с англ. тянуть вверх) это вход "Z" к которому "как бы" подключен резистор примерно 40 КОм от + питания МК. PORTC
Других настроек для нашей задачи не требуется. 3) Сохраняем сгенерированный текст программы на Си. c:\VMLAB\_timerM8\main.c и файл проекта c:\VMLAB\_timerM8\cv.prj 4) Будем наращивать на созданный мастером скелет программы main.c - свой текст (код) который реализует работу таймера. Придумывать алгоритм будем по ходу работы. Создаем заголовок программы и объявляем глобальные переменные: /************************************* Project: timer
#include <mega8.h> #include <delay.h> // Declare your global variables here unsigned int time_val @10; Двух байтовая переменная time_val Младший байт числа будет в регистре 10 а старший в регистре 11 и при отладке можно будет увидеть состояние SW1 SW2 */
unsigned char ctr; Обязательная для программ на Си главная функция:
Выше есть код конфигурирующий порты МК. Рассмотрим строку: PORTC = 0x3F; Она означает: присвоить переменной PORTC значение 3Fh или 0011 1111 в сочетании с нулем в регистре DDRC это включит подтяжку входов для ножек порт_С с 5-й по 0-ю или PC5_PC0 - что мы и заказывали визаду. Добавляем текст в программу:
Если переключатель SW1 SW2 не замкнут то подтяжка создает
Сделаем это с помощью поразрядного логического И с битовой маской: 0b00111111 В результате биты числа на которое налагается маска не изменятся напротив единиц в маске и обнуляются напротив нулей в маске. После наложения битовой маски состояние SW1 записывается в time_val Что бы сделать это нужно сдвинуть в лево на 6 позиций число полученное после наложения маски на значение регистра PINC - это делается вот так: << 6 После сдвига полученное число складываем со значением уже хранящимся в time_val и результат помещаем (присваиваем) в time_val Теперь в битах 11_0 переменной time_val содержится 12-битный результат опроса состояния переключателей SW1 и SW2.
|