Рисунок 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].
Редактор схем 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].
шахматный часы плата микроконтроллер
В начале процесса разработки было определенно, что в качестве дисплея
будет использоваться два 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 - Площадка для программирования микроконтроллеров
Необходимо было выбрать подходящую среду. В библиотеке 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].
Для корректной работы устройства, необходимо организовать важную функцию
- прерывание.
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].
Для того чтобы выводить информацию на индикаторы, надо правильно
настроить, вывод информации.
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].
Для работы нажатия кнопок необходимо написать код для каждой кнопки,
чтобы микроконтроллер знал какое действие надо выполнить при нажатии каждой
кнопки.
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].