Bài giảng Đo lường và điều khiển bằng máy tính - Chương 4: Lập trình cho máy tính điều khiển

Chöông  
4
LAÄP TRÌNH CHO MAÙY TÍNH ÑIEÀU  
KHIEÅN  
4.1 LAÄP TRÌNH XUAÁT NHAÄP NGOAÏI VI  
Khi duøng maùy tính ñeå ño löôøng, ñieàu khieån ta phaûi giaûi quyeát vaán ñeà  
laø xuaát moät döõ lieäu 8 bit ra moät thanh ghi hay ñoïc döõ lieäu 8 bit töø thanh ghi  
vaøo moät bieán.  
Vaán ñeà naøy ñöôïc giaûi quyeát deã daøng bôûi caùc ngoân ngöõ laäp trình trong  
moâi tröôøng DOS nhö hôïp ngöõ, Qbasic, Pascal, C. Vôùi heä ñieàu haønh  
Windows 98, 2000XP thì coâng vieäc trôû neân phöùc taïp hôn..  
4.1.1 Laäp trình xuaát nhaäp trong moâi tröôøng DOS  
1- Laäp trình hôïp ngöõ  
Xuaát döõ lieäu töø bieán data ra coång coù ñòa chæ address:  
mov  
mov  
out  
dx, address  
ax, data  
dx, ax  
Ví duï:  
mov  
mov  
out  
dx, 300H  
ax, F0H  
dx, ax  
Nhaäp soá lieäu töø coång ñòa chæ address vaøo bieán data  
mov  
in  
dx, address  
ax, dx  
mov  
data, ax  
data, address laø soá nhò phaân 16 bit.  
2- Qbasic  
Duøng leänh INP (port%) vaø OUT port%, data%  
port laø soá nguyeân töø 0 ñeán 65535 chæ ñòa chæ coång  
data laø soá nguyeân töø 0 ÷ 255,&H kyù hieäu soá Hex phía sau , % kyù hieäu  
CHÖÔNG 4: LAÄP TRÌNH CHO MAÙY TÍNH ÑIEÀU KHIEÅN  
Trang 88  
bieán laø soá nguyeân  
Ví duï:  
a% = INP (&H3FC)  
‘ñoïc soá lieäu ôû coång 3FCH, thanh ghi modem  
‘ñaûo bit cuoái, xuaát ra coång 3FCH  
OUT &H3FC, (a% XOR 1)  
OUT 768, 160  
‘ xuaát A0H ra coång 300H  
3- Pascal  
Duøng leänh port: xuaát nhaäp moät byte, portw: xuaát nhaäp moät töø  
Xuaát ra port ñòa chæ reg:  
}
{
port[reg]: = data;  
ñoïc soá lieäu ôû port ñòa chæ reg vaøo bieán value .  
}
{
value: = port [reg];  
Ví duï:  
data: = port [$378];  
port [$37A]:= data out;  
4- C, C Builder, Visual C  
Duøng leänh inp vaø outp (hay inportb, outportb, inport, outport)  
Control = inp (0X61);  
outp (0X43, 0Xb6);  
Visual C++ 6.0 coù caùc haøm vaø thuû tuïc:  
_inp:  
ñoïc byte  
_outp:  
xuaát byte  
_inpw:  
_inpd:  
ñoïc moät töø _outpw: xuaát töø  
ñoïc töø keùp _outpd: xuaát töø keùp  
Ví duï: laäp trình C  
# include <conio.h>  
# define dataport 0x378  
# define statusport 0x379  
int Dummy:  
Dummy = _outp(dataport, 0);  
Dummy = _inp(statusport);  
...  
4.1.2 Laäp trình xuaát nhaäp duøng Visual C++6.0  
Sau khi môû VC, baïn vaøo menu File – New – Projects choïn muïc  
MFCAppWizard (exe), sau ñoù ñaët teân cho project vaø ñòa chæ löu file roài baám  
OK.  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 89  
Khi cöûa soå MFCAppWizard xuaát hieän, choïn option Dialog Based sau  
ñoù tieáp tuïc baám Next, ôû böôùc 4 baïn baám Finish roài OK  
Sau ñoù baïn taïo caùc ñoái töôïng Static Text, Edit Box, Button vaø Timer,  
caùc bieán lieân keát vôùi Edit Box Port In vaø Port Out laàn löôït laø m_indata vaø  
m_outdata. Cöù moãi 1s do Timer chöông trình ñoïc döõ lieäu ôû Port In 379, xöû  
lyù roài xuaát ra Port Out 378  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 4: LAÄP TRÌNH CHO MAÙY TÍNH ÑIEÀU KHIEÅN  
Trang 90  
Sau ñaây laø moät phaàn cuûa chöông trình xuaát nhaäp coång, caùc doøng in  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 91  
ñaäm laø caùc doøng boå sung theâm  
// ioportDlg.cpp : implementation file  
#include "stdafx.h"  
#include "ioport.h"  
#include "ioportDlg.h"  
# include "conio.h" //definition _inp and _outp  
#ifdef _DEBUG  
#define new DEBUG_NEW  
#undef THIS_FILE  
static char THIS_FILE[ ] = __FILE__;  
#endif  
BOOL CIoportDlg::OnInitDialog()  
{
CDialog::OnInitDialog();  
SetIcon(m_hIcon, TRUE);  
SetIcon(m_hIcon, FALSE);  
// Set big icon  
// Set small icon  
SetTimer(ID_CLOCK_TIMER,1000, NULL);  
return TRUE;  
}
void CIoportDlg::OnTimer(UINT nIDEvent)  
{
UpdateData(TRUE);  
m_indata=_inp(0x379);  
m_outdata=m_indata ^0x80;  
_outp(0x378,m_outdata);  
UpdateData(FALSE);  
CDialog::OnTimer(nIDEvent);  
}
void CIoportDlg::OnBtnexit()  
{
OnOK();  
}
4.1.3 Laäp trình duøng Delphi  
Khoâng coù leänh xuaát nhaäp maø ta phaûi duøng hôïp ngöõ taïo haøm xuaát nhaäp.  
Functrion Inport (address: word): byte;  
Var data: word;  
begin  
asm  
push dx  
mov dx, address  
in ax, dx  
mov data, ax  
pop dx  
end;  
inport: = data; end;  
Procedure Outport (address: word; data: word);  
begin  
asm  
push dx  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 4: LAÄP TRÌNH CHO MAÙY TÍNH ÑIEÀU KHIEÅN  
Trang 92  
mov dx, address  
mov ax, data  
out dx, ax  
pop dx  
end;  
end;  
Ví duï: Chöông trình Delphi xuaát nhaäp Port  
unit inoutunit;  
interface  
uses  
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;  
type  
TForm1 = class(TForm)  
Edit1: TEdit;  
Edit2: TEdit;  
Label1: TLabel;  
Label2: TLabel;  
btnIN: TButton;  
btnOUT: TButton;  
function inport (address:word):byte;  
procedure outport (address:word; data:byte);  
procedure btnINClick (Sender: TObject);  
procedure btnOUTClick (Sender: TObject);  
private  
{ Private declarations }  
public  
{ Public declarations }  
end;  
var  
Form1: TForm1;  
implementation  
{$R *.DFM}  
function Tform1.inport (address:word):byte;  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 93  
var data:byte;  
begin  
asm  
push dx  
mov dx,address  
in al,dx  
mov data, al  
pop dx  
end;  
inport:= data;  
end;  
procedure TForm1.outport (address:word; data:byte);  
begin  
asm  
push dx  
mov dx,address  
mov al,data  
out dx,al  
pop dx  
end;  
end;  
procedure TForm1.btnINClick (Sender: TObject);  
begin  
edit2.text:= inttostr (inport (strtoint (edit1.text)));  
end;  
procedure TForm1.btnOUTClick (Sender: TObject);  
begin  
outport (strtoint (edit1.text), strtoint (edit2.text));  
end;  
end.  
4.1.4 Visual Basic  
Ngoân ngöõ naøy khoâng hoã trôï xuaát nhaäp port, ta phaûi duøng thö vieän lieân  
keát ñoäng (dynamic link library)  
4.2 VIEÁT TAÄP TIN LIEÂN KEÁT ÑOÄNG DLL  
File thö vieän lieân keát ñoäng coù ñuoâi .dll chöùa caùc haøm vaø thöôøng trình  
maø caùc chöông trình chaïy trong moâi tröôøng Windows nhö Delphi, Visual  
Basic, Visual C coù theå söû duïng.  
Caùc ngoân ngöõ laäp trình Visual C, Delphi, Borland C++ Builder ñeàu cho  
pheùp vieát taäp tin .dll. Heä ñieàu haønh Windows coù saün moät soá haøm thö vieän  
lieân keát ñoäng goïi chung döôùi teân Win API (Applications Programming  
Interface) tuy nhieân vieäc söû duïng chuùng ñoøi hoûi kinh nghieäm laäp trình.  
Coù theå laáy caùc taäp tin dll nhaäp xuaát döõ lieäu caùc port maùy tính töø maïng  
Internet vaø caøi vaøo maùy tính, hoaëc coù theå töï vieát.  
Sau ñaây trình baøy hai ví duï duøng Visual C vaø Delphi ñeå vieát taäp tin.dll  
maø Visual Basic seõ söû duïng.  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 4: LAÄP TRÌNH CHO MAÙY TÍNH ÑIEÀU KHIEÅN  
Trang 94  
4.2.1 Duøng Visual C++4.0 (Win 16 bit)  
Ta vieát taäp tin thö vieän ñaët teân laø INOUT.dll goàm thöôøng trình xuaát ra  
coång ñaët teân OUTPORT vaø thöôøng trình nhaäp döõ lieäu INPORT.  
Ñaàu tieân duøng phaàn meàm soaïn vaên baûn vieát hai taäp tin INOUT.DEF  
(define) vaø taâïp tin INOUT.CPP (chöông trình C).  
// Inout.def listing  
-----------------------------  
Library inout  
Description dll for I/O card  
Exports  
Outport @ 1  
Inport @ 2  
-----------------------------  
Haøng ñaàu laø teân file INOUT, haøng thöù hai laø chuù thích, caùc haøng sau  
lieät keâ teân caùc thöôøng trình trong thö vieän. Sau teân thöôøng trình laø daáu @ vaø  
soá thöù töï.  
// INOUT.CPP Listing  
-----------------------  
// file nguoàn. CPP cho dll INOUT.dll  
# include <stdio.h>  
# include <conio.h>  
// chöùa haøm INP vaø OUTP  
Short-stdcall OUTPORT (int PortAddress, int PortData)  
{
Short Dummy;  
Dummy = (Short) (_outp (PortAddress, PortData));  
Return (Dummy);  
};  
Short_stdcall INPORT (int PortAddress)  
{
Short PortData;  
PortData = (Short) (_inp (PortAddress));  
Return (PortData);  
;
}
------------------------  
Sau khi ñaõ soaïn xong hai taäp tin INOUT.def vaø vaø INOUT.cpp ta caát  
vaøo moät thö muïc, ví duï, C:\port. Vaøo Visual C choïn File - New -Projects -  
Win32DLL ñaùnh teân INOUT vaø ñòa chæ C:\port\INOUT roài baám OK. Maøn  
hình INOUT - Microsoft Developper Studio seõ xuaát hieän vaø project INOUT  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 95  
classes ñöôïc taïo ra, ta seõ coäng theâm hai file INOUT.def vaø INOUT.cpp vaøo  
project INOUT roài baám FILE - SAVE ALL.  
Sau khi ñaõ taïo project INOUT baám Build vaø choïn Build INOUT.dll,  
neáu khoâng coù gì sai soùt file INOUT.dll seõ ñöôïc taïo ra vaø caát trong  
C:\port\inout\debug. Sau ñoù caát file vaøo thö muïc heä thoáng cuûa Windows, ví  
duï, C:\Windows. Vôùi Visual C 5.0 vaø 6.0 caùch vieát seõ khaùc ñi.  
Caùc chöông trình vieát treân ngoân ngöõ khaùc nhö Delphi, Visual Basic coù  
theå goïi haøm INPORT vaø OUTPORT khi ñaõ khai baùo caùc haøm naøy vaø  
INOUT.dll  
Ví duï, trong Visual Basic ta theâm caùc doøng naøy trong phaàn khai baùo  
chöông trình sau phaùt bieåu Option Explicit:  
------------------  
Option Explicit  
Private Declare Function OUTPORT LIB “INOUT.dll” (ByVal PortAddress As Integer, By Val  
Port Data as Integer) As Integer.  
Private Declare Function INPORT Lib “INOUT.dll” (ByVal PortAddress As Integer) As Integer  
---------------------  
Private cho bieát caùc haøm vaø thöôøng trình sau Declare laø cuïc boä. Sau  
Declare ta vieát Function neáu coù traû veà giaù trò, coøn khoâng thì duøng SUB, sau  
ñoù laø teân. Töø LIB vaø keøm theo cho bieát nôi tìm taäp tin dll, thöôøng phaûi keøm  
ñöôøng daãn.  
Sau khi ñaõ khai baùo coù theå söû duïng caùc haøm vaø chöông trình con trong  
chöông trình..  
Ví duï, muoán xuaát 0 ra ñòa chæ 300H ta vieát:  
Dummy = OUTPORT (768, 0)  
Dummy laø bieán nguyeân ñaõ khai baùo (Dim Dummy as Integer;)  
Muoán nhaäp moät trò ôû coång Control Port vaøo bieán Value ta vieát  
Value = INPORT (Control Port)  
4.2.2 Taïo dll duøng VC++ 6.0 (Win32 bit)  
Vaøo File- New- Projects choïn Wìn32 Dynamic- Link Library, ñaët teân  
cho project laø inout  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 4: LAÄP TRÌNH CHO MAÙY TÍNH ÑIEÀU KHIEÅN  
Trang 96  
Sau ñoù tieáp tuïc choïn option A Simple DLL Project  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 97  
Khung soaïn thaûo chöông trình xuaát hieän  
Ta boå sung theâm caùc doøng leänh vaøo inout.cpp  
// inout.cpp : Defines the entry point for the DLL application.  
#include "stdafx.h"  
#include <stdio.h>  
#include <conio.h>  
BOOL APIENTRY DllMain( HANDLE hModule,  
DWORD ul_reason_for_call,  
LPVOID lpReserved  
)
{
return TRUE;  
}
int APIENTRY inport(WORD Port)  
{
return(_inp(Port));  
}
int APIENTRY outport(WORD Port, int ByteData)  
{
return(_outp(Port, ByteData));  
}
Sau ñoù vaøo File – New -Files, choïn Text File, boå sung vaøo Project inout file inout.def  
//inout.def  
LIBRARY inout  
EXPORTS  
inport @1  
outport @2  
Vaøo menu Choïn Build- Build inout.dll, file inout ñöôïc löu vaøo thö muïc  
d:\inout\Debug, ta cheùp vaøo thö muïc c:\Windows  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 4: LAÄP TRÌNH CHO MAÙY TÍNH ÑIEÀU KHIEÅN  
Trang 98  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 99  
Chöông trình söû duïng file inout. dll trong Visual Basic 6.0:  
Private Declare Function inport Lib "inout.dll" (ByVal portaddress As Integer) As Long  
Private Declare Function outport Lib "inout.dll" (ByVal portaddress As Integer, ByVal_  
value As Byte) As Long  
Private Sub Command1_Click()  
Timer1.Enabled = True  
End Sub  
Private Sub Command2_Click()  
Timer1.Enabled = False  
Unload Form1  
End Sub  
Private Sub Form_Load()  
Timer1.Interval = 1000  
Timer1.Enabled = False  
End Sub  
Private Sub Timer1_Timer()  
Dim i, port, giatri, dummy  
port = 768  
dummy = outport(port + 1, Val(Text1.Text))  
giatri = inport(port)  
Text2.text=giatri  
For i = 0 To 7  
If (giatri And (2 ^ i))=2^i Then  
Lamp(i).FillColor = QBColor(12)  
Else  
Lamp(i).FillColor = QBColor(10)  
End If  
Next  
End Sub  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 4: LAÄP TRÌNH CHO MAÙY TÍNH ÑIEÀU KHIEÅN  
Trang 100  
Chöông trình Delphi duøng inout.dll:  
unit Unit1;  
interface  
uses  
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  
StdCtrls;  
type  
TForm1 = class(TForm)  
Edit1: TEdit;  
Button1: TButton;  
Edit2: TEdit;  
procedure Button1Click(Sender: TObject);  
private  
{ Private declarations }  
public  
{ Public declarations }  
end;  
Function inport (adr: word): byte; stdcall; external 'inout.dll'  
Function outport (adr: word; data:byte): byte; stdcall; external'inout.dll'  
var  
Form1: TForm1;  
implementation  
{$R *.DFM}  
procedure TForm1.Button1Click(Sender: TObject);  
var data: byte;  
begin  
data := outport ($378, strtoint ( edit1.text));  
edit2.text := inttostr (inport($379))  
end;  
end.  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 101  
4.2.3 Taïo DLL duøng Delphi  
Chaïy Delphi, vaøo menu File- New, choïn DLL - OK, treân cöûa soå soaïn  
thaûo Project1.dpr xuaát hieän khung chöông trình sau:  
library Project1;  
uses  
SysUtils,  
Classes;  
{$R *.RES}  
begin  
end.  
Ta seõ ñoåi teân Project1 thaønh inout vaø theâm caùc doøng leänh tröôùc begin  
end. Ví duï sau taïo inout.dll goàm chöông trình con outport vaø haøm inport  
library inout;  
uses  
SysUtils,  
Classes;  
{$R *.RES}  
Procedure outport(adr:word;data:word);export; stdcall;  
begin  
asm  
push dx  
mov dx,adr  
mov ax,data  
out dx,ax  
pop dx  
end;  
end;  
Function inport(adr:word):word;export; stdcall;  
var data:word;  
begin  
asm  
push dx  
mov dx,adr  
in ax,dx  
mov data, ax  
pop dx  
end;  
inport:=data;  
end;  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 4: LAÄP TRÌNH CHO MAÙY TÍNH ÑIEÀU KHIEÅN  
Trang 102  
exports  
outport index 1,  
inport index 2;  
begin  
end.  
Sau ñoù vaøo menu Project- Build inout. File inout.dll ñöôïc taïo ra trong  
thö muïc \Delphi5\Projects cuøng vôùi caùc file inout.dpr, inout.res, inout.dof,  
inout.cfg. Ta cheùp file inout.dll vaøo thö muïc Windows\System.  
Ví duï: Vieát chöông trình Visual Basic duøng dll inout do Delphi taïo ra  
Private Declare Function inport Lib "inout.dll" (ByVal portaddress As Integer) As Byte  
Private Declare Sub outport Lib "inout.dll" (ByVal portaddress As Integer, ByVal_ value As  
Byte)  
Private Sub Command1_Click()  
Timer1.Enabled = True  
End Sub  
Private Sub Command2_Click()  
Timer1.Enabled = False  
Unload Form1  
End Sub  
Private Sub Timer1_Timer()  
Dim i, port, giatri  
port = 768  
giatri = inport (port+1)  
For i = 0 To 7  
If (giatri And (2  
^ i)) and 2^i Then Lamp(i).FillColor = QBColor(12) Else_  
Lamp(i).FillColor = QBColor(10)  
Next  
End Sub  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 103  
Ví duï: vieát chöông trình Delphi duøng inout.dll do Delphi taïo ra  
unit Unit1;  
interface  
uses  
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  
StdCtrls;  
type  
TForm1 = class(TForm)  
Edit1: TEdit;  
Button1: TButton;  
Edit2: TEdit;  
procedure Button1Click(Sender: TObject);  
private  
{ Private declarations }  
public  
{ Public declarations }  
end;  
Function inport (adr: word): word; stdcall; external 'inout.dll'  
Procedure outport (adr: word; data: word); stdcall; external 'inout.dll'  
var  
Form1: TForm1;  
implementation  
{$R *.DFM}  
procedure TForm1.Button1Click (Sender: TObject);  
begin  
outport ($378, strtoint ( edit1.text));  
edit2.text:= inttostr((inport($379)) and $ff)  
end;  
end.  
4.3 Xuaát nhaäp vôùi Win 2000 vaø Win NT  
Vieäc xuaát nhaäp trong DOS vaø Win 98 thöïc hieän deã daøng nhö ñaõ trình baøy ôû  
caùc muïc treân, tuy nhieân caùc heä ñieàu haønh Win 2000 vaø Win NT ngaên caûn  
vieäc thöïc hieän caùc leänh truy caäp ngoaïi vi tröïc tieáp trong mode ngöôøi duøng.  
Muoán vöôït qua raøo caûn naøy ta phaûi vieát caùc driver truy caäp ngoaïi vi trong  
mode kernel söû duïng caùc haøm WinAPI. Vieát caùc file xuaát nhaäp dll daïng  
naøy khaù phöùc taïp vaø ñoøì hoûi trình ñoä laäp trình cao, baïn coù theå vaøo caùc trang  
web ñeå download veà söû duïng, ví duï moät ñòa chæ laø www.logix4u.net. Moät  
ñòa chæ khaùc www.jungo.com hoã trôï vieát driver cho card ISA, PCI, USB….  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 4: LAÄP TRÌNH CHO MAÙY TÍNH ÑIEÀU KHIEÅN  
Trang 104  
4.4 SÖÛ DUÏNG NGAÉT TRONG ÑIEÀU KHIEÅN  
Khi ñoïc döõ lieäu töø coång ngoaïi vi thöôøng duøng hai phöông phaùp. Phöông  
phaùp thöù nhaát laø thaêm doø baèng caùch ñoïc traïng thaùi cuûa coång theo chu kyø ñeå  
xem coù gì thay ñoåi khoâng, neáu coù seõ chuyeån sang moät chöông trình phuïc vuï.  
Phöông phaùp naøy toán thôøi gian vaø laøm chaäm caùc quaù trình khaùc.  
Phöông phaùp thöù hai laø duøng ngaét, vi xöû lyù thöïc hieän coâng vieäc bình  
thöôøng, khi ngoaïi vi coù thoâng tin caàn gôûi ñeán seõ gôûi yeâu caàu ngaét IRQ  
(Interrupt Request) ñeán vi xöû lyù, luùc ñoù VXL chaám döùt leänh ñang thöïc hieän,  
caát moät soá thoâng tin vaøo ngaên xeáp vaø thöïc hieän thöôøng trình phuïc vuï ngaét  
ISR (Interrupt Service Rovtine) ñaõ ñònh saün. Khi ñaõ thöïc hieän xong ISR,  
VXL quay trôû laïi nôi ñaõ rôøi khoûi.  
Coù taát caû 256 ngaét cho hoï VXL 8086, moät soá ngaét (ña soá) khoâng lieân  
quan gì ñeán ngoaïi vi, soá ít coøn laïi laø ngaét cöùng phuïc vuï cho vieäc giao tieáp  
VXL vôùi ngoaïi vi nhö ngaét thôøi gian, baøn phím, con chuoät, coång song song,  
coång noái tieáp, ñóa cöùng, ñóa meàm, card aâm thanh…  
VXL quaûn lyù ngaét qua vector ngaét, vector ngaét cho bieát ñòa chæ chöùa  
ISR cho moãi loaïi ngaét. Baûng caùc ñòa chæ goïi laø baûng vector ngaét (baûng 4.1).  
Moãi ñòa chæ chieám boán byte  
N x 4  
Caùc ngaét kyù hieäu INT N coù ñòa chæ ISR ôû trong  
caùc oâ nhôù: goàm ñòa chæ ñoaïn CS vaø ñòa chæ töông ñoái  
IP, ñòa chæ vaät lyù CS x 16 + IP  
IP  
N x 4 + 1  
N x 4 + 2  
N x 4 + 3  
CS  
Caùc ngaét ñöôïc xeáp öu tieân töø cao ñeán thaáp nhö  
sau:  
INT0; INTn; NMI; IRQ0; IRQ1; IRQ8 ÷ IRQ15;  
IRQ3; IRQ4, IRQ5; IRQ6; IRQ7; INT1  
INTn laø caùc ngaét meàm vaø ngaét ngoaïi leä.  
Vi xöû lyù xöû lyù ngaét ngoaøi thoâng qua vi maïch ñieàu khieån öu tieân ngaét  
PIC (Priority Interrupt Controller), caùc mainboard ñôøi cuõ duøng hai PIC  
8259A coøn caùc mainboard ñôøi môùi tích hôïp trong moät chip ña naêng theo  
coâng ngheä ASIC (chip set)  
PIC coù caùc thanh ghi phuïc vuï xöû lyù ngaét  
PIC 1: ngaét IRQ7, 6, 5, 4, 3, 2, 1, 0 coù ñòa chæ 20H vaø 21H  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 105  
Baûng 4.1: Baûng vector ngaét  
INT (Hex)  
00 - 01  
02  
IRQ  
Söû duïng  
Chia cho zero  
Sai parity  
Exception Handlers  
IRQ khoâng che (NMI)  
Exception Handlers  
Ngaét cöùng IRQ0  
Ngaét cöùng IRQ1  
Ngaét cöùng IRQ2  
Ngaét cöùng IRQ3  
Ngaét cöùng IRQ4  
Ngaét cöùng IRQ5  
Ngaét cöùng IRQ6  
Ngaét cöùng IRQ7  
Ngaét meàm  
03 - 07  
08  
Xöû lyù caùc ngoaïi leä  
Timer Heä thoáng  
Baøn phím  
09  
0A  
Chuyeån höôùng sang IRQ9  
Coång noái tieáp 2, 4  
Coång noái tieáp 1, 3  
Card aâm thanh  
Ñóa meàm  
0B  
0C  
0D  
0E  
0F  
Coång song song  
Ngaét do phaàn meàm  
Ñoàng hoà thôøi gian thöïc  
Chuyeån höôùng töø IRQ2  
Döï tröõ  
10 ÷ 6F  
70  
Ngaét cöùng IRQ8  
Ngaét cöùng IRQ9  
Ngaét cöùng IRQ10  
Ngaét cöùng IRQ11  
Ngaét cöùng IRQ12  
Ngaét cöùng IRQ13  
Ngaét cöùng IRQ14  
Ngaét cöùng IRQ15  
Ngaét meàm  
71  
72  
73  
Döï tröõ  
74  
Con chuoät PS/2  
Ñoàng xöû lyù  
75  
76  
Ñóa cöùng  
77  
Döï tröõ  
78 - FF  
Ngaét do phaàn meàm  
Baûng 4.2 Caùc thanh ghi cuûa PIC  
Ñòa chæ  
Ñoïc/Vieát  
Chöùc naêng  
20H  
Vieát  
Vieát  
Töø ñieàu khieån khôûi ñoäng 1 ICW1  
Töø ñieàu khieån hoaït ñoäng 2 OCW2  
Töø ñieàu khieån hoaït ñoäng 3 OCW3  
Yeâu caàu ngaét IRR  
Vieát  
Ñoïc  
Ñoïc  
Phuïc vuï ngaét ISR  
21H  
Vieát  
Töø ñieàu khieån khôûi ñoäng 2 ICW2  
Töø ñieàu khieån khôûi ñoäng 3 ICW3  
Töø ñieàu khieån khôûi ñoäng 4 ICW4  
Maët ra ngaét IMR  
Vieát  
Vieát  
Ñoïc/Vieát  
Töø ñieàu khieån hoaït ñoäng 1 OCW1  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 4: LAÄP TRÌNH CHO MAÙY TÍNH ÑIEÀU KHIEÅN  
Trang 106  
PIC2: ngaét IRQ15, 14, 13, 12, 11, 10, 9, 8 coù ñòa chæ töông öùng laø A0H  
vaø A1H  
Muoán che moät ngaét naøo ñoù ta cho bit töông öùng cuûa noù trong OCW1  
baèng 1. Ví duï, muoán cho pheùp IRQ3 ta gôûi byte F7 ñeán ñòa chæ 21H luùc naøy  
caùc IRQ 0 ÷ 7 tröø IRQ3 seõ bò caám.  
Muoán khoâng aûnh höôûng ñeán caùc IRQ khaùc ta duøng leänh:  
Outportb (OX21, (inportb (0X21) & OXF7)); (trong C)  
Muoán che IRQ3 ta gôûi leänh:  
Outportb (OX21, (inportb (OX21) ⏐ OX08));  
Muoán söû duïng ngaét ta phaûi vieát chöông trình phuïc vuï ngaét ISR, ñaët  
ñòa chæ cuûa chöông trình naøy vaøo vò trí phuø hôïp treân baûng vector ngaét, tröôùc  
ñoù caàn phaûi caát ñòa chæ ñaõ coù saün ñeå sau ñoù phuïc hoài trôû laïi. Khi coù ngaét  
xaûy ra vaø ISR thöïc hieän xong phaûi baùo trôû laïi cho PIC baèng caùch gôûi EOI  
(end of interrupt) ñeán OCW2, thoâng thöôøng laø byte 20H (cho ngaét thöôøng).  
Vieäc khôûi ñoäng PIC do ROM BIOS ñaûm nhieäm ta khoâng caàn quan taâm ñeán.  
Ví du : Laäp trình ngaét duøng C  
#include <process.h>  
#include <stdio.h>  
#include <stdlib.h>  
#include <dos.h>  
#include <conio.h>  
void main(void)  
{
No_irq = 5;  
init_isr(No_irq);  
{
}
/*Theâm maõ*/  
close_isr(No_irq);  
}
/*  
INIT INTERRUPT SERVICE ROUTINE  
*/  
void init_isr (int irq_num)  
{
disable();  
if ( irq_num < 8 )  
old_handler1 = getvect(irq_num+8);  
Tải về để xem bản đầy đủ
pdf 25 trang Thùy Anh 24060 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Đo lường và điều khiển bằng máy tính - Chương 4: Lập trình cho máy tính điều khiển", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_do_luong_va_dieu_khien_bang_may_tinh_chuong_4_lap.pdf