Подключение PIC18F452 к LPT в режиме EPP
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено alexei-d 28 декабря 2004 г. 10:21

Подключил PIC18F452 к LPT в режиме EPP. Не работает чтение из PIC.
А когда эмулирую цикл EPP, дeргая выходы порта вручную в
двунаправленном режиме - работает. Подозреваю, что не выдерживаю
временную диаграмму. Но нигде в Сети мне не попадалось описание обмена
с указанием временных интервалов. Где рыть?


Кусок программы для PIC:

;Порт D - ШД LPT-порта
;RB0/INT0 - nDataStrobe
;RB1 - nWrite
;RB2 - nWait
...
INT_0 ORG 0x8 ;Обраб. прерываний обмена по EPP
INT_EPP BTFSS INTCON,INT0IF,0 ;если не было фронта INT0, ...
RETFIE ;то выход
BTFSS PORTB,1,0 ;если nWrite=0, т.е. ид+т запись, ...
BRA EPP_WRI ;... то перейти на обработчик записи
;Обработчик чтения
FSRNEQ2 CLRF TRISD ;PORTD на вывод
MOVFF POSTINC1,PORTD ;вывод
END_EPP RCALL EPP_END ;подтвердить завершение цикла EPP
...
;Подпрограмма квитирования завершения цикла EPP
EPP_END BSF PORTB,2,0 ;1 на nWait
LOOPSTR BTFSS PORTB,0,0 ;ждать заднего фронта nDataStrobe
BRA LOOPSTR
SETF TRISD ;PORTD на ввод
BCF PORTB,2,0 ;0 на nWait
RETURN


Кусок программы для PC:

#define _STROBE (1<<0)
#define _AUTOFEED (1<<1)
#define INIT (1<<2)
#define _SELECT_INPUT (1<<3)
#define INPUT (1<<5)
...
//"из старших режимов (010-111) переключение возможно толь-
// ко в 000 или 001."
//Для ECP-порта - установить двунаправленный режим SPP
outp(LPT_ECR, 1<<5);
//Для ECP-порта - установить режим EPP
outp(LPT_ECR, 0x80);
outp(LPT_CTL_WR, INIT);
printf("status: %02X\n", inp(LPT_STA_RD));
printf("data: %02X\n", inp(LPT_base+4));
printf("status: %02X\n", inp(LPT_STA_RD));


Эмуляция цикла EPP:

printf("инициализация\n");
outp(LPT_CTL_WR, INIT);
outp(LPT_CTL_WR, INIT | INPUT );
print_LPT();
if (delays) getch();
printf("nDataStrobe->0\n");
outp(LPT_CTL_WR, INIT | INPUT | _AUTOFEED);
print_LPT();
if (delays) getch();
printf("чтение\n");
print_LPT();
if (delays) getch();
printf("nDataStrobe->1\n");
outp(LPT_CTL_WR, INIT | INPUT );
print_LPT();
if (delays) getch();

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru