Chapter7 Timer&ADC GT V2q

50 229 3
Chapter7 Timer&ADC GT V2q

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Chapter7 Timer&ADC GT V2q tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn về tất cả các lĩnh vực ki...

Chương 7: định thời/bộ đếm, ADC, so sánh CHƯƠNG 7: BỘ ĐỊNH THỜI/BỘ ĐẾM, BỘ BIẾN ĐỔI TƯƠNG TỰ SANG SỐ, BỘ SO SÁNH Mục tiêu chương người tham khảo:  Hiểu rõ cấu trúc hoạt động định thời/bộ đếm  Hiểu rõ cấu trúc hoạt động chuyển đổi tương tự sang số  Hiểu rõ cấu trúc hoạt động so sánh  Thiết kế lập trình ứng dụng dùng định thời  Thiết kế lập trình ứng dụng dùng đếm  Thiết kế lập trình ứng dụng dùng chuyển đổi tương tự sang số 7.1 TIMER0 Khối Timer0 tích hợp tính sau: − Lựa chọn chế độ hoạt động phần mềm: timer hay counter, chế độ 8-bit hay 16-bit − Có ghi đọc ghi − Bộ chia trước tần số (prescaler) 8-bit dành riêng lập trình phần mềm − Có thể chọn nguồn xung clock (clock nội hay ngoại) − Có thể chọn sườn kích cho nguồn xung clock ngoại − Có hoạt động ngắt tràn Hầu hết định thời PIC18 có độ rộng 16-bit Vì PIC18 có kiến trúc 8-bit, định thời 8-bit truy xuất hai ghi riêng gồm byte thấp (TMRxL) byte cao (TMRxH), chẳng hạn hình 7.1 Hình 7.1: ghi TMR0 7.1.1 Thanh ghi điều khiển TIMER0 (T0CON) Hình 7.2: ghi T0CON 223 Chương 7: định thời/bộ đếm, ADC, so sánh Ghi chú: R: bit cho phép đọc W: bit cho phép ghi U: bit không sử dụng, xem bit ‘0’ ‘0’: bit xóa ‘1’: bit set x: bit không xác định trạng thái Bit – TMR0ON: bit điều khiển Timer0 On/Off = Enable Timer0 = Stop Timer0 Bit – T08BIT: bit điều khiển Timer0 timer 8-bit/16-bit = Timer0 cấu hình chế độ timer/counter 8-bit = Timer0 cấu hình chế độ timer/counter 16-bit Bit – T0CS: bit chọn nguồn xung Timer0 = Theo chuyển trạng thái chân T0CKI = Theo chu kỳ xung clock nội (CLKO) Bit – T0SE: bit chọn sườn kích cho Timer0 = Timer tăng chân T0CKI chuyển từ high xuống low = Timer tăng chân T0CKI chuyển từ low lên high Bit – PSA: bit thiết lập cho prescaler Timer0 = Prescaler Timer0 không gán, ngõ vào clock Timer0 bỏ qua prescaler = Prescaler Timer0 gán, ngõ vào clock Timer0 cấp từ ngõ prescaler Bit 2-0 – T0PS2:T0PS0: bit chọn prescaler Timer0 111 = 1:256 giá trị prescaler 110 = 1:128 giá trị prescaler 101 = 1:64 giá trị prescaler 100 = 1:32 giá trị prescaler 011 = 1:16 giá trị prescaler 010 = 1:8 224 giá trị prescaler Chương 7: định thời/bộ đếm, ADC, so sánh 001 = 1:4 giá trị prescaler 000 = 1:2 giá trị prescaler Ví dụ 7.1: xác định giá trị T0CON muốn lập trình Timer0 chế độ 16-bit, khơng dùng prescaler PIC18 có dao động FOSC/4 để tạo nguồn xung clock, gia tăng theo cạnh lên xung Giải pháp: Đặt ghi T0CON sau : T0CON = 0b00001000; //TMR0 : 16-bit, FOSC/4, no prescaler Timer0 off Ví dụ 7.2: tính tần số xung định thời chu kỳ PIC18 sử dụng thạch anh sau Giả sử không sử dụng prescaler (a) 10 MHz (b) 16 MHz (c) MHz Giải pháp: (a) (1/4) x 10 MHz = 2.5 MHz , T = 1/(2.5 MHz) = 0.4 µs (b) (1/4) x 16 MHz = MHz , T = 1/(4 MHz) = 0.25 µs (c) (1/4) x MHz = MHz , T = 1/(1 MHz) = µs 7.1.2 Hoạt động TIMER0 Timer0 hoạt động timer counter, chế độ hoạt động chọn cách xoá bit T0CS (T0CON) Ở chế độ timer, Timer0 mặc định tăng lên sau chu kỳ xung clock giá trị prescaler không chọn Nếu ghi TMR0 ghi, hoạt động Timer0 bị cấm chu kỳ lệnh Chế độ counter chọn cách set bit T0CS (T0CS = 1) chế độ này, Timer0 tăng theo trạng thái sườn lên sườn xuống chân RA4/T0CKI Sườn kích cho hoạt động counter xác định thông qua bit T0SE (T0CON) Xung clock ngoại sử dụng để điều khiển Timer0, nhiên bắt buộc phải tương thích với số điều kiện để đảm bảo nguồn xung clock đồng với pha xung clock nội (TOSC) Ln có khoảng thời gian delay trình đồng nguồn xung lúc timer/counter bắt đầu hoạt động 7.1.3 Đọc ghi Timer0 chế độ 16-bit TMR0H byte cao thực lưu giá trị Time0 chế độ 16-bit, xem đệm byte cao thực Timer0 đọc hay ghi cách trực tiếp Nội dung TMR0H cập nhật từ nội dung byte cao Timer0 225 Chương 7: định thời/bộ đếm, ADC, so sánh suốt trình đọc ghi TMR0L Điều cho phép đọc tất 16 bit Timer0 mà kiểm tra xem đọc byte thấp byte cao hay không Tương tự cho trình ghi vào byte cao Timer0 phải thực thông qua ghi đệm TMR0H Byte cao thực Timer0 cập nhật nội dung TMR0H ghi TMR0L ghi Điều cho phép 16 bit Timer0 cập nhật Hình 7.3: sơ đồ khối Timer0 (chế độ 8-bit) Hình 7.4: sơ đồ khối Timer0 (chế độ 16-bit) Ví dụ 7.3: chương trình sau, tạo sóng vng RB.5 Timer0 sử dụng để tạo delay (time delay) Giải pháp: HERE 226 bcf TRISB, ; RB.5 as an output movlw 0x08 movwf T0CON ; Load T0CON movlw 0xFF movwf TMR0H ; ; Timer0, 16-bit, int clock, no prescaler ; TMR0H = 0xFF Chương 7: định thời/bộ đếm, ADC, so sánh AGAIN movlw 0xF2 ; TMR0L = 0xF2 movwf TMR0L ; bcf INTCON, TMR0IF; Xoá TMR0 interrupt flag bit btg PORTB, bsf T0CON, TMR0ON; Start TMR0 btfss INTCON, TMR0IF; Monitor TMR0 flag until bra AGAIN bcf T0CON, TMR0ON; Stop TMR0 bra HERE ; Toggle PB5 ; it rolls over Giải thích trình tự thực chương trình:  T0CON nạp  0xFFF2 nạp vào TMR0H-TMR0L  Cờ ngắt Timer0 xoá lệnh “bcf INTCON, TMR0IF”  PORTB.5 chốt  Timer0 bắt đầu hoạt động lệnh “bsf T0CON, TMR0ON”  Timer0 đếm lên theo xung clock Bộ định thời đếm lên từ 0xFFF2 …0xFFFF Thêm xung giá trị ghi Timer0 0x0000 làm bit cờ TMR0IF = Tại thời điểm này, lệnh “btfss INTCON, TMR0IF” bỏ qua lệnh “bra AGAIN”  Timer0 dừng lại lệnh “bcf T0CON, TMR0ON”, trình lập lại 0xFFF2 0xFFF3 0xFFF4 0xFFFF 0x0000 TMR0IF = TMR0IF = TMR0IF = TMR0IF = TMR0IF = Hình 7.5: trạng thái bit cờ TMR0IF ví dụ 7.3 Ví dụ 7.4: ví dụ 7.3, tính thời gian delay timer Giả sử dùng XTAL = 10 MHz Giải pháp: Timer hoạt động có tần số xung clock fCK = fOSC/4 = 2.5 MHz  TCK = 0.4 µs Mặt khác, Timer0 đếm lên 0.4 µs tạo độ trễ: delay = (số lần đếm) x 0.4 µs = [(FFFFH – FFF2H) + 1] x 0.4 = 5.6 µs thời gian delay phân nửa xung Thời gian toàn delay tạo định thời Tdelay = x 5.6 = 11.2 µs Ví dụ 7.5: tính tần số sóng vng phát chân RB.5 227 Chương 7: định thời/bộ đếm, ADC, so sánh Giải pháp: Để nhận điều chỉnh thời gian xác hơn, ta cần thêm vào chu kỳ lệnh nhờ lệnh vòng bcf TRISB, movlw 0x08 movwf T0CON bcf INTCON, TMR0IF HERE movlw 0xFF movwf TMR0H movlw -D’48’ movwf TMT0L call DELAY btg PORTB, bra HERE ;====> delay using Timer0 DELAY bsf T0CON, TMR0ON AGAIN btfss T0CON, TMR0IF bra AGAIN bcf T0CON, TMR0ON bcf INTCON, TMR0IF return Chu kỳ sóng vng: T = x (48 + 13) x 0.4 µs = 48.8 µs  F = 20.491 kHz Ví dụ 7.6: tìm giá trị delay tạo Timer0 đoạn mã sau Sử dụng XTAL = 10 MHz không sử dụng prescaler 228 bcf TRISB,5 ; RB5 as output movlw 0x80 ; TMR0, 16-b, int clk, no prescale movwf T0CON bcf INTCON, TMR0IF; Xoá TMR0 interrupt Chương 7: định thời/bộ đếm, ADC, so sánh HERE movlw 0xB8 movwf TMR0H movlw 0x3E movwf TMR0L bsf T0CON, TMR0ON; Start TMR0 AGAIN btfss ; TMR0H = 0xB8 ; TMR0L = 0x3E INTCON, TMR0IF; Monitor TMR0 flag until bra AGAIN ; it rolls over bcf T0CON, TMR0ON; Stop TMR0 bcf INTCON, TMR0IF; Xoá TMR0 flag btg PORTB, ; Toggle PB5 bra HERE ; Endless loop Giải pháp: (0xFFFF – 0xB83E + 1) = 0x47C2 = 18,370 Timer0 tạo thời gian delay = 18,370 x 0.4 µs = 7.348 ms Ví dụ 7.7: tính tần số sóng vng tạo đoạn chương trình sau biết XTAL = 10 MHz Lưu ý, tính lệnh bên vòng START HERE include org 0x00 goto START bcf TRISB, movlw 0x08 movwf T0CON movlw 0x76 movwf TMR0H movlw 0x34 movwf TMR0L bcf INTCON,TMR0IF; Xoá interrupt flag call DELAY btg PORTB,5 ; Toggle PB5 bra HERE ; Load TH & TL again ; TMR0H = 0x76 ; TMR0L = 0x34 229 Chương 7: định thời/bộ đếm, ADC, so sánh ;===> delay using Timer0 DELAY bsf T0CON,TMR0ON; Start TMR0 AGAIN btfss INTCON,TMR0IF ; Monitor TMR0 flag until bra AGAIN ; it rolls over bcf T0CON,TMR0ON ; Stop TMR0 return Giải pháp: Vì (0xFFFF – 0x7634 + 1) = 0x89CC = 35,276 xung clock  tdelay = 35,276 x 0.4 = 14.11 ms  F = 1/(14.11 ms x 2) = 35.434 Hz Cách tìm giá trị nạp vào timer Giả sử biết giá trị thực độ delay cho timer mà cần Để tính toán giá trị nạp vào ghi TMR0L TMR0H, giả sử dùng XTAL = 10 MHz cho họ PIC18 không sử dụng prescale, làm theo trình tự bước sau: (1) Chia độ trễ thời gian mong muốn cho 0.4 µs (2) Thực (65536 – n), với n giá trị thập phân bước (3) Chuyển đổi kết bước sang giá trị hex 0xhhll, 0xhhll giá trị ban đầu phải nạp vào cho ghi timer (4) Đặt TMR0L = 0xll TMR0H = 0xhh Các bước lập trình cho Timer0 hoạt động chế độ 8-bit Trình tự thực theo bước sau: (1) Cấu hình ghi T0CON để định Timer0 hoạt động 8-bit (2) Nạp giá trị đếm ban đầu cho ghi TMR0L (3) Bắt đầu đếm timer (4) Kiểm tra cờ TMR0IF, báo tràn TMR0IF = (5) Ngừng đếm timer lệnh “bcf T0CON, TMR0ON” (6) Xố bit cờ TMR0IF (7) Lập lại vòng lặp từ bước để nạp lại giá trị cho TMR0L 230 Chương 7: định thời/bộ đếm, ADC, so sánh 7.1.4 Lập trình đếm Bit TOCS ghi T0CON Bit TOCS định nguồn cấp xung clock cho timer Nếu TOCS = 0, timer lấy xung từ dao động thạch anh gắn vào hai chân OSC1 OSC2 (FOSC/4) Ngược lại, TOCS = 1, timer sử dụng đếm nhận xung từ bên ngồi PIC18 cung cấp Vì thế, TOCS = 1, đếm thực đếm lên theo xung nhận từ chân RA4 (chân thứ PIC18) Chân T0CKI (Timer0 Clock Input) Tương tự Timer1, chân nhận xung RC0 (chân thứ 15 PIC18) Ví dụ 7.8: xác định giá trị cho ghi T0CON để Timer0 hoạt động đếm 8-bit, không dùng prescaler Sử dụng nguồn clock đếm lên theo cạnh lên xung Giải pháp: T0CON = 0110 1000 Ví dụ 7.9: từ hình 7.6, viết chương trình để Conuter0 8-bit đếm xung hiển thị trạng thái đếm TMR0L LED PORTB Hình 7.6: sơ đồ kết nối ví dụ 7.9 Giải pháp: HERE bsf TRISA, RA4 ; RA4 as an input for clock clrf TRISB ; PORB as an output movlw 0x68 movwf T0CON ; Load to T0CON movlw 0x00 ; movwf TMR0L ; TMR0L = 0x00 bcf INTCON,TMR0IF ; Cleat flag bit bsf T0CON,TMR0ON ; Start TMR0 AGAIN movff ; TMR0, 8-bit, ext clk, no prescaler TMR0L, PORTB ; Display the count on PORTB btfss INTCON, TMR0IF; Monitor flag bit until bra AGAIN bcf T0CON, TMR0ON; Stop TMR0 ; it rolls over 231 Chương 7: định thời/bộ đếm, ADC, so sánh goto HERE end 7.1.5 Bộ ấn định hệ số chia Prescaler Prescaler đếm counter 8-bit nằm khối Timer0, khơng thể ghi đọc cách trực tiếp, giá trị prescaler thiết lập bit PSA T0PS2:T0PS0 (T0CON), bit có chức xác định giá trị gán cho prescaler tỷ số chia đếm Xóa bit PSA gán giá trị prescaler đến khối Timer0, giá trị prescaler chọn tăng theo hệ số với tỷ lệ 1:2 đến 1:256 Khi đó, tất lệnh thực hoạt động ghi vào ghi TMR0 (CLRF TMR0, MOVWF, MR0, BSF TMR0…) xóa giá trị đếm prescaler, nhiên khơng làm thay đổi giá trị gán trước cho prescaler 7.1.6 Ngắt Timer0 Ngắt TMR0 xảy ghi TMR0 bị tràn từ giá trị FFh 00h chế độ 8-bit, từ FFFFh tới 0000h chế độ 16-bit Khi có tràn Timer0, bit cờ TMR0IF set Ngắt Timer0 vơ hiệu cách xố bit TMR0IE (INTCON) Trước cho phép ngắt Timer0 trở lại, bit cờ TMR0IF phải xoá phần mềm Bởi Timer0 bị tắt chế độ Sleep, ngắt TMR0 khơng thể làm cho vi xử lý hoạt động trở lại từ trạng thái Sleep Bảng 7.1: ghi có liên kết với Timer0 Tên TMR0L TMR0H INTCON T0CON TRISA Bit Bit Bit Thanh ghi byte thấp TMR0 Thanh ghi byte cao TMR0 GIE/GIEH PEIE/GIEL TMR0IE TMR0ON T08BIT T0CS TRISA6(1) TRISA5 - Bit Bit Bit Bit Bit INT0IE T0SE TRISA4 RBIE PSA TRISA3 TMR0IF T0PS2 TRISA2 INT0IF T0PS1 TRISA1 RBIF T0PS0 TRISA0 Chú thích: “-”: không sử dụng, đọc 0; ô tô xám không sử dụng cho Timer0 (1) RA6 cấu hình làm chân port kiểu dao động sơ cấp Khi chân port bị vô hiệu, tất bit liên kết đọc 7.2 TIMER1 Khối Timer1 (timer/counter) tích hợp tính sau: − Lựa chọn chế độ hoạt động phần mềm: timer 16-bit hay counter 16-bit − Có ghi 8-bit đọc ghi (TMR1H TMR1L) − Có thể chọn nguồn xung clock (clock nội hay ngoại) với tùy chọn: xung clock VĐK dao động nội Timer1 − Có hoạt động ngắt tràn 232 Chương 7: định thời/bộ đếm, ADC, so sánh ghi lại trạng thái ban đầu, điều buộc khối AD ngưng hoạt động chuyển đổi diễn chấm dứt Các ghi ADRESH ADRESL chứa đựng kết chuyển đổi AD Khi chuyển đổi AD hoàn tất, kết nạp vào cặp ghi ADRESH: ADRESL, lúc ̅̅̅̅̅̅̅̅̅ xoá bit cờ ngát AD ADIF định để thông báo chuyển đổi bit GO/𝑫𝑶𝑵𝑬 AD hoàn tất Lưu ý, sau tác động POR, nội dung ADRESH: ADRESL có giá trị khơng xác định Sơ đồ khối AD minh hoạ hình 7.24 Hình 7.24: sơ đồ khối AD Các bước thiết lập chuyển đổi AD sau: (1) Cấu hình khối AD:  Định cấu hình chân tương tự, điện chuẩn vào/ra số (ADCON1)  Chọn kênh ngõ vào AD (ADCON0)  Chọn thời gian nhận cho AD (ADCON2)  Chọn xung clock chuyển đổi AD (ADCON2) 258 Chương 7: định thời/bộ đếm, ADC, so sánh  Cho phép khối AD hoạt động (ADCON0) (2) Cấu hình ngắt AD (nếu cần):  Xoá bit cờ ADIF  Đặt bit ADIE  Đặt bit GIE (3) Chờ thời gian nhận quy định (nếu yêu cầu) (4) Bắt đầu chuyển đổi: ̅̅̅̅̅̅̅̅̅ (ADCON0)  Đặt bit GO/𝑫𝑶𝑵𝑬 (5) Chờ chuyển đổi AD hoàn tất, một hai cách sau: ̅̅̅̅̅̅̅̅ xố  Hoặc thăm dò bit GO/𝐷𝑂𝑁𝐸  Hoặc chờ ngắt AD (6) Đọc giá trị kết biến đổi ADRESH:ADRESL; xoá bit ADIF yêu cầu (7) Để thực chuyển đổi kế tiếp, quay lại thực bước (1) (2) Thời gian chuyển đổi AD bit định nghĩa TAD Một khoảng thời gian chờ tối thiểu quy định 3.TAD trước bắt đầu lần chuyển đổi Hình 7.25: chuyển đổi mức AD 259 Chương 7: định thời/bộ đếm, ADC, so sánh Các u cầu thu nhận AD Hình 7.26: mơ hình ngõ vào tương tự Bảng 7.11: tần số biến đổi AD Nguồn xung clock AD (TAD) Tần số lớn Hoạt động ADCS2:ADCS0 2.TOSC 000 2.86 MHz 4.TOSC 100 5.71 MHz 8.TOSC 001 11.43 MHz 16.TOSC 101 22.86 MHz 32.TOSC 010 45.71 MHz 64.TOSC 110 48.0 MHz (2) RC x11 1.00 MHz(1) Chú thích: (1) Nguồn RC có thời TAD điển hình ms (2) Các tần số MHz VĐK phải chế độ Sleep tồn q trình chuyển đổi độ xác AD khơng Hình 7.27: chu kỳ TAD chuyển đổi AD (ACQT = 000, TACQ = 0) 260 Chương 7: định thời/bộ đếm, ADC, so sánh Hình 7.28: chu kỳ TAD chuyển đổi AD (ACQT = 010, TACQ = 4TAD) Bảng 7.12: ghi liên kết với hoạt động AD Tên INTCON PIR1 PIE1 IPR1 PIR2 PIE2 IPR2 ADRESH ADRESL ADCON0 ADCON1 ADCON2 PORTA TRISA PORTB TRISB LATB PORTE TRISE(4) LATE(4) Bit Bit Bit Bit GIE/GIEH PEIE/GIEL TMR0IE INT0IE SPPIF(4) ADIF RCIF TXIF SPPIE(4) ADIE RCIE TXIE SPPIP(4) ADIP RCIP TXIP OSCFIF CMIF USBIF EEIF OSCFIE CMIE USBIE EEIE OSCFIP CMIP USBIP EEIP Byte cao ghi kết chuyển đổi A/D Byte thấp ghi kết chuyển đổi A/D CHS3 CHS2 VCFG1 VCFG0 ADFM ACQT2 ACQT1 RA6(2) RA5 RA4 TRISA6(2) TRISA5 TRISA4 RB7 RB6 RB5 RB4 TRISB7 TRISB6 TRISB5 TRISB4 LATB7 LATB6 LATB5 LATB4 RDPU(4) - Bit RBIE SSPIF SSPIE SSPIP BCLIF BCLIE BCLIP Bit TMR0IF CCP1IF CCP1IE CCP1IP HLVDIF HLVDIE HLVDIP Bit INT0IF TMR2IF TMR2IE TMR2IP TMR3IF TMR3IE TMR3IP Bit RBIF TMR1IF TMR1IE TMR1IP CCP2IF CCP2IE CCP2IP CHS1 PCFG3 ACQT0 RA3 TRISA3 RB3 TRISB3 LATB3 RE3(1,3) - CHS0 PCFG2 ADCS2 RA2 TRISA2 RB2 TRISB2 LATB2 RE2(4) TRISE2 LATE2 ̅̅̅̅̅̅̅̅ GO/DONE ADON PCFG0 ADCS0 RA0 TRISA0 RB0 TRISB0 LATB0 RE0(4) TRISE0 LATE0 PCFG1 ADCS1 RA1 TRISA1 RB1 TRISB1 LATB1 RE1(4) TRISE1 LATE1 Chú thích: “-”: khơng sử dụng, đọc 0; tô xám không sử dụng cho chuyển đổi A/D (1) Chỉ thực chức xoá chủ bị vô hiệu (bit MCLRE = 0) (2) Các bit RA6 bit LAT với TRIS liên kết cho phép chân I/O theo cấu hình dao động; ngược lại, bit đọc (3) Bit RE3 sẵn sàng chân ngõ vào bit MCLRE = (4) Các ghi và/hoặc bit không sử dụng với VĐK 28 chân 7.7 KHỐI SO SÁNH Khối so sánh tương tự gồm có hai so sánh cấu hình theo nhiều cách Các ngõ vào chọn từ ngõ vào tương tự chân từ RA0 đến RA5 Thanh ghi CMCON (Comparator Control) hình 7.29 sử dụng để chọn cấu hình ngõ vào ngõ so sánh 261 Chương 7: định thời/bộ đếm, ADC, so sánh Hình 7.29: ghi CMCON Bit – C2OUT: bit ngõ so sánh Khi C2INV = 0: = C2 Vin+ > C2 Vin0 = C2 Vin+ < C2 VinKhi C2INV = 1: = C2 Vin+ < C2 Vin0 = C2 Vin+ > C2 VinBit – C1OUT: bit ngõ so sánh Khi C1INV = 0: = C1 Vin+ > C1 Vin0 = C1 Vin+ < C1 VinKhi C1INV = 1: = C1 Vin+ < C1 Vin0 = C1 Vin+ > C1 VinBit – C2INV: bit cho phép đảo ngược ngõ so sánh = Ngõ C2 đảo ngược = Ngõ C2 không đảo ngược Bit – C1INV: bit cho phép đảo ngược ngõ so sánh 1 = Ngõ C1 đảo ngược = Ngõ C1 không đảo ngược Bit – CIS: bit chuyển mạch ngõ vào so sánh Khi CM2:CM0 = 110: = C1 Vin- kết nối tới RA3/AN3/Vref+ C2 Vin- kết nối tới RA2/AN2/Vref-/CVref = C1 Vin- kết nối tới RA0/AN0 C2 Vin- kết nối tới RA1/AN1 Bit 2-0 – CM2:CM0: bit định chế đố so sánh Hình 7.30 mơ tả chế độ hoạt động so sánh với bit cấu hình CM2:CM0 262 Chương 7: định thời/bộ đếm, ADC, so sánh Cấu hình so sánh Có chế độ hoạt động cho so sánh minh hoạ hình 7.30 Các bit CM2:CM0 ghi CMCON sử dụng để chọn chế độ Thanh ghi TRISA điều khiển chiều liệu chân so sánh cho chế độ Nếu chế độ so sánh bị thay đổi, mức ngõ so sánh độ trễ thay đổi chế độ cụ thể dẫn phần đặc tính điện Hình 7.30: chế độ hoạt động I/O so sánh Hoạt động so sánh Bộ so sánh đơn giản hình 7.31 phụ thuộc vào quan hệ mức tín hiệu vào tương tự ngõ số Khi điện ngõ vào Vin+ nhỏ Vin-, ngõ so sánh 263 Chương 7: định thời/bộ đếm, ADC, so sánh mức thấp Khi Vin+ > Vin- ngõ mức cao Vùng tơ đen hình 7.28 biểu diễn khơng chắn, sai lệch ngõ vào đáp ứng thời gian Tham chiếu so sánh Tuỳ thuộc vào chế độ hoạt động so sánh, tham chiếu điện ngồi hay bên sử dụng Tín hiệu tương tự Vin- so sánh với Vin+ ngõ số so sánh điều chỉnh thích hợp Hình 7.31: minh hoạ so sánh đơn giản Tín hiệu tham chiếu ngồi Khi điện tham chiếu ngồi sử dụng, khối so sánh cấu hình để so sánh hoạt động từ nguồn tham chiếu giống khác Tuy nhiên, ứng dụng phát ngưỡng phải yêu cầu tham chiếu giống Tín hiệu tham chiếu phải có giá trị VSS VDD Tín hiệu tham chiếu nội Khối so sánh cho phép sử dụng điện tham chiếu bên từ khối tham chiếu điện so sánh Sự tham chiếu nội sẵn dung chế độ mà ngõ vào ghép thành hai so sánh (CM2:CM0 = 110) Ở chế độ này, tham chiếu điện nội cung cấp tới chân VIN+ hai so sánh Thời gian đáp ứng so sánh Thời gian đáp ứng thời gian tối thiểu, sau lựa chọn điện tham chiếu nguồn ngõ vào trước ngõ so sánh có mức Nếu tham chiếu nội thay đổi, độ trễ tối đa tham chiếu điện nội phải xem xét sử dụng ngõ so sánh Ngược lại, độ trễ tối đa so sánh phải sử dụng theo đặc tính điện Các ngõ so sánh Các ngõ so sánh đọc thông qua ghi CMCON, lưu ý bit đọc Các ngõ so sánh ngõ trực tiếp chân I/O RA4 RA5 Các 264 Chương 7: định thời/bộ đếm, ADC, so sánh bit TRISA tương ứng cho phép hay không cho phép RA4 RA5 ngõ chế độ Cực tính ngõ so sánh thay đổi nhờ vào bit C2INV C1INV (CMCON) Lưu ý:  Khi đọc ghi PORT, tất chân cấu ngõ vào tương tự đọc Các chân cấu hình ngõ vào số chuyển đổi ngõ vào tương tự theo đặc điểm ngõ vào Schmitt trigger  Các mức tương tự chân xác định ngõ vào số làm cho đệm ngõ vào tiêu thụ dòng nhiều định Hình 7.32: sơ đồ khối ngõ so sánh Các ngắt so sánh Cờ ngắt so sánh đặt có thay đổi giá trị ngõ Bit CMIF (PIR2) cờ ngắt so sánh Khi cho phép ngắt hai bit CMIE (PIE2) PEIE (INTCON) phải đặt Ngoài ra, bit GIE (INTCON) phải cho phép Nếu bit bị xố ngắt khơng cho phép Lưu ý: thay đổi ghi CMCON (C1OUT hay C2OUT) xảy hoạt động đọc thực thi, cờ ngắt CMIF khơng thể đặt Ảnh hưởng reset Việc reset VĐK ép buộc ghi CMCON trở trạng thái ban đầu nó, làm cho so sánh khơng hoạt động (CM2:CM0 = 111) 265 Chương 7: định thời/bộ đếm, ADC, so sánh Sự cân nhắc kết nối ngõ vào tương tự Trong hình 7.32, ngõ vào tương tự phải có mức VDD VSS Nếu điện ngõ vào chênh lệch dải 0.6 V hai đầu giới hạn, diode phân cực thuận điều kiện chốt xảy Các linh kiện kết nối tới chân ngõ vào tương tự (như tụ điện, zener, …) phải có dòng rỉ nhỏ Hình 7.33: mơ hình ngõ vào tương tự so sánh Bảng 7.13: ghi liên kết với so sánh Tên CMCON CVRCON INTCON PIR2 PIE2 IPR2 PORTA LATA TRISA Bit C2OUT CVREN GIE/GIEH OSCFIF OSCFIE OSCFIP - Bit C1OUT CVROE PEIE/GIEL CMIF CMIE CMIP RA6(1) LATA6(1) TRISA6(1) Bit C2INV CVRR TMR0IE USBIF USBIE USBIP RA5 LATA5 TRISA5 Bit C1INV CVRSS INT0IE EEIF EEIE EEIP RA4 LATA4 TRISA4 Bit CIS CVR3 RBIE BCLIF BCLIE BCLIP RA3 LATA3 TRISA3 Bit CM2 CVR2 TMR0IF HLVDIF HLVDIE HLVDIP RA2 LATA2 TRISA2 Bit CM1 CVR1 INT0IF TMR3IF TMR3IE TMR3IP RA1 LATA1 TRISA1 Bit CM0 CVR0 RBIF CCP2IF CCP2IE CCP2IP RA0 LATA0 TRISA0 Chú thích: “-”: khơng sử dụng, đọc 0; ô tô xám không sử dụng cho khối so sánh (1) Bit PORTA bit LAT với TRIS cấu hình đồng thời chân ngõ vào theo cấu hình dao động khác Khi bị vô hiệu, bit đọc 7.8 HƯỚNG DẪN LẬP TRÌNH BẰNG C18 Ví dụ 7.12: viết chương trình chốt bit PORTB liên tục với thời gian trễ Sử dụng Timer0, 16-bit khơng dùng prescaler Giải pháp: #include void T0Delay(void); void main(void) 266 Chương 7: định thời/bộ đếm, ADC, so sánh { TRISB = 0; while(1) { PORTB = 0x55; T0Delay(); PORTB = 0xAA; T0Delay(); // Toggle all bits of Port B // Delay about some time // Toggle all bits of Port B } } void T0Delay() { T0CON = 0x08; // TMR0, 16-bit, no prescaler TMR0H = 0x35; // Load TH0 TMR0L = 0x00; // Load TL0 T0CONbits.TMR0ON = 1; // Turn on T0 while (INTCONbits.TMR0IF == 0); // Wait for TF0 to roll over T0CONbits.TMR0ON = 0; // Turn off T0 INTCONbits.TMR0IF = 0; // Xố T0 } Ví dụ 7.13: viết chương trình để chốt PORTB.4 liên tục 50 ms Sử dụng Timer0, 16-bit, prescaler có hệ số chia 1:4 để tạo delay Giả sử XTAL = 10 MHz Giải pháp: #include void T0Delay(void); #define mybit PORTBbits.RB4 void main(void) { TRISBbits.TRISB4 = 0; while(1) { mybit ^= 1; // Toggle PORTB.4 T0Delay(); // Timer0, mode (16-b) } } void T0Delay() { T0CON = 0x01; // Timer0, 16-b, 1:4 prescaler 267 Chương 7: định thời/bộ đếm, ADC, so sánh TMR0H = 0x85; // Load TH0 TMR0L = 0xEE; // Load TL0 T0CONbits.TMR0ON = 1; // Turn on Timer0 while (INTCONbits.TMR0IF == 0); // Wait for TF0 to roll over T0CONbits.TMR0ON = 0; // Turn off Timer0 INTCONbits.TMR0IF = 0; // Xoá TF0 } Giải thích: (0xFFFF – 0x85EE +1) = 0x7A12 = 31,250 Thời gian delay = 31250 x x 0.4 µs = 50 ms Ví dụ 7.14: viết chương trình để phát tần số Hz chân RB.5 Sử dụng Timer0, 8-bit để tạo delay Giải pháp: #include void T0M8Delay(void); #define mybit PORTBbits.RB5 void main(void) { unsigned char x,y; TRISBbits.TRISB5 = 0; while(1) { mybit ^= 1; For (x = 0; x < 250; x++) For (y = 0; y < 35; y++) T0M8Delay(); // Toggle PORTB.5 // // Get 35 (not 39) } } void T0M8Delay() { T0CON = 0x45; // Timer0, 8-b, 1:64 prescaler TMR0L = -1; // T0CONbits.TMR0ON = 1; // while (INTCONbits.TMR0IF == 0); // T0CONbits.TMR0ON = 0; // INTCONbits.TMR0IF = 0; // 268 Chương 7: định thời/bộ đếm, ADC, so sánh } Giải thích: 256 – 255 =  x 64 x 0.4 µs = 25.6 µs 256 µs x 250 x 39 = 0.2496 s F = 1/(2 x 0.2496 s) = Hz Ví dụ 7.15: viết chương trình để tạo sóng vng có tần số 250 Hz bit PORTC Sử dụng Timer0, 16-bit không dùng prescaler Giả sử XTAL = 10 MHz Giải pháp: #include void T0Delay(void); void main(void) { unsigned char x; TRISC = 0; PORTC = 0x55; while(1) { PORTC = ~PORTC; // Toggle all bits of Port C for (x = 0; x < 20; x++) T0Delay(); } } void T0Delay() { T0CON = 0x0; // Timer0, 16-b, no prescaler TMR0H = 0xFF; TMR0L = 0x06; T0CONbits.TMR0ON = 1; while (INTCONbits.TMR0IF == 0); T0CONbits.TMR0ON = 0; INTCONbits.TMR0IF = 0; } Giải thích: 0xFF06 = 65286  65536 – 65286 = 250 250 x 0.4 µs = 0.1 ms 20 x 0.1 ms = ms 269 Chương 7: định thời/bộ đếm, ADC, so sánh F = 1/(2 x ms) = 250 Hz Hướng dẫn theo cách khác: T = 1/250 Hz = 0.004 s T/2 = 0.002 s (nửa chu kỳ) 0.002 s/0.4 µs = 5000 5000/20 = 250 (bởi vòng lặp 20 lần) Ví dụ 7.16: giả sử có xung clock Hz đưa vào chân T0CKI Viết chương trình để đếm hoạt động 8-bit đếm lên hiển thị giá trị đếm TMR0L LED PORTB Giá trị đếm bắt đầu Giải pháp: #include void main(void) { TRISAbits.TRISA4 = 1; TRISB = 0; T0CON = 0x68; // Counter0, 8-b, no prescaler TMR0L = 0; // Begin at while(1) { { T0CONbits.TMR0ON = 1; PORTB = TMR0L; // Place value on PORTB } while (INTCONbits.TMR0IF == 0); T0CONbits.TMR0ON = 0; INTCONbits.TMR0IF = 0; } } 7.9 CÂU HỎI VÀ BÀI TẬP 1) PIC 18F4550 có định thời? 2) PIC 18F4550 có đếm? 3) Timer0 hoạt động 16-bit, ghi TMR0 đếm từ giá trị báo tràn gì? 4) Timer0 hoạt động 8-bit, ghi TMR0 đếm từ giá trị báo tràn gì? 270 Chương 7: định thời/bộ đếm, ADC, so sánh 5) Khi bit TMR0IF = 1? 6) Viết chuỗi lệnh để Timer0 hoạt động chế độ 16-bit sử dụng xung clock từ chân T0CKI, xung tác động sườn lên 7) Viết chuỗi lệnh để Timer0 hoạt động chế độ 16-bit sử dụng xung clock từ chân T0CKI, xung tác động sườn xuống 8) Tìm giá trị cho T0CON muốn lập trình cho Timer0 hoạt động 16-bit với prescaler có hệ số chia 1:64, sử dụng clock nội (FOSC/4) cho nguồn clock, tích cực sườn xung lên 9) Tìm tần số chu kỳ clock timer cho hệ thống PIC18 hoạt động với tần số thạch anh: MHz; MHz; 12 MHz Giả sử prescaler có hệ số 1:64 10) Khảo sát đoạn chương trình sau tìm thời gian delay (chỉ tính lệnh vòng), giả sử XTAL = 10 MHz HERE DELAY AGAIN bcf movlw movwf movlw movwf movlw movwf bcf call btg bra bsf btfss bra bcf return TRISB,2 0x05 T0CON 0x01 TMR0H 0x08 TMR0L INTCON,TMR0IF DELAY PORTB,2 HERE T0CON,TMR0ON INTCON,TMR0IF AGAIN T0CON,TMR0ON 11) Giả sử XTAL = 10 MHz (a) Tìm chu kỳ clock cấp cho Timer0 prescaler 1:256 (b) Cho biết thời gian delay lâu sử dụng hệ số chia 12) Giả sử XTAL = 10 MHz, viết chương trình để tạo sóng vng có tần số 50 Hz chân RB.7 Sử dụng Timer0 16-bit với prescaler = 128 13) Giả sử trường hợp sau sử dụng timer 8-bit Hãy viết lại assembly sử dụng số hex 271 Chương 7: định thời/bộ đếm, ADC, so sánh (a) movlw –D’200’ movwf TMR0L (b) movlw –D’60’ movwf TMR0L (c) movlw –D’12’ movwf TMR0L 14) Giả sử có xung clock đưa vào chân T0CKI buzzer gắn vào chân RB.1, viết chương trình cho Counter0 8-bit để phát âm 100 xung 15) Viết chương trình C18 để tạo tần số 2500 Hz chân RB.1, sử dụng Timer1 để tạo delay 16) Giả sử có xung clock Hz cấp cho T0CKI Viết chương trình C18 cho Counter0 hoạt động 16-bit để đếm số xung hiển thị giá trị TMR0H TMR0L PORTD PORTB tương ứng 17) Giả sử có xung clock 64 Hz cấp cho T0CKI Viết chương trình C18 cho Counter0 8-bit để hiển thị số đếm sang mã ASII Các số ASCII hiển thị PORTB, PORTC, PORTD (PORTB LSD) Giá trị ban đầu TMR0L 18) Giả sử có xung clock Hz đưa vào chân T0CKI Viết chương trình để đếm hoạt động 8-bit đếm lên hiển thị giá trị đếm TMR0L LED PORTB Giá trị đếm 50 19) Giả sử có xung clock Hz đưa vào chân T0CKI Viết chương trình để đếm hoạt động 8-bit đếm xuống hiển thị giá trị đếm TMR0L LED PORTB Giá trị đếm 100 272 ... movlw d’59’ ; Kiểm tra 60 phút chưa? cpfsgt mins ; không, đủ 60 phút return clrf mins ; Xóa phút incf hours, F ; Tăng movlw d’23’ ; Kiểm tra 24 chưa? cpfsgt hours ; không, đủ 24 return movlw d’01’... bcf PIR1, TMR1IF ; Xóa cờ ngắt incf secs, F ; Tăng giây movlw d’59’ ; Kiểm tra 60 giây chưa? cpfsgt secs ; khởi tạo giá trị đầu cho ghi lưu thời gian return RTCisr 237 Chương 7: định thời/bộ đếm,

Ngày đăng: 21/12/2017, 12:19

Tài liệu cùng người dùng

Tài liệu liên quan