Аппаратные и программные средства встраиваемых систем


  Программирование светодиодных индикаторов



Pdf көрінісі
бет234/268
Дата07.01.2022
өлшемі3,23 Mb.
#18255
1   ...   230   231   232   233   234   235   236   237   ...   268
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 ); 
    } 
}     


Достарыңызбен бөлісу:
1   ...   230   231   232   233   234   235   236   237   ...   268




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет