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 );
}
}
Достарыңызбен бөлісу: