Вы вошли на сайт, как Гость
Регистрация

Обмен данными в режиме PSP

Программные примеры для микроконтроллеров PIC - MPLab IDE
(Обмен данными в режиме PSP)

Реализуем обмен данными между двумя микроконтроллерами PIC, один из которых (главный) работает в режиме PSP порта D, а второй (внешний) принимает и передает данные через порт С. Три вывода порта Е обоих микроконтроллеров служат для обмена управляющими сигналами: RD — вывод О, WR — вывод 1, CS — вывод 2.

Главный микроконтроллер передает внешнему данные, принятые через порт В, а данные, принятые от внешнего, отображает с помощью светодиодов, подключенных к порту С. При этом обмен данными осуществляется по соответствующему запросу на прерывание. Программа для главного микроконтроллера представлена ниже (PSP_1.c).

Внешний микроконтроллер постоянно считывает данные из главного микроконтроллера, а затем "эхом" отправляет их обратно. Программа для внешнего микроконтроллера представлена ниже (PSP_2.c).

Примечание: при компиляции проекта требуется добавить в проект следующие библиотеки: "16F877.h", "stdio.h".

PSP_1.c

#use delay(clock=10000000)
#fuses HS, NOWDT

#byte TRISE = 0x89               //Определяем регистр TRISE

#int_PSP //Обработчик прерывания от PSP
PSP_isr()
{
  if (TRISE & 0x80)              //Если запись в порт PSP (флаг IBF=1),
    output_C(~input_D());        //то выводим данные, принятые через
                                 //порт D, в порт С (на светодиоды)
  else                           //Если вывод через порт PSP,
    output_D(input_B());         //то выводим через порт D данные порта B
}

void main()
{
  port_b_pullups(TRUE);          //Активизируем внутренние подтягивающие
                                 //резисторы для порта В
  setup_adc_ports(NO_ANALOGS);   //Выводы порта Е не должны 
                                 //использоваться в качестве аналоговых
  setup_psp(PSP_ENABLED);        //Активизируем режим PSP
  enable_interrupts(INT_PSP);    //Разрешаем прерывание от PSP
  enable_interrupts(global);     //Общее разрешение прерываний
  while(1);                      //Бесконечный цикл в ожидании прерывания от PSP
}

PSP_2.c

#use delay(clock=10000000)
#fuses HS, WDT                   //Будет использоваться сторожевой таймер

int c;

void main()
{
  setup_adc_ports(NO_ANALOGS);   //Выводы порта Е не должны 
                                 //использоваться в качестве аналоговых
  setup_counters(RTCC_INTERNAL, WDT_72MS);  //Сброс от 
                                 // сторожевого таймера через каждые 72 мс
  output_E(0x7);                 //CS=1, RD=1, WR=1
  while(1)
  {
    restart_wdt();               //Сбрасываем счетчик сторожевого таймера
    output_E(2);                 //CS=0, RD=0, WR=1 – запрос главному 
                                 //микроконтроллеру на чтение данных
    c = input_c();               //Считываем данные от главного 
                                 //микроконтроллера через порт С в переменную с
    output_E(7);                 //CS=1, RD=1, WR=1
    delay_us(50);                //Задержка 50 мкс между операциями PSP
    output_C(c);                 //Передаем данные главному микроконтроллеру
    output_E(1);                 //CS=0, RD=1, WR=0 – запрос главному
                                 //микроконтроллеру на запись данных
    output_E(7);                 //CS=1, RD=1, WR=1
    delay_us(50);                //Задержка 50 мкс между операциями PSP
  }
}

Файлы проекта можно скачать здесь: