[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