Giáo trình môn học Kỹ thuật vi xử lý

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ơ.

pdf255 trang | Chia sẻ: nguyenlam99 | Lượt xem: 821 | Lượt tải: 0download
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:

  • pdfbg_ktvxl_norestriction_0208.pdf