помнить, что все подключения и отключения коммуникационного кабеля
RS-232 необходимо производить при выключенном питании стенда SDK-
1.1!
Порядок работы со стендом очень прост:
1. Установите себе компилятор SDCC, утилиту make и M3P.
2. Подключите учебный стенд к своему компьютеру с помощью кабеля
RS-232 (кабель входит в комплект поставки стенда). В случае
подключения через USB вам понадобится переходник USB2Com.
3. Подключите к стенду прилагаемый источник питания.
4. Вставьте источник питания в розетку (сеть 220В, 50 Гц). На стенде
должен загореться светодиод POWER.
5. Скачайте тестовый пример и войдите в каталог с тестовым примером.
6. Откорректируйте название вашего последовательного порта в makefile.
Для Windows это будет com1, com2,…, для Linux /dev/ttyS0, /dev/ttyS1 и
так далее. Если у вас один встроенный порт, то это скорее всего com1
или /dev/ttyS0.
7. Скомпилируйте тестовый проект. Для этого нужно в каталоге, в
котором находится файл makefile, запустить команду make.
8. Загрузите получившийся файл в учебный стенд. Для этого нужно
выполнить команду make load.
9. Если всё прошло нормально, вы увидите эмулятор терминала,
запущенный в консоли вашего компьютера, а программа, загруженная в
SDK-1.1, начнет исполняться.
6.2 Программирование светодиодных индикаторов
Светодиодные индикаторы (8 шт.) в стенде SDK-1.1 подключены не
напрямую к микроконтроллеру ADuC812, а через расширитель портов,
выполненный на базе ПЛИС. За связь со светодиодами в расширителе портов
отвечает 8-разрядный регистр SV, который находится по адресу 080007h (на 8-й
странице внешней памяти данных 7-я ячейка), значение после сброса
00000000B, доступен только для записи (см. подраздел 4.4.3).
Для доступа к регистрам ПЛИС нужно переключить страничный регистр
DPP на 8 страницу памяти. Адреса регистров внутри страницы находятся в
диапазоне от 0 до 7.
Доступ к регистрам возможен через указатель:
unsigned char xdata *regnum
Необходимо помнить, что при переключении страниц становятся
недоступными все данные, размещенные в странице 0 (т.е. переменные в
программе объявленные с модификатором памяти xdata).
Для того, чтобы избежать проблем со страничным регистром DPP, нужно
использовать специальные функции для доступа к ПЛИС, которые перед
247
началом работы с регистрами ПЛИС будут запоминать старое значение
страничного регистра, а по окончании работы возвращать его обратно.
Нужно следить, чтобы передаваемые в регистры ПЛИС значения
хранились во внутренней памяти микроконтроллера (DATA, IDATA).
Убедиться, что передаваемая информация не содержится во внешней памяти
контроллера (XDATA), достаточно легко: так как для доступа к внешней
памяти в микроконтроллерах семейства Intel MCS-51 используется регистр
специального назначения DPTR, нужно просто просмотреть листинг
программы и убедиться в том, что для доступа к переменным компилятор не
использует DPTR.
Пример программы:
#include "aduc812.h"
#define MAXBASE 0x8 // Номер страницы внешней памяти (xdata),
// куда отображаются регистры расширителя портов в/в.
/*--------------------------------------------------------------------
write_max
----------------------------------------------------------------------
Запись в нужный регистр ПЛИС ALTERA MAX3064(3128)
Вход: regnum - адрес (номер) регистра
val - записываемое значение
Выход: нет
Результат: нет
Описание: Производится запись в регистр (порт) ПЛИС ALTERA MAX3064(3128)
путем переключения адресуемой страницы памяти на страницу, где
расположены (куда отображаются) порты ввода-вывода ПЛИС.
--------------------------------------------------------------------*/
void write_max( unsigned char xdata *regnum, unsigned char val )
{
unsigned char oldDPP = DPP;
DPP = MAXBASE;
*regnum = val;
DPP = oldDPP;
}
/*--------------------------------------------------------------------
read_max
----------------------------------------------------------------------
Чтение из нужного регистра ПЛИС ALTERA MAX3064(3128)
Вход: regnum - адрес (номер) регистра
Выход: нет
Результат: прочитанное из регистра значение
Описание: Чтение из порта ПЛИС ALTERA MAX3064(3128)
путем переключения адресуемой страницы памяти на страницу, где
расположены (куда отображаются) порты ввода-вывода ПЛИС
Пример:
--------------------------------------------------------------------*/
unsigned char read_max( unsigned char xdata *regnum )
{
unsigned char oldDPP=DPP;
unsigned char val;
DPP = MAXBASE;
248
val = *regnum;
DPP = oldDPP;
return val;
}
/*--------------------------------------------------------------------
leds
----------------------------------------------------------------------
Зажигание линейки светодиодов
Вход: on - управление светодиодами. Каждый бит переменной отвечает за один
светодиод: 1 - зажигает, 0 гасит светодиод
Выход: нет
Результат: нет
Описание: Производится доступ к регистру расширителя портов SV с помощью
функции write_max. Состояние светодиодов хранится в регистре
old_led.
--------------------------------------------------------------------*/
void leds( unsigned char on )
{
write_max( SV, on );
old_led = on;
}
/*--------------------------------------------------------------------
main
--------------------------------------------------------------------*/
// Задержка на заданное количество мс
void delay ( unsigned long ms )
{
volatile unsigned long i, j;
for( j = 0; j < ms; j++ )
{
for( i = 0; i < 50; i++ );
}
}
void main( void )
{
int i;
for( i = 0; i < 3; i++ )
{
leds( 0xFF ); delay( 100 );
leds( 0x00 ); delay( 100 );
}
led( 0, 1 ); delay( 300 );
led( 1, 1 ); delay( 300 );
led( 2, 1 ); delay( 300 );
led( 3, 1 ); delay( 300 );
led( 4, 1 ); delay( 300 );
led( 5, 1 ); delay( 300 );
led( 6, 1 ); delay( 300 );
led( 7, 1 ); delay( 300 );
delay( 1000 );
for( i = 0; i < 3; i++ )
{
leds( 0xFF ); delay( 100 );
leds( 0x00 ); delay( 100 );
}
249
while( 1 )
{
leds( 0x55 ); delay( 500 );
leds( 0xAA ); delay( 500 );
}
}
Do'stlaringiz bilan baham: |