
- •1 Задание на курсовую работу
- •2 Разработка принципиальной схемы устройства
- •2.1 Аналоговая часть
- •2.2 Цифровая часть
- •3 Протокол обмена данными с компьютером
- •4 Разработка программного обеспечения контроллера
- •5 Тестирование программы
- •6 Алгоритм программного продукта
- •7 Листинг программы
- •8 Принципиальная схема устройства
4 Разработка программного обеспечения контроллера
Выбрана следующая настройка битов конфигурации контроллера:
High Fuse Byte = 0x99 – Внутрисхемный отладчик, CKOPT, сохранение данных EEPROM при стирании, переход к загрузчику - отключены, JTAG, последовательная запись данных – включены.
Extended fuse = 0x03 – Режим совместимости с AtMega103 отключен, WDT отключен.
Low Fuse Byte = 0xEE – BOR отключено, время запуска после сброса – по умолчанию, тактовый генератор работает от внешнего высокочастотного кварца с диапазоном 3-8 МГц.
Разрабатываемую программу можно разбить на четыре процесса, протекающих параллельно и связанных только в нескольких ключевых точках:
Измерение данных
Передача данных (момент начала передачи привязан к готовности данных)
Прием пакета и сброс флагов ошибки
Тест системы (должен производиться только в то время, когда ОЗУ свободно)
Процесс измерения является основным, он запускает передачу данных в нужный момент, а также запускает процесс самотестирования.
По заданию требуется 30 раз в секунду получать данные для всех 4 каналов, причем каждый канал нужно измерить 4 раза и усреднить по этим отсчетам данные. Для этого настраивается таймер на генерацию 30*4*4 = 480 отсчетов в секунду.
По каждому отсчету таймера запускается АЦП.
По прерыванию по завершению измерения АЦП производится считывание измеренных данных, их прибавление к сумме и переключение на следующий канал. После третьего канала производится возврат к нулевому каналу. При получении 4 отсчетов для каждого канала производится усреднение и запись данных в ОЗУ. Причем для проведения теста ОЗУ запись производится только при получении нечетной выборки, при этом результаты четной выборки хранятся в специальном буфере rezbuf и записываются в ОЗУ вместе с результатами предыдущей нечетной выборки.
Такой алгоритм запуска АЦП выбран для того чтобы ввести паузу между переключением внутреннего мультиплексора и измерением, необходимую для перезаряда внутренних емкостей аналоговых линий микроконтроллера.
Для получения ровно 480 отсчетов в секунду нужно разделить тактовую частоту контроллера 7372800 Гц на 480:
7372800 / 480 = 15360
Нужно запрограммировать таймер таким образом, чтобы он генерировал прерывания каждые 15360 тактов. Можно заметить, что 15360 = 240*64, поэтому можно использовать 8-ми битный Timer0 с делителем на 64. Число 240 заносится в регистр сравнения таймера. Используются прерывания от модуля сравнения таймера, и в каждом прерывании к значению регистра сравнения прибавляется 240. Это позволяет получить точное число отсчетов в секунду, даже если прерывания не будут обрабатываться сразу после наступления события, например из-за занятости контроллера процедурой обработки другого прерывания.
При получении очередного отсчета АЦП производятся следующие действия:
- Вычисляется номер двухбайтовой ячейки в массиве adcsigma
- Считывается результат преобразования АЦП и прибавляется к выбранной ячейке
- Увеличивается номер канала (и одновременно – ячейки). Если следующий номер – 3, то происходит возврат к номеру 0. Номер канала хранится непосредственно в регистре управления мультиплексором АЦП.
- Увеличивается количество отсчетов adcnum. Если получено меньше 4 отсчетов, то процедура завершается
- Если получено 4 отсчета, то они обрабатываются следующим образом:
- Определяется позиция в массиве выходных данных на основе счетчика выходных данных arrpos.
- Каждая из 4 двухбайтовых ячеек массива adcsigma считывается, делится на 16 (на 4 – из-за усреднения, и на 4 – чтобы результат лежал в диапазоне 0..255), и записывается в массив выходных данных.
- Массив adcsigma обнуляется.
- Позиция в массиве arrpos увеличивается на 1.Если новая позиция =3600, arrpos сбрасывается.
- При значении arrpos=3489 запускается передача массива данных в порт.
Основной массив данных включает в себя 14405 байт информации. Со скоростью 38400, при параметрах передачи 8N1 передача всего пакета займет 3751,3 миллисекунд. Передача одного байта занимает 0,2604мс. Рассчитаем момент начала передачи таким образом, чтобы к моменту получения последних 4 отсчетов передавать оставалось 10 байт информации (с небольшим перекрытием):
3751,3 – 0,2604*10 = за 3748,69 миллисекунды до завершения последнего измерения. Момент времени можно задавать при выбранном алгоритме только с точностью 0.033 секунды. Выберем момент запуска равным 120-3,7 секунды, то есть 3489 отсчет. На момент получения 3600 отсчета будет передаваться 3700/ 0.2604 = 14209 байт.
Передача завершится через (14405-14209) * 0.2604 = 51,04 миллисекунды после завершения измерения.
Такой сложный алгоритм запуска передачи выбран для того, чтобы провести тест внешней памяти в тот момент, когда данные в ней не используются. После завершения передачи до момента, когда алгоритм получения данных будет записывать данные во внешнее ОЗУ, останется около 49 миллисекунд на тест ОЗУ – все данные на этот момент будут переданы, а результаты нового измерения ещё будут накапливаться во внутреннем ОЗУ, в буфере adcsigma и rezbuf.