Upload
ha-thanh-diep
View
98
Download
1
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