|
Подключил 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