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