ЗНАЕТЕ ЛИ ВЫ?

Работа с последовательным каналом по опросу



Простейшим из способов организации последовательного обмена является управление им из прикладной программы. То есть, если требуется переслать байт, то: 1) сбрасывается TI; 2) в SBUF записывается нужный байт данных; и 3) ожидается, пока TI не будет установлен контроллером. С приемом в этом случае дело обстоит сложнее: нужно постоянно проверять флаг RI и, если он установлен, то читать принятый байт из SBUF и сбрасывать RI. Такой способ удобен, когда разработчику четко известно, когда произойдет прием данных и когда его завершать. Неудобен он тем, что время выполнения самой программы напрямую зависит от скорости обмена. Чем медленнее скорость, тем дольше по времени цикл ожидания готовности к приему/посылке следующего байта.

При программировании последовательного канала под Windows, нужного состояния сигналов RTS и DTR можно добиться с помощью двух строк кода на языке С:

EscapeCommFunction( Port, SETRTS);

EscapeCommFunction( Port, CLRDTR);

Порядок работы.

В процессе работы необходимо изучить:

1. Аппаратный блок последовательного канала

· Структурную схему контроллера последовательного канала

· Схему включения UART

· Страничную организацию памяти

2. ПЛИС МАХ

· Регистры ПЛИС

3. Схему подключения светодиодов

В процессе работы необходимо:

1. Разработать архитектуру драйверов и системы тестирования.

2. Написать тесты драйвера светодиодов.

3. Написать тест драйвера последовательного канала.

4. Написать драйвер светодиодов.

5. Написать драйвер UART (функции чтения и записи байтов, опрос готовности приемника) без использования прерываний.

6. Отладить и протестировать драйверы.

Содержание отчета

Отчет должен содержать:

1. Описание архитектуры

· используемой аппаратной части,

· драйверов,

· системы тестирования,

2. Исходные тексты драйверов.

3. Исходные тексты тестов.

5. Результаты тестирования.

4. Контрольные вопросы

1. Какие проблемы могут возникнуть при обращении к ПЛИС?

2. Какой режим работы последовательного канала используется в SDK-1.1 при связи с ПК?

3. Нарисуйте на бумаге формат посылки для байтов 0x14, 0x25, 0хА0.

4. Какой режим работы последовательного канала ADuC812 вы использовали?

5. Что такое гальваническая изоляция?

6. Что такое оптрон?

7. Как работает схема гальванической развязки последовательного канала в SDK-1.1?

8. Какой бит устанавливается в логическую 1 при приеме байта по последовательному каналу?

9. Когда устанавливается бит TI, после записи байта в SBUF или после его передачи?

10. Нарисуйте регистровую модель контроллера последовательного канала ADuC812.


Лабораторная работа 10
Таймер, использование прерываний в лабораторном стенде SDK 1.1

Цель работы:Изучить архитектуру таймеров и систему прерываний лабораторного стенда SDK-1.1, принципы обработки прерываний, разработать программы для управления системным таймером, просимулировать программы в отладчике-симуляторе, загрузить и выполнить программы на лабораторном стенде.

Методические указания к работе.

Таймеры

ADUC812 имеет три 16-битных таймера/счетчика общего назначения: Таймер 0, Таймер 1, Таймер 2. Каждый таймер состоит из двух 8-битных регистров ТНх и TLх (х обозначает 0, 1 или 2 для таймеров 0,1 и2). Все три таймера могут быть настроены на работу в режимах "таймер" или "счетчик". В режиме "таймер" регистр инкрементируется каждый машинный цикл. То есть можно рассматривать это как подсчет машинных циклов. Так как машинный цикл состоит из 12 перепадов напряжения на тактовом входе контроллера, частота инкрементирования таймера в 12 раз меньше тактовой частоты контроллера.

В режиме "счетчик" регистр инкрементируется по перепаду 1→0 на соответствующем входе Т0, Т1 или Т2. В этом режиме внешний вывод опрашивается в S5P2 каждого машинного цикла. Когда опрос показывает высокий уровень в одном цикле и низкий уровень в следующем, счетчик увеличивается на 1. Новое значение появляется в счетчике в S3P1 машинного цикла следующего за тем, в котором был обнаружен перепад. Так как требуется два машинных цикла на обнаружение перепада 1→0, максимальная частота инкремента счетчика равна 1/24 тактовой частоты контроллера. Нет никаких ограничений на поведение сигнала на входе, но для обеспечения того, чтобы он был хотя бы раз опрошен, необходимо продержать его значение не менее одного машинного цикла. Для конфигурации и контроля Таймеров используются 3 SFR регистра: TMOD и TCON для управления таймерами 1 и О, T2CON для управления таймером 2.

Таймеры 0 и 1

Каждый таймер состоит из двух 8 битных регистров. В зависимости от режима работы они могут использоваться как независимые регистры, или как один объединенный 16 битный регистр.

ТНО и ТНО (SFR адреса 8Ch и 8Ah) -старший и младший байты Таймера 0.

ТН1 и ТН1 (SFR адреса 8Dh и 8Bh) -старший и младший байты Таймера 1.

Формат регистра режимов таймеров 0 и 1 TMOD (SFR адрес 89h) приведен в таблице 1.

Таблица 1. Регистр режима таймеров TMOD.

Номер бита Обозна-чение Описание
GATE Управление стробированием Таймера 1. Устанав-ливается программно и разрешает работу таймера-счетчика 1, только тогда, когда сигнал INT1 сохра-няет высокий уровень и установлен бит TR1 в регис-тре TCON. Сбрасывается программно и разрешает Работу таймера 1 только при установленном бите TR1.
С/Т Выбор режима таймер/счетчик для Таймера 1 0 – работа в режиме «таймер» 1 работа в режиме «счетчик»
Ml Устанавливают режим работы Таймера 1
МО Ml М0 0 0 – 13 битный таймер/счетчик 0 1 – 16 битный таймер/счетчик 1 0 – 8 битный режим с автопрезагрузкой 1 1 – таймер/счетчик 1 остановлен
GATE Управление стробированием Таймера 0. Устанав-ливается программно и разрешает работу таймера-счетчика 0, только тогда, когда сигнал INT0 сохра-няет высокий уровень и установлен бит TR0 в регис-тре TCON. Сбрасывается программно и разрешает Работу таймера 0 только при установленном бите TR0.
С/Т Выбор режима таймер/счетчик для Таймера 0 0 – работа в режиме «таймер» 1 – работа в режиме «сетчик»
Ml Устанавливают режим работы Таймера 0
М0 Ml М0 0 0 – 13 битный таймер/счетчик 0 1 – 16 битный таймер/счетчик 1 0 – 8 битный режим с автопрезагрузкой 1 1 – таймер/счетчик 1 остановлен

Формат регистра управления таймерами 0 и 1 TCON (SFR адрес 88h) приведен в таблице 2. В таблице описаны только 4 старших бита, младшие в управлении таймером не участвуют.

Таблица 2. Регистр управления таймерами TCON.

Номер бита Обозна-чение Описание
TF1 Бит переполнения таймера 1. Устанавливается аппаратно при переполнении таймера/счетчика 1. Сбрасывается также аппаратно при переходе процессора на процедуру обработки прерывания.
TR1 Бит запуска таймера 1. Устанавливается программно для запуска таймера 1 Программно сбрасывается для остановки таймера 1
TF0 Бит переполнения таймера 0. Устанавливается аппаратно при переполнении таймера/счетчика 0. Сбрасывается также аппаратно при переходе процессора на процедуру обработки прерывания.
TR0 Бит запуска таймера 0. Устанавливается программно для запуска таймера 0 Программно сбрасывается для остановки таймера 0

1.1.2. Режимы работы таймеров/счетчиков 0 и1.

Режим 0 (13-битный Таймер/Счетчик) образует 8 битный таймер/счетчик с предварительным делителем на 32 на входе. Регистр таймера конфигурируется как 13 битный регистр. Когда регистр таймера переполняется (переходит из состояния все 1ко всем 0), то выставляется флаг переполнения таймера TFx, который может использоваться для организации запроса на прерывание. Счет разрешается при TRx=l и либо GATE=0 либо INTx=l. Установка GATE=1 приводит к тому, что работа таймера контролируется внешним входом INTx, что позволяет измерять длительность импульса.

13-битный регистр состоит из всех восьми бит ТНх и младших пяти регистра TLx. Старшие три бита TLx не определены и должны быть игнорированы. Установка бита запуска TRx не очищает регистр.

Рис. 1. Работа таймера в режиме 0.

Работа таймера в этом режиме 1 (16-битный Таймер/Счетчик)аналогична работе в режиме 1, за исключением регистра таймера который теперь конфигурируется как 16-разрядный регистр.

Рис. 2. Работа таймера в режиме 1.

В режиме 2 таймер представляет собой 8-битный регистр с автоматической перезагрузкой. Когда TLx переполняется, не только устанавливается флаг TFx, но в TLx загружается значение ТНх, записанное туда ранее программно. Значение ТНх при перезагрузке сохраняется.

Рис. 3. Работа таймера в режиме 2.

Работа в режиме 3 (два независимых 8-битных Таймера/Счетчика) имеет отличия для таймеров 0 и 1. Таймер 1 в этом режиме просто останавливает свой счет. Тот же эффект даст установка TR1=0. Таймер 0 в режиме 3 устанавливает TL0 и ТН0 как два разных счетчика. Счетчик на базе TL0 использует биты управления таймера 0: С/Т, GATE, TR0, INT0, TF0. ТН0 зафиксирован в режиме таймера (считающего машинные циклы), и использует для управления биты TR1 и TF1 таймера 1. Таким образом, прерывание от переполнения регистра ТН0, будет обозначено флагом TF1.

Рис. 4. Работа таймера в режиме 3.

Режим 3 предназначен для приложений, которым нужен дополнительный 8-битный таймер или счетчик. Когда таймер 0 работает в режиме 3, таймер 1 может быть выключен установкой его в режим 3, или может быть оставлен включенным для использования в качестве генератора тактовых импульсов для последовательного интерфейса, или для любого приложения, которому не требуется прерывание именно от таймера 1.

Таймер 2

Регистры данных Таймера 2 представлены регистрами:

ТН2 и TL2 (SFR адреса CDh и CCh) – старший и младший бит данных. RCAP2H и RCAP2L (SFR адреса CBh и СAh).

Режимы работы таймера 2

Работа Таймера 2 в 16 битный режиме с автоперезагрузкой зависит от значения бита EXEN2. Если EXEN2=0, Таймер 2 при переполнении устанавливает флаг TF2, и перезагружает свои регистры TL2 и ТН2 числами из регистров RCAP2L и RCAP2H, загруженными туда ранее программно. Если EXEN2=1, Таймер 2, кроме выше перечисленных функций, дополнительно производит автоперезагрузку и в случае появления отрицательного перехода 1→0 на внешнем входе Т2ЕХ.

 

Таблица 3. Регистр управления Таймером 2 T2CON (SFR адрес – С8h)

Номер-бита Обозна-чение Описание
TF2 Флаг переполнения Таймера 2 Устанавливается аппаратно в случае переполнения Таймера 2. TF2 не устанавливается когда RCLK, либо TCLK равны 1. Сбрасывается программно.
EXF2 Внешний флаг Таймера 2. Устанавливается аппаратно когда происходит захват или перегрузка по отрицательному переходу на входе Т2ЕХ, при этом EXEN2=1.
RCLK Выбор таймера для тактирования приема по последова-тельному каналу. 1 – разрешает тактирование приема данных по последова-тельному каналу в режимах 1 и 3 Таймером 2. 0 – разрешает тактирование приема данных по последова-тельному каналу в режимах 1 и 3 Таймером 1.
TCLK Выбор таймера для тактирования передачи по последова-тельному каналу. 1 – разрешает тактирование передачи данных по последова-тельному каналу в режимах 1 и 3 Таймером 2. 0 – разрешает тактирование передачи данных по последова-тельному каналу в режимах 1 и 3 Таймером 1.
EXEN2 Флаг разрешения внешнего управления. Устанавливается пользователем для разрешения захвата или перегрузки по отрицательному переходу на входе Т2ЕХ, если таймер 2 не используется для тактирования последовательного порта. Сбрасывается пользователем, для игнорирования сигналов на Т2ЕХ.
TR2 Бит запуска Таймера 2. Устанавливается программно для запуска таймера 2. Программно сбрасывается для остановки таймера 2.
CNT2 Выбор режима таймер/счетчик. 0 – работа в режиме «таймер» 1 – работа в режиме «сетчик»
САР2 Выбор режима захват/перезагрузка/ 0 – режим перезагрузки по переполнению или по отрицательному перепаду на входе Т2ЕХ, если EXEN2=1. При тактировании последовательного порта бит игнорируется. 1 – режим захвата по отрицательному переходу на входе Т2ЕХ, если EXEN2=1

 

 

Таблица 4. Режимы работы таймера 2.

RCLK или TCLK САР2 TR2 Режим
X X X 16 бит с Автоперезагрузкой 16 бит с Захватом Тактирование последовательного канала Выключен

Рис. 5. Работа таймера 2 в режиме с автоперезагрузкой.

Рис. 6. Работа таймера 2 в режиме захвата.

Работа Таймера 2 в 16 битныйом режиме захвата также зависит от бита EXEN2 регистра TCON. Если EXEN2=0, то Таймер 2 работает как 16-битный таймер/счетчик, при переполнении которого устанавливается флаг TF2, который можно использовать для организации запроса на прерывание. Если EXEN2=1, то Таймер 2, кроме перечисленных функций, дополнительно в случае появления отрицательного перепада на внешнем входе Т2ЕХ, произведет захват содержимого регистров TL2 и ТН2 в регистры RACP2L и RACP2H, соответственно. Кроме этого установится флаг EXF2, который может сгенерировать прерывание.

В этом режиме тактирования последовательного порта Таймер 2 используется для тактирования передачи последовательного порта, и флаг прерывания TF2 не устанавливается. Однако флаг EXF2 устанавливается, и может вызывать прерывания. В этом режиме его можно использовать в качестве еще одного источника внешних прерываний.

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

Процессор AduC812 поддерживает 9 источников прерываний с 2 уровнями приоритета. Конфигурирование и контроль системы прерываний осуществляется через 3 регистра специальных функций.

Регистр IE (SFR адрес A8h ) – регистр разрешения прерываний. Все биты регистра устанавливаются и сбрасываются пользователем.

Таблица 7. Регистр разрешения прерываний IE.

Бит Обозн. Описание
ЕА 0 – запрещены, 1 – разрешены прерывания от всех источников
EADC 0 – запрещены, 1 – разрешены прерывания от АЦП
ЕТ2 0 –запрещены, 1 – разрешены прерывания от Таймера 2
ES 0 – запрещены, 1 – разрешены прерывания от UART
ЕТ1 0 – запрещены, 1 – разрешены прерывания от Таймера 1
ЕХ1 0 – запрещено, 1 – разрешено внешние прерывание 1
ET0 0 – запрещены, 1 – разрешены прерывания от Таймера 0
EX0 0 – запрещено, 1 – разрешено внешние прерывание 0

Регистр IP (SFR адрес B8h) – регистр приоритета прерываний. Все биты регистра устанавливаются и сбрасываются пользователем. После включения питания по умолчанию содержит 00h. Назначение битов регистра приведены в таблице 8.

Таблица 8. Регистр приоритета прерываний IР.

Бит Обозн. Описание
PSI 0 – высокий, 1 – низкий приоритет прерывания от SPI/I2C
PADC 0 – высокий, 1 – низкий приоритет прерывания от АЦП
РТ2 0 – высокий', 1 – низкий приоритет прерывания от Таймера 2
PS 0 – высокий, 1 – низкий приоритет прерывания UART
РТ1 0 – высокий, 1 – низкий приоритет прерывания от Таймера 1
РХ1 0 – высокий, 1 – низкий приоритет внешнего прерывания 1
PT0 0 – высокий, 1 – низкий приоритет прерывания от Таймера 0
PX0 0 – высокий, 1 – низкий приоритет внешнего прерывания 0

Регистр IE2 (SFR адрес A9h) – регистр разрешения вторичных прерываний (таблица 9).

Таблица 9. Регистр разрешения вторичных прерываний IE2.

Бит Обозн. Описание
7-2 - Зарезервированы для использования в будущем
ЕТ0 0 – запрещены, 1 – разрешены прерывания от монитора источника питания
ЕХ0 0 – запрещено, 1 – разрешено прерывания от SPI/I2C

Регистры разрешения прерывания устанавливаются пользова-телем для разрешения прерываний от отдельных источников, в то время как регистры установки приоритета устанавливаются пользователем для выбора одного из двух уровней приоритета для каждого прерывания. Прерывание с высоким уровнем приоритета может прерывать обслужи-вание прерывания с низким уровнем приоритета, а если прерывания с разными уровнями придут одновременно, то прерывание с высоким при-оритетом будет обслужено первым. Обслуживание прерывание не мо-жет быть прервано прерыванием с таким же уровнем приоритета. Если два прерывания с одинаковым уровнем приоритета пришли одновремен-но, то порядок их обслуживания определяется с помощью таблицы 10.

Таблицы 10. Приоритет источников прерываний.

Источник Приоритет Описание
PSMI 1 (Наивысший) Монитор источника питаная
IE0 Внешние прерывание 0
ADCI Прерывание от АЦП
TFO Прерывание от Таймера/Счетчика 0
IE1 Внешние прерывание 1
TF1 Прерывание от Таймера/Счетчика 1
I2CI+ISPI Прерывание от I C/SPI
RI+TI Прерывание от UART
TF2+EXF2 9 (Низший) Прерывание от Таймера/Счетчика 2

Когда происходит прерывание, значение программного счетчика помещается в стек, а в сам счетчик загружается адрес соответствующего вектора прерывания. Адреса векторов указаны в таблице 11.

Прерывания ADuC812 имеют вектора в диапазоне 0003h-0043h, которые попадают в область младших адресов памяти программ. Это пространство соответствует 8Кб (0000h-2000h) Flash-памяти. Следовательно, пользователь, не имеющий возможности записи во Flash-память, не может подставить свои процедуры обработки прерываний (точнее, команды перехода к процедурам) по адресам, соответствующим векторам прерываний.

 

Таблица 11. Вектора прерываний ADuC812.

Прерывание Наименование Адрес вектора Приоритет
PSMI Источник питания ADuC812. 43Н
IE0 Внешнее прерывание INTO. 03Н
ADCI Конец преобразования АЦП. 33Н
TF0 Переполнение таймера 0. 0ВН
IE1 Внешнее прерывание INT1. 13Н
TF1 Переполнение таймера 1. 1ВН
I2CI/ISPI Прерывание последовательного интерфейса (I2C, SPI). 3ВН
RI/TI Прерывание UART. 23Н
TF2/EXF2 Переполнение таймера 2. 2ВН

Проблема использования прерываний в пользовательских программах решается следующим образом:

1. По адресам (0003h-0043h) векторов прерываний во Flash-памяти SDK-1.1 располагаются команды переходов на вектора пользовательской таблицы, размещенной в адресах 2003h-2043h.

2. По адресам векторов пользовательской таблицы пользователем указываются команды переходов на процедуры обработки прерываний.

Переадресацию векторов прерываний иллюстрирует рис. 7.

Следующая программа – пример помещения собственного вектора в пользовательскую таблицу. Пусть требуется осуществить обработку прерываний от таймера 0 (прерывание 0Bh). В программу на языке Си можно вставить следующий код:

void T0_ISR(void) interrupt 1 // Обработчик прерывания от

// таймера 0

{

// Действия, выполняемые обработчиком

}

void SetVector(unsigned char xdata * Address, void * Vector)

// Функция, устанавливающая вектор прерывания Vector по //адресу Address

{

unsigned short xdata * TmpVector;/ Временная переменная

*Address = 0x02; //Первым байтом по указанному адресу за-

//писывается код команды передачи управления ljmp,равный 02h

TmpVector = (unsigned short xdata *) (Address+1);

*TmpVector = (unsigned short) Vector;

// Далее записывается адрес перехода Vector

// Таким образом, по адресу Address теперь располагается

// инструкция ljmp Vector

}

 

void main(void)

{

/*…*/

SetVector(0x200В, (void *) TO_ISR); // Установка вектора в // пользовательской таблице

ЕТ0=1; ЕА=1; // Разрешение прерываний от таймера 0

}

 

Рис. 7. Использование прерываний в SDK-1.1.

Компилятор С51 предоставляет возможность вызова функций при возникновении прерываний. Это дает возможность написания на языке С собственных обработчиков прерываний. Однако следует соблюдать осторожность в выборе номера прерывания и банка регистров. Компилятор автоматически генерирует вектор прерывания, а также код входа в обработчик и выхода из него. Атрибут interrupt, включенный в объявление функции, указывает на то, что данная функция обрабатывает прерывание. Кроме того, можно указать банк регистров для данного прерывания с помощью атрибута using.

unsigned int interruptcnt;

unsigned char second;

void timerO (void) interrupt 1 using 2

{

if (++interruptcnt == 4000)

{

/* count to 4000 */

second++; /* second counter */

interruptcnt =0; /* clear int counter */

}

}

Порядок работы.

В процессе работы необходимо изучить:

1. Архитектуру аппаратных блоков:

· Таймеры микроконтроллера.

· Систему прерываний микроконтроллера.

2. Принципы обработки прерываний.

В процессе работы необходимо:

1. Разработать архитектуру драйвера системного таймера и системы тестирования.

2. Написать тесты драйвера.

3. Написать драйвер системного таймера.

4. Отладить и протестировать драйвер.

Содержание отчета

Отчет должен содержать:

1. Описание архитектуры

· используемой аппаратной части,

· драйверов,

· системы тестирования,

2. Исходные тексты драйверов.

3. Исходные тексты тестов.

5. Результаты тестирования.


Лабораторная работа 11
Работа с клавиатурой лабораторного стенда SDK 1.1

Цель работы:Изучить архитектуру клавиатуры в составе лабораторного стенда SDK-1.1. Разработать и написать драйвер клавиатуры для учебно-лабораторного стенда SDK-1.1. Написать тестовую программу для разработанного драйвера, которая выполняет определенную задачу.





Последнее изменение этой страницы: 2017-01-25; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.216.79.60 (0.02 с.)