39
ĐẠI HỌC QUỐC GIA TP.HCM TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH BÁO CÁO THÍ NGHIỆM VI XỬ LÝ - VI ĐIỀU KHIỂN Họ và tên: MSSV Nguyễn Đình Dũng 51000529 Hà Thanh Điệp 51000688

báo cáo TN Vi Xử Lí

Embed Size (px)

DESCRIPTION

dfgdfgd

Citation preview

ĐẠI HỌC QUỐC GIA TP.HCM

TRƯỜNG ĐẠI HỌC BÁCH KHOA

KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH

BÁO CÁO THÍ NGHIỆM

VI XỬ LÝ - VI ĐIỀU KHIỂN

Họ và tên: MSSV

Nguyễn Đình Dũng 51000529

Hà Thanh Điệp 51000688

Bài 1 : Giới thiệu MPLAB IDE và KIT PIC1. Các điều kiện cần có để tiến hành thí nghiệm gồm: Kit thí nghiệm ICD2 và PICDEM 2 PLUS.

1. Đế cắm DIP 18, 28 và 40 chân (có thể cắm 3 linh kiện nhưng chỉ dùng 1 mỗi lần).

2. Ổn áp +5V dùng cho nguồn 9V, 100 mA AC/DC hay pin 9V.

3. Đầu cắm DB-9 theo chuẩn giao tiếp RS-232.

4. Đầu cắm qua bộ lập trình In-Circuit Debugger (ICD).

5. Biến trở 5KΩ dùng cho tín hiệu nhập tương tự.

6. Ba nút nhấn dùng tạo tín hiệu kích từ bên ngoài và reset.

7. LED nguồn.

8. Bốn LED chỉ thị cho PORTB.

9. Jumper J6 để ngắt LED chỉ thị RB0 (khi nhập tín hiệu từ nút nhấn RB0).

10. Bộ dao động (OSC) 4 MHz.

11. Nơi để lắp thêm thạch anh dao động nếu cần.

12. Thạch anh dao động 32.768 kHz tạo xung clock cho Timer1.

13. Jumper J7 để ngắt dao động RC có sẳn (khoảng 2 MHz).

14. EEPROM nối tiếp 32K x 8 bit.

15. Màn hình LCD.

16. Kèn Piezo.

17. Vùng lắp thêm linh kiện.

18. Cảm biến nhiệt TC74.

Môi trường phát triển MPLAB:

2. Các bước cần làm để nạp chương trình ra card có chip vi điều khiển:

- Tạo 1 project như hình bên dưới:

-Sau đó, ta có một chương trình cho PIC như sau, bây giờ chúng ta lưu chương trình vừa viết thành BaiTN1.asm vào một thư mục đã tạo project phía trên. Để compile chương trình ta vào menu Project_|Build All như hình bên dưới.

-Nếu việc build thất bại, nhưng việc này thì không mong muốn, ta có kết quả như hình sau:

-Nếu thành công, ta sẽ thấy hình sau:

-Nếu việc build đã thành công, chương trình sẽ dịch BaiTN1.asm thành BaiTN1.hex

trong cùng thư mục chương trình BaiTN1.asm. Sau khi đã có được file hex, công việc

tiếp theo là làm thế nào để nạp được file Hex xuống board. Đầu tiên, chọn mạch nạp bằng

cách vào menu Programmer_|Select Programmer_|Mplab ICD2 như hình sau :

-Sau khi chọn Mplab ICD2 xong thì ta sẽ thấy giao diện như sau:

3. Các bước cần làm để tiến hành debug giả lập trên máy hoặc trên mạch:

-Bước 1. Chọn Debugger bằng menu

Debugger_|Select Debugger_|Mplab SIM

-Bước 2. Tham khảo menu Debugger. Xuất hiện nhiều chức năng hỗ trợ debug.

Từ đây ta đã có thể mô phỏng được chương trình của mình một cách dễ dàng.

Các chức năng thường dùng :

• Run (F9): chạy chương trình, chương trình sẽ chạy liên tục đến khi nào có

breakpoint thì dừng.

• Breakpoints (F2): tạo ra breakpoint tại vị trí hiện tại của con trỏ (cũng có thể

"double click" vào hàng code mình mong muốn đặt Breakpoint).

• Step Into (F7): chạy từng bước, vào trong chương trình con (nếu gặp).

• Step Over (F8): chạy từng bước, gọi chương trình con cũng xem như 1 bước.

• Reset: trở về đầu chương trình.

-Bước 3. Khi debug thì ta cũng cần phải biết giá trị của các thanh ghi cũng như bộ nhớ

của chip như thế nào, để xem được các giá trị này thì chúng ta qua menu View.

Để xem được giá trị của các thanh ghi trong PIC ta chọn menu View_|File registers

sẽ xuất hiện cửa sổ như hình sau:

Để xem được giá trị của các thanh ghi SFR thì ta chọn View_|Special Function

Registers sẽ xuất hiện của sổ như hình sau:

Hay để xem một và thanh ghi mà ta quan tâm thì có thể dùng Watch để xem bằng

cách vào menu View_|Watch thì hình sau sẽ xuất hiện:

Muốn xem thanh ghi nào, ta chỉ việc chọn thanh ghi tương ứng trong combobox bên

trên, sau đó nhấn Add SFR.

Bài tập:Cải tiến chương trình BaiTN1.asm để khi nhấn RA4 sẽ thấy 4 LED từ RB3 đến RB0

sáng như đầu ra một bộ đếm 4 bit nhị phân tăng dần (mỗi lần nhấn tăng 1).

list p=18f4520 #include p18f4520.inc code 0 goto start udataPRG codestart call init

main btfsc PORTA,RA4 bra main incf LATB bra main return init clrf PORTB bcf TRISB,RB0 bcf TRISB,RB1 bcf TRISB,RB2 bcf TRISB,RB3 bsf TRISA,RA4 return end

Bài 2 : Khảo sát cổng xuất nhập1.Để có thể sử dụng cổng giao tiếp song song,ta cần:

2.Giải thích tại sao dùng LATB và PORTB lúc giống nhau, lúc khác nhau.

-PORTB dùng để đọc dữ liệu từ ngoài thiết bị vào hoặc cũng có thể đọc lại dữ liệu đã ghi ra cổng LATB.-LATB dùng để chốt dữ liệu zuất ra PORTB(thường dùng phục vụ cơ chế đọc-sửa-ghi).

3 Tính thời gian chính xác của vòng lặp delay.

Bài tập:1.Viết chương trình để khi nhấn RA4 thì các led sẽ sáng đếm lên, mỗi lần nhấn đếm lên 1 đơn vị.

list p=18f4520#include p18f4520.inccode 0goto startudata

PRG codestart call init

main btfsc PORTA,RA4bra mainincf LATBbra mainreturn

init clrf PORTBbcf TRISB,RB0bcf TRISB,RB1bcf TRISB,RB2bcf TRISB,RB3bsf TRISA,RA4returnend

2. Viết chương trình sao cho mỗi lần nhấn RA4 thì 2 led trái và 2 led phải thay nhau sáng.

list p=18f4520#include p18f4520.inccode 0goto startudata

PRG codestart call init

main btfsc PORTA,RA4bra mainmovlw 0x05movwf PORTB

loopbtfsc PORTA,RA4bra loopmovlw 0x0amovwf PORTBbra mainreturn

init clrf PORTBbcf TRISB,RB0bcf TRISB,RB1bcf TRISB,RB2bcf TRISB,RB3bsf TRISA,RA4returnend

3.Tạo hiệu ứng light river trên 4 led của board mạch starter kit. Nhấn RA4 để thay đổi chiều của light river.

Bài 3 : Khảo sát cơ chế ngắt quãng, giao tiếp LCD ký tự1.Bố cục của chương trình có sử dụng ngắt quãng:

2. Dùng ngắt ngoài đọc trạng thái nút nhấn RA4 có bị rung không ?Làm sao biết để chống rung?

-Dùng ngắt ngoài trạng thái nut nhấn RA4 có rung.vì khi nhấn RA4 thì tạo ra nhiều ngắt lien tục.vì thế để mạch chạy đúng và ổn định cần chống rung phím.

Bài tập:

1. Viết chương trình khởi tạo 2 ngắt:

Ngắt ngoài INT0 (nhận ngắt qua nút nhấn RB0, Jumper JP6 hở) với độ ưu tiên cao. Ngắt timer 0 với độ ưu tiên thấp.

Trong chương trình ngắt ngoài INT0 bật 3 led đơn RB1, RB2, RB3 sáng cùng lúc.

Trong chương trình timer 0 sau 1s khi 3 led được bật ở trong ngắt ngoài thì tắt 3

led đơn RB1, RB2, RB3 cùng lúc.

list p = 18f4520

#include P18f4520.inc

Code 0

goto main

org 08H

goto isr_high

org 18H

goto isr_low

; Vung du lieu

udata

delay res 1

; Vung bat dau code

PRG code

main

call init

call init_timer0

call init_int0

goto $

; Ham khoi dong ban dau

init

clrf LATB ; RB1-RB3 la cong xuat

movlw 0x0F

movwf ADCON1

bsf TRISB,RB0

bcf TRISB,RB1

bcf TRISB,RB2

bcf TRISB,RB3

movlw .10 ; khoi dong bien delay=10

movwf delay

return

; Ham khoi dong timer0

init_timer0

bsf RCON,IPEN ; cho phep uu tien ngat.

bcf INTCON2,TMR0IP ; timer0 uu tien thap

bcf INTCON,TMR0IF ; xoa co ngat timer0

bsf INTCON,TMR0IE ; cho phep ngat timer0

bsf INTCON,GIEH ; cho phep ngat uu tien cao

bsf INTCON,GIEL ; cho phep ngat uu tien thap

clrf T0CON ; prescaler 2:1

movlw HIGH (-50000) ; nap so dem 50000 cho time

movwf TMR0H

movlw LOW (-50000)

movwf TMR0L

bsf T0CON,TMR0ON ; cho phep timer0 dem

return

; Ham khoi dong int0

init_int0

bcf INTCON2,INTEDG0 ; tac dong canh xuong

bcf INTCON,INT0IF ; xoa co ngat

bsf INTCON,INT0IE ; cho phep ngat ngoai IN

return

; Ham xu ly ngat timer0

timer0_isr

bcf INTCON,TMR0IF

decfsz delay,1

bra timer0_isr_1

bcf LATB,RB1

bcf LATB,RB2

bcf LATB,RB3

movlw .10

movwf delay

timer0_isr_1

bcf T0CON,TMR0ON

movlw HIGH (-50000) ; nap lai so dem 50000 cho

movwf TMR0H

movlw LOW (-50000)

movwf TMR0L

bsf T0CON,TMR0ON ; cho phep timer0 dem lai

return

; Ham xu ly ngat int0

int0_isr

bcf INTCON,INT0IF

bsf LATB,RB1

bsf LATB,RB2

bsf LATB,RB3

movlw .10

movwf delay

return

; Ham xu ly ngat uu tien cao

isr_high

call int0_isr

retfie

; Ham xu ly ngat uu tien thap

isr_low

call timer0_isr

retfie

end

2.Viết chương trình hiển thị kí tự lên LCD.

list p = 18f4520

#include P18f4520.inc

#define LCD_D4 LATD, RD0 ; LCD data bits

#define LCD_D5 LATD, RD1

#define LCD_D6 LATD, RD2

#define LCD_D7 LATD, RD3

#define LCD_D4_DIR TRISD, RD0 ; LCD data bits

#define LCD_D5_DIR TRISD, RD1

#define LCD_D6_DIR TRISD, RD2

#define LCD_D7_DIR TRISD, RD3

#define LCD_E LATD, RD6 ; LCD E clock

#define LCD_RW LATD, RD5 ; LCD read/write line

#define LCD_RS LATD, RD4 ; LCD register select line

#define LCD_E_DIR TRISD, RD6

#define LCD_RW_DIR TRISD, RD5

#define LCD_RS_DIR TRISD, RD4

#define LCD_INS 0

#define LCD_DATA 1

LCDWriteNibble

btfss STATUS, C ; Set the register select

bcf LCD_RS

btfsc STATUS, C

bsf LCD_RS

bcf LCD_RW ; Set write mode

bcf LCD_D4_DIR ; Set data bits to outputs

bcf LCD_D5_DIR

bcf LCD_D6_DIR

bcf LCD_D7_DIR

nop ; Small delay

nop

bsf LCD_E ; Setup to clock data

nop

nop

btfss temp_wr, 7 ; Set high nibble

bcf LCD_D7

btfsc temp_wr, 7

bsf LCD_D7

btfss temp_wr, 6

bcf LCD_D6

btfsc temp_wr, 6

bsf LCD_D6

btfss temp_wr, 5

bcf LCD_D5

btfsc temp_wr, 5

bsf LCD_D5

btfss temp_wr, 4

bcf LCD_D4

btfsc temp_wr, 4

bsf LCD_D4

nop ; Small delay

nop

bcf LCD_E ; Send the data

return

LCDWrite_command macro data1

bcf LCD_RS ;write command

movlw data1

movwf temp_wr

call LCDWriteNibble

movlw 0xF

movwf delay

rcall DelayXCycles

endm

LCDWrite_data macro data1

bsf LCD_RS ;write data

movff data1,temp_wr

rcall LCDBusy

bsf STATUS, C

rcall LCDWrite

movlw 0x0F ;Wait ~100µs @ 20 MHz

movwf delay

rcall DelayXCycles

endm

LCDInit1

call init_variable

bsf LATD, RD7

bcf TRISD, RD7

bcf LCD_E_DIR ;configure control lines

bcf LCD_RW_DIR

bcf LCD_RS_DIR

movlw b'00001110'

movwf ADCON1

movlw 0xff ; Wait ~15ms @ 20 MHz

movwf COUNTER

lil11

movlw 0xFF

movwf delay

rcall DelayXCycles

decfsz COUNTER,F

bra lil11

LCDWrite_command 0x20

LCDWrite_command 0x80

LCDWrite_command 0x00

LCDWrite_command 0xf0

LCDWrite_command 0x00

LCDWrite_command 0x10

call LongDelay ;2ms

call LongDelay ;2ms

LCDWrite_command 0x00

LCDWrite_command 0x20

call Lcd_clear

return

Lcd_display

movff INDF0,temp_wr1

movlw .0

cpfseq temp_wr1

goto Lcd_display1

movlw 0x20

movwf temp_wr1

Lcd_display1

LCDWrite_data temp_wr1

incf FSR0L

clrf WREG

addwfc FSR0H, F

movlw .0

cpfseq flag_line

goto Lcd_display_line2

;display line1

incf index_of_lcd

molw MAX_INDEX

cpfseq index_of_lcd

goto Exit_Lcd_display

clrf Index_of_lcd

movlw .1

movwf flag_line

Set_cursor .0,.1

goto Exit_Lcd_display

Lcd_display_line2

incf index_of_lcd

movlw MAX_INDEX

cpfseq index_of_lcd

goto Exit_Lcd_display

clrf Index_of_lcd

movlw .0

movwf flag_line

movlw HIGH Lcd_buffer

movwf FSR0H

movlw LOW Lcd_buffer

movwf FSR0L

Set_cursor .0, .0

Exit_Lcd_display

Return

Bài 4 : Khảo sát bộ định thờia) Giải thích ý nghĩa công thức tính thời gian của Timer. Nếu dùng prescaler 16:1 thì

cần chỉnh các thông số nào trong bài thí nghiệm để thời gian không đổi.

thời gian của timer = 1/(FOSC /4)*prescaler

Trong đó:

-FOSC : tần số xung clock ngoài ( = 4MHz).

-prescaler:giá trị của thanh ghi T0CON

T0CON=0x00 prescaler=2

T0CON=0x05 prescaler=4

b) Tại sao phải dùng số đếm âm (-50000)?

Vì cờ ngắt quãng được set khi đếm tràn từ FFFF sang 0000 nên muốn đếm 50000 thì phải thiết lập cho thanh ghi TMR0H và TMR0L là FFFF – 50000 nên số đếm âm

c) Xác định thời gian chính xác khi dùng ngắt thời gian trong bài thí nghiệm.

Thời gian chính xác: 10ms+(2+1+2+2+1+1+1+2+1+1+1+1+1)*1µs = 1.017ms

Bài tập:1. Sử dụng bộ timer0 cứ sau 1s đếm lên 1 đơn vị rồi xuất giá trị ra led đơn.

list p = 18f4520

#include p18f4520.inc

code 0

goto main

org 0x000008 ; vector ngat uu tien cao

goto isr_high

org 0x000018 ; vector ngat uu tien thap

goto isr_low

udata

delay res 1

PRG code

main

call init

call init_timer0

goto $

init

clrf PORTB ; toan bo PORTB la cong xuat

clrf TRISB

return

init_timer0

bsf RCON,IPEN ; cho phep uu tien ngat.

bcf INTCON2,TMR0IP ; timer0 uu tien thap

bcf INTCON,TMR0IF ; xoa co ngat timer0

bsf INTCON,TMR0IE ; cho phep ngat timer0

bsf INTCON,GIEH ; cho phep ngat uu tien cao

bsf INTCON,GIEL ; cho phep ngat uu tien thap

clrf T0CON ; prescaler 2:1

movlw HIGH (-50000) ; nap so dem 50000 cho timer0

movwf TMR0H

movlw LOW (-50000)

movwf TMR0L

bsf T0CON,TMR0ON ; cho phep timer0 dem

return

isr_high ; khong lam gi ca

retfie

isr_low

call timer0_isr

retfie

timer0_isr

bcf INTCON,TMR0IF

decfsz delay,1

bra timer0_isr_1

incf LATB

movlw .10

movwf delay

timer0_isr_1

bcf T0CON,TMR0ON

movlw HIGH (-50000) ; nap lai so dem 50000 cho timer0

movwf TMR0H

movlw LOW (-50000)

movwf TMR0L

bsf T0CON,TMR0ON ; cho phep timer0 dem lai

return

end

2.Dùng bộ định thời tạo xung vuông chu kì 10ms, duty cycle 30%.

list p=18f4520

#include P18f4520.inc

code 0

goto main

udata

delay res 1

PRG code

main

call init

call init_timer0

goto $

isr_high

bcf INTCON,TMR0IF

bra isr_low

bcf LATB

movlw .3500

retfie

isr_low

bcf T0CON,TMR0IF

bsf LATB

movlw .1500

retfie

init_timer0

clrf PORTB

clrf TRISB

Bài 5 : Kỹ thuật quét ma trận phím

Khái niệmMa trận phím là cách kết nối các phím theo hàng và cột. Cách kết nối như vậy sẽ tiết kiệm được tài nguyên của vi điều khiển. Ví dụ dưới đây là cách mắc ma trận phím 4x4 :

Ta có 16 phím và 8 tín hiệu điều khiển. Nếu mắc 16 phím này như các phím đơn, ta phải cần đến 16 tín hiệu điều khiển.

Giải mã ma trận phímTa xét 1 ma trận phím 2x2 như hình dưới đây:

Khi phím A được nhấn thì điện áp tại C1 sẽ bằng R1. Như vậy nếu ban đầu tại C1 và C2 là mức cao, R1 là mức thấp và R2 là mức cao, thì khi phím A được nhấn, điện áp tại C1 (ban đầu là mức cao) sẽ bị kéo xuống mức thấp.

Tương tự nếu phím B được nhấn thì C2 sẽ bị kéo xuống mức thấp.Để xác định 2 phím C và D có được nhấn hay không, ta sẽ nâng điện áp tại R1 lên mức cao, kéo điện áp tại R2 lên mức cao (chuyển hàng tích cực).

Như vậy, để xác định vị trí của phím nào được nhấn, ta sẽ duyệt qua tất cả các hàng và xét các phím hàng đó. Quy ước tín hiện DEACTIVE là mức 1 và tín hiện ACTIVE là mức 0, từng bước giải mã ma trận phím như sau:

Cho tín hiệu các cột là DEACTIVE Cài đặt tín hiện tại các cột là INPUT Cho tín hiện các hàng là DEACTIVE Cài đặt tín hiệu các hàng là OUTPUT Lặp qua các hàng

o Cho tín hiệu hàng đang xét là ACTIVE.o Xét các cột trong hàng đang cho ACTIVE, cột nào có tín hiệu ACTIVE là phím

tương ứng được nhấn. Kết thúc vòng lặp

Bài 6 : Kỹ thuật quét LED1.Viết chương trình cho phép hiển thị ra led ma trận.

list p=18f4520#include p18f4520.inccode 0goto mainorg 08H goto isr_high org 18H goto isr_lowudata

delay res 1index res 1red_buffer res 8green_buffer res 8

row_buffer res 8PRG code#define red_data LATD#define green_data LATC#define row LATB

main call init_IO movlw 0x3C movwf red_data movlw 0x33 movwf green_data movlw 0x80; movwf row call init_timer0 goto $init_IO clrf PORTD clrf TRISD clrf PORTC clrf TRISC clrf PORTB clrf TRISB movlw 0x80 movwf red_buffer movwf green_buffer movwf row_buffer movlw 0x40 movwf red_buffer+1 movwf green_buffer+1 movwf row_buffer+1 movlw 0x20 movwf red_buffer+2 movwf green_buffer+2 movwf row_buffer+2 movlw 0x10 movwf red_buffer+3 movwf green_buffer+3 movwf row_buffer+3 movlw 0x08 movwf red_buffer+4 movwf green_buffer+4 movwf row_buffer+4 movlw 0x04 movwf red_buffer+5 movwf green_buffer+5 movwf row_buffer+5

movlw 0x02 movwf red_buffer+6 movwf green_buffer+6 movwf row_buffer+6 movlw 0x01 movwf red_buffer+7 movwf green_buffer+7 movwf row_buffer+7 return

init_timer0 bsf RCON,IPEN bcf INTCON2,TMR0IP bcf INTCON,TMR0IF bsf INTCON,TMR0IE bsf INTCON,GIEH bsf INTCON,GIEL clrf T0CON movlw HIGH(-.5000) movwf TMR0H movlw LOW(-.5000) movwf TMR0L bsf T0CON,TMR0ON return

timer0_isr bcf INTCON,TMR0IF decfsz delay,1 bra timer0_isr_1 movlw .10 movwf delay

movf index,w lfsr FSR0,red_buffer movff PLUSW0, red_data lfsr FSR0,green_buffer movff PLUSW0, green_data lfsr FSR0,row_buffer movff PLUSW0, row incf index movlw .8 cpfslt index clrf index

timer0_isr_1 bcf T0CON,TMR0ON

movlw HIGH(-.5000) movwf TMR0H movlw LOW(-.5000) movwf TMR0L bsf T0CON,TMR0ON return

int0_isr bcf INTCON,INT0IF movlw .10 movwf delay return

isr_high call int0_isr retfie

isr_low call timer0_isr retfie

end

Bài 7 : Khảo sát bộ truyền nhận nối tiếpViết chương trình giao tiếp giữa máy tính và vi điều khiển PIC.

list p=18f4520 #include p18f4520.inc code 0 org 00000h goto main udata dem res 1 delay res 1 PRG code

main rcall INIT_PORT rcall INIT_UART movlw 5h movwf dem

main1 movf dem , W

movwf LATB movwf TXREG main2 btfss PIR1,TXIF bra main2 btfsc PORTA,RA4 bra main4

main3 btfss PORTA,RA4 bra main3 incf dem bra main1

main4 movlw .200 movwf delay main5 decfsz delay bra main5 bra main1 INIT_PORT clrf LATB clrf TRISB bsf TRISA,RA4 bcf TRISC,6 bsf TRISC,7 RETURN

INIT_UART movlw 19h movwf SPBRG bsf TXSTA,TXEN bsf TXSTA,BRGH bsf RCSTA,SPEN bsf RCSTA,CREN bcf PIR1,RCIF bsf PIE1,RCIE bsf INTCON,PEIE bsf INTCON,GIE RETURN

end

Bài 8 : Khảo sát khối chuyển đổi A-DBài tập:

Viết chương trình đọc và hiển thị giá trị điện áp thay đổi bởi biến trở.

list p=18f4520#include P18F4520.inccode 0org 0x0000goto startudata

PRG codestart call init_portB call init_ADloop_2 call update_adc bra loop_2

init_portB clrf PORTB clrf TRISB return

init_AD movlw B'00000100' movwf ADCON1 movlw B'11000101' ; choose AD1, nap B'11000001' movwf ADCON0 movlw 0x01 movwf ADCON2 call setupdelay bsf ADCON0,GO return

setupdelay movlw .5loop decfsz WREG bra loop return

update_adc bsf ADCON0,GOloop_3 btfsc ADCON0,GO bra loop_3 movf ADRESH,W ; thanh ghi ADRESH chi duoc read swapf WREG

movwf LATB returnend

Bài 9 : Khảo sát các khối chức năng đặc biệt khác

Bài tập:1.Sử dụng PWM tạo xung. Tính period và dultycycle.

list p=18f4520 #include p18f4520.inc org 0x000000 ; reset vector bra START START call Init_pwm goto $ Init_pwm

bcf TRISC,2 movlw .249

movwf PR2 ;initialize PWM period movlw .125 ;initialize PWM duty cycle movwf CCPR1L bcf CCP1CON,CCP1X bcf CCP1CON,CCP1Y ;postscale 1:1, prescaler 4, Timer2 ON movlw 0x05 movwf T2CON movlw 0x0F ;turn buzzer on movwf CCP1CON return

end

Ta có:Period=(PR2+1)*4*TOSC*prescaler=(249+1)*4*1/(4*106)*4=10-3

Dultycycle=(CCPR1L:CCP1CON[5:4])*TOSC* prescaler =((111110100)2)* 1/(4*106)*4=5*10-4

2.Tạo xung dùng PWM:a)

list p=18f4520 #include p18f4520.inc org 0x000000 ; reset vector bra START START call Init_pwm goto $ Init_pwm

bcf TRISC,2 movlw .174

movwf PR2 ;initialize PWM period movlw .75 ;initialize PWM duty cycle movwf CCPR1L bcf CCP1CON,CCP1X bcf CCP1CON,CCP1Y ;postscale 1:1, prescaler 4, Timer2 ON movlw 0x05 movwf T2CON movlw 0x0C ;turn buzzer on movwf CCP1CON return

endb)

list p=18f4520 #include p18f4520.inc org 0x000000 ; reset vector bra START START

call Init_pwm goto $ Init_pwm

bcf TRISC,2 movlw .13

movwf PR2 ;initialize PWM period movlw .17 ;initialize PWM duty cycle movwf CCPR1L bcf CCP1CON,CCP1X bcf CCP1CON,CCP1Y ;postscale 1:1, prescaler 4, Timer2 ON movlw 0x07 movwf T2CON movlw 0x3C ;turn buzzer on movwf CCP1CON return

end