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
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
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 đủ
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:
bai_giang_do_luong_va_dieu_khien_bang_may_tinh_chuong_4_lap.pdf

