Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
403
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

Настроить тактовую частоту на линии SCK через регистр S0SPCCR (выражение 1.17.1). В соответствии с техническом описанием для регистра 74HC595 фирмы NXP допустимая частота составляет 20 МГц.

4.Выполнить настройку таймера. Значение порогового регистра T0MR0 рассчитать по формуле (1.13.3) для времени не более

мс. Разрешить сброс таймера и запрос прерывания при совпадении (регистр T0MCR). Включить таймер (регистрT0TCR).

5.Включить прерывание от таймера.

6.Формирование карты светодиодной матрицы может выполняться следующим кодом (для изображения цифры «7»)

for (k=0;k<6;k++) Map[k+1]=Font_6x8_Data[6*'7'+k];

Массив столбцов светодиодной матрицы Map заполняется кодами из таблицы знакогенератора Font_6x8_Data. Индекс каждого байта таблицы вычисляется по формуле , где — ASCII-код отображаемого символа, — счетчик цикла, соответствующий номерам столбцов светодиодной матрицы. Индексу массива Map придается смещение, равное единице (Map[k+1]). Это необходимо для симметрирования изображения на светодиодной матрице (символ имеет ширину 6 точек, а матрица — 8). Таким образом, при будут заполнены средние 6 столбцов.

7. Программа заканчивается конструкцией вечного цикла.

3.11.4 Алгоритм процедуры обработки прерывания

В процедуре объявляется локальная переменная Code типа unsigned

int.

1. Формирование 16-разрядного кода Code осуществляется в соответствии со схемой на рисунке 3.11.4. Предложим команду, формирования управляющего кода.

Code=0x100 << K | Map[K];

Старший байт содержит одну единицу, в позиции K-го столбца, питание которого предстоит включить. Этот байт формируется путем сдвига шестнадцатеричного числа 0x100 на K разрядов влево. Младший байт занимает K-ый код управления светодиодами столбца из массива Map. Он внедряется операцией логического сложения.

2–4. Необходимо увеличить на единицу счетчик столбцов K и его обнулить, если в результате он стал равен семи.

5. Передача по SPI осуществляется присваиванием регистру S0SPDR управляющего кода Code. Как следует из схемы на рисунке 3.11.1, активными уровнями являются логические нули. Поэтому перед присваиванием переменную необходимо инвертировать:

S0SPDR=~Code;

6. Далее требуется дождаться завершения передачи по SPI, ожидая в цикле while аппаратной установки единицы в разряде SPIF регистра S0SPSR.

while (!(S0SPSR & 0x80)) ;

200

7.Получив подтверждение окончания передачи, то есть загрузки сдвиговых регистров, необходимо сформировать строб на входах RCK микросхем 74HC595, подключенных параллельно к линии P0.15. Для этого дать подряд команды на установку в единицу и сброс в ноль этой портовой линии. Длительность такого импульса даже при тактовой частоте микроконтроллера 60 МГц окажется больше минимально допустимого значения 24 нс. По нарастающему фронту сигнала RCK в выходные защелки двух регистра перепишется принятый код и на выводах Q0–Q7 установятся соответствующие логические уровни.

8.Инициализация системы прерываний состоит в сбросе флага в регистре T0IR и сбросе в ноль регистра VICVectAddr.

3.11.5 Реализация движения строки

Ниже рассматривается вариант получения анимированного изображения — эффекта «бегущей» строки. За основу принимается та же программа. Потребуются следующие константы и переменные:

а) строковая константа хранит движущиеся символы; б) целочисленная константа — ширина индикатора (число точек);

в) целочисленная константа — число кадров, в течение которых строка остается неподвижной;

г) целочисленная константа — длина строки (число символов);

Процедура обработки

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

прерывания от таймера

 

 

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Инкремент K

 

 

 

 

Начало

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9

 

 

 

 

Да

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

K = LM

 

 

 

 

I = T + k % L

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

Нет

10

 

 

 

 

 

Да

 

 

 

 

K = 0

 

 

 

 

 

 

 

 

 

 

 

I >= 6N

 

 

 

 

 

 

 

 

 

 

 

3 I = I - 6N

 

 

 

 

 

 

11 Инкремент T

 

 

Нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

Да

12

 

 

 

 

 

 

 

 

 

 

 

Формирование кода C

 

 

 

 

 

 

 

 

T = 6N

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

для K % L и I

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Нет

5

 

 

 

 

 

 

 

 

 

 

 

13

 

 

Передача по SPI С

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T = 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

14

 

 

 

 

 

 

 

 

 

 

Да

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Передача ?

 

 

 

Инициализация

 

 

 

 

 

 

 

системы прерываний

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Нет

 

 

 

 

 

 

 

 

 

 

7

 

 

 

Возврат

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Строб на P0.15

 

 

 

 

 

 

 

 

 

 

Рисунок 3.11.5 – Схема алгоритма процедуры обработки прерывания для эффекта «бегущей строки»

201

д) целочисленная переменная — счетчик столбцов изображения;

е) целочисленная переменная — счетчик столбцов индикатора;

ж) массив байтов — карта индикатора, которая теперь будет хранить изображение всей строки, поэтому имеет размерность .

Все эти переменные и константы должны быть глобальными. Счетчикам K и T обязательно должны быть присвоены нулевые начальные значения. Предложим пример объявления.

const char Str[]="Превед!"; const int M=8, L=8;

const int N=sizeof(Str)-1; char Map[N*6];

int T=0, K=0;

В основной программе потребуется внести изменения в блок 6 (рисунок 3.11.2), отвечающий за формирование карты индикатора. Предлагается следующая реализация блока 6.

for (k=0;k<N;k++) for (i=0;i<6;i++)

Map[k*6+i]=Font_6x8_Data[Str[k]*6+i];

В процедуре обработки прерывания (рисунок ) кроме переменной C потребуется еще одна целочисленная переменная I, которая хранит номер индицируемого столбца карты. Изменения касаются блоков 1–4, 9–13. Прокомментируем их.

1. Из карты выбирается столбец, с номером вычисляемым по формуле

,

где обозначено остаток от отделения на .

2–3. Блоки предназначены для «цикличности» бегущей створки. Они обеспечивают то, что последний столбец будет сменяться первым. Если I окажется больше предельного значения 6N, он будет откорректирован.

Предлагается блоки 1–3 реализовать командами:

I=K % L+T;

if (I>=N*6) I-=N*6;

4. Формирование управляющего кода теперь осуществляется по правилу: столбец индикатора , столбец карты .

Code=0x100 << K % L | Map[I];

Назначение блоков 9–13 ясно из алгоритма. Здесь предложим запись на языке Си

if (++K==L*M)

{

K=0;

if (++T==6*N) T=0;

}

202