|
Обмен данными в режиме 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
}
}
|
Файлы проекта можно скачать здесь:
|
|
|