Дипломная (вкр): Проектирование и создание шахматных часов с функцией будильника на основе микроконтроллера

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Рисунок 22 - 2D вид платы в Proteus

Несмотря на то, что программа работает с устройствами, состоящими из нескольких микроконтроллеров и даже с чипами от разных производителей в одном устройстве, необходимо четко понимать, что симуляция повторяет работу реальной схемы не абсолютно точно. Чтобы избежать ошибок, нужно ясно представлять конечный результат [13].VSM является коммерческим продуктом. Есть бесплатная демонстрационная версия. Она обладает всеми функциями и возможностями платного пакета, но не позволяет сохранить или распечатать результат работы, создать свой собственный микроконтроллер [13].

Меню программы англоязычное. Полного русификатора для Proteus VSM нет. Устанавливать программу необходимо в папку без кириллических символов в названии [13].

Рисунок 23 - 3D вид платы в Proteus

Работает во всех операционных системах, начиная с версии 7.8 [13].

Отличительными особенностями является:

Поддерживаемые этапы разработки:

Разработка схемы электрической принципиальной (ввод в графическом редакторе)

Моделирование схемы с использованием разнообразных виртуальных приборов

Разработка печатной платы, включая 3D-визуализацию её сборки

Возможности отладки микропрограммного обеспечения

совместное моделирование работы микроконтроллера, исполняющего заданную программу, и окружающих его аналоговой и цифровой схем

широкие отладочные возможности, в т.ч. доступ к содержимому регистров и памяти, задание точек останова программы, пошаговое выполнение

отладка на уровне исходного кода (Си, Бейсик, Ассемблер, в зависимости от типа используемого для отладки файла с испытываемым микропрограммным обеспечением)

поддержка нескольких семейств микроконтроллеров от разных производителей, в т.ч.:

- PIC12, PIC16, PIC18 и PIC24 (Microchip).

- 8051/8052, в т.ч. производные от них, выпускаемые Philips и Atmel.

- AVR, Tiny AVR и Mega AVR (Atmel).

ARM7, в т.ч. LPC2000 (NXP).

HC11 (Freescale) и микроконтроллерные модули BASIC Stamp (Parallax).

- Ведется работа по добавлению поддержки других МК.

Преимущества:

Выполнение всех этапов разработки электронного устройства на основе микроконтроллера в единой среде.

Возможность написания, отладки и тестирования микропрограммного обеспечения еще до физического изготовления опытного образца системы.

Генерируемые диагностические сообщения (например, при выполнении непредусмотренной инструкции) как со стороны ЦПУ, так и со стороны моделей устройств ввода-вывода, позволяют обнаружить сложные в поиске ошибки программирования.

Ускоряет процесс разработки электронного устройства.

Поддержка совместной работы с аппаратными устройствами, подключенными через порт компьютера [14].

2.3 sPlan - программа для создания электронных схем


Редактор схем sPlan разрабатывался с начала 2000-х годов немецкой фирмой ABAKOM. Программа поддерживается и в настоящее время, на данный момент последняя версия sPlan 7.0. С документацией по всем функциям программы можно ознакомиться, используя встроенную справку (на английском языке) [15].

Рисунок 24 - Окно программы sPlan 7.0

Данная программа для создания схем, хорошо работает с векторной графикой своего формата, а также имеет все необходимые функции, что нужны инженеру, да и простому электрику для создания хорошего чертежа либо электронной или электрической схемы. В sPlan есть такая возможность как экспорт векторной графики в растровую, и её дальнейшая печать в различном масштабе. Программа может создавать из простых фигур и элементов типа точки, прямой, окружности и т.д., сложные элементы с их использованием как шаблоны [15].

Главной функцией программы sPlan, является проектирование и разработка электронных принципиальных схем. Специально для этого, разработчиками сделана весьма большая база различных геометрических заготовок - обозначения электронных элементов. В также имеются все элементы, что могут, пригодится в создании принципиальной электрической и электронной схемы. Если, вдруг необходимого элемента нет, то Вы сами можете его сделать из простых фигур, а после сохранить в основной библиотеке. Программа sPlan включает в себя такие группы электрических элементов как: элементы питания, акустика, конденсаторы, сигнализаторы, антенны, разъёмы, реле, цифровые элементы, диоды, двигатели, различные транзисторы, тиристоры, плавкие вставки, различные генераторы, магазин индуктивностей, условные обозначения, основные и дополнительные приборы измерения, всяческие усилители, сопротивления, переключатели и выключатели, трансформаторы, лампы и множество других компонентов [16].

Кроме основного заложенного изначально набора готовых компонентов, программа sPlan также имеет такие в себе возможности как построения чертежей при помощи: прямоугольника, эллипса, произвольная формы, замкнутые и незамкнутые ломаные, кривые, пересечение прямых с соединением через точку, одно строчный и много строчный текст, произвольное изображение в растровом виде. В программе sPlan имеется такая функция как увеличительное стекло, что помогает при установки желаемого масштаба рабочего пространства, элемент редактирования для различного выделения, перемещения и удаления имеющихся объектов на чертеже, много градусный поворот элемента на требуемый угол, создание дубликата помеченных компонентов, зеркальное отражение по горизонтали и вертикали, пропорциональное изменение размера, а также поиск по имени и т.д. [16].

Вся графика в программе sPlan опирается на сетку, что непосредственно привязана к горизонтальной и вертикальной линейке. Это позволяет перемещать объекты только на определённые расстояния: по умолчанию - это 1мм. При необходимости переместить элемент на свободное расстояние, нужно делать это, нажав соответственно клавишу Shift на своей клавиатуре. Как и большинство нынешних редакторов, программа sPlan имеет хорошую возможность отмены произведённых действий сочетанием клавиш Ctrl+Z, а также, при необходимости, их повторения клавишами Ctrl+Y. Плюс ко всему этому, каждому компоненту чертежа, возможно, присвоить своё имя, личный номинал и желаемое описание [16].

Замечательной особенностью данного графического редактора также является его многосторонность, то есть, один чертёж, вполне может содержать в себе несколько различных листов, что можно при необходимости сохранить в один единый файл, как по отдельности, так и все вместе [16].

шахматный часы плата микроконтроллер

3. Разработка шахматных часов на микроконтроллере

.1 Выбор компонентов


В начале процесса разработки было определенно, что в качестве дисплея будет использоваться два 7-сегментных диодных индикатора, представленных на рисунке 25 [17]:

Рисунок 25 - 7-сегментный четырехразрядный светодиодный индикатор

Для управления достаточно было 5 кнопок - «Игрок 1», «Игрок 2», «Сброс», «Настройка» и «Пауза» (рисунок 26) [17]:

Рисунок 26 - Кнопка четырёхконтактная

С выбором микроконтроллера проблем не возникло: будет использоваться ATmega8 от Atmel - 23 пина ввода/вывода, два 8-битных таймера, один 16-битный, частота - до 16 Мгц, маленькое потребление (1-3.6 мА), дешевый ($2). В общем, для начала - более чем достаточно [17].

Рисунок 27 - Микроконтроллер Atmega8-16PU

Для прошивки микроконтроллера под Windows требуется установка драйвера. В остальном проблем нет. Попробовали использовать связку AVR Studio + eXtreme Burner в Windows. Всё работает отлично.

Конечно же, требуется программатор. На рынке предлагается много вариантов - от самых дешевых ISP (In-System Programming) программаторов за несколько долларов, до мощных программаторов-отладчиков за несколько сотен долларов. Было решено попробовать один из самых простых и дешевых - USBasp. На самом деле, это китайская версия программатора от Thomas Fischl. Несмотря на это, работает он хорошо. К тому же поддерживает достаточно много AVR контроллеров серий ATmega и ATtiny. Под Linux не требует установки драйвера [17].

Рисунок 28 - Программатор USBasp

Для прошивки необходимо соединить выходы программатора VCC, GND, RESET, SCK, MOSI, MISO с соответствующими выходами микроконтроллера. В данном исследовании использовалась готовая площадка для контроллеров ATmega8, ATmega48, ATmega88 [17].

Рисунок 29 - Площадка для программирования микроконтроллеров

.2 Разработка схемы и программного кода


Необходимо было выбрать подходящую среду. В библиотеке Multisim отсутствуют AVR микроконтроллеры, а sPlan подходит только как среда для разработки схемы. Потому была выбрана программа Proteus, ввиду того что она отлично работает с AVR микроконтроллерами.

После некоторого времени, проведённого в среде Proteus, была сделана схема, представленная на рисунке 30 [17]:

Рисунок 30 - Схема шахматных часов в среде Proteus

Следующим этапом после создания схемы являлось программирование микроконтроллера ATmega8.

Программировать AVR контроллеры можно как на ассемблере (AVR assembler), так и на Си. Тут каждый должен сделать свой выбор сам в зависимости от конкретной задачи и своих предпочтений. При программировании на ассемблере архитектура устройства становится понятнее и появляется ощущение, что разбираешься непосредственно во внутренностях контроллера. К тому же в особенно критических по размеру и производительности программах знание ассемблера может очень пригодиться. Выбор был сделан в пользу Си.

Начинать следует с точки входа программы - функции main. На самом деле ничего примечательного в ней нет - настройка портов, инициализация данных и бесконечный цикл обработки нажатий кнопок. А также вызов sei() - разрешение обработки прерываний, о них немного позже [17].

int main(void)

{_io();_data();_off();();(1)

{_buttons();

}0;

}

Рассмотрим каждую функцию в отдельности [17].

void init_io()

{

// set output= 0xFF;= 0xFF;

// set input= 0b11100000;

// pull-up resistors|= 0b00011111;

// timer interrupts= (1<<OCIE1A) | (1<<TOIE0);|= (1 << CS01) | (1 << CS00);B = (1<<CS12|1<<WGM12);

//OCRn = (clock_speed / prescaler) * seconds - 11A = (F_CPU / 256) * 1 -1;

}

Настройка портов ввода/вывода происходит очень просто - в регистр DDRx (где x - буква, обозначающая порт) записывается число, каждый бит которого означает, будет ли соответствующий пин устройством ввода (соответствует 0) либо вывода (соответствует 1). Таким образом, заслав в DDRB и DDRD число 0xFF, мы сделали B и D портами вывода. Соответственно, команда DDRC = 0b11100000; превращает первые 5 пинов порта C во входные пины, а оставшиеся - в выходные. Команда PORTC |= 0b00011111; включает внутренние подтягивающие резисторы на 5 входах контроллера. Согласно схеме, к этим входам подключены кнопки, которые при нажатии замкнут их на землю. Таким образом, контроллер понимает, что кнопка нажата [17].

Далее следует настройка двух таймеров, Timer0 и Timer1. Первый используется для обновления индикаторов, а второй - для обратного отсчета времени, предварительно настроив его на срабатывание каждую секунду. Подробное описание всех констант и метода настройки таймера на определенный интервал можно найти в документации к ATmega8 [17].

3.2.1 Обработка прерываний

Для корректной работы устройства, необходимо организовать важную функцию - прерывание.

ISR (TIMER0_OVF_vect)

{();(_buzzer > 0)

{

_buzzer--;(_buzzer == 0)_off();

}

}(TIMER1_COMPA_vect)

{(ActiveTimer == 1 && Timer1 > 0)

{--;(Timer1 == 0)_timeoff();

}(ActiveTimer == 2 && Timer2 > 0)

{--;(Timer2 == 0)_timeoff();

}

}

При срабатывании таймера управление передается соответствующему обработчику прерывания. В нашем случае, это обработчик TIMER0_OVF_vect, который вызывает процедуру вывода времени на индикаторы, и TIMER1_COMPA_vect, который обрабатывает обратный отсчет [17].

3.2.2 Вывод на индикаторы

Для того чтобы выводить информацию на индикаторы, надо правильно настроить, вывод информации.

void display()

{_number((Timer1/60)/10,0b00001000);

_delay_ms(0.25);_number((Timer1/60)%10,0b00000100); _delay_ms(0.25);_number((Timer1%60)/10,0b00000010); _delay_ms(0.25);_number((Timer1%60)%10,0b00000001); _delay_ms(0.25);_number((Timer2/60)/10,0b10000000); _delay_ms(0.25);_number((Timer2/60)%10,0b01000000); _delay_ms(0.25);_number((Timer2%60)/10,0b00100000); _delay_ms(0.25);_number((Timer2%60)%10,0b00010000); _delay_ms(0.25);= 0;

}display_number(int number, int mask)

{= number_mask(number);= mask;

}

Функция display использует метод динамической индикации. Дело в том, что каждый отдельно взятый индикатор имеет 9 контактов (7 для управления сегментами, 1 для точки и 1 для питания). Для управления 4 цифрами понадобилось бы 36 контактов. Слишком расточительно. Поэтому вывод разрядов на индикатор с несколькими цифрами организован по следующему принципу (рисунок 31) [17]:

Рисунок 31 - Принцип подключения индикаторов

Напряжение поочередно подается на каждый из общих контактов, что позволяет высветить на соответствующем индикаторе нужную цифру при помощи одних и тех же 8 управляющих контактов. При достаточно высокой частоте вывода это выглядит для глаза как статическая картинка. Именно поэтому все 8 питающих контактов обоих индикаторов на схеме подключены к 8 выходам порта D, а 16 управляющих сегментами контактов соединены попарно и подключены к 8 выходам порта B. Таким образом, функция display с задержкой в 0.25 мс попеременно выводит нужную цифру на каждый из индикаторов. Под конец отключаются все выходы, подающие напряжение на индикаторы (команда PORTD = 0;). Если этого не сделать, то последняя выводимая цифра будет продолжать гореть до следующего вызова функции display, что приведет к ее более яркому свечению по сравнению с остальными [17].

3.2.3 Обработка нажатий кнопок

Для работы нажатия кнопок необходимо написать код для каждой кнопки, чтобы микроконтроллер знал какое действие надо выполнить при нажатии каждой кнопки.

void handle_buttons()

{_button(KEY_SETUP);_button(KEY_RESET);_button(KEY_PAUSE);_button(KEY_PLAYER1);_button(KEY_PLAYER2);

}handle_button(int key)

{bit;(key)

{KEY_SETUP:bit = SETUP_BIT; break;KEY_RESET:bit = RESET_BIT; break;KEY_PAUSE:bit = PAUSE_BIT; break;KEY_PLAYER1:bit = PLAYER1_BIT; break;KEY_PLAYER2: bit = PLAYER2_BIT; break;: return;

}(bit_is_clear(BUTTON_PIN, bit))

{(_pressed == 0)

{

_delay_ms(DEBOUNCE_TIME);(bit_is_clear(BUTTON_PIN, bit))

{|= key;

// key action(key)

{KEY_SETUP: process_setup(); break;KEY_RESET: process_reset(); break;KEY_PAUSE: process_pause(); break;KEY_PLAYER1: process_player1(); break;KEY_PLAYER2: process_player2(); break;

}_on(15);

}

}

{&= ~key;

}

}

Эта функция по очереди опрашивает все 5 кнопок и обрабатывает нажатие, если такое случилось. Нажатие регистрируется проверкой bit_is_clear(BUTTON_PIN, bit), т.е. кнопка нажата в том случае, если соответствующий ей вход соединён с землёй, что и произойдёт, согласно схеме, при нажатии кнопки. Задержка длительностью DEBOUNCE_TIME и повторная проверка нужна во избежание множественных лишних срабатываний из-за дребезга контактов. Сохранение статуса нажатия в соответствующих битах переменной _pressed используется для исключения повторного срабатывания при длительном нажатии на кнопку.

Функции обработки нажатий достаточно тривиальны и, полагаю, что в дополнительных комментариях не нуждаются [17].

Источник: https://www.bibliofond.ru/detail.aspx?id=863615