Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
20.06.2014
Размер:
920.58 Кб
Скачать

4 Разработка программного обеспечения контроллера

Выбрана следующая настройка битов конфигурации контроллера:

High Fuse Byte = 0x99 – Внутрисхемный отладчик, CKOPT, сохранение данных EEPROM при стирании, переход к загрузчику - отключены, JTAG, последовательная запись данных – включены.

Extended fuse = 0x03 – Режим совместимости с AtMega103 отключен, WDT отключен.

Low Fuse Byte = 0xEE – BOR отключено, время запуска после сброса – по умолчанию, тактовый генератор работает от внешнего высокочастотного кварца с диапазоном 3-8 МГц.

Разрабатываемую программу можно разбить на четыре процесса, протекающих параллельно и связанных только в нескольких ключевых точках:

  1. Измерение данных

  2. Передача данных (момент начала передачи привязан к готовности данных)

  3. Прием пакета и сброс флагов ошибки

  4. Тест системы (должен производиться только в то время, когда ОЗУ свободно)

Процесс измерения является основным, он запускает передачу данных в нужный момент, а также запускает процесс самотестирования.

По заданию требуется 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.

Соседние файлы в папке Материалы