ЭУМК по дисциплине "Проектирование проблемно-ориентированных вычислительных средств" › Теория › Тема 8. Блок многочастотного приемника сигналов для цифровой АТС

# Электронный учебно-методический
комплекс по дисциплине
"Проектирование проблемно-ориентированных вычислительных средств"

для специальности

1-40 02 02 «Электронные вычислительные средства»

Оглавление | Программа | Теория | Практика | Контроль знаний | Об авторах

8.6. Программное управление блоком многочастотного приемника
8.6.1. Программа инициализации блока многочастотного приемника
Описание переменных

    ;***********************************************************************
    ;  Description:  Программа TMS320VC5402 для БЕТА МЧП
    ;  Copyright BSUIR, Minsk, Belarus, 2004
    ;  U. Klius & M. Kachinsky, 22/04/2004. (017) 239-89-78
    ;***********************************************************************
    	.asg	22042004h, DATE		; Дата модификации программы
    	.asg	1, Yes
    	.asg	0, No
    	.asg	Yes, HPI
    	.asg	2, IKM				; Число ИКМ-трактов
    IDNT	.set	0505h-(HPI+2*(IKM-1))*100h ; Версия программы
    	.asg	No, Sp50			; Скорость процессора 50 МГц
    	. . .
    	.include "stp_256.inc"		; Амплитуды и частоты для эмуляции
    	.mmregs
    *-------------------------  Регистры  McBSP0  -------------------------*
    McBSP0_DRR1 .set	0021h		; McBSP0 Data Rx Reg1
    	. . .
    PCR	   .set	000Eh		; McBSP Pin Ctrl Reg
    *	DLB RJUST CLKSTP rsvd DXENA ABIS RINTM RSYNCERR RFULL RRDY -RRST
    * SPCR1:  0   10     00   000    0    0    00      0       0    0     0
    *	0100000000000000b	4000h
    *	0~~~~~~~~~~~~~~~ (DLB)	Digital loop back mode disabled
    *	~10~~~~~~~~~~~~~ (RJUSR)	Left-just and zero-fill DRR[1,2]
    *	~~~00~~~~~~~~~~~ (CLKSTP)	Clock stop mode disabled
    *	~~~~~000~~~~~~~~		Reserved
    *	~~~~~~~~0~~~~~~~ (DXENA)	DX enabler is off
    *	~~~~~~~~~0~~~~~~ (ABIS)	A-bis mode is disabled
    *	~~~~~~~~~~00~~~~ (RINTM)	RINT driven by RRDY (end of word)
    *	~~~~~~~~~~~~0~~~ (RSYNCERR)	No synchronization error
    *	~~~~~~~~~~~~~0~~ (RFULL)	RBR[1,2] is not in overrun(R-only)
    *	~~~~~~~~~~~~~~0~ (RRDY)	Receiver Ready: 1=ready (R-only)
    *	~~~~~~~~~~~~~~~0 (-RRST)	Receiver reset: 1=enabled
    	. . .
    *	ARP  TC  C  OVA  OVB    DP
    * ST0:	000  1   1   0    0  000000000
    *	000  0   0   0    0  000000000
    ;+ Внешние Регистры ( только для REG )
    	.asg	0h, BaseIO		; Base IO Addres
    	.asg	BaseIO+0, TWD	; Write Data Register
    	.asg	BaseIO+0, TRD	; Read  Data Register
    	.asg	BaseIO+1, TWC	; Write Control Register
    	.asg	BaseIO+1, TRS	; Read  Status  Register
    *			RUN(0)
    * TWC:			 0
    *	HTBF THBE                WAIT LOAD
    * TRS:	 7    6                   1    0
    *
    * Биты состояния
    	.asg	8, THTBF		; Test HOST to TMS Buffer Full
    	.asg	9, TTHBE		; Test TMS to HOST Buffer Empty
    	.asg	14, TWAIT		; Test Wait State
    	.asg	15, TLOAD		; Test Load State
    	. . .
    ;	Область системной памяти в dma
    	.asg	   60h, SysP		; Адрес на странице 0
    	.asg	  SysP, TEMP		; 60 Рабочая ячейка
    	.asg	TEMP+1, ONE		; 61 1
    	.asg	 ONE+1, COM0		; 62 Слово команды
    	. . .
    	.asg	PHS1+4, TTIM		; 7C,7D,7E Test Time Run
    	.asg	TTIM+3, CNTD		; 7F Счетчик для DFT
    *
    ;	Распределение внутренней памяти dma
    ; 0080-29FF -	Память программы
    	.asg	2A00h, x_dat		; буфер чтения ИКМ0 (2A80 ИКМ1)
    	.asg	2B00h, buf_trn	; буфер передачи ИКМ0 (2B80 ИКМ1)
    	. . .
    	.asg	ar1, ar_x		; only Smem   input data
    	.asg	ar2, ar_s		; Xmem & Ymem average data
    	.asg	ar3, ar_h		; Xmem & Ymem coeff. of filters
    	.asg	ar4, ar_xd		; Xmem & Ymem delayed data
    	.asg	ar4, ar_fm		; Xmem & Ymem number of first  Max
    	.asg	ar5, ar_xy		; Xmem & Ymem prehist. of filters
    	.asg	ar5, ar_sm		; Xmem & Ymem number of second Max
    	.asg	ar6, ar_t		; only Smem   numb. of current Max
    	.asg	ar7, ar_y		; only Smem   code data
    ;***********************************************************************

Вектора и обработка прерываний

    	.def	_c_int00		; C entry point
    	.text
    	.sect	".vectors"		; таблица векторов прерываний
    	.align	0x80			; выравнивание на границу страницы
    RESET:					; вектор сброса процессора
    	BD	_c_int00		; переход на начало программы	(2)
    	STM	#a_stack, SP		;2w установить указатель стека	(2)
    nmi:	RETE				; разр.прер. и выйти из него		(1)
    	NOP				;					(1)
    	NOP				;					(1)
    	NOP				;					(1)
    		; программные прерывания
    sint17	.space	4*16			;					(4)
    	. . .
    int0:	bd	COMM			; вход по команде для REG		(2)
    	pshm	st0			;1w					(1)
    	pshm	st1			;1w					(1)
    	. . .
    dmac4:	addm	#ikm_c, FLAG		; конец/середина приемного буфера
    	rete				;					(1)
    		NOP			;					(1)
    dmac5:	bd	DMA5			; синхронизация адреса передачи	(2)
    	stm	#DMSRC2, DMSA		;2w					(2)
    	. . .
    IDN:	.word	0			; Версия (адрес 00FDh)		(1)
    	.long	DATE			; Дата   (адрес 00FEh, 00FFh)	(2)
    *
    RAMCMD:
    	bd	NCOM			; несуществующая команда 0		(2)
    	popm	ag			;1w					(1)
    	popm	ah			;1w					(1)
    	bd	RECONF			; действительная команда 1		(2)
    	ld	COM0, a			;1w					(1)
    	and	M08, a			;1w					(1)
    	bd	STATE			; действительная команда 2		(2)
    	popm	ag			;1w					(1)
    	popm	ah			;1w					(1)
    	bd	RECTST			; действительная команда 3		(2)
    	ld	COM0, a			;1w					(1)
    	and	M08, a			;1w					(1)
    	. . .
    	bd	OUTDAT			; действительная команда 8		(2)
    	pshm	ar1			;1w					(1)
    	pshm	ar2			;1w					(1)
    	. . .
    	bd	RESTART			; действительная команда F		(2)
    	stm	#0, COM0		;2w					(2)
    *
    *+++++++++++++++++++++++  Обработчик прерываний  +++++++++++++++++++++++
    ;	синхронизация адреса буфера передатчика с приемником
    DMA5:	stm	#buf_trn+ikm_c*2/IKM+2, DMSDN	; коррекция адреса ИКМ0
    	stm	#DMSRC3, DMSA			;				(2)
    	stm	#buf_trn+ikm_c*2*2+ikm_c+2, DMSDN ;корр. адреса ИКМ1
    	reted					;				(1)
    	andm	#MCDMA5, imr			;2w запретить прерывание DMA5

Начальная инициализация блока МЧП

    *========================= Головная  программа =========================
    _c_int00
    	stm	#a_stack, sp		;					(2)
    	stm	#RESET+20h, pmst	;					(2)
    	stm	#0, st0			;					(2)
    	stm	#0941h, st1		;					(2)
    	ld	#0FFFFh, 16, a		; al=0, ah=FFFF			(2)
    	stl	a, imr			;					(1)
    	sth	a, ifr			;					(1)
    	sth	a, prd			;					(1)
    	sth	a, prd1			;					(1)
    	sth	a, tim1			;					(1)
    	stl	a, tcr1			;d start timer1 10 ns			(1)
    *------------------------  Сброс McBSP0&McBSP1  ------------------------
    	stm	#SPCR1, McBSP0_SPSA	;					(2)
    	stm	#4000h, McBSP0_SPSD	;					(2)
    	stm	#SPCR2, McBSP0_SPSA	;					(2)
    	stlm	a, McBSP0_SPSD		; al=0					(1)
    	. . .
    *-----------------------------------------------------------------------
    	stm	#3FC0h, swwsr		;					(2)
    Clock	stlm	a, clkmd		; al=0, переключиться на DIV		(1)
    TstSt
    	ldm	clkmd, a		;					(1)
    	and	#1, a			; установить бит статуса		(2)
    	bc	TstSt, aneq		;					(2)
     .if Sp50
    	stm	#04007h, clkmd		; перейти на PLL (*5) 50МГц		(2)
     .else
    	stm	#09007h, clkmd		; перейти на PLL (*10) 100МГц	(2)
     .endif
    *
    	st	#1, ONE			;					(2)
    	st	#000FFh, M08		;					(2)
    	st	#0FF00h, M80		;					(2)
    *-----------------------  Инициализация  McBSP0  -----------------------
    	stm	#RCR1, McBSP0_SPSA	;					(2)
    	stm	#(ikm_c*2/IKM-1)*256+0h, McBSP1_SPSD ; кадр 32(64) сл.
    	stm	#RCR2, McBSP0_SPSA	;					(2)
    	stm	#001Ch, McBSP0_SPSD	; Word A-law + Every Sinc		(2)
    *
    	stm	#XCR1, McBSP0_SPSA	;					(2)
    	stm	#(ikm_c*2/IKM-1)*256+0h, McBSP1_SPSD ; кадр 32(64) сл.
    	stm	#XCR2, McBSP0_SPSA	;					(2)
    	stm	#001Ch, McBSP0_SPSD	; Word A-law + Every Sinc		(2)
    *
    	stm	#PCR, McBSP0_SPSA	;					(2)
    	stm	#000Ch, McBSP0_SPSD	;					(2)
    *-----------------------  Инициализация  McBSP1  -----------------------
    	. . .
    *---------------  Инициализация контроллера DMA  (DMA2)  ---------------
    	stm	#DMSRC2, DMSA		; установить адрес источника на	(2)
    	stm	#buf_trn+1, DMSDN	; buf_trn+1				(2)
    	stm	#DMDST2, DMSA		; установить адрес приемника на	(2)
    	stm	#McBSP0_DXR1, DMSDN	; McBSP0_DXR1				(2)
    	stm	#DMCTR2, DMSA		;					(2)
    	stm	#ikm_c*2*2/IKM, DMSDN ; длина буфера 32(64)*2 слов	(2)
    	stm	#DMSFC2, DMSA		;					(2)
    	stm	#2000h, DMSDN		;					(2)
    	stm	#DMMCR2, DMSA		;					(2)
    	stm	#3441h, DMSDN		; приращение адреса по DMIDX1	(2)
    *---------------  Инициализация контроллера DMA  (DMA3)  ---------------
    	. . .
    *---------------  Инициализация контроллера DMA  (DMA4, 5)  ------------
    	. . .
    *--------------  Initialization DMA Controller  (DMA2-5)  --------------
    	stm	#DMIDX0, DMSA		;					(2)
    	stm	#1, DMSDN		; задать приращение адреса +1	(2)
    	stm	#DMIDX1, DMSA		;					(2)
    	stm	#1, DMSDN		; задать приращение адреса +1	(2)
    	stm	#303Ch, DMPREC		; включить каналы 2&3&4&5		(2)
    *-----------------------------------------------------------------------
    	stm	#IDN, ar_y		;					(2)
    	cmpm	*ar_y, #IDNT		;					(2)
    	stm	#4000h-EPRG-1, brc	; Запись адресов			(2)
    	rptbd	stadr-1			; в свободную память			(2)
    	stm	#EPRG, ar_xy		;2w команда не повторяется		(2)
    	ldm	ar_xy, a		; прочитать адрес в а			(1)
    	stl	a, *ar_xy+		; записать адрес (stl), 0 (sth)	(1)
    stadr
    	bcd	OK, tc			; версия программы в памяти		(2)
    ; версии программы нет в памяти (первый запуск)
    	stm	#(t_dat+t_len), ar_xy ;2w for test				(2)
    	rptz	a, #(t_len-1)		; clear					(2)
    	stl	a, *ar_xy-		; level buffer				(1)
    	ldm	ar_xy, b		;					(1)
    	stm	#TMP1, ar_xy		; очистка системной памяти		(2)
    	rpt	#24-2			; от 68h до 7Eh			(1)
    	stl	a, *ar_xy+		; a = 0					(1)
    	. . .
    	stm	#RESET, ar_xy		; Подсчет контрольной суммы		(2)
    	rptz	a, #(EDAT-RESET)	; д.б. равна версии ПО		(2)
    	add	*ar_xy+, a		;					(1)
    	add	a, -16, a		;					(1)
    	stl	a, *ar_y		; запись КС (версии ПО)		(1)
    	and	#0FFFFh, a		;					(2)
    	nop				; точка останова для КС		(1)
     .if HPI
    OK
     .else
    	portw	al, TWD			;					(2)
    OK	portr	TRD, TEMP		;					(2)
    	portw	ah, TWC			; ah = 0				(2)
     .endif
    	sth	a, FLAG			;					(1)
    	. . .
    *------------------------  Старт McBSP0&McBSP1  ------------------------
    	stm	#SPCR2, McBSP0_SPSA	;					(2)
    	ld	McBSP0_SPSD, 16, a	;					(1)
    	or	#RunXmtr, 16, a	;					(2)
    	stm	#SPCR1, McBSP0_SPSA	;					(2)
    	or	McBSP0_SPSD, a		;					(1)
    	or	#RunRcvr, a		; ah - X0, al - R0			(2)

    	stm	#SPCR2, McBSP1_SPSA	;					(2)
    	ld	McBSP1_SPSD, 16, b	;					(1)
    	or	#RunXmtr, 16, b	;					(2)
    	stm	#SPCR1, McBSP1_SPSA	;					(2)
    	or	McBSP1_SPSD, b		;					(1)
    	or	#RunRcvr, b		; bh - X1, bl - R1			(2)

    	sth	a, McBSP0_DXR1		;					(1)
    	sth	a, McBSP1_DXR1		;					(1)
     .if EmulDat = No
    	stl	a, McBSP0_SPSD		; Start Serial Port R0		(1)
       .if IKM = 2
    	stl	b, McBSP1_SPSD		; Start Serial Port R1		(1)
       .endif
    	stm	#SPCR2, McBSP0_SPSA	;					(2)
    	stm	#SPCR2, McBSP1_SPSA	;					(2)
    	sth	a, McBSP0_SPSD		; Start Serial Port X0		(1)
       .if IKM = 2
    	sth	b, McBSP1_SPSD		; Start Serial Port X1		(1)
       .endif
     .endif
    *-----------------------------------------------------------------------
    	. . .
    	stm	#0FFFFh, ifr		; сброс всех прерываний		(2)
     .if HPI
    	stm	#(MWHPI | MWDMA4| MWDMA5), imr ; размаскир. прер.		(2)
     .else
    	stm	#(MWHTBF | MWDMA4| MWDMA5), imr ; размаскир. прер.	(2)
     .endif
    	. . .
    	rsbx	intm			; разрешить прерывания		(1)
    nxtf	; начало главного цикла
    	. . .
    wdma1	bitf	FLAG, #ikm_c		;					(2)
    	bcd	wdma1, ntc		; 1-я пол.буфера не заполнена	(2)
    	stm	#xy_dat+l_dat-1, ar_xy ;2w					(2)
    ;----	Buf1 IKM0
    	. . .
    	bd	nxtf			; в начало цикла			(2)
    	andm	#0FFFFh-ikm_c*6, FLAG ;2w сбросить флаг (0FF3Fh)		(2)

8.6.2. Программа дешифрации и выполнения команд блока МЧП
Подпрограмма дешифрации команд

    COMM	pshm	ar3			; обработка команд			(1)
    	pshm	al			;					(1)
    	pshm	ah			;					(1)
    	pshm	ag			;					(1)
    	portr	TRD, COM0		;					(2)
    	ld	COM0, -10, a		;					(2)
    	and	#3Ch, a			;					(2)
    	add	#RAMCMD, a		;					(2)
    	baccd	a			; переход по команде			(1)
    	stm	#TEMP, ar3		;2w					(2)
    *
    NCOM	addm	#1, ERCC		; ошибка				(2)
    	orm	#ErComm, STAT		; несуществующая команда		(2)
    	pshm	COM0			;					(1)
    	popm	ERRC			;					(1)
    ENDCOM	popm	al			; завершение команды			(1)
    	popm	ar3			;					(1)
    	popm	st1			;					(1)
    	popm	st0			;					(1)
    	andm	#0FFFFh, tcr		; 0FFEFh start timer 0		(2)
    	reted				; возврат из прерывания		(1)
    	pshm	STAT			;1w					(1)
    	popm	COM0			;1w					(1)

Подпрограммы выполнения команд блока МЧП

    	.align	0x80			; выравнивание на границу страницы
    *
    * Приемник ВКЛ	0001 CCCC NNNN NNNN
    * Приемник ВЫКЛ	0001 0000 NNNN NNNN
    * N - номер приемника, C - код группы частот
    ;	adr_prg, adr_cof, aver1, ..., aver8, cnt&cod_c, cnt&cod_o
    ; ofs:	   0        1       2           9        10         11
    ;	COM0 & M08 -> a
    RECONF	pshm	ar4			;					(1)
    	stlm	a, ar3			;					(1)
    	ld	a, ikm_sht, a		; *32 = 20h				(1)
    	addm	#c_dat, ar3		;					(2)
    	stlm	a, ar4			;					(1)
    	ld	COM0, a			;					(1)
    	addm	#s_dat+ikm_stp-1, ar4 ;					(2)
    	and	#0F00h, a		; код группы частот			(2)
    	sth	a, *ar3			;					(1)
    	ld	a, -7, a		;					(1)
    	add	#tab_gr+1, a		; смещение 2 (адрес коэфф.)		(2)
    	stlm	a, ar3			;					(1)
    	rpt	#ikm_stp-3		;					(1)
    	sth	a, *ar4-		;					(1)
    	mvdd	*ar3-, *ar4-		;					(1)
    	mvdd	*ar3, *ar4		;					(1)
    	popm	ar4			;					(1)
    	bd	ENDCOM			;					(2)
    	popm	ag			;1w					(1)
    	popm	ah			;1w					(1)
    *
    * Состояние программы	0010 XXXX XXXX XXXX
    * X - не используются, Состояние записывается в COM0
    STATE	pshm	STAT			; 					(1)
    	popm	COM0			;					(1)
    	popm	al			;					(1)
    	popm	ar3			;					(1)
    	popm	st1			;					(1)
    	popm	st0			;					(1)
    	reted				;					(1)
    	stm	#0, STAT		;2w					(2)
    *
    * Опросить приемник	0011 XXXX NNNN NNNN (для МЧП)
    * X - не используются, N - номер приемника
    * Ответ	CCCC CCCC FFFF FFFF
    * C - счетчик, F - код частоты (частот)
    ;	adr_prg, adr_cof, aver1, ..., aver8, cnt&cod_c, cnt&cod_o
    ; ofs:	   0        1       2           9        10         11
    ;	COM0 & M08 -> a
    RECTST	add	#c_dat, a		;					(2)
    	stlm	a, ar3			;					(1)
    	popm	ag			;					(1)
    	popm	ah			;					(1)
    	bd	ENDCOM			;					(2)
    	portw	*ar3, TWD		;2w					(2)
    *
    * Output Data	1000 CCCC CCCC CCCC
    * C - count, A - addres AAAA AAAA AAAA AAAA	(D...D)
    OUTDAT	orm	#10h, tcr		; stop timer0				(2)
    	ld	COM0, a			;					(1)
    OUTD	portr	TRS, *ar3		;					(2)
    	bit	*ar3, THTBF		;					(1)
    	bcd	OUTD, ntc		;					(2)
    	and	#00FFFh, a		;2w					(2)
    	portr	TRD, ar2		;					(2)
    	stlm	a, ar1			;					(1)
    *
    OUTD1	portr	TRS, *ar3		;					(2)
    	bit	*ar3, TTHBE		;					(1)
    	bc	OUTD1, ntc		;					(2)
    	portw	*ar2+, TWD		;					(2)
    	banzd	OUTD1,*ar1-		;					(2)
    	stm	#MWHTBF, ifr		;2w					(2)

    	popm	ar2			;					(1)
    	popm	ar1			;					(1)
    OUTD2	bd	ENDCOM			; end of command			(2)
    	popm	ag			;1w					(1)
    	popm	ah			;1w					(1)
    	. . .
     .if HPI
    	.space	(01FEh-0182h)*16
     .else
    	.space	(01FEh-018Bh)*16
     .endif
    ;	.align	0x7E			; выравнивание _c_int00
    *================= Команда перезапуска =================================
    RESTART frame 6			;					(1)
    	popm	ADR0			;					(1)

Оглавление | Программа | Теория| Практика | Контроль знаний | Об авторах
© БГУИР , 2012