Silikagel

Karel Kulhavy clock
Středa Březen 17 12:06:51 CET 2004


    Zdravim,
tak jsem ten svuj programek trochu ladil a zjistil
jsem, ze se mi registr R2 meni, aniz by k tomu
mel duvod - mel se inkrementovat pouze pro prichodu
znaku serivym kanalem, lec ze zahadnych okolnosti
se menil, i kdyz uz bylo vse odvysilano (resp. zakazano
vysilani).

Jedine co jsem upravil bylo zakazani preruseni pred
cyklem, ktery vysilal data a po jejich odvysilani
jsem zase preruseni povolil...

Ted to funguje pekne, ale bohuzl mi to zacne vysilat
az po naplneni bufferu (32B + xB co zustaly v bufferu
UARTU v PC po zakazani vysilani signalem RTS).

Takze bych ted mel dve otazky:
1) proc se to tak chovalo - prc pomohlo zakazani preruseni
   i kdyz se teoreticky R2 uz menit nemelo
   
2) jak se zbavit cekani na plny buffer ???


Dekuji vsem moc za namety, rady, pripominky....

V priloze posilam zdrojak, snad dorazi.

-- 

----
                                         Martin Sveda
					 
		      email:        sejda@kn.vutbr.cz
		             martin.sveda@kn.vutbr.cz
		      www:    www.kn.vutbr.cz/~sveda3
-------------- next part --------------
; posila ven to, co prijde dovnitr
; funguje spolehlive, ale vysila jen
; kdyz ma plny buffer
;
;  R2 se pri vysilani meni ---- proc????
;
;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;            Definice
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

RTS		BIT	P3.7		; RTS - handshaking signal
CTS		BIT	P3.5		; CTS - handshaking signal

Buf_FULL	bit	0		; priznak plneho bufferu

Buffer		EQU	40h		; pocatek bufferu

Pom		EQU	39h		; pomocna promenna

; Registry R0 a R1 budou vyuzity na neprimou adresaci - bufferovani
; Registr R2 slouzi pro zaznam poctu bytu v bufferu (prijatych)
; Registr R3 slouzi pro zaznam poctu vyslanych bytu


; Registr R7, R6 a R5 jsou pro zpozdovaci rutinu

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;            Vektory preruseni
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	org	0h
	ljmp	start
	
	org	01Bh
	ljmp	citac
	
	org	23h
	ljmp	uart
	

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;           Program
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	org 	40h
start:

	mov	R0, #Buffer	; inicializace ukazatele
	mov	R1, #Buffer
	mov	R2, #0h		; nuluji pocet bytu v bufferu

	mov	P1,#0h		; vynuluju branu P1
	mov	P3,#0FFh	; P3 bude vstupni brana

	; nastaveni serioveho kanalu
	mov	SCON,#11010000b		; ser. kanal, rezim 3
	mov	PCON,#10000000b		; SMOD = 1
	
	; nastaveni citacu
	mov	TMOD,#00100000b		; citac 1, rezim 2
	mov	TH1,#0FDh		; predvolba pro citac 1 (19200bps)
	mov	TL1,#0FDh

	; nastaveni preruseni
	mov	IE,#10011000b		; povoleni preruseni od citace+serin
	mov	IP,#00010000b		; nejvyssi priorita je od serin
	
	;start
	mov	TCON,#01000000b		; start citace 1

	clr	TI
	
	; povolim prijem ser. dat (handshaking)
	clr	RTS
	clr	Buf_FULL		; nuluji priznak plneho bufferu



loop:

	jnb	Buf_FULL,$		; ceka na plny buffer
	acall	delay
	acall	delay

	clr	ES
vysilani:
	jb	CTS, $			; cekani na povoleni k vysilani
	mov	SBUF, @R1
	jnb	TI, $			; cekani na odvysilani		
	clr	TI
	inc	R1
	djnz	R2, vysilani
	; tady je uz odvysilany cely buffer

	mov	R0, #Buffer
	mov	R1, #Buffer
	mov	R2, #0h
	clr	Buf_FULL		; nulovani priznaku plneho bufferu
	setb	ES
	clr	RTS			; povoleni vysilani (mohu prijimat)

	ljmp	loop		; skok na zacatek

		

;;;;;;;;;;;
; Jine rutiny
;;;;;;;;;;;

delay:
	mov	R7, #100
  del:
	mov	R6, #70
	djnz	R6, $
	djnz	R7, del
	ret
;;;;



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;           Handlery preruseni
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

citac:
	reti				; navrat z preruseni od citace


uart:
	jnb	RI, xmit
	mov	@R0, SBUF		; co prislo, dam do akumulatoru
	inc	R0			; posun ukazatele
	inc	R2			; inkrementace poctu doslych bytu
	clr	RI			
	cjne	R2,#32, end_uart	; pokud je buffer plny,
	setb	RTS			; zastavim tok dat
	setb	Buf_FULL		; nastavim priznak plneho bufferu
	cpl	P1.6


  xmit:
	cpl	P1.7

  end_uart:

	reti


	end


Další informace o konferenci Hw-list