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


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 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

ножки режим работы сигнал назначение
PB0 выход   светодиод выключен
PB1 выход   транзистор выключен
PB2 ВХОД Z определение исправности цепи нагрузки

"Z" - означает вход с высоким сопротивлением - т.е. без подтяжки,
считайте что его сопротивление более 10 МОм.

PORTD

ножки режим работы сигнал назначение
PD0... PD5 вход с подтяжкой зависит от SW1 разряды от 0 до 6 набора времени таймера
PD6 вход с подтяжкой зависит от SW3 запуск таймера
PD7 вход с подтяжкой зависит от подключения ножки PD7 длительность включения нагрузки

вход с подтяжкой (или pull-up - с англ. тянуть вверх) это вход "Z" к которому "как бы" подключен резистор примерно 40 КОм от + питания МК.

PORTC

ножки режим работы сигнал назначение
PС0... PС5 вход с подтяжкой зависит от SW2 разряды от 7 до 12 набора времени таймера

 

Других настроек для нашей задачи не требуется.

3) Сохраняем сгенерированный текст программы на Си. c:\VMLAB\_timerM8\main.c и файл проекта c:\VMLAB\_timerM8\cv.prj

4) Будем наращивать на созданный мастером скелет программы main.c - свой текст (код) который реализует работу таймера. Придумывать алгоритм будем по ходу работы.

Создаем заголовок программы и объявляем глобальные переменные:

/*************************************
AVR123.nm.ru

Project: timer
Date: 06.05.2005
Author: Termo


Chip type: ATmega8
Clock frequency: 1,000000 MHz
**************************************/

#include <mega8.h>
//подключил библиотеку с описанием регистров МК

#include <delay.h>
// добавил библиотеку выполнения пауз

// Declare your global variables here
// Объявите глобальные переменные здесь

unsigned int time_val @10;
/* число сколько раз надо отсчитать по 0,2 сек.

Двух байтовая переменная time_val

Младший байт числа будет в регистре 10 а старший в регистре 11 и при отладке можно будет увидеть состояние SW1 SW2 */


unsigned char SW3_state;
// состояние SW3 - это напряжение на PD6

unsigned char ctr;
// вспомогательная переменная для счетчика

Обязательная для программ на Си главная функция:

void main(void) { // Declare your local variables here // приглашение объявить локальные переменные, // но нам они не нужны. // Дальше оставим без изменения то что написал // Мастер начальной конфигурации МК: // Input/Output Ports initialization PORTB=0x01; DDRB=0x03; PORTC=0x3F; DDRC=0x00; PORTD=0xFF; DDRD=0x00; // Пропускаю большой кусок кода // External Interrupt(s) initialization // INT0: Off // INT1: Off MCUCR=0x00; // настройка прерываний от внешних сигналов // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Analog Comparator initialization // Analog Comparator: Off // An.Comp. Input Capture by Timer_ 1: Off ACSR=0x80; SFIOR=0x00;  
   

Выше есть код конфигурирующий порты МК. Рассмотрим строку:

PORTC = 0x3F;

Она означает: присвоить переменной PORTC значение 3Fh или 0011 1111 в сочетании с нулем в регистре DDRC это включит подтяжку входов для ножек порт_С с 5-й по 0-ю или PC5_PC0 - что мы и заказывали визаду.

Добавляем текст в программу:

     
  ////////////////////////////////////// // Program starts here // =================================== PORTB.0 = 0; // включить светодиод delay_ms(1000); // пауза 1000 мС или 1 сек  
     
       


Нам нужно определить 12 разрядов числа отсчетов интервалов времени по 200 мС по состоянию переключателей SW1 и SW2. Максимальное время отрабатываемое таймером приблизительно 4095 * 0,2 = 819 сек или 13 минут 39 сек.
Если переключатель в SW1 SW2 замыкает вывод на "землю" на этом выводе будет "0" и конечно "0" будет в соответствующем регистре PINx и в соответствующем разряде (бите) в 12 битном числе таймера.

Если переключатель SW1 SW2 не замкнут то подтяжка создает
на входе высокий логический уровень "1".

     
  time_val = 0; // обнуляем переменную // читаем SW1 - это 6 млад. бит порта_D // и записываем в биты 5_0 time_val time_val = PIND & 0b00111111; // читаем SW2 - это 6 младших бит порта_C // и записываем в биты 11_6 time_val time_val = time_val + ((PINC & 0b00111111)<<6);  
     


По схеме подключения переключателей SW1 и SW2 в числах взятых из регистров PIND и PINC нам нужно оставить только 6 младших бит - т.е. обнулить биты 7 и 6.

Сделаем это с помощью поразрядного логического И с битовой маской: 0b00111111

В результате биты числа на которое налагается маска не изменятся напротив единиц в маске и обнуляются напротив нулей в маске.

После наложения битовой маски состояние SW1 записывается в time_val
А вот состояние SW2 нужно записать в биты 11_6 переменной time_val

Что бы сделать это нужно сдвинуть в лево на 6 позиций число полученное после наложения маски на значение регистра PINC - это делается вот так:

<< 6

После сдвига полученное число складываем со значением уже хранящимся в time_val и результат помещаем (присваиваем) в time_val

Теперь в битах 11_0 переменной time_val содержится 12-битный результат опроса состояния переключателей SW1 и SW2.

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



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