Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
686.docx
Скачиваний:
85
Добавлен:
24.04.2019
Размер:
6.68 Mб
Скачать

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, нужно

использовать специальные функции для доступа к ПЛИС, которые перед

246

началом работы с регистрами ПЛИС будут запоминать старое значение

страничного регистра, а по окончании работы возвращать его обратно.

Нужно следить, чтобы передаваемые в регистры ПЛИС значения

хранились во внутренней памяти микроконтроллера (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;

247

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 );

}

248

}

while( 1 )

{

leds( 0x55 );

leds( 0xAA );

}

delay( 500 );

delay( 500 );

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]