Bài 4: Tín hiệu quay số trên máy điện thoại có thể giải mã bằng IC giải mã DTMF MT8870, một
phím nhấn sẽ được mã hoá thành tín hiệu DTMF và được MT8870 đổi ra mã nhị phân 4 bit
tương ứng. Để đọc được giá trị đúng cần kiểm tra tín hiệu INT của 8870 trước khi đọc giá
trị mã phím.
Bài 5: Để giao tiếp với các đèn công suất lớn cần có giao tiếp công suất bằng Relay hoặc SSR.
Giải thuật điều khiển khá đơn giản: cho đèn xanh ngã tư bên này + đèn đỏ bên kia cùng
sáng. Sau đó tắt hai đèn này để sáng đồng thời hai đèn vàng và cuối cùng sẽ cho sáng hai
đèn còn lại. Mỗi lần sáng sẽ theo một khoảng thời gian định trước.
Bài 6: Hệ thống đếm sản phẩm trước hết cần một bộ cảm biến quang để mỗi sản phẩm đi ngang
qua sẽ tạo ra một xung. Xung này sẽ được đưa tới ngõ vào của một timer, timer được khởi
động ở chế độ counter cho phép chạy từ bên trong. Giá trị đếm được sẽ trong bộ đếm timer
sẽ được đổi ra thập phân và đổi thành mã hiển thị thích hợp cung cấp tới bộ hiển thị.
Bài 7: Cảm biến tốc độ sẽ cung cấp xung tới ngõ vào một timer, bộ đếm timer sẽ tăng lên sau mỗi
xung và từ số xung đếm được trong một thời gian định trước sẽ tính ra được tốc độ quay
của động cơ.
255 trang |
Chia sẻ: nguyenlam99 | Lượt xem: 920 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Giáo trình môn học Kỹ thuật vi xử lý, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
phòng
64 - 255 100 - 3FC Người sử dụng định nghìa
Ngay sau khi reset CPU lấy các giá trị tại các địa chỉ từ 0 tới 6 nạp cho SP và PC như sau:
Vector for Reset
Địa chỉ Reset Vector
$0000 Byte cao của SP
$0002 Byte thấp của SP
$0004 Byte cao của PC
$0006 Byte thấp của PC
Đoạn chương trình sau sử dụng để khởi động vector reset, cần chú ý không để ngăn xếp năm
trong vùng nhớ chương trình và SP sẽ giảm khi nạp dữ liệu vào ngăn xếp.
org $0000 ;bắt đầu tại địa chỉ $000000 trong bộ nhớ
DW $0000 ;Khởi động SP = $4000
DW $4000
DW $0000 ;khởi động PC = $400
DW $0400
Đoạn chương trình sau có thể sử dụng để khởi động giá trị cho các vector ngắt khác. Trong
một chương trình thực tế mỗi vector ngắt có thể trỏ tới một nhãn khác nhau, nhưng trong ví dụ tất
cả các vector ngắt đều trỏ tới một nhãn INT. Tại nhãn INT trong chương trình cần phải viết các
lệnh tương ứng để xử lý ngắt khi nó xảy ra. Trong ví dụ giả sử địa chỉ của nhãn INT nằm trong
vừng nhớ từ 0 tới $10000, hay nó cách khác nó có từ cao của địa chỉ là $0000.
226
OP
EN
.P
TIT
.E
DU
.V
N
Chương 8: Vi điều khiển 32 bit MC68332
org $0008 ;Đặt đoạn lệnh sau nằm sau vector reset
DW $0000 ;Địa chỉ của nhãn INT nằm tại địa chỉ $0008,
DW INT ;là vector báo lỗi bus
DW $0000 ;địa chỉ lỗi nằm tại $000C
DW INT
DW $0000 ;lệnh không cho phép nằm tại $0010
DW INT
DW $0000 ;chia cho 0 nằm tại $0014
DW INT
DW $0000 ;Lệnh CHK, CHK2 tại $0018
DW INT
DW $0000 ;Ngắt người sử dụng định nghĩa nằm tại $03FC
DW INT
Chương trình xử lý ngắt có khuôn dạng như sau:
INT
{Các lệnh xử lý ngắt}
RTE ;quay về từ chương trình ngắt.
• Khởi động thanh ghi trạng thái
Thanh ghi trạng thái của CPU chứa một số thông tin quan trọng như:
Cho phép theo vết - Trace Enable [15:14] — Nếu được cho phép CPU sẽ tạo ra ngoại lệ trace
sau khi thực hiện xong mỗi lệnh, cho phép một chương trình giám sát chạy thử một chương trình.
Sau khi reset quá trình trace bị cấm.
Trạng thái giám sát/sử dụng - Supervisor/User State [13] — MCU có hai mức đặc quyền:
supervisor và user. Hầu hết các chương trình ứng dụng đều hoạt động ở mức user và sau đó
chuyển qua mức supervisor khi xảy ra ngoại lệ. Sau khi reset bit này được lập, MCU hoạt động ở
chế độ supervisor.
Mức ưu tiên ngắt - Interrupt Priority Level[10:8] — Mức ưu tiên ngắt xác định các ngắt có
được thực hiện hoặc bị che. Ngắt mức 7 luôn được cho phép, để cho phép các ngắt khác cần phải
nạp giá trị nhỏ hơn mức ưu tiên tương ứng. Ví dụ muốn ngắt mức 6 được cho phép cần phải nạp
giá trị nhỏ hơn hoặc bằng %101. Sau khi khởi động các bit này có giá trị là %111, có nghĩa là chỉ
có ngắt mức 7 được cho phép.
Thanh ghi mã điều kiện - Condition Code Register [4:0] — Đây là các cờ trạng thái (các mã
điều kiện) E (extend), N (negative), Z (zero), O (overflow) và C (carry), chúng được tác động theo
kết quả của các lệnh vừa thực hiện sử dụng làm các điều kiện để rẽ nhánh chương trình. Các bit
này có thể không cần khởi động.
8.7.4. Lập trình khởi động SIM
Do SIM xác định các đặc tính hoạt động quan trọng của MCU nên nó cần được lập trình khởi
động ngay sau khi khởi động CPU. Sau đây là một số thanh ghi cần phải được khởi động trong
SIM: Thanh ghi cấu hình SIM - System Integration Module Configuration Register (SIMCR).
Thanh ghi điều khiển tạo clock - Clock Synthesizer Control Register (SYNCR). Thanh ghi điều
khiển bảo vệ hệ thống - System Protection Control Register (SYPCR). Thanh ghi định thời ngắt
227
OP
EN
.P
TIT
.E
DU
.V
N
Chương 8: Vi điều khiển 32 bit MC68332
theo chu kỳ - Periodic Interrupt Timer Register (PITR). Thanh ghi điều khiển ngắt theo chu kỳ -
Periodic Interrupt Control Register (PICR). Các thanh ghi chân chọn mạch - Chip-Select Pin
Assignment Registers (CSPAR0 and CSPAR1). Các thanh ghi địa chỉ cơ sở chọn mạch - Chip-
Select Base Address Registers (CSBARBT, CSBAR[0:10]). Các thanh ghi tuỳ chọn chân CS -
Chip-Select Option Registers (CSORBT and CSOR[0:10]). Các cổng vào ra đa dụng - General-
Purpose I/O Ports.
Sau đây là đoạn chương trình ví dụ về khởi động SIM: Trong ví dụ này giả sử đã có hai tập tin
org00000.asm và org00008.asm. Tập tin org000000.asm khởi động con trỏ ngăn xếp và bộ đếm
chương trình, và tập tin org00008.asm khởi động các vector ngắt như đã trình bày trong phần trên.
Đoạn chương trình sau sử dụng cho trình biên dịch IASM32.
CSBARBT EQU $FFFA48
CSBAR0 EQU $FFFA4C
CSBAR1 EQU $FFFA50
CSBAR2 EQU $FFFA54
CSORBT EQU $FFFA4A
CSOR0 EQU $FFFA4E
CSOR1 EQU $FFFA52
CSOR2 EQU $FFFA56
CSPAR0 EQU $FFFA44
PICR EQU $FFFA22
PITR EQU $FFFA24
SYNCR EQU $FFFA04
SYPCR EQU $FFFA21
SIMCR EQU $FFFA00
* INCLUDE 'org00000.asm ;gồm reset vector
* INCLUDE 'org00008.asm' ;bao gồm khởi động các vector ngoại lệ khác
ORG $400 ;bắt đầu chương trình tại $400, ngay sau bảng
ngoại lệ
CLR.L D0
MOVEC D0,VBR ; đảm bảo cho VBR=0, nó đã bằng 0 sau khi reset.
INITSYS: MOVE.B #$7F,(SYNCR).L ; chọn clock hệ thống là 16.78 MHz
CLR.B (SYPCR).L ; không cho phép watchdog bằng phần mềm
INITCS: ;Phần này khơi 3 động sử dụng hai vi mạch RAM 32Kx8 bằng tín hiệu Chip select.
;bộ nhớ bắt đầu tại địa chỉ $30000 và có thể đọc ghi theo byte hoặc theo từ, trong
chương trình này giả sử RAM có thời gian truy cập là 85ns và không yêu cầu trạng
thái chờ. Các bit DSACK củ thanh ghi CSOR có thể sử dụng để điều chỉnh cho các
bộ nhớ có tốc độ truy cập nhanh hơn hoặc chậm hơn.
MOVE.W #$0003,(CSBARBT).L ;Địa chỉ cơ sở là $00000 kích thước khối là
64K
MOVE.W #$7870,(CSORBT).L ;có thể đọc ghi, có một trạng thái chờ, nếu đoạn
mã này nạp vào ROM thì giá trị khởi động là
$6B30.
; Khởi động chip select với địa chỉ cơ sở là $30000 mỗi khối 64K
228
OP
EN
.P
TIT
.E
DU
.V
N
Chương 8: Vi điều khiển 32 bit MC68332
MOVE.W #$0303,(CSBAR0).L ;CS0 cho địa chỉ $30000, 64K
MOVE.W #$0303,(CSBAR1).L ;CS1 cho địa chỉ $30000, 64K
MOVE.W #$0303,(CSBAR2).L ;CS2 cho địa chỉ $30000
MOVE.W #$5030,(CSOR0).L ;CS0 có byte cao chỉ ghi
MOVE.W #$3030,(CSOR1).L ;CS1 có byte thấp chỉ ghi
MOVE.W #$6830,(CSOR2).L ;CS2 có cả hai byte cao chỉ đọc
MOVE.W #$3FFF,(CSPAR0).L ;CS 0, 1, 2 tới các cổng 16 bit
INITPIT: ; Phần chương trình này khởi động định thời ngắt theo chu kỳ sau mỗi thời gian 1
giây.
MOVE.L #CLKINT,($0100).l ;Địa chỉ bắt đầu chứa chương trình ngắt là $100
($40x4). Giả sử rằng VBR = 0.
MOVE.W #$0640,(PICR).l ;Ngắt mức 6 có vector là $40
MOVE.W #$0110,(PITR).l ;Chu kỳ time – out là 1 giây
ANDI.W #$F0FF,SR ;che tất cả các ngắt dưới mức 6
ORI.W #$0500,SR
ANDI.W #$FFF0,(SIMCR).l ;thiết lập các bit phân xử ngắt có một giá trị
ORI.W #$0005,(SIMCR).l ; duy nhất
ITSELF BRA ITSELF ; chương trình thực hiện ở đây để chờ ngắt.
CLKINT ; chương trình ngắt cho PIT
ADDI.L #$01,D0 ;lệnh cho chương trình ngắt tại đây
RTE
8.7.5. Lập trình định cầu hình RAM nội
RAM nội có thể bản đồ hoá tại vị tí bất kỳ trong bản đồ bộ nhớ, nhưng nó không được trùng
với các thanh ghi điều khiển. Sau khi reset mặc định RAM không được cho phép, để khởi động
RAM cần ghi địa chỉ cơ sở thích hợp vào thanh ghi địa chỉ cơ sở và trạng thái RAM (đây là một
thanh ghi chỉ ghi) và xoá bit RAMDS để cho phép RAM hoạt động. Nạp giá trị cho các bit RASP
[1:0] trong thanh ghi định cấu hình RAM để chọn mức đặc quyền truy cập.
Nếu không sử dụng nguồn backup cho RAM, nới chân VSTBY xuống GND. Nếu sử dụng
nguồn backup cần xác định giá trị tụ nối giữa chân VSTBY và GND.
8.7.6. Lập trình cho QSM
QSM có hai khối nhỏ SCI và QSPI, khi sử dụng khối nào cần lập trình khởi động cho khối đó.
8.7.5.1 Lập trình cho khối SCI.
Chương trình khởi động SCI có thể thực hiện như sau:
SCI INITIALIZATION:
Hai lệnh dưới nạp địa chỉ tác động của ký tự cuối cùng cùa đoạn dữ liệu truyền vào thanh ghi
địa chỉ A1.
MOVE.L A0,A1
ADDA.L #$5,A1
Ba lệnh tiếp theo kiểm tra thanh ghi dữ liệu truyền có trống hay không bằng cách xét bit
TDRE trong thanh ghi trạng thái SCI (SCSR). Nếu TDRE=0 thỉ TDR hiện không không gởi dữ
liệu tới bộ dịch truyền. Nếu TDRE=1 thì việc truyền dữ liệu đang thực hiện, có thể ghi một giá trị
229
OP
EN
.P
TIT
.E
DU
.V
N
Chương 8: Vi điều khiển 32 bit MC68332
mới tới TDR, vì vậy đoạn chương trình kiểm tra sẽ được lặp lại cho đền khi TDRE=1.
SCCR0 EQU $FFFC08
SCCR1 EQU $FFFC0A
SCSR EQU $FFFC0C
SCDR EQU $FFFC0E
SYNCR EQU $FFFA04
SYPCR EQU $FFFA21
ORG $400 ;bắt đầu chương trình tại $400 ngay sau bảng
; vector ngoại lệ.
INIT_SIM
MOVE.B #$7F,(SYNCR).L ;tăng tốc độ clock
CLR.B (SYPCR).L ;không cho phép watchdog phần mềm
INIT_SCI
MOVE.W #$0037,(SCCR0).L ;tốc độ truyền của SCI là 9600
MOVE.W #$000C,(SCCR1).L ;cho phép bộ truyền và bộ nhận
PRINT
LEA (MESSAGE).L,A0 ;nạp địa chỉ tác động của (message) vào A0
LOOP
FINISH
MESSAGE
MOVE.W (SCSR).L,D0
ANDI.W #$0100,D0
BEQ LOOP
MOVE.B (A0)+,D0
MOVE.W D0,(SCDR).L
CMPA.L A1,A0
BNE LOOP
BRA FINISH
FCB ‘12345’
;chuyển ký tự hiện hành của message vào D0
;sau đó tăng A0 để trỏ tới ký tự kế tiếp
;chuyển giá trị hiện hành tới SCDR
;kiểm tra đã kết thúc message chưa
;nếu không thì in ký tự tiếp theo
;chờ tại đây
;in ra các ký tự “12345”
8.7.5.2 Lập trình khởi động QSPI
QSPI của QSM là bus truyền nối tiếp đồng bộ với các thiết bị ngoại vi bên ngoài và các MCU
khác. Module này có một hàng đợi, con trỏ hàng đợi có thể lập trình được cho phép truyền 16 ký
tự dữ liệu một cách tự động, và trong chế độ wap-around sẽ cho phép truyền liên tục tới hoặc từ
hàng đợi mà không cần sự điều khiển của CPU. Hàng đợi rất hữu dụng trong nhiều ứng dụng như
biến đổi AD. Một số điểm sau cần chú ý khi sử dụng QSPI:
- Lập bit SPE cho phép QSPI cần thực hiện cuối cùng của quá trình khởi động.
- Cần khởi động các thanh ghi định hướng truyền dữ liệu DDRQS và thanh ghi dữ liệu của
cổng PORTQS, ngay cả khi chân tín hiệu đã được gán cho chức năng QSPI bằng thanh
ghi gán chân tín hiệu PQSPAR.
- Tín hiệu chọn ngoại vi sẽ tác động khi thực hiện một lệnh trong RAM lệnh, tu nhiên tác
động mức cao hay mức thấp còn tuỳ thuộc vào bit tương ứng trong PORTQS.
Đoạn chương trình sau khởi động cổng QSPI trong chế độ wrap-around, truyền 8 bit và chân
chọn ngoại vi tác động mức thấp. Việc hiệu chỉnh để cầm chế đô wrap-around thực hiện khá đơn
giản được giải thích trong phần chú giải lệnh. Lệnh kế tiếp đọc và xoá các cờ trong SPSR, các cờ
này là cờ kết thúc QSPI (SPIF), cờ báo lỗi chế độ (MODF) và cờ chấp nhận nử (HALTA). Bit
230
OP
EN
.P
TIT
.E
DU
.V
N
Chương 8: Vi điều khiển 32 bit MC68332
SPIF là bit được sử dụng nhiều nhất, nó được lập khi QSPI hoàn tất một chu kỳ truyền khi địa chỉ
trỏ tới cuối hàng đợi ENDQP. Nếu cho phép chế độ wrap-around bit này sẽ được lập khi truyền
xong một vòng hàng đợi. Khi cho phép ngắt, bit SPIF tác động sẽ tạo ra yêu cầu ngắt.
ANDI.B#$00,(SPSR).L
Lệnh tiếp theo khởi động cho tín hiệu chọn mạch trong PORTQS (thường gọi là QPDR). Tín hiệu
chọn mạch có thể tác động mức cao hoặc mức thấp. Trạng thái khởi động sau khi reset trong
PORTQS là trạng thái không tích cực. Trạng thái tích cực lá chọn trong RAM lệnh. Trong ví dụ
này khởi động trạng thái của tín hiệu chọn là mức coa và SCK là mức thấp. Tức là tín hiệu chọn
mạch tác động mức thấp và SCK tác động mức cao. Tín hiệu TxD không bị tác động.
SPCR1 EQU $FFFC1A
PORTQS EQU $FFFC15
PQSPAR EQU $FFFC16
DDRQS EQU $FFFC17
SPSR EQU $FFFC1F
SPCR0 EQU $FFFC18
SPCR2 EQU $FFFC1C
SPCR3 EQU $FFFC1E
SYNCR EQU $FFFA04
SYPCR EQU $FFFA21
TXDRAM EQU $FFFD20
CMDRAM EQU $FFFD40
ORG $400
;chương trình bắt đầu tại $400, ngay sau bảng
ngoại lệ
INIT_SIM
MOVE.B #$7F,(SYNCR).L ;tăng tốc độ clock
CLR.B (SYPCR).L ;cấm software watchdog
INIT_QSPI
ANDI.W #$7F,(SPCR1).L ;xoá bit SPE bit trong SPCR1để cấm QSPI
MOVE.B #$7B,(PORTQS).L
MOVE.B #$7B,(PQSPAR).L
MOVE.B #$7E,(DDRQS).L
MOVE.W #$8002,(SPCR0).L
;Gán tất cả các chân QSPI, các chân có thể gán
; làm chân vào ra đa dụng hoặc cho QSPI.
;Chọn hướng truyền là ngõ ra trừ MISO
;Cấu hình cho QSPI là master không tích cực,
trạng thái SCK là thấp, lấy dữ liệu tại cácnh
lên của SCK, tốc độ là 4.129MHz, trường
BITS không cần quan tâm vì chúng được xoá
và cho phép truyền 8 bit dữ liệu.
Lệnh kế tiếp thiết lập các tham số điều khiển, không cho phép các ngắt, cho phép ngắt khi bit
SPIF tác động, lập SPCR2 [15]. Để xoá một ngắt, đọc và sau đó xoá bit SPIF. Cho phép chế độ
wrap-around. Xoá NEWQP và ENDQP=$F để QSPI truyền dữ liệu liên tục từ địa chỉ $0 tới đại
chỉ $F của hàng đợi. Cấm chế độ wrap-around, vì thế QSPI truyền một lần hàng đợi xoá bit
WREN về 0.
MOVE.W $4F00,(SPCR2).L
231
OP
EN
.P
TIT
.E
DU
.V
N
Chương 8: Vi điều khiển 32 bit MC68332
Lệnh kế tiếp lấp đầy RAM lệnh có một byte thông tin điều khiển cho mỗi lệnh QSPI thực hiện
trong hàng đợi. Ở đây dữ liệu được truyền 8 bit và bốn tín hiệu chọn mạch tác động mức thấp.
MOVE.B #$00,(SPCR3).L ;cấm chế độ lặp, các ngắt HALTA và MODF và
HALT
MOVEA.L #DATA,A0 ;con trỏ A0 làm địa chỉ dữ liệu truyền
MOVEA.L #TXDRAM,A1 ;Con trỏ A1 chỉ RAM dữ liệu truyền
MOVEA.L #CMDRAM,A2 ;Con trỏ A2 chỉ RAM lệnh
MOVE.W #$10,D0 ;Khởi động bộ đếm bằng 16 ($10), vì hàng đợi 16 vị
trí
CLR.L D1 ;Xoá D1 nó sẽ được sử dụng để lấp đầy RAM truyền
LOOP MOVE.B (A0)+,D1 ;Bắt đầu vòng lặp lấp đầy RAM truyền
MOVE.W D1,(A1)+ ;Lưu dữ liệu và chỉnh phải
MOVE.B #$00,(A2)+
SUBI.W #$01,D0 ;Trừ bộ đếm đi 1
FINISH
BNE LOOP
MOVE.W #$8000,(SPCR1).L
BRA FINISH
DATA DB 16
;Nạp vị trí kế tiếp cho hàng đợi
;Lập bit SPE để bắt đầu truyền dữ liệu
;Có thể bắt đầu một nhiệm vụ khác
8.7.5.3 Khởi động ngắt QSM
Để cho phép ngắt của QSM cần nạo giá trị cho 5 trường sau:
- ILQSPI và ILSCI trong thanh ghi QILR để xác định mức ưu tiên của ngắt QSPI và SCI. Nếu
trường này được lập giá trị giống nhau thì ngắt QSPI có độ ưu tiên cao hơn.
- INTV[7:0] trong thanh ghi QIVR để xác định số vector ngắt. Với QSPI bit thấp nhất sẽ chỉ
đọc bằng 1, với SCI bit thấp nhất chỉ đọc bằng 0.
- IARB trong thanh ghi QSMCR để xác định ngắt nào sẽ lập tức được thực hiện khi QSM và
một module khác có cùng mức ưu tiên cùng yêu cầu ngắt. Giá trị này phải khác không và duy nhất
khi ngắt được cho phép.
- IPL trong thanh ghi trạng thái của CPU để xác định mức ưu tiên trong các ngắt đăng ký. Để
đăng ký các ngắt QSM, trường này cần nạp giá trị thấp hơn mức ưu tiên ngắt chỉ thị trong QILR.
- Vector ngắt cần được nạp giá trị để trỏ tới vị trí đặt chương trình ngắt.
8.7.7. Lập trình cho TPU
Để lập trình cho TPU chúng ta cần lập trình các giá trị cho các thanh ghi điều khiển của TPU
như: thanh ghi định cấu hình TPU (TPUMCR), các thanh ghi chọn chức năng kênh CFSR[1:3],
các thanh ghi thứ tự host HSRR0 và HSRR1, các thanh ghi yêu cầu phục vụ host, các thanh ghi
ưu tiên kênh, các thanh ghi tham số RAM, các thanh ghi điều khiển kênh CCR, và nếu sử dụng
ngắt TPU cần khởi động các thanh ghi ngắt và các vector ngắt.
SYNCR EQU $FFFA04
SYPCR EQU $FFFA21
CFSR3 EQU $FFFE12
232
OP
EN
.P
TIT
.E
DU
.V
N
Chương 8: Vi điều khiển 32 bit MC68332
TPUMCR EQU $FFFE00
HSQR1 EQU $FFFE16
HSSR1 EQU $FFFE1A
CPR1 EQU $FFFE1E
ORG $400 ;bắt đầu chương trình tãi $400
INITSYS:
MOVE.B #$7F,(SYNCR).L ;lập clock hệ thống bằng 16.78 MHz
CLR.B (SYPCR).L ;cấm software watchdog
CNTLREG:
MOVE.W
#$0009,(CFSR3).L
;chọn chức năng kênh. Chú ý số chức
năng này tuỳ theo ứng dụng cụ thể
MOVE.W #$00C0,(TPUMCR).L ;lập TCR1 tới SYSCLK/4. tại 16.778
MHz, có nghĩa là TCR1 count=238ns
MOVE.W #$0000,(HSQR1).L ;các bit HSQ = 0 cho chức năng
PWM
PRAM:
MOVE.W
#$0092,($FFFF00).L
;Thanh ghi điều khiển kênh: sau khi
khởi động chân tín hiệu mức thấp sử
dụng cho TCR1.
MOVE.W #$2000,($FFFF04).L ;Bộ đếm cao TCR1 = $2000 TCR1
MOVE.W #$4000,($FFFF06).L ;Bộ đếm chu kỳ TCR1 = $4000
START:
MOVE.W #$0002,(HSSR1).L ;khởi động yêu cầu phục vụ host
MOVE.W #$0003,(CPR1).L ;Cho kênh có mức ưu tiên cao
DONE BRA DONE
Ví dụ sau khởi động sử dụng ngắt trên kênh 4:
MOVE.W #$0680,(TICR).l ;mức ngắt = 6, vector cơ sở = $80
MOVE.L #INT,($0210).l ;bắt đầu chương trình ngắt tại nhãn INT
;giả sử VBR =0
NDI.W #$F5FF,SR ;cho phép các ngắt từ mức 6 trở lên
CLR.L D0
MOVEC D0,VBR ;khởi động VBR =0
ORI.W #$0005,(TMCR).l ;cho IARB = $5
ORI.W #$0010,(CIER).l ;Cho phép ngắt kênh 4
*** chương trình con phục vụ ngắt ***
INT
ANDI.W #$FFEF,(CISR).l ;đọc và xoá cho phép ngắt
**** các lệnh chương trình con phục vụ ngắt ****
RTE ;quay về từ ngắt
233
OP
EN
.P
TIT
.E
DU
.V
N
Chương 8: Vi điều khiển 32 bit MC68332
Tóm tắt nội dung chương:
• Các khối chức năng của MCU 68332 bao gồm: module tích hợp hệ thống SIM cung cấp
các tính năng giao tiếp với bên ngoài và các tính năng hỗ trợ hệ thống khác như: định thời
bật vi điều khiển (watchdog timer), cấp xung nhịp cho hệ thống. CPU 32 bit thực hiện các
lệnh của các chương trình yêu cầu. Khối xử lý thời gian (TPU) với rất nhiều tính năng hỗ
trợ điều khiển như: các chức năng vào ra định thời so sánh, các chức năng điều rộng xung,
các chức năng đo tần số, chu kỳ xung, các chức năng phát xung, các chức năng điều khiển
động cơ bước, động cơ AC, các chức năng đo tốc độ, xác định vị trí. Khối giao tiếp nối
tiếp hàng đợi hỗ trợ hai chuẩn giao tiếp SPI và UART. Khối bộ nhớ RAM nội bao gồm
các ô nhớ đa dụng, các thanh ghi và các vùng nhớ có thể sử dụng cho việc thực hiện các vi
lệnh. Các khối chức năng đuợc kết nối với nhau bằng hệ thống BUS gọi là IMB.
• Tập lệnh của MC68332 bao gồm các nhóm lệnh sau:
o Nhóm di chuyển dữ liệu: EXG, LEA, LINK, MOVE, MOVEA, MOVEM,
MOVEP, MOVEQ, PEA, SWAP, UNLK.
o Nhóm lệnh số học: ADD, ADDA, ADDI, ADDQ, ADDX, CLR, CMP, CMPA,
CMPI, CMPM, DIVS, DIVU, MULS, MULU, NEG, NEGX, SUB, SUBA, SUBI,
SUBQ, SUBX, TAS, TST.
o Nhóm lệnh logic: AND, ANDI, OR, ORI, EOR, EORI, NOT.
o Nhóm lệnh quay dịch: ASL, ASR, LSL, LSR, ROL, ROR, ROXL, ROXR.
o Nhóm lệnh xử lý bit: BCHG, BCLR, BSET, BTST.
o Nhóm lệnh với số BCD: ABCD, NBCD, SBCD.
o Nhóm lệnh điều khiển chương trình: BCC, DBCC, SCC, BRA, JMP, JSR, RTR.
o Nhóm điều khiển hệ thống: ANDI SR, EORI SR, RESET, RTE, STOP, CHK,
TRAP, TRAPV, ILLEGAL, ANDI CCR, ORI CCR, EORI CCR, MOVE to CCR,
NOP.
• Khởi động CPU bao gồm việc khởi động ngoại lệ reset để thiết lập các giá trị ban đầu cho
SP và PC. Khởi động vị trí đặt bảng vector ngoại lệ, và giá trị cho các vector ngoại lệ
trong bảng. Cuối cùng cần khởi động các bit mức đặc quyền, các bit ưu tiên ngắt và các
bit cho phép chế độ tìm kiếm gỡ rối chương trình.
• Khởi động SIM cần khởi động giá trị cho các thanh ghi của nó như: SIMCR, SYNCR,
SYPCR, PITR, PICR, CSPAR0, CSPAR1, CSBARBT, CSBAR[0:10], CSORBT,
CSOR[0:10] và các cổng đa dụng.
• Để khởi động RAM nội trước hết phải nạp giá trị địa chỉ cơ sở vào thanh ghi địa chỉ cơ sở
RAM và thanh ghi trạng thái RAM. Sau đó xoá bit RAMDS để cho phép RAM hoạt động.
Chú ý không định cấu hình RAM trùng vào địa chỉ của các thanh ghi.
• Lập trình khởi động cổng nối tiếp bao gồm việc khởi động cho hai module SCI và QSPI.
BÀI TẬP
Bài 1: Cho biết các chế độ địa chỉ sử dụng trong các lệnh sau:
a) EXG D0,A2
b) MOVE.B #5,D1
234
OP
EN
.P
TIT
.E
DU
.V
N
Chương 8: Vi điều khiển 32 bit MC68332
c) MOVE.W D6,(A0)
d) MOVE.W D6,(A0)+
e) MOVE.W D6,-(A0)
f) JMP (PC)
g) ADD.L A0,10H(A1,D1.W)
Bài 2: Hai lệnh sau sẽ thực hiện các công việc gì?
EXG D0,A0
EXG D0,A1
Bài 3: Cho biết lệnh sau thực hiện công việc gì:
MOVE.B -(A3),(A3)+
Bài 4: Các ô nhớ có địa chỉ từ 000490 tới 000495 lần lượt chứa các giá trị: 0A, 9C, B2, 78, 4F và
C3. Thanh ghi D2 sẽ có giá trị bằng bao nhiêu sau mỗi lệnh sau:
a) MOVE.B (A0),D2
b) MOVE.B -(A0),D2
c) MOVE.W (A0),D2
d) MOVE.W (A0)+,D2
e) MOVE.W -(A0),D2
Biết rằng trước khi thực hiện lệnh A0=00000492 và D2=0.
Bài 5: A0 sẽ chứa giá trị bằng bao nhiêu sau mỗi lệnh trong bài 4.
Bài 6: Biết A0=0028C504 các lệnh sau sẽ thực hiện các công việc gì?
a) MOVE.L (A0)+,A1
b) MOVE.L A0,(A0)
c) MOVE.L (A0),A0
d) MOVE.L -(A0),A0
Bài 7: Giả sử A0=00003800H và D0=00000200H. Cho biết địa chỉ của toán hạng trong mỗi lệnh
sau:
a) MOVE.B 10H(A0),D2
b) MOVE.B 1400H(A0),D2
c) MOVE.B 9F00H(A0),D2
d) MOVE.B 10H(A0,D0.L),D2
e) MOVE.B 84H(A0,D0.L),D2
Bài 8: Giả sử các ô nhớ có địa chỉ từ 004000 tới 004007 chứa các giá trị tương ứng là: 11, 22, 33,
44, 99, AA, 55, 66. Cho biết kết quả sau khi thực hiện các lệnh:
235
OP
EN
.P
TIT
.E
DU
.V
N
Chương 8: Vi điều khiển 32 bit MC68332
MOVE.W D3-D7,-(A2)
MOVE.W (A0)+,D3-D7
Bài 9: Cho biết kết quả của lệnh SWAP D0 với D0 = 042959FD.
Bài 10: Cho biết sự khác nhau sau khi thực hiện hai lệnh CLR.B D0 và SUB.B D0,D0.
Bài 11: Cho biết D2 = 55555555 cho biết giá trị của D2 sau khi thực hiện lệnh NEG.W D2.
Bài 12: Giả sử D2 = 3B25AC89 cho biết giá trị của D2 sau khi thực hiện chuỗi lệnh sau:
ANDI.B #2CH,D5
ORI.W #3C45H,D5
EORI.L #789ABCDEH,D5
NOT.W D5
Bài 13: Giả sử D4=C9AE23A5 cho biết kết quả chứa trong thanh ghi D4 sau khi thực hiện xong
hai lệnh:
ASR.L #3,D4
ROL.W #5,D4
Bài 14: Cho biết D3=56789ABC và D4=00000013. Xác định trạng thái của cờ Z và nội dung của
thanh ghi D3 sau khi thực hiện các lệnh:
BTST #4,D3
BTST D4,D3
BSET #1,D3
BCHG D4,D3
Bài 15: Viết chương trình cộng một bảng dữ liệu bao gồm 128 phần tử dữ liệu có độ dài 2 byte,
sau đó tính giá trị trung bình của nó.
Bài 16: Cho một chuỗi dữ liệu một byte kết thúc bằng giá trị FF, với A6 giữ địa chỉ bắt đầu của
chuỗi trong bộ nhớ. Viết đoạn chương trình xác định địa chỉ của số trong chuỗi có giá trị
bằng D6.
Bài 17: Viết các lệnh di chuyển 16K word bắt đầu từ địa chỉ trỏ bởi thanh ghi A3 tới vị trí bộ nhớ
có địa chỉ trỏ bởi thanh ghi A4.
Bài 18: Viết đoạn chương trình khai báo 6 chương trình con và các lệnh chuyển tới chương trình
con tương ứng với số chứa trong thanh ghi D4.
236
OP
EN
.P
TIT
.E
DU
.V
N
HƯỚNG DẪN VÀ ĐÁP SỐ BÀI TẬP
CHƯƠNG 1:
Bài 1: A03FFH
Bài 2: Ghép hai bộ nhớ 256Kx4bit để tạo thành một bộ nhớ 256B x 8 bằng cách nối chung các
đường địa chỉ, các đường điều khiển và để riêng các đường dữ liệu. Sau đó ghép các khối
256K x 8 để tạo thành bộ nhớ 1M x 8.
Bài 3: b) Giải mã 2 ra 4 và sử dụng cổng AND hai ngõ ra Y0 và Ý của bọ giải mã để cho phép CS
của bộ nhớ 512KB số 1.
Bài 4: Sử dụng cổng cài các ngõ vào nối tới data bus ngõ ra nối tới các LED, bộ cài được cho
phép bằng một cổng NAND với các ngõ vào là các đường địa chỉ cung cấp thẳng hoặc đảo
cho đúng với địa chỉ F000H.
Bài 5: Sử dụng cổng đệm 1 chiều 8 bit với ngõ vào nối tới các phím nhấn, ngõ ra nối tới data bus
của hệ thống. Cổng đệm cho phép bằng cổng NAND với các ngõ vào là các đường địa chỉ.
Bài 6: Có thể sử dụng bộ giải mã 2 – 4 với ngõ vào là A1 và A0 và mỗi ngõ ra sẽ cho phép một
cổng vào ra.
CHƯƠNG 2:
Bài 1: a) Offset = vật lý – 10h x segment
b) Segment = (Vật lý – offset)/10H
Bài 2: a) Vật lý = segment x 10H + offset
Bài 3: Địa chỉ vật lý đỉnh ngăn xếp = SS x 10H + SP.
Bài 4: Nếu khoảng cách giữa hai địa chỉ lớn hơn 64K có thể cần phải thay đổi cả CS và IP, nếu
không có thể chỉ cần thay đổi IP.
Bài 5: Chuyển điều khiển chương trình có thể bằng lệnh hoặc bằng ngắt phần cứng. Chuyển điều
khiển theo lệnh có hai cơ chế chính là nhảy và gọi chương trình con. Nhảy chia thành hai
loại: nhảy có điều kiện và không có điều kiện.
Bài 6: Sẽ không phải chỉ thị vị trí chứa một toán hạng và kết quả cuối cùng của các phép tính mà
ALU thực hiện.
Bài 7: Khi có bộ giải mã lệnh, các lệnh mã máy ngoài bộ nhớ sẽ chỉ cần có kích thước ngắn, bộ
giải mã sẽ giải mã chọn ra một trong nhiều hàm hoặc vùng đệm dữ liệu để thực hiện lệnh.
Bài 8: Nơi chứa địa chỉ chương trình phục vụ trong bảng vector ngắt sẽ bằng số hiệu ngắt nhân
với 4.
Bài 9: Khi cộng tràn khỏi bộ nhớ hoặc khi trừ số nhỏ cho số lơn hơn cờ nhớ sẽ bằng 1.
Bài 10: Cờ ZF bằng 1 bất cứ khi nào kết quả trong thanh ghi chứa kết quả bằng 0.
Bài 11: Cờ chẵn lẻ bằng 1 khi kết quả các phép tính có số bit 1 là một số chẵn.
Bài 12: Cờ phụ (AF) bằng 1 khi có sự tràn bit 1 từ nibble thấp quan nibble cao.
Bài 13: Cờ tràn bằng 1 khi có sự tràn bit 1 từ bit MSB – 1 qua bit MAS.
Bài 14: Cờ dấu bằng 1 khi bit MSM của kết quả bằng 1.
Bài 15: Khi truy cập một ô nhớ nhiều lần sử dụng các thanh ghi địa chỉ sẽ có lợi hơn, vì độ dài
lệnh ngắn hơn do chỉ cần chỉ thị thanh ghi giữ địa chỉ mà không cần phải chỉ thị bằng số
trong mã lệnh.
237
OP
EN
.P
TIT
.E
DU
.V
N
Bài 16: Khi truy cập một chuỗi dữ liệu liên tiếp trong bộ nhớ sẽ có lợi do truy cập tới một phần tử
của chuỗi chỉ cần chỉ thị số độ dời trong mã lệnh.
Bài 17: Quay về từ ngắt còn phục hồi thêm giá trị cùa các cờ trạng thái.
Bài 18: Khi nhân 16 bit kết quả có thể lên tới 32 bit như vậy AX sẽ giữ không đủ cần thêm thanh
ghi DX. Khi thực hiện phép chia 16 bit, số dư có thể 16 bit vì vậy cần thanh ghi DX để giữ
nó.
CHƯƠNG 3:
Bài 1: trong lệnh địa chỉ vật lý truy cập sẽ bằng DSx10H+3897H
Bài 2: MOV [4B2CH],DL
Bài 3: a) AX là trực tiếp thanh ghi và [BX] là gián tiếp thanh ghi.
b) CX – trực tiếp thanh ghi, [1234H] – trực tiếp.
c) trực tiếp thanh ghi.
d) trực tiếp thanh ghi.
e), f), g), h) – trực tiếp thanh ghi.
i) trực tiếp thanh ghi và tức thời.
k) trực tiếp thanh ghi và tương đối cơ sở chỉ số.
l), m) trực tiếp thanh ghi.
n) hiểu ngầm là AL và [BX+AL].
o) trực tiếp thanh ghi.
p) trực tiếp thanh ghi và tức thời.
q) r) trực tiếp thanh ghi và hiểu ngầm trong lệnh.
s) hiểu ngầm trong lệnh.
t), u) tương đối.
Bài 4:
a) MOV BP,3654H
b) MOV SP,BP
c) MOV [9876h],AX
d) INC CX
e) ADD DL,07
f) OR AX,1000000000000000B
g) OR AX,0000000000000001B
h) AND CL,0FH
i) MOV AL,8
MUL AH
j) XOR DX,0000 0000 0000 1111B
k) MOV AX,0
SUB AX,BP
Bài 5: Do trình tự PUSH và POP giống nhau nên sau các lệnh POP sẽ được AX = giá trị cũ của
DX, BX bằng giá trị cũ của CX, CX bằng giá trị cũ của BX và DX bằng giá trị cũ của AX.
Bài 6: 2650
Bài 7: a) các cờ trạng thái sẽ không bị ảnh hưởng.
b) – f): tuỳ theo kết quả phép tính mà sẽ có các cờ trạng thái khác nhau.
Bài 8: Tức thời MOV AH,12H
238
OP
EN
.P
TIT
.E
DU
.V
N
Trực tiếp ADD AL,[1234H]
Trực tiếp thanh ghi SUB AH,BH
Gián tiếp thanh ghi AND AL,[BX]
Tương đối chỉ số XCHG AL,[DI+01]
Tương đối cơ sở CMP BL,[BP+08]
Tương đối chỉ số cơ sở SHL [BX+SI+09]
Bài 9: Chế độ trực tiếp, gián tiếp thanh ghi, tương đối ngắn -128 đến 127, tương đối từ -216 tới 216-
1, tuyệt đối.
Bài 10: Nhập ký tự dùng hàm 01 ngắt 21H, hiển thị lên dòng tiếp theo dùng hàm 02 ngắt 21H.
Bài 11: Nhập dùng hàm 01 ngắt 21H, hiển thị 25 lần theo cột dọc cần dùng vòng lặp 25 lần hiển
thị và xuống hàng về đầu hàng.
Bài 12: Lặp lại hàm 01 ngắt 21H cho đến khi gặp ký tự ESC mã ASCII bằng 27.
Bài 13: Nhập một chuỗi cần khai báo bộ đệm để lưu trữ nó. Tiếp theo xử lý chuỗi bằng các so
sánh hai số kế tiếp nhau nếu số nào nhỏ hơn thì đổi chỗ nó lên phía trước. Lặp lại cho đến
khi không có sự đổi chỗ nào nữa thì chuỗi được sắp xếp xong.
Bài 14: Để đổi từ chữ thường thành chữ in hoa có thể trừ mã ASCII của nó đi 20H.
Bài 15: Trước hết nhập chuỗi thứ nhất cất vào bộ đệm, khi nhập một ký tự của chuỗi thứ 2 sẽ đem
so sánh với toàn bộ chuỗi thứ nhất, nếu giống thì cất vào bộ đệm hiển thị.
Bài 16: Trước hết nhận chuỗi cất vào bộ đệm, sau đó với từng ký tự có mã ASCII là xyH cần đổi
thành 0xH và 0yH, tiếp theo xét 0xH và 0yH nếu lớn hơn 9 thì công với 37H để thành ký tự
từ A tới F, nếu không cộng với 30H để thành các ký tự từ 0 đến 9 có mã ASCII là 30H tới
39H.
Bài 17: Khai báo hai biến hàng đơn vị và hàng chục, lặp lại việc tăng hàng đơn vị, nếu hàng đơn
vị bằng 10 thì xoá nó về 0 và tăng hàng chục, sau đó hiển thị hàng chục và hàng đơn vị, lặp
lại cho đến khi gặp số bằng 99.
Bài 18: Đổi số HEX ra thập phân có thể chia cho 10 lấy số dư sẽ là hàng đơn vị, thương số còn lại
tiếp tục chia cho 10 để lấy số dư là hàng chục và tiếp tục cho hàng trăm và hàng ngàn.
Bài 19: Nhập a, b, c sau đó tính x = (c-b)/a
Bài 20: Khai báo bảng dữ liệu bao gồm các lệnh và mã lệnh tương ứng, khi nhập lệnh vào sẽ lấy
chuỗi ký tự nhập so sánh tuần tự trong bảng dữ liệu đã có để lấy mã lệnh.
Bài 21: Nhập chuỗi ký tự hiển thị lên mà hình chờ một khoảng thời gian để mắt cảm nhận được,
tiếp theo cần đảo chuỗi ký tự đã nhập, ký tự sau lên thế chỗ của ký tự trước nó trong bộ nhớ
sau đó di chuyển con trỏ về đầu chuỗi đã hiển thị và hiển thị chuỗi mới.
Bài 22: Lặp lại phép cộng một trăm lần, mỗi lần tăng số cộng lên 1.
Bài 23: Khai báo bảng dữ liệu bao gồm các dấu * và khoảng trống sắp thành ký tự. Từ ký tự nhập
từ bàn phím sẽ tra vào bảng dữ liệu đã khai báo để lấy các dữ liệu cần hiển thị.
Bài 24: Muốn tính USCLN của hai số có thể lặp lại việc lấy số lớn trừ đi số nhỏ sau đó lấy hiệu và
số trừ so sánh để tiếp tục trừ tiếp cho đến khi kết quả bằng 0 thì hai số trước khi trừ chính là
USCLN của nó.
Bài 25: Để chữ rơi cần di chuyển con trỏ tới vị trí mới và hiễn chữ trong thời gian ngắn.
Bài 26: Để hiện ký tự theo đường chéo có thể sử dụng cách hiển thị liên tiếp các khoảng trong để
dịch con trỏ.
Bài 27: Để xét một số có phải là số nguyên tố có thể lấy số đó tuần tự chia cho các số lẻ từ 3 tới số
đó chia 2.
Bài 28: hiển thị bảng cửu chương sẽ tuần tự hiển thị số bị nhân dấu x số nhân dấu = và tích của 2
số dưới dạng thập phân. Số nhân tăng dần sau đó tăng số bị nhân.
239
OP
EN
.P
TIT
.E
DU
.V
N
Bài 29: Nhập từ bàn phím số nhị phân sẽ thu được kết quả là 30H hoặc 31H muốn có 8 bit cần
xoá (khi 30H) và lập (khi 31H) cờ C và quay trái vào một thanh ghi nào đó 8 lần. Để hiển
thị giá trị HEX có thể tách giá trị thu được trong bước trên thành hai số và đổi thành số
HEX tương ứng bằng cách cộng với 30H nếu là số và cộng với 37H nếu là chữ.
Bài 30: Khai báo 3 biến chứa các số hàng đơn vị, chục và trăm. Khi nhấn T thì tăng biến đơn vị,
biến đơn vị bằng 10 thì xoá về 0 và tăng biến chục, biến chục bằng 10 thì xoá về 0 tăng biến
trăm, biến trăm bằng 10 thì xoá về 0. Ngược lại khi nhấn G sẽ giảm, bằng 0 giảm tiếp sẽ
cho về 9 và giảm hàng kế tiếp đi 1.
Bài 31: Khai báo bảng mã LED7 trong bộ nhớ, sau đó sử dụng lệnh XLAT với AL là giá trị thập
phân của ký tự nhập từ bàn phím.
CHƯƠNG 4:
Bài 1: Trước hết 80286 cần được kết nối với các mạch phụ trợ như: bộ điều khiển BUS 80288
cung cấp ra các tín hiệu IO/M, IORC, IOWC, MRDC, MWRC, DEN, DT/R . Các cổng cài
cho bus địa chỉ, các cổng đệm 3 trạng thái cho bus dữ liệu. Sau đó kết nối bus dữ liệu và các
đường MRDC và MWRC tới tất cả các chip nhớ trong bản đồ. Kết nối địa chỉ cao tới giải
mã địa chỉ và địa chỉ thấp tới mọi bộ nhớ, ngõ ra bộ giải mã địa chỉ sẽ sử dụng cho phép các
bộ nhớ.
Bài 2: Nhận phím nhấn sử dụng lệnh IN, muốn kiểm tra phím nào được nhấn có thể sử dụng lệnh
AND để giữ lại bit tương ứng với phím, các bit khác xoá về 0. Để các LED sáng các kiểu
khác nhau sử dụng lệnh OUT với dữ liệu khác nhau.
Bài 3: Mỗi cửa sẽ cung cấp một bit vào và các bit này sẽ được kiểm tra giống như các phím nhấn,
cứ một bit tác động thì cấp một bit ra bằng 1 đóng cho còi báo động.
Bài 4: Giải thuật phần mềm bao gồm các công việc: Kiểm tra các bit vào, đóng ngõ ra khi có bit
vào tác động và tắt báo động khi ngõ vào yêu cầu tắt tác động.
Bài 5: Chương trình được thực hiện theo giải thuật trong bài 4.
Bài 6: mạch tính cước bao gồm các mạch: phát hiện nhấc máy bằng cách phát hiện sụt mức DC
trên đường dây hoặc có dòng chảy qua máy điện thoại với tổng trở từ 600 – 1500 ohm.
Mạch đọc số quay dùng IC 8870. Phát hiện thông thoại và gác máy bằng cách phát hiện đảo
cực tính trên hai đường dây điện thoại. Như vậy nếu nhận được số gọi, biết thời điểm bắt
đầu thông thoại và thời điểm gác máy, có thể tính được thời gian cuộc gọi. Và với bảng giá
quy định trước sẽ tính được cước phí cuộc gọi.
Bài 7, 8, 9: Trước hết cần đóng mở các đèn thông qua các Relay, cuộn dây relay sẽ được đóng
ngắt từ hệ thống vi xử lý và từ công tắc tay, tiếp điểm phụ relay sẽ sử dụng làm phản hồi để
báo thiết bị đang đóng hay mở. Muốn tắt cần đưa tín hiệu ngõ ra để đảo trạng thái của tín
hiệu đóng ralay.
Bài 10: Để điều khiển được tốc độ động cơ cần môt bộ DAC kết nối với hệ thống vi xử lý, ngõ ra
sẽ cấp tín hiệu tương tự tới ngõ Vin của mạch điều khiển tốc độ động cơ. Như vậy tương
ứng với một giá trị số đưa tới DAC, động cơ sẽ quay với một tốc độ nhất định. Động cơ
dừng với ngõ ra bằng 7FH, từ 7F giảm về 0 động cơ sẽ quay nhanh dần theo một chiều, và
từ 7FH tăng lên tới FFH động cơ sẽ quay nhanh dần theo chiều ngược lại.
Bài 11: Có thể điều khiển nhiệt độ bằng cách đóng mở phần tử nhiệt, nếu nhiệt độ tăng quá giá trị
mong muốn tắt phần tử nhiệt và ngược lại. Để xác định nhiệt độ lò cần sử dụng cảm biến
nhiệt độ (ví dụ LM35) đổi từ nhiệt độ thành điện áp, sau đó điện áp sẽ đổi thành giá trị số
bằng ADC để đọc vào vi xử lý.
240
OP
EN
.P
TIT
.E
DU
.V
N
Bài 12: Để đo điện áp AC 0 – 220V trước hết cần giảm điện áp bằng biến áp, sau đó cần chỉnh lưu
để cho ra giá trị DC tương ứng và dùng ADC để đổi thành số đọc vào vi xử lý. Giá trị đọc
vào sẽ được tính toán ra giá trị thập phân tương ứng để hiển thị lên LED 7 đoạn.
Bài 13: Giao tiếp động cơ bước với hệ thống vi xử lý cần sử dụng mạch khuếch đại công suất, dữ
liệu xuất theo trình tự trong bảng để động cơ quay theo chiều thuận, số bước xuất sẽ tương
ứng với góc quay yêu cầu.
Bài 14: Để hiển thị ký tự lên LED ma trận trước hết cần có mã ký tự định nghĩa trước trong bộ
nhớ. Sau đó sẽ hiển thị từng mã trên từng cột của ma trận. Để chữ trôi cần đảo vị trí của các
mã trong bộ nhớ.
CHƯƠNG 5:
Bài 1: Đọc phím nhấn cần thực hiện theo phương pháp quét, cần tuần tự đưa mức 0 ra các cộ và
tuần tự đọc vào từ các hàng. Từ mã cung cấp ra cột và từ mã nhận vào từ các hàng có thể
xác định được phím đã nhấn. Hiển thị lên các LED cũng cần quét bằng các chọn lần lượt
từng đèn và cung cấp mã hiển thị cho đèn đó.
Bài 2: Lần lượt dùng từ điều khiển lập xoá bit cổng C với thời gian trễ khác nhau sẽ được các
sóng vuông với tần số khác nhau.
Bài 3: 1100 01000B
Bài 4: Kết nối các cổng A và B của hai hệ thống với nhau, chú ý các tín hiệu bắt tay OBF nối với
STB và IBF nối với ACK. Khởi động các từ điều khiển tương ứng và viết các chương trình
kiểm tra đường INTR để truyền nhận dữ liệu.
Bài 5: Kết nối cổng A của hai 8255 trên hai hệ thống kèm theo các tín hiệu điều khiển cho chúng,
viết các chương trình kiểm tra trạng thái các chân INTR để truyền nhận dữ liệu.
Bài 6: Một cổng cấp dữ liệu cho các hàng và một cổng cấp dữ liệu cho các cột, muốn hiện lên một
ký tự cần chọn 1 trong các cột bằng 0 sau đó cung cấp dữ liệu để sáng các led tương ứng
trên cột đó, sau đó tiếp tục chọn cột kế tiếp.
Bài 7: Một cổng 8255 sẽ nối tới các ngõ ra dữ liệu của ADC, cổng khác sẽ điều khiển tín hiệu bắt
đầu quá trình chuyển đổi (Start) và cần giám sát tín hiệu kết thúc chuyển đổi EOC để nhận
được dữ liệu đúng.
Bài 8: 01000100B
Bài 9: 10001000B
Bài 10, 11: kết nối TxD của 8251 hệ thống này tới RxD của 8251 hệ thống kia và ngược lại, có
thể sử dụng các tín hiệu bắt tay DSR nối với DTR và RTS nối tới CTS. Sau đó viết các đoạn
chương trình khởi động các chế độ làm việc tương ứng. Chương trình truyền nhận cần kiểm
tra tình trạng sẵn sàng của thiết bị trước khi truyền nhận dữ liệu.
Bài 12: kết nối 8251 với hệ thống 80286 như mô tả trong bài học, thực hiện chương trình khởi
động và truyền nhận dữ liệu trên 80286. Trên máy tính tham khảo thư viện MSCOMM của
MSDN.
CHƯƠNG 6:
Bài 1: Lệnh OR bit cần có một toán hạng trong cờ C, nên cần lệnh MOV bit.
Bài 2: bit 53H
Bài 3: MOV DPTR,9A00H
MOV A,#0ABH
241
OP
EN
.P
TIT
.E
DU
.V
N
MOVX @DPTR,A
Bài 4: 3MHz
Bài 5: PSEN
Bài 6: OR A,#01
Bài 7: MOV DPTR,#100H
MOVX @DPTR,R7
Bài 8: địa chỉ 08H và 09H
Bài 9: lệnh ghi bit tương ứng trong thanh ghi PCON.
Bài 10: MOV R1,#50H
MOV A,@R1
Bài 11: 1EH
Bài 12: 8FH
Bài 13: A0H
Bài 14: A1H
Bài 15: Cần sử dụng timer tạo ra khoảng thời gian trễ bằng ½ chu kỳ xung vuông, sau đó lật trạng
thái ngõ ra P1.7 sau mỗi lần gọi trễ.
Bài 16: Cần tạo ra hai chương trình trễ 4 μsec và 200 μsec cứ lật trạng thái P1.7 lên 1 sau 4 μsec
lại xoá về 0 200 μsec.
Bài 17: Thực hiện các lệnh OR và NOT cho hình a và NAND rồi NOT cho hình b.
Bài 18: A=29H
Bài 19: MOV C,PSW.5
MOV P1.5,C
Bài 20: Đọc vào từ cổng P3, xoá 4 bit cao về 0 sau đó tra bảng để đổi thành mã LED 7 đoạn và
cấp ra cổng P1.
Bài 21: Timer 1 được cho phép chạy.
Bài 22: Timer 1 làm bộ đếm counter chế độ 0 cho phép chạy từ bên ngoài, Timer 0 làm bộ đếm
chế độ 1 cho phép chạy từ bên trong.
Bài 23: Sử dụng timer 0 chế độ định thời cho phép từ bên trong tạo ra thời gian trễ bằng ½ chu kỳ
xung vuông 12KHz, lật trạng thái P1.2 sau mỗi lần gọi chương trình trễ.
Bài 24: Cần khởi động cổng nối tiếp và timer1 để xác định tốc độ truyền nhận, các chương trình
truyền cần kiểm tra TI trước khi cấp dữ liệu tới SBUF. Các chương trình nhận cần kiểm tra
RI trước khi đọc SBUF.
Bài 25: Chọn chế độ thanh ghi dịch cho cổng nối tiếp, phần cứng chân TxD và RxD nối tới thanh
ghi dịch như trong bài giảng.
Bài 26: Dùng lệnh dịch phải và kiểm tra cờ C để xác định khi nào có bit 1.
CHƯƠNG 7:
Bài 1: Khởi động timer 1 ở chế độ counter cho phép chạy từ bên trong, mỗi xung ngõ vào cấp từ
cửa quay sẽ làm bộ đếm timer tăng lên 1. Giám sát TH1 khi nào bằng giá trị cần thiết thì bật
đèn sáng.
Bài 2: Trước hết mạch cần giao tiếp với 6 LED 7 đoạn để hiển thị giờ – phút – giây. Sử dụng
timer tạo ra thời gian trễ 250 μsec tạo ra một ngắt CPU, chương trình ngắt sẽ tăng một số
đếm N1. Chương trình chính kiểm tra N1, nếu N1=40 thì xoá về 0 khi đó sẽ được 10000
μsec hay 0.1 sec. Tăng số đếm N2 (0.1sec) nếu N2 = 10 thì xoá về 0 tăng số đếm giây, số
đếm giây bằng 60 thì xoá về 0 và tăng số đếm phút, phút bằng 60 thì xoá về 0 và tăng số
242
OP
EN
.P
TIT
.E
DU
.V
N
đếm giờ, giờ bằng 24 thì xoá về 0. Tiếp theo sẽ hiển thị số đếm giở phút giây lên LED 7
đoạn.
Bài 3: Quét bàn phím ma trận bằng các cấp mức 0 ra cột và đọc hàng rồi đổi ra mã LED 7 đoạn.
Khởi động timer trễ 20 msec gây ngắt CPU, chương trình ngắt quét giá trị lên 8 LED 7
đoạn.
Bài 4: Tín hiệu quay số trên máy điện thoại có thể giải mã bằng IC giải mã DTMF MT8870, một
phím nhấn sẽ được mã hoá thành tín hiệu DTMF và được MT8870 đổi ra mã nhị phân 4 bit
tương ứng. Để đọc được giá trị đúng cần kiểm tra tín hiệu INT của 8870 trước khi đọc giá
trị mã phím.
Bài 5: Để giao tiếp với các đèn công suất lớn cần có giao tiếp công suất bằng Relay hoặc SSR.
Giải thuật điều khiển khá đơn giản: cho đèn xanh ngã tư bên này + đèn đỏ bên kia cùng
sáng. Sau đó tắt hai đèn này để sáng đồng thời hai đèn vàng và cuối cùng sẽ cho sáng hai
đèn còn lại. Mỗi lần sáng sẽ theo một khoảng thời gian định trước.
Bài 6: Hệ thống đếm sản phẩm trước hết cần một bộ cảm biến quang để mỗi sản phẩm đi ngang
qua sẽ tạo ra một xung. Xung này sẽ được đưa tới ngõ vào của một timer, timer được khởi
động ở chế độ counter cho phép chạy từ bên trong. Giá trị đếm được sẽ trong bộ đếm timer
sẽ được đổi ra thập phân và đổi thành mã hiển thị thích hợp cung cấp tới bộ hiển thị.
Bài 7: Cảm biến tốc độ sẽ cung cấp xung tới ngõ vào một timer, bộ đếm timer sẽ tăng lên sau mỗi
xung và từ số xung đếm được trong một thời gian định trước sẽ tính ra được tốc độ quay
của động cơ.
CHƯƠNG 8:
Bài 1: a) Trực tiếp thanh ghi địa chỉ (A2) và trực tiếp thanh ghi dữ liệu (D0).
b) Tức thời #5.
c) Gián tiếp thanh ghi địa chỉ (A0).
d) Gián tiếp thanh ghi địa chỉ tăng sau (A0)+
e) Gián tiếp thanh ghi địa chỉ trừ trước –(A0)
f) Tương đối thanh ghi PC
g) Gián tiếp thanh ghi địa chỉ với chỉ số.
Bài 2: A0 = D0 cũ; A1 = A0 cũ và D0 = A1 cũ.
Bài 3: Lệnh không thực hiện được công việc nào cả.
Bài 4: a) Lấy giá trị ô nhớ 492 vào thanh ghi D0, D0 = B2H
b) D2=9CH
c) B278H
d) B278H
e) 0A9CH
Bài 5: a) A0=492
b) A0=491
c) A0=492
d) A0=494
e) A0=490
Bài 6: a) A1 sẽ được nạp 4 byte bắt đầu tại địa chỉ 0028C504
b) giá trị 0028C504 sẽ được ghi vào các địa chỉ từ 0028C504 tới 0028C507
c) Từ dài tại địa chỉ 0028C504 sẽ được chép vào A0
d) Từ dài tại địa chỉ 0028C500 sẽ chép vào A1, A0 =0028C500
243
OP
EN
.P
TIT
.E
DU
.V
N
Bài 7: a) 00003810
b) 00004C00
c) FFFFD700
d) 00003A10
e) 00003984
Bài 9: 59FD0429
Bài 10: Lệnh CLR.B D0 xoá một byte thấp của D0 nhưng không tác động tới các cờ giống như
lệnh SUB.B D0,D0.
Bài 11: 5555AAAB
Bài 12: 43BFFF6C
Bài 13: C9AE 048E
Bài 15: Chương trình có thể thực hiện như sau:
COUNT BYTE 128
SUM WORD 0
AVERAGE WORD 0
VALUES BLOCK 256
FINAVE LEA VALUE,A2
CLR.B D0
CLR.W SUM
ADDLOOP MOV.W (A2)+,D2
ADD.W D2,SUM
ADDQ.B #1,D0
CMP.B COUNT,D0
BNE ADDLOOP
MOVE.W SUM,D2
EXT.L D2
MOVE.B COUNT,D1
EXT.W D1
DIVS D1,D2
MOVE.W D2,AVERAGE
Bài 16: chương trình có thể thực hiện như sau
SEARCH MOVE.B (A6)+,D5
CMP.B D5,D6
BEQ FOUND
CMP.B SEARCH
ANDI #0FBH,CCR
FOUND RTS
Bài 17:
BLOCKMOVE MOVE.W #16383,D0
MOVEDATA MOVE.W (A3)+,(A4)+
244
OP
EN
.P
TIT
.E
DU
.V
N
DBF D0,MOVEDATA
Bài 18:
SUBTAB LONG SUB0
LONG SUB1
LONG SUB2
LONG SUB3
LONG SUB4
LONG SUB5
DISPAT CMP.B #6,D4
BCC ERROR
MOVEQ #4,D3
MULU D3,D4
LEA SUBTAB,A0
MOVEA.L 0(A0,D4.W),A1
JSR (A1)
BRA DISPAT
245
OP
EN
.P
TIT
.E
DU
.V
N
CÁC CHỮ VIẾT TẮT SỬ DỤNG TRONG BÀI GIẢNG.
AAA: Ascii adjust for add – lệnh chỉnh ASCII cho lệnh cộng
AAD: Ascii adjust for divide – lệnh chỉnh ASCII cho lệnh chia
AAM: Ascii adjust for multiply – lệnh chỉnh ASCII cho lệnh nhân
AAS: Ascii adjust for subtract – lệnh chỉnh ASCII cho lệnh trừ
ADD – add: lệnh cộng.
ADC – add with carry; lệnh cộng có nhớ
AF: auxiliary flag – cờ phụ.
ALE: Address latch Enable – Tín hiệu cho phép cài địa chỉ: sử dụng để cài tín hiệu địa chỉ
qua bộ cài cung cấp cho bộ nhớ và vào ra.
ALU: Arithmetic logic unit – đơn vi số học vào logic
AU: Address Unit – Khối tạo địa chỉ; sử dụng tạo ra địa chỉ vật lý cung cấp cho bộ nhớ và
vào ra.
AX: accumulator – thanh ghi tích luỹ.
BP: base pointer – thanh ghi con trỏ cơ sở
BU: Bus Unit – Khối giao tiếp BUS; là khối mạch tác động mọi tín hiệu để giao tiếp với thế
giới bên ngoài của bộ vi xử lý
BX: base – thanh ghi đa năng cơ sở.
CE: Chip Enable – Tín hiệu điều khiển chọn vi mạch hoạt động (vi mạch nhớ hoặc vi mạch
vào ra).
CF: Carry flag – Cờ nhớ
CJNE: compare and jump if not equal – lệnh so sánh và nhỷa nếu không bằng
CLD- clear direction flag – lệnh xoá cờ định hướng
CLI: clear interupt flag – lệnh xoá cờ ngắt.
CLK: clock – ngõ vào nhận tín hiệu xung nhịp của các vi mạch số.
CMP: compare – lệnh so sánh.
CPU: Central Procesing Unit: Đơn vi xử lý trung tân hay còn gọi là bộ vi xử lý.
CS: Chip Select – Tương tự CE là tín hiệu chọn vi mạch hoạt động.
CS: Code Segment – thanh ghi đoạn lệnh
CX: Count – thanh ghi đa năng đếm số lần lặp.
C/D: control data – tín hiệu ngõ vào phân biết dữ liệu điều khiển và dữ liệu truyền nhận của
8251.
DAA: decimal adjust for add – Lệnh chỉnh thập phân sau lệnh cộng
DAS: decimal adjust for subtract – Lệnh chỉnh thập phân sau lệnh trừ.
DB: define byte – Chỉ thị hợp ngữ khai báo biến byte trong bộ nhớ.
244
OP
EN
.P
TIT
.E
DU
.V
N
DD: define double word – chỉ thị khai báo biến 32 bit trong bộ nhớ.
DDRE: port E Data direction register – thanh ghi định hướng truyền dữ liệu cổng E
DEC: decrement – lệnh giảm
DEN: data enable – ngõ ra cho phép bộ đệm dữ liệu hai chiều của 80288..
DF: direction flag – cờ định hướng.
DI: destination index – thanh ghi chỉ số đích.
DIO; discrete input/output – vào ra rời rạc
DRAM: dynamic RAM – bộ nhớ RAM động.
DS: Data Segment – thanh ghi đoạn dữ liệu
DT/R: data transmite revceive – ngõ ra cho phép chiều truyền dữ liệu qua bộ đệm hai chiều
của 80288.
DT: define ten byte – chỉ thị hợp ngữ khai báo biến 10 byte trong bộ nhớ.
DIV: divide – lệnh chia
DW: define word – chỉ thị hợp ngữ khai báo biến 16 bit trong bộ nhớ.
DX: data – thanh ghi đa năng chứa dữ liệu cho các lệnh nhân chia 16 bit.
EBI: External bus interface – giao tiếp bus ngoài.
EEROM: electrical erasable ROM – bộ nhớ ROM có thể xoá bằng điện.
EM: emulate processor extension – bít cho phép bộ đồng xử lý toán học trong thanh ghi từ
trạng thái máy của 80286.
EPROM: electrical programmmable ROM – bộ nhớ ROM có thể lập trình bằng điện.
ES: Extra Segment – thanh ghi đoạn mở rộng
EU: Execution Unit – Khối thực hiện lệnh trong vi xử lý
FQM: frequency measurement – đo tần số
IC: integrated circuit – vi mạch tích hợp.
IDIV: integer divide – lệnh chia nguyên.
IF: Interrupt flag – cờ ngắt.
IMB: Inter module bus – bus kết nối các module.
IMUL: integer multiply – lệnh nhân nguyên.
IN: input – lệnh nhập dữ liệu từ cổng.
INC: increment – lệnh tăng.
INT: interupt – là tín hiệu ngõ vào nhận yêu cầu ngắt của vi xử lý.
I/O: input/output – vào ra
IORC: input/output read control – tín hiệu đọc vào ra cấp từ CPU
IOPL: IO privilede level – cờ chỉ thị mức đặc quyền vào ra.
IOWC: input/output write control – tín hiệu ghi vào ra cấp từ CPU
IP:instruction pointer – thanh ghi con trỏ lệnh.
ITC: input capture/input transition counter – bộ đếm ngõ vào bắt và chuyển đổi.
IU: Instruction Unit – Khối giải mã lệnh trong vi xử lý.
245
OP
EN
.P
TIT
.E
DU
.V
N
JA: jump if above – Nhảy khi lớn hơn
JB: jump if below – Nhảy khi nhỏ hơn.
JC: jump if carry – nhảy khi cở nhớ bằng 1
JE: jump if equal – nhảy khi bằng.
JNC; jump if not caryy – nhảy khi cờ nhớ bằng 0.
JMP: jump – lệnh nhảy
LDS: load effective address and segment into DS – lệnh nạp địa chỉ tác động và nạp địa chỉ
segment vào DS.
LEA: load effective address – lệnh nạp địa chỉ tác động (offset) vào một thanh ghi.
LES: load effective address and segment into DS – lệnh nạp địa chỉ tác động và nạp địa chỉ
segment vào ES.
LSI: large scale integration – mạch tích hợp mạt độ cao
MCU: Micro Controller Unit – bộ vi điều khiển
M/IO: memory/input output – ngõ ra xác định 80286 truyền dữ liệu với bộ nhớ hoặc vào ra.
MOV: move – lệnh chuyển dữ liệu
MRDC; memory read control – tín hiệu đọc độ nhớ cấp từ CPU
MP: monitor coprocessor extension – bit cho biết có đồng xử lý toán học đang hoạt động.
MSI:midium scale integration: mạch tích hợp mật độ vừa.
MUL: multiply – lệnh nhân
MWTC: memory write control – tín hiệu ghi bộ nhớ cấp từ CPU.
NEG: negative – lệnh lấy âm
NT: nested task – cờ nhiệm vụ lồng nhau
OC: output control – ngõ vào điều khiển cho phép ra.
OC: output compare – ngõ ra so sánh
OE: output Enable – tín hiệu nhận yêu cầu đọc của bộ nhớ
OF: overflows flag – cờ tràn
OUT: output – lệnh xuất dữ liệu ra một cổng.
PE: protect mode enable – bit cho phép chế độ bảo vệ
PF: parity flag – cở chẵn lẻ.
PEPAR: port E pin assignment register – thanh ghi gán chân port E
PUSH – lệnh nạp dữ liệu vào ngăn xếp
POP – lệnh lấy dữ liệu ra khỏi ngăn xếp.
PWM: pulse width modulation – điều chế độ rộng xung
246
OP
EN
.P
TIT
.E
DU
.V
N
QOM: queued output match – ngõ ra so sánh hàng đợi
QSM: queue serial module – mô đun nối tiếp hàng đợi
QSPI: queue serial peripheral interface – giao tiếp ngoại vi nối tiếp hàng đợi
RAM: random access memory – bộ nhớ truy cập ngẫu nhiên
RCL: rote carry left – lệnh quay trái qua cớ nhớ
RCL: rote carry right – lệnh quay phải qua cớ nhớ
RD: read – tín hiệu đọc thường là ngõ vào của bộ nhớ hoặc vào ra nhận yếu cầu đọc từ CPU.
ROL: rote leff – lệnh quay trái.
ROM: read only memory – bộ nhớ chỉ đọc.
ROR: rote right – lệnh quay phải
RPL: requested Privelege level – Các bit đặt mức đặc quyển yêu cầu trong con trỏ địa chỉ ảo.
SBB: subtract with borrow – lệnh trừ có mượn.
SF: sign flag – cờ dấu.
SHL: shift left – lệnh dịch trái
SHR: shift right – lệnh dịch phải
SAL: shift arithmetic left – lệnh dịch trái số học
SAR: shift arithmetic right – lệnh dịch phải số học
SI: source index – thanh ghi chỉ số nguồn
SIM : system integrated module – mô đun tích hợp hệ thống của MCU68332.
SIMCR: SIM configue register – thanh ghi cấu hình SIM.
SIMTR: SIM test register – thanh ghi kiểm tra SIM
SRAM : stactic RAM – bộ nhớ RAM tĩnh.
SP: Stack pointer – thanh ghi con trỏ ngăn xếp
SCI: Serial Communication Interface – giao tiếp thông tin nối tiếp.
SPWM: synchronized PWM – PWM đồng bộ.
SR: status register – thanh ghi trạng thái
SS: Stack Segment – thanh ghi đoạn ngăn xếp
SSI: small scale integration – vi mạch tích hợp mạch độ thấp.
SUB: subtract – lệnh trừ.
SYNCR: Clock synthesizer control register – thanh ghi điều khiển tổng hợp clock.
TI: table indicator – bộ chỉ thị bảng sử dụng phân biệt không gian nhớ.
TF: trap flag – cờ bẫy.
TPU: time processor unit – mộ xử lý thời gian.
TS: task set – bit chuyển nhiệm vụ trong thanh ghi trang thái máy
TSM: table step motor – bảng điều khiển động cơ bước
UART: universal asynchronous receicer transmitter – Bộ truyền nhận cận đồng bộ tích hợp.
247
OP
EN
.P
TIT
.E
DU
.V
N
VLSI: very large scale integration – mạch tích hợp mạch độ rất cao
VBR: Vector Base Register – thanh ghi vector cơ sở của MC68332.
WE: write enable – tín hiệu nhận yêu cầu ghi cửa bộ nhớ.
WR: write – tín hiệu ghi thường là ngõ vào của bộ nhớ và vào ra nhận tín hiệu yếu cầu ghi từ
CPU.
XCHG: exchange – lệnh chuyển đổi dữ liệu
XLAT – lệnh nạp giá trị từ bảng dữ liệu vào thanh ghi AL.
ZF: zero flag – cờ Zero.
248
Các file đính kèm theo tài liệu này:
- bg_ktvxl_norestriction_0208.pdf