[elektro-etc] soros kommunikáció TP
Moczik Gabor
pm_levlista at progzmaster.hu
Tue Dec 4 16:05:19 CET 2007
otto wrote:
> Közben most látom,hogy a listára "nem ment ki" tegnap a kérdéses program,így
> jogos a kérdés!
> Tehát az alábbi program nem jól működik,de nem tudom,hogy miért:
Na, BIOS megszakitassal nem kezeltem sose, egybol hardver szintut irtam...
> procedure RSelesztese;
> begin
> regs.AX:=(128+64+32+0+0+0+0+2+1); {11100011 9600 baud,nincs
> par,8bit}
> {Set up for setting baud rate of serial port}
> regs.DX:=0; {for com1, DX := 0 com1 port megadása}
> intr($14,regs); {Set baud rate, etc. for port az előzőek
> kiküldése}
Ez is lehet jó, bár ha már direkt I/O-val csinálod, akkor megírhatnád az
inicializálást is BIOS függetlenül...
> getintvec($0C,com1); {Save old interrupt for com1}
> hd:=0; tl:=0; {A buffer paraméterei a kezdet és vég}
> Holdint := port[$21]; {Save initial status of interrupt enables.}
> setintvec($0C, at input); {Redirect input from Com1 to procedure Input}
> port[$21]:=port[$21] and $EF; {11101111 Enable interrupts for Com1}
> base:=memw[$40:$00]; {memória terület a Com1 részére jó címzés?}
>
> port[base+3]:=port[base+3] and $7F; {amit beállítottam,hogy tudjak
> beolvasni}
> port[base+1]:=$01; {vett adat érvényes megszakítás engedélyezése}
> port[base+4]:=$09; {out2 invertált vezérlése;DTR invertált
> vezérlése}
> {ennélkül nem müködik}
>
> xRS:=port[base]; {nem látom az értelmét!}
Ez az inicializáció része, ki kell olvasni az RBR regisztert (hátha maradt
benne valami, ami minket nem érdekel).
Kéne még egy 'dummy' olvasás az MSR (+6), LSR (+5) és IIR (+2) regiszterekre is.
> end;
> --------------------------------------------------------------------------
> procedure input(flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP: word);
> interrupt;
> begin
> if port[base+5] and 1=1 then {Ha a "0." bit =1 akkor valami jött a
> portra}
Az IIR regisztert is kéne olvasni, hogy kiderüljön miért keletkezett
megszakítás. Sőt, inkább csak azt kéne, abból kiderül ha vett adat van a
bufferben.
> Begin
> buf[hd]:=port[base]; {új karaktert tesz com1 a buffer-be}
> inc(hd); {a következő cellára mutat}
> hxxflag:=1; {jelzi,hogy volt megszakítás}
> if hd >= portbufsize then hd := 0;
> End;
>
> port[$20]:=$20; {megszakítás törlése}
> end;
Szerintem ez jó.
> {----------------------------------------------------}
> procedure RSkilep; {ha elhagyom az RS rutint!}
> begin
> port[$21]:= Holdint; {azzal lépek ki amellyel bejöttem}
Ez nem jó. DOS alatt ugyan nincsen multitaszk, de a háttérben attól még
megváltoztathatja valami a megszakítás flageket.
Itt kell kiolvasni, törölni (illetve 1-be állítani, mert negált) ami nem
kell, és azt visszaírni.
--
((( Móczik Gábor )))--((( E~Mail: pm-junk ~@~ progzmaster ~.~ hu )))
((( Skype: moczik )))
More information about the Elektro-etc
mailing list