Бегущая строка на контроллере ARM7
 
Прогресс не стоит на месте и производители выпускают новые виды микронтроллеров. Большую популярность в последнее время получило ядро ARM. Чтобы не отстать от времени я взялся за изучение чипов фирмы NXP(Philips), а в качестве примера выбрал бегущую строку. Несмотря на то, что проект был учебный, он обладает всем необходимым функционалом. Итак, что умеет устройство:
-воспроизведение строки из внешнего чипа EEPROM;
-воспроизведение строки из внутренней RAM;
-показ времени по достижении конца строки;
-коммуникация с компьютером для загрузки данных.

Схема платы контроллера.

U1 LPC2101 - собственно сам МК ARM7(8КБ Flash + 2КБ RAM). Для нормальной работы МК необходимо два напряжения: 1,8V для процессора и 3,3V для питания периферийных модулей. Эти напряжения поставляются линейными стабилизаторами U2 и U3. Выводимый текст хранится в чипе памяти U4(на схеме не показаны выводы питания: 4=земля и 8=+3,3V). Потенциометр RV1 подключен ко входу внутреннего АЦП U1 и задает скорость прокручивания текста. Резервная батарейка BAT1 питает модуль RTC когда отключено основное питание и тем самым поддерживает ход часов.
Это табло, как и большинство других, использует принцип динамической индикации. Светодиодное табло организовано в виде матрицы до 64x7. Данные столбцов матрицы передаются в последовательном коде на сдвиговые регистры 74HC595 (разъем J3): DS=линия данных, SH_CP=строб битов, ST_CP=защелкивание строки и передача на светодиоды. Затем отображаемая строка включается транзисторами Q1-Q7(разъем J4). Организация матрицы: строки образуют катоды СД, столбцы - аноды диодов.

Схема светодиодного блока.

Разъем J2 используется для программирования контроллера и коммуникации с компьютером. Для связи необходима микросхема преобразователя уровней RS232-ТТЛ типа MAX232. Схема преобразователя уровней RS-232.

Детали.
U4 должна поддерживать полноскоростной обмен(100КГц) при питании 3,3V(но можно ее запитать от 5 вольт т.к. контроллер позволяет работать с такими лог. уровнями). Микросхемы стабилизаторов(1V8 и 3V3) можно найти на платах от DVD-ROMов и др. компьютерных устройств. Там как раз используются такие напряжения.
Номиналы емкостей C10 и C11 следует выбирать исходя из характеристик применяемого часового кварца(они влияют на точность часов). Таблицу рекомендуемых значений можно найти в разделе 18  руководства UM10161.

Программа.
Программа была написана на Си под компилятор ICCV7ARM.
Для нужд бегущей строки использовано два 32-битных таймера: векторное прерывание от TIMER0 занимается регенерацией экрана, а прерывание от TIMER1  опрашивает АЦП для получения скорости бега текста, считывает новый символ из EEPROM/RAM, сдвигает экран влево и загружает изображение нового выводимого символа.
Программа содержит один пропорциональный шрифт(больше не влезло, файл font.c). Знакогенератор представлен двумя одномерными массивами: char_set[] содержит изображения символов и их ширину, а charLUT[] определяет начальное смещение для каждого символа в массиве char_set[]. Т.е. для того, чтобы извлечь символ мы с помощью таблицы charLUT[]  определяем его начальный байт N, затем обращаемся в  char_set[] по адресу N и считываем ширину W для этого символа. Теперь у нас есть все необходимые данные и мы можем считать сам символ(байты N+1...N+W). Такой подход позволил сэкономить более 5% Flash памяти. Можно шрифт ужать еще больше если убрать изображения всех служебных и неосновных символов.
Работа с модулем I2C строится на основе обработки запросов от прерываний. Любое изменение состояния(за исключением сигнала STOP) шины i2c приводит к генерации IRQ и переходу по вектору на функцию i2c_isr. В функции на структуре switch реализован конечный автомат, считывающий состояние статусного регистра I2STAT и выполняющий следующее запланированное действие. Т.о. нет необходимости ждать когда через медленный интерфейс пройдут все данные и процессор можно загрузить какой-нибудь более полезной работой.
Функции mem_write и mem_read записывают и читают байт по произвольному адресу.
Переменные и флаги:
i2c_msg[] - двухбайтовый адрес ЯП(MSB+LSB) + байт данных(для операции записи).
i2c_mem_wr - флаг записи(TRUE), для чтения должен быть FALSE.
i2c_lock - флаг занятости интерфейса, т.е. если TRUE, то в настоящий момент идет транзакция.
i2c_max_cnt - число байт в посылке, 3 для записи и 2 для чтения.
i2c_nack - флаг неподтверждения приема адреса чипа. После передачи данных на запись чип памяти отрубается и с помощью этого флажка я узнаю когда чип будет готов к новой транзакции(т.н. процедура ACK polling).
Чтобы при чтении следующего символа не ждать момента когда будут переданы данные по шине я реализовал упреждающее чтение. mem_read вызывается заранее, результат помещается в глобальную переменную i2c_out.

Программирование контроллера.
Надо закоротить на землю P0.14(нога 44 U1) и подать питание на плату. В этом режиме запускается заводской загрузчик, готовый к обмену через COM-порт ПК с утилитой FlashMagic. Затем заливается прошивка(файл .HEX) в память контроллера. Более подробно о процедуре прошивки контроллеров семейства LPC2000 можно прочитать в документе AN10302 Using the Philips LPC2000 Flash utility.

Использование.
При включении питания начинает выводиться строка из EEPROM. Если чип памяти чистый, то выводится "яяяяя...".
Устройство может быть сконфигурировано через COM-порт ПК с помощью любой терминальной программы(Hyperterminal, Tera-Term и др.). Настройки порта: 9600 бод, 8N1, без управления потоком.
В терминале быстро два раза нажать [ENTER]. Будет выведено меню:
1- Запись строки мгновенного сообщения в ОЗУ(до 1000 символов). Мгновенное сообщение крутится до выключения питания либо до момента сброса через меню;
2- Запись строки в EEPROM(8 килобайт, точнее 8191 символ). При вводе текста прокручивается строка с лого. После выхода из редактора начинает выводится текст из eeprom;
3- Сброс, начинает выводится строка из eeprom с самого начала;
4- Включить/отключить показ времени. Время показывается в конце строки.
5- Изменить время. Время вводится в 24-часовом формате ЧЧ:ММ без двоеточия. Если ЧЧ меньше 10 например, 8:35 утра, то надо ввести 08:35. Если было введено недопустимое число то появится сообщение об ошибке времени;
6- Выход из меню.
Устройство возвращает в сторону ПК все принимаемые символы(т.н. эхо).

     

Скрин меню одной из ранних версий.

Прошивка с исходником проекта.

Видео (в реальности без тормозов - особенность вебкамеры)
 

На главную

Hosted by uCoz