Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Курсовой проект разработка модуля ввода-вывода информации, сопрягаемого с Эвм через шину Usb - файл Program.doc


Курсовой проект разработка модуля ввода-вывода информации, сопрягаемого с Эвм через шину Usb
скачать (528 kb.)

Доступные файлы (9):

Program.doc86kb.20.06.2009 13:27скачать
Main.vsd
Спецификация.vsd
Strukturnaya.vsd
Diagram2.bmp
Diagram.bmp
Diagrami.bmp
Отчёт.doc661kb.20.06.2009 13:27скачать
Рисование1.vsd

содержание
Загрузка...

Program.doc

Реклама MarketGid:
Загрузка...
5.5. Программа функционирования модуля ввода-вывода информации


Листинг программы функционирования модуля приведён ниже. Он содержит подробные комментарии выполняемых действий и не требует дополнительного пояснения:
SOURCE

NAME SAMPLE

3 PROG SEGMENT CODE

CONST SEGMENT CODE

VAR1 SEGMENT DATA

BITVAR SEGMENT BIT

STACK SEGMENT IDATA

RSEG STACK

DS 32 ; 32 BYTES STACK

VAR1 SEGMENT DATA

RSEG VAR1 ; SWITCH TO THIS DATA SEGMENT

DEVICEREQUEST:

BMREQUEST: DS 1

BREQUEST: DS 1

WVALUE: DS 2

WINDEX: DS 2

WLENGTH: DS 2

FLAG: DS 1

IN_BUFFER: DS 8

OUT_BUFFER: DS 8

IN_COUNT: DS 1

OUT_COUNT: DS 1

VALUE: DS 1

INT_ENABLE: DS 1

DATA_P: DS 1

CD_LENGTH: DS 1

CD_COUNT: DS 1

NO_SINGLE_PACKET: DS 1

CSEG AT 0 ; ОСНОВНОЙ СЕГМЕНТ ВНУТРЕННЕГО ППЗУ

LJMP START

RSEG PROG

USING 0 ; БАНК 0 С РЕГИСТРАМИ !!!!!

CSEG AT 013H

LJMP INT1_INTERRAPT

CONST SEGMENT CODE ; SEGMENT FOR INTERRUPT FUNCTION

RSEG CONST ; SWITCH TO THIS CODE SEGMENT

USING 1 ; БАНК 1 С РЕГИСТРАМИ !!!!!

; **************************************************************************

; ************ ОПИСАНИЕ ПРОЦЕДУР ДЛЯ ВНЕШНЕГО ПРЕРЫВАНИЯ INT1 **************

; **************************************************************************

INT1_INTERRAPT:

CLR IE1

MOV VALUE, R0

PUSH VALUE

MOV VALUE, R1

PUSH VALUE

MOV VALUE, R5

PUSH VALUE

CALL SETTIMER

POP VALUE ; ВОССТАНАВЛИВАЕМ ИЗ СТЕКА ВСЁ, ЧТО ИСПОРТИЛИ

MOV R5, VALUE

POP VALUE

MOV R1, VALUE

POP VALUE

MOV R0, VALUE

RETI

SETTIMER:

MOV A, OUT_COUNT

CJNE A, #0, TRANSMIT_OK

LJMP NO_INT1

TRANSMIT_OK:

SETB P3.5 ; УСТАНАВЛИВАЕМ СТРОБ DATA_WR В 1. (АКТИВНЫЙ 0)

MOV R1, DATA_P

MOV ACC, #OUT_BUFFER

ADD A, R1

MOV R0, ACC

MOV R5, OUT_COUNT

MOV VALUE, P0

PUSH VALUE

SETB P0.0

SETB P0.1

MOV P2, #00110000B

CLR P3.5 ; УСТАНОВКА СТРОБА ЗАПИСИ В 0

NOP

SETB P3.5 ; УСТАНОВКА СТРОБА ЗАПИСИ В 1

MOV ACC, DATA_P

ADD A, #2

MOV DATA_P, ACC

DEC R5

MOV OUT_COUNT, R5 ; УМЕНЬШАЕМ СЧЁТЧИК ДАННЫХ В БУФЕРЕ НА 1

CJNE R5,#0, CMP_COUNT

MOV DATA_P, #0

LJMP SET_INT

CMP_COUNT:

CJNE R5,#0FFH, SET_INT

MOV DATA_P, #0

MOV OUT_COUNT, #0

SET_INT:

POP VALUE

MOV P0, VALUE ; ВОССТАНАВЛИВАЕМ СОДЕРЖИМОЕ ПОРТА Р0 ИЗ СТЭКА

SETB EA

SETB EX1

SETB PX1

MOV INT_ENABLE, #1

LJMP INT1_EXIT

NO_INT1:

CLR EA ; ЗАПРЕТ ВСЕХ ПРЕРЫВАНИЙ

SETB EX1

MOV INT_ENABLE, #0

INT1_EXIT:

RET

; *****************************************************************

; ************ ДАЛЕЕ ИДЁТ ОПИСАНИЕ ОСНОВНЫХ ПРОЦЕДУР **************

; *****************************************************************

INIT_DATA: ; ПРОЦЕДУРА ИНИЦИАЛИЗАЦИИ

CLR P3.1 ; СБРОС СТРОБА BYTE_OK. (АКТИВНЫЙ 1 УРОВЕНЬ)

SETB P3.5

SETB P3.6

SETB P3.7

MOV NO_SINGLE_PACKET, #0

MOV FLAG, #0

MOV DATA_P, #0

MOV INT_ENABLE, #0

RET

RECONECT_USB:

MOV R0, #0F3H ; УСТАНОВИТЬ РЕЖИМ

MOV R1, #16H

MOV R2, #7H

CALL PW_D12_2

RET

FN_USB_ISR:

MOV R0,#0F4H

CALL PR_D12_2

CJNE R1,#0,NEXT

CJNE R2,#0,NEXT

EXIT:

RET ; ВЫХОД

NEXT:

CJNE R1,#2, NO_D12_INT_ENDP0IN

CALL EP0_TXDONE

NO_D12_INT_ENDP0IN:

CJNE R1,#1, NO_D12_INT_ENDP0OUT

CALL EP0_RXDONE

NO_D12_INT_ENDP0OUT:

CJNE R1,#8, NO_D12_INT_ENDP1IN

CALL EP1_TXDONE

NO_D12_INT_ENDP1IN:

CJNE R1,#4, EXIT

CALL EP1_RXDONE

JMP EXIT

D12_ACK_ENDPOINT:

CALL PW_D12_0

MOV ACC, R0

XCH A, R0

MOV R0, #0F1H

CALL PW_D12_0 ; ПОДТВЕРЖДЕНИЕ SETUP

CJNE A, #0, NOT_0

MOV R0, #0F2H

CALL PW_D12_0

NOT_0:

RET

EP0_TXDONE: ; ПОСЫЛАЕМ ХОСТ... В К.Т. 0

MOV R0,#41H

CALL PR_D12_1

MOV R1, NO_SINGLE_PACKET

CJNE R1, #1, M_RET

MOV R5, CD_LENGTH

MOV A, R5

CLR C

SUBB A, CD_COUNT

MOV R5, A ; ПОЛУЧАЕМ НОВЫЙ РАЗМЕР ПАКЕТА

MOV NO_SINGLE_PACKET, #0

CLR C

CJNE R5, #16, EP0_CHECK_PACKET

LJMP EP0_SINGLE_PACKET

EP0_CHECK_PACKET:

JC EP0_SINGLE_PACKET

MOV R5, #16

MOV NO_SINGLE_PACKET, #1

EP0_SINGLE_PACKET:

MOV R0, #1

CALL D12_WRITEENPPOINT_PC ; В DPTR - ПРОСТО ОБЯЗАН БЫТЬ АДРЕС СЛЕДУЮЩЕГО БАЙТА !!!

MOV ACC, R2

ADD A, CD_COUNT

MOV CD_COUNT, ACC

M_RET:

RET

EP0_RXDONE: ; ХОСТ ПОСЫЛАЕТ НАС... В К.Т. 0

MOV R0, #40H

CALL PR_D12_1

MOV ACC, R1

JNB ACC.5, NO_SETUP_PACKET

MOV R0, #0

MOV R3, #DEVICEREQUEST

MOV R5, #8

CALL D12_READENDPOINT ; ПОЛУЧАЕМ ПОСЫЛКУ ОТ ХОСТА

MOV R0, #0

CALL D12_ACK_ENDPOINT ; СООБЩИТЬ ХОСТУ, ЧТО SETUP ПАКЕТ ПОЛУЧЕН

MOV R0, #1

CALL D12_ACK_ENDPOINT

MOV R3, WLENGTH

MOV CD_LENGTH, R3

MOV FLAG, #1 ; ВЗВОДИМ ФЛАГ

NO_SETUP_PACKET:

RET

EP1_TXDONE: ; ПОСЫЛАЕМ ХОСТ... В К.Т. 1

MOV R0,#43H

CALL PR_D12_1

MOV ACC,R1

JNB ACC.0, LEN_NULL ; ПРЕДЫДУЩИЙ ПАКЕТ ПОСЛАН УСПЕШНО?

MOV R2, IN_COUNT

CJNE R2,#0, LENGTH_OK

LJMP LEN_NULL

LENGTH_OK:

MOV R5,IN_COUNT

MOV R0,#3

MOV R3,#IN_BUFFER

CALL D12_WRITEENDPOINT

MOV IN_COUNT,#0

LEN_NULL:

RET

EP1_RXDONE: ; ХОСТ ПОСЫЛАЕТ НАС... В К.Т. 1

MOV R0, #42H ; ЧТЕНИЕ СОСТОЯНИЯ ПОСЛЕДНЕЙ ТРАНЗАКЦИИ К.Т. 1(OUT)

CALL PR_D12_1

MOV ACC, R1

JB ACC.5, SETUP_PACKET

MOV R0, #2

MOV ACC,OUT_COUNT

CJNE A, #0, SETUP_PACKET

MOV R3, #OUT_BUFFER

MOV OUT_COUNT, #16

MOV R5, OUT_COUNT

CALL D12_READENDPOINT ; ПОЛУЧАЕМ ПОСЫЛКУ ОТ ХОСТА

MOV OUT_COUNT, R2 ;

SETUP_PACKET:

RET

D12_READENDPOINT: ; R0 - СОДЕРЖ. КОМАНДУ ВЫБОРА К.Т., R5-ДЛИННА ПОЛУЧАЕМЫХ ДАННЫХ, R3-АДРЕС БУФЕРА

CALL PR_D12_1

MOV ACC, R1

JB ACC.1, E_POINT_STALL

JNB ACC.0, BUFFER_NOT_FULL

MOV R0, #0F0H

CALL PR_D12_2

MOV ACC, R2 ; СОХРАНЯЕМ ДЛИННУ ПРОЧИТЫВАЕМЫХ ДАННЫХ

JZ E_POINT_STALL

MOV VALUE, R5

CLR C

CJNE A, VALUE, CHECK_LEN ; ЕСЛИ ТРЕБУЕМАЯ И ЗАПРОШЕННАЯ ДЛИННА НЕ РАВНЫ, ...

JMP LEN_OK

CHECK_LEN:

JNC LEN_OK

MOV R5, ACC

LEN_OK:

MOV A, R3

MOV R0,A ;

CLR P3.4 ; A=0. ФАЗА ДАННЫХ

SETB P3.7

REP:

MOV @R0, P0

CLR P3.7 ; RD=0

SETB P3.7 ; RD=1

INC R0 ; ПЕРЕХОД К СЛЕДУЮЩЕМУ БАЙТУ

DJNZ R5, REP ; ПОКА ВСЁ НЕ ПЕРЕШЛЁМ

MOV R0, #0F2H ; СООБЩИТЬ, ЧТО БУФЕР ПРОЧИТАН

LJMP PW_D12_0

BUFFER_NOT_FULL:

E_POINT_STALL:

RET

D12_WRITEENDPOINT:

CALL PR_D12_1

MOV ACC, R1

JB ACC.1, EP_STALL ; ВЫБРАННАЯ К.Т. ОСТАНОВЛЕНА?

JB ACC.0, BUFFER_FULL

MOV R0,#0F0H

MOV R1, #0

MOV A, R5

MOV R2,A

CALL PW_D12_2 ; СООБЩАЕМ PDIUSBD12, ЧТО ХОТИМ С НИМ СДЕЛАТЬ

CJNE R2, #0, LEN_NOT_NULL

LJMP WR_0

LEN_NOT_NULL:

MOV A, R3

MOV R0,A ;

CLR P3.4 ; A=0. ФАЗА ДАННЫХ

SETB P3.6 ; WR=1.

WEP_0:

MOV P0, @R0

CLR P3.6 ; WR=0

SETB P3.6 ; WR=1

INC R0 ; ПЕРЕХОД К СЛЕДУЮЩЕМУ БАЙТУ

DJNZ R5, WEP_0 ; ПОКА ВСЁ НЕ ПЕРЕШЛЁМ

WR_0:

MOV R0, #0FAH ; СООБЩИТЬ, ЧТО БУФЕР ПОЛНЫЙ

LJMP PW_D12_0

BUFFER_FULL:

EP_STALL:

RET

PW_D12_0:

SETB P3.6 ; WR=1

SETB P3.7 ; RD=1

SETB P3.4 ; A0=1

MOV P0,R0

CPL P3.6

SETB P3.6 ; WR=1

RET

PW_D12_1:

SETB P3.6 ; WR=1

SETB P3.7 ; RD=1

SETB P3.4 ; A0=1

MOV P0,R0

CPL P3.6

SETB P3.6 ; WR=1

CPL P3.4 ; A0=0

MOV P0,R1

CPL P3.6 ;

SETB P3.6 ; WR=1

RET

PW_D12_2:

SETB P3.6 ; WR=1

SETB P3.7 ; RD=1

SETB P3.4 ; A0=1

MOV P0,R0

CPL P3.6

SETB P3.6 ; WR=1

CPL P3.4 ; A0=0

MOV P0,R1

CPL P3.6

SETB P3.6 ; WR=1

MOV P0,R2

CPL P3.6

SETB P3.6 ; WR=1

RET

PR_D12_1:

SETB P3.6 ; WR=1

SETB P3.7 ; RD=1

SETB P3.4 ; A0=1

MOV P0,R0

CPL P3.6

SETB P3.6 ; WR=1

CPL P3.4 ; A0=0

MOV R1,P0

CPL P3.7

SETB P3.7 ; RD=1

RET

PR_D12_2:

SETB P3.6 ; WR=1

SETB P3.7 ; RD=1

SETB P3.4 ; A0=1

MOV P0,R0

CPL P3.6

SETB P3.6 ; WR=1

CPL P3.4 ; A0=0

MOV R1,P0

CPL P3.7

SETB P3.7 ; RD=1

MOV R2,P0

CPL P3.7

SETB P3.7 ; RD=1

RET

IN_DATA:

CLR P3.1

JNB P3.0, IN_EXIT

MOV ACC,IN_COUNT

CJNE A, #0, IN_EXIT

MOV R0,#IN_BUFFER

MOV R5,#8 ; 8

MOV IN_COUNT, R5

TX_OK:

JNB P3.0, TX_OK ; СНОВА ЖДЕМ ОЧЕРЕДНОГО СИГНАЛА ОТ О.У.

MOV @R0, P1

INC R0

SETB P3.1

NOP

NOP

CLR P3.1 ; СБРАСЫВАЕМ СТРОБ

DJNZ R5, TX_OK

IN_EXIT:

RET

START:

MOV SP,#STACK-1 ; FIRST SET STACK POINTER

CALL INIT_DATA ; ПРОЦЕДУРА ИНИЦИАЛИЗАЦИИ

CALL RECONECT_USB ; ДАТЬ СИГНАЛ ПОДКЛЮЧЕНИЯ К ЛИНИИ USB (ПЕРЕДАТЬ МИНИМАЛЬНЫЕ ХАРАКТЕРИСТИКИ УСТРОЙСТВА)

MAIN0:

JB P3.2, MAIN1 ; ТРЕБУЕТСЯ ЛИ ОБСЛУЖИВАНИЕ PDIUSBD12 (INT=0)?

CALL FN_USB_ISR ; РАЗБИРАЕМ ЗАПРОСЫ

MOV R1, FLAG

CJNE R1, #1, MAIN1 ; ПРИХОДИЛ ЛИ SETUP ПАКЕТ?

CALL SETUP_HADLER ; ДА. БЫЛ SETUP ПАКЕТ

MOV FLAG, #0 ; ОЧИСТКА ФЛАГА SETUP ПАКЕТА

MAIN1: ; ПЫТАЕМСЯ РАБОТАТЬ С ОБЪЕКТОМ УПРАВЛЕНИЯ

CALL IN_DATA ; ПРОЦЕДУРА ЧТЕНИЯ 32 БАЙТ ИЗ О.У.

MOV A, INT_ENABLE

CJNE A, #0, MAIN0

CALL SETTIMER

JMP MAIN0

SETUP_HADLER:

MOV R5, BREQUEST

CJNE R5, #1, HADLER_NOT_1

LJMP H_CLR_FEAT ; ПРИБЫЛ ЗАПРОС CLEAR_FEATURE ОТ ХОСТА

HADLER_NOT_1:

CJNE R5, #5, HADLER_NOT_5

LJMP H_SET_ADDRES ; ПРИБЫЛ ЗАПРОС SET_ADDRES ОТ ХОСТА

HADLER_NOT_5:

CJNE R5, #6, HADLER_NOT_6

LJMP H_GET_DESCRIPTOR ; НУЖНО ПЕРЕДАТЬ ТИП ДЕСКРИПТОРА ХОСТУ

HADLER_NOT_6:

CJNE R5, #8, HADLER_NOT_8

LJMP H_GET_CONFIG ; НУЖНО ПЕРЕДАТЬ КОНФИГУРАЦИЮ УСТРОЙСТВА ХОСТУ

HADLER_NOT_8:

CJNE R5, #9, RESERVED

LJMP H_SET_CONFIG ; ПРИБЫЛ ЗАПРОС SET_CONFIG ОТ ХОСТА

RESERVED:

RET

H_CLR_FEAT:

MOV R5, #0

MOV R0, #1

LJMP D12_WRITEENDPOINT

H_SET_ADDRES:

MOV ACC, WVALUE

SETB ACC.7

MOV R1, ACC

MOV R0, #0D0H

CALL PW_D12_1

LJMP H_CLR_FEAT

H_GET_DESCRIPTOR:

MOV R5, WVALUE+1

MOV R6, WVALUE

CJNE R5, #1, NOT_GD_DEVICE

LJMP H_GD_DEVICE

NOT_GD_DEVICE:

CJNE R5, #2, NOT_GD_CONFIG

LJMP H_GD_CONFIG

NOT_GD_CONFIG:

CJNE R5, #3, ANOTHER_DESC

LJMP H_GD_STRING

ANOTHER_DESC:

RET

H_GD_DEVICE:

MOV DPTR, #DEV_DESC

MOV A, #0

MOVC A, @A+DPTR ; ЧИТАЕМ ДЛИННУ ДЕСКРИПТОРА УСТРОЙСТВА

MOV R5, A ; ПЕРЕДАЁМ ДЛИННУ ОТВЕТА

LJMP CODE_TRANSMIT

H_GD_CONFIG:

MOV DPTR, #CONF_DESC ; ЧИТАЕМ АДРЕС ЗАРАНЕЕ ПОДГОТОВЛЕННОГО ОТВЕТА

MOV A, #0

MOVC A, @A+DPTR ; ЧИТАЕМ ДЛИННУ ДЕСКРИПТОРА КОНФИГУРАЦИИ

MOV R5, A

LJMP CODE_TRANSMIT

H_GD_STRING:

CJNE R6, #0, NO_LANG_ID

MOV DPTR, #LANG_ID ; ЧИТАЕМ АДРЕС ЗАРАНЕЕ ПОДГОТОВЛЕННОГО ОТВЕТА

LJMP DESCK_STR_OK

NO_LANG_ID:

CJNE R6, #1, NO_LANG_ID1

MOV DPTR, #LANG_ID ; ЧИТАЕМ АДРЕС ЗАРАНЕЕ ПОДГОТОВЛЕННОГО ОТВЕТА

LJMP DESCK_STR_OK

NO_LANG_ID1:

CJNE R6, #2, NO_PROD_ID

MOV DPTR, #PROD_ID ; ЧИТАЕМ АДРЕС ЗАРАНЕЕ ПОДГОТОВЛЕННОГО ОТВЕТА

LJMP DESCK_STR_OK

NO_PROD_ID:

CJNE R6, #3, NO_SERNUM

MOV DPTR, #SERNUM ; ЧИТАЕМ АДРЕС ЗАРАНЕЕ ПОДГОТОВЛЕННОГО ОТВЕТА

LJMP DESCK_STR_OK

NO_SERNUM:

LJMP RESERVED

DESCK_STR_OK:

MOV A, #0

MOVC A, @A+DPTR ; ЧИТАЕМ ДЛИННУ НУЖНОГО ДЕСКРИПТОРА СТРОК

MOV R5, A

LJMP CODE_TRANSMIT

H_GET_CONFIG:

MOV DPTR, #CONF_DESC+5 ; ЧИТАЕМ ЗАРАНЕЕ ПОДГОТОВЛЕННОЕ ЗНАЧЕНИЕ

MOV R5, #1

LJMP CODE_TRANSMIT

H_SET_CONFIG:

MOV R0, #0D8H

MOV R1, #1

CALL PW_D12_1

LJMP H_CLR_FEAT

CODE_TRANSMIT:

MOV CD_COUNT, #0

MOV R0, #1

MOV A, R5

CLR C

CJNE A ,CD_LENGTH, CHECK_CD_LEN

LJMP CD_LEN_OK

CHECK_CD_LEN:

JNC CD_LEN_OK

MOV CD_LENGTH, R5

CD_LEN_OK:

MOV R5, CD_LENGTH

MOV NO_SINGLE_PACKET, #0 ;

CLR C

CJNE R5, #16, CHECK_PACKET

LJMP SINGLE_PACKET

CHECK_PACKET:

SINGLE_PACKET

MOV R5, #16

MOV NO_SINGLE_PACKET,#1

SINGLE_PACKET:

CALL D12_WRITEENPPOINT_PC

MOV ACC, R2

ADD A, CD_COUNT

MOV CD_COUNT, ACC ; ЗАПОМИНАЕМ ЧИСЛО ПЕРЕДАННЫХ БАЙТОВ

RET

D12_WRITEENPPOINT_PC:

CALL PR_D12_1 ; ЧТЕНИЕ 1 БАЙТА(R1)

MOV ACC, R1

JB ACC.1, EP0_STALL ; ВЫБРАННАЯ К.Т. ОСТАНОВЛЕНА?

JB ACC.0, EP0_BUFFER_FULL

MOV R0,#0F0H

MOV R1, #0

MOV A, R5

MOV R2,A

CALL PW_D12_2 ; СООБЩАЕМ PDIUSBD12, ЧТО ХОТИМ С НИМ СДЕЛАТЬ

CJNE R2, #0, EP0_LEN_NOT_NULL

LJMP EP0_WR_0

EP0_LEN_NOT_NULL:

CLR P3.4 ; A=0. ФАЗА ДАННЫХ

SETB P3.6 ; WR=1. ПЕРЕСТРАХУЕМСЯ!!!!!!!!

EP0_WEP_0:

MOV ACC, #0

MOVC A, @A+DPTR

MOV P0, A ; БАЙТ НА ВЫВОД В ACC

CLR P3.6 ; WR=0

SETB P3.6 ; WR=1

INC DPTR

DJNZ R5, EP0_WEP_0 ; ПОКА ВСЁ НЕ ПЕРЕШЛЁМ

EP0_WR_0:

MOV R0, #0FAH ; СООБЩИТЬ, ЧТО БУФЕР ПОЛНЫЙ

LJMP PW_D12_0

EP0_BUFFER_FULL:

EP0_STALL:

RET

$INCLUDE (EPP.INC)

END

MACRO ASSEMBLER SHADOW 11/20/104 14:19:36 PAGE 2
MODULE INFORMATION: STATIC OVERLAYABLE

CODE SIZE = 1008 ----

XDATA SIZE = ---- ----

DATA SIZE = 41 ----

IDATA SIZE = 16 ----

BIT SIZE = ---- ----

END OF MODULE INFORMATION.


REGISTER BANK(S) USED : 0 1
ASSEMBLY COMPLETE. 0 WARNING(S) 0 ERROR(S)


Скачать файл (528 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru