Tổng quan về vi điều khiển PIC.PDF

37 2.1K 22
Tổng quan về vi điều khiển PIC.PDF

Đ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

Tổng quan về vi điều khiển PIC

Dson Thanh ghi (Register): Thanh ghi đặt PIC, ghi, đọc Hãy tưởng tượng ghi giống mẩu giấy mà đọc hay viết thơng tin lên Hình bên mơ tả file ghi (register file) ánh xạ vào PIC16F84 PIC chia làm phần, Bank0 Bank1 Bank1 dùng để điều khiển hoạt động PIC, ví dụ nói cho biết bit PortA vào (Input) bit xuất (Output) Bank0 dùng để thao tác liệu, ví dụ ta muốn làm cho bit PortA lên mức cao, ta ta phải chuyển đến Bank1 để set bit chân cụ thể PortA trở thành Output, sau ta chuyển đến Bank0 gởi mức tới chân Những ghi thơng thường Bank1 mà sử dụng ghi STATUS, TRISA and TRISB Đầu tiên quay vào Bank1, ghi TRISA cho phép ta chọn chân PortA làm ngõ Output hay Input, ghi TRISB cho phép ta chọn chân PortB làm ngõ Output hay Input, ghi STATUS cho phép chọn sử dụng Bank0 hay Bank1 STATUS: Để thay đổi từ Bank0 sang Bank1 ta sử dụng ghi trạng thái STATUS, set bit5 ghi trạng thái lên1 để chọn Bank1 xoá bit5 để chọn Bank0, ghi STATUS có địa 03H TRISA TRISB: ghi TRISA and TRISB đặt địa 85H 86H, để lập trình cho chân ghi thông thường người ta gởi mức hay đến bit tương ứng ghi, làm điều dạng số binary (bin) hay hex Dùng kiểu binary rõ ràng kiểu hex mà trông lượm thượm ! Trên PortA ta có chân tương ứng bit, muốn đặt chân thành Output ta phải gởi đến bit tương ứng với nó, bít có tên bit xác với tên nó, nói cách khác bit0 RA0, bit1 RA1, bit2 RA2… Hãy xem ví dụ: Nếu ta muốn set RA0, RA3 RA4 thành Output RA1, RA2 thành Inputs, ta phải gởi 00110 (=06h), nên nhớ bit thấp nằm bên phải, xem hình: Port A Pin Bit Number Binary RA4 RA3 RA2 RA1 1 RA0 0 Dson Tương tự làm cho TRISB PORTA PORTB: Để làm cho chân Output lên mức cao ta gởi đến bit tương ứng ghi PORTA PORTB, giống cách làm ghi TRISA TRISB, kiểm tra lại chân Port Thanh ghi W: Thanh ghi W là ghi mụch đích chung mà đặt lên giá trị ta muốn, gán cho ghi W giá trị đó, ta cộng với giá trị khác copy (Mov) Nếu bạn gán giá trị lên ghi W nội dung trước bị ghi đè lên Xem ví dụ sử dụng PortA: Đầu tiên cần chọn Bank0 Bank1 cách set ghi STATUS, địa STATUS 03H set bit5 lên theo cách sau: BSF 03h,5 BSF có nghĩa Bit Set F, từ F nghĩa sử dụng vị trí memory ghi, số “03H” sau câu lệnh BSF nghĩa địa ghi STATUS, số “5” tức bit5 nó, ý nghĩa câu lệnh set bit5 STATUS lên Bây thao tác Bank1 MOVLW b'00110' Ta đặt giá trị binary 00110 vào ghi mụch đích chung W, chữ b có nghĩa binary, dĩ nhiên ta viết lại dạng số hex, sau: MOVLW 06h MOVLW có nghĩa là ‘Move Literal Value Into W’ tạm dịch di chuyển giá trị Literal vào ghi W, để rõ ràng ta nói “ đặt giá trị trực tiếp sau (06H) vào ghi W “ Bây ta tiếp tục đặt giá trị vào ghi TRISA để thiết lập trạng thái cho Port: MOVWF 85h Lệnh có nghĩa “MOV nội dung W vào (thanh ghi có) địa 85h”, trường hợp trỏ địa trỏ tới TRISA, ghi TRISA chứa giá trị 00110, xem lại mơ tả câu lệnh hình sau: Port A Pin Binary Input/Output RA4 O RA3 O RA2 I RA1 I RA0 O Bây thiết lập chân PORTA, quay Bank0 để thao tác liệu BCF 03h,5 Dson Lệnh BCF đối nghịch với BSF, có nghĩa “ Bit Clear F” tạm dịch xố bit vùng memory hay ghi đó, trường hợp ghi STATUS (vì địa 03H) lệnh xoá bit5 STATUS Bên đoạn code: BSF MOVLW MOVWF BCF 03h,5 06h 85h 03h,5 ; vào Bank ; Đặt giá trị 00110 vào W ; Move 00110 vào TRISA ; Quay trở Bank Hãy đọc kỹ đoạn code bạn hiểu làm Ghi lên Port: Trong phần nói đến làm để thiết lập chân Port trở thành Input hay Output, phần ta nói tiếp gởi data tới Port phần kết thúc với đoạn code làm cho đèn Led chớp tắt với sơ đồ mạch để hiểu rõ Pic làm việc xác đến mức độ nào, đừng có thử compile nạp đoạn code vào Pic bạn ví dụ mà Đầu tiên setup bit2 Port A thành Output Bsf Movlw Movwf 03h,5 00h 85h bcf 03h,5 ; Vào Bank ; Đặt giá trị 00000 vào W ; Copy 00000 vào TRISA, tất ; chân trở ;thànhOutput ; Quay trở Bank0 Đoạn code nói phần trước, khác ta set tất chân PortA trở thành Output cách gởi giá trị đến ghi w (thanh ghi W loại ghi có trạng thái tri-state register) Bây mà ta muốn Pic phải làm bật tất Led lên, để làm điều ta phải gởi mức đến chân Led, xem làm đây: movlw 02h movwf 05h ; Ghi 02h vào ghi W 00010 ; viết theo dạng binary, đặt vào ; bit (chân 18) giữ chân khác ; ;mức ;Bây copy nội dung W (02H) vào ;PortA (địa 05H) Con Led bật on, thử tắt xem: movlw 00h movwf 05h ; Ghi 00h vào ghi W 00000 ; viết theo dạng binary, đặt vào ; tất chân ; Bây copy nội dung W ( 02H) vào ; PortA Bây Led bị tắt Để làm cho led sáng, tắt liên tục phải làm cho chương trình quay trở lại điểm bắt đầu cách đặt nhãn cho chương trình nói cho biết điểm bắt đầu mà phải quay lại thực lần Rất đơn giản, đặt nhãn có tên START điểm bắt đầu đoạn code Dson Start movlw 02h movwf 05h movlw 00h movwf 05h goto Start ; Write 02h to the W register In binary ; this is 00010, which puts a ‘1’ on pin2 ; while keeping the other pins to ‘0’ ; Now move the contents of W (02h) ; onto the PortA, whose address is 05h ; Write 00h to the W register This puts a ; 0’ on all pins ; Now move the contents of W (0h) onto ; the Port A, whose address is 05h ; Goto where we say Start Bây xem lại đoạn code: Bsf Movlw Movwf bcf Start movlw Movwf Movlw Movwf Goto 03h,5 00h 85h 03h,5 02h 05h 00h 05h Start Chúng ta nhìn thấy tồn số, bạn muốn hiểu phải nhớ hết tất địa ghi, Port … Nhưng bạn nhớ tất đoạn code ngắn làm bạn bối rối, để giải vấn đề gán cho số địa tên lệnh EQU EQU đơn giản thay một !, khơng phải câu lệnh PIC mà câu lệnh assembler, với lệnh EQU bạn gán địa ghi tên gợi nhớ gán tên cho số đoạn chương trình Hãy thử gán vài số tên bạn thấy dể đọc đến STATUS equ 03h TRISA equ 85h PORTA equ 05h ; this assigns the word STATUS to the value of 03h, ; which is the address of the STATUS register ; This assigns the word TRISA to the value of 85h, ; which is the address of the Tri-State register for ; PortA ;This assigns the word PORTA to 05h which is the ; address of Port A Bây thiếp lập giá trị số đặt chúng vào chương trình, giá trị số phải định nghĩa trước đặt vào chương trình nhớ phải ln đặt chúng vào vị trí bắt đầu chương trình Bây xoá hết ghi sau câu lệnh, bạn thử nhìn xem có dể dàng hiểu đoạn code khơng có dịng ghi chú: STATUS TRISA PORTA equ equ equ 03h 85h 05h Dson Bsf movlw movwf bcf Start movlw Movwf movlw movwf goto STATUS,5 00h TRISA STATUS,5 02h PORTA 00h PORTA Start Hy vọng bạn hiểu đoạn code khơng có ghi cho câu lệnh Delay Loops Có chút rắc rối đoạn code chớp tắt đèn led mà ta xem bên Mỗi lệnh thực thi chu kỳ xung clock, ta sử dụng thạch anh 4MHz lệnh 4/4MHz hay 1us, đoạn code trên, ta sử dụng lệnh 5us để thực thi hoàn toàn, nhanh để mắt người nhìn thấy đèn led chớp tắt khỏang thời gian ngắn ngủi vậy, mà ta cần làm cho khoảng thời gian sáng tắt led kéo dài ra, nói cách khác làm trễ (Delay) Cơ chương trình Delay cho đếm ngược lại giá trị đặt trước đó, đến zero (0) ta cho dừng đếm, giá trị zero báo cho biết dừng chương trình delay tiếp tục thực thi lại ta muốn Đầu tiên phải định nghĩa số dùng đếm, tạm thời gọi số COUNT, phải xác định đếm thực đếm bao nhiêu, số lớn mà ta dùng cho đếm 255 số hex FFh Lệnh EQU gán giá trị cho ghi, điều có nghĩa số mà ta gán cho COUNT COUNT có giá trị với nội dung địa Nếu thử gán giá trị FFh cho COUNT ta nhận thông báo lỗi compile chương trình địa FFH dùng cho mụch đích khác khơng thể truy cập tới nó, phải gán số cho hợp lệ ?, bạn đừng lo lắng, có cách giải Nếu gán COUNT cho địa đó, ví dụ 08h, trỏ tới vị trí ghi mụch đích chung, mà giá trị sau mở nguồn vị trí khơng dùng đến FFh COUNT trỏ tới 08h có giá trị FFh Bây tơi lại nghe bạn “khóc” mà gán COUNT số có giá trị trùng với địa ghi sử dụng?, không sao, điều mà phải làm MOV giá trị bạn tới vị trí này, giả sử bạn muốn COUNT có giá trị 85h, khơng thể làm: COUNT EQU 85h Bởi 85h vị trí ghi xuất (out) trạng thái (Tri-State register) PORTA Cái mà phải làm là: Movlw Movwf 85h 08h ; Đầu tiên đặt giá trị 85h vào ghi W ; Kế đến copy giá trị tới ghi 08h Bây giờ, nói: COUNT equ 08h Thì COUNT tương đương với giá trị 85h Thật quỷ quyệt, có phải không ?! Dson Tiếp tục, ta định nghĩa cho số COUNT equ 08h giảm COUNT xuống = 0, cần lệnh đơn để làm việc với hỗ trợ lệnh GOTO nhãn, lệnh đơn dùng là: DECFSZ COUNT,1 Lệnh DECFSZ giảm ghi ( trường hợp COUNT) xuống đơn vị điền sau dấu phẩy (,), ví dụ đơn vị Nếu giảm tới zero chương trình bỏ qua lệnh để nhảy đến thực thi lệnh thứ Mất nhiều lời để giải thích cho lệnh đơn có phải khơng?, xem xảy ta đặt vào chương trình COUNT equ 08h LABEL decfsz COUNT,1 Goto LABEL Carry on here : : : Điều mà phải làm gán số COUNT = 255, đặt nhãn bên cạnh lệnh defsz Lệnh decfsz COUNT,1 giảm giá trị COUNT xuống lưu giá trị giảm trở vào COUNT, kiểm tra xem COUNT = chưa, chưa cho chương trình thực thi lệnh kế tiếp, ví dụ thực thi lệnh GOTO để quay lại điểm bắt đầu ( LABEL), COUNT = cho chương trình bỏ qua lệnh nhảy đến lệnh thứ 2, ví dụ chương trình nhảy đến nơi có chữ ‘Carry on here’ Như bạn thấy, làm cho chương trình lưu lại thời gian trước tiếp tục làm việc tiếp theo, gọi vòng trễ (Delay loop), muốn thời gian trễ lớn phải làm vòng trễ kiểu khác, mà dể dàng để hiểu có nhiều Loop thời gian trễ lâu hơn, cần Loop muốn nhìn thấy đèn Led chớp Bây đặt chúng vào chương trình kết thúc chương trình, nhớ thêm ghi ;*****Set up the Constants**** STATUS TRISA PORTA COUNT1 COUNT2 equ equ equ equ equ 03h 85h 05h 08h 09h ;Address of the STATUS register ;Address of the tristate register for Port A ;Address of Port A ;First counter for our delay loops ;Second counter for our delay loops ;****Set up the Port**** bsf movlw movwf STATUS,5 00h TRISA ;Switch to Bank ;Set the Port A pins ;to Output Dson bcf STATUS,5 ;Switch back to Bank ;****Turn the LED on**** Start movlw movwf 02h PORTA ;Turn the LED on by first putting ;it into the w register and then ;on the Port ;****Start of the delay loop 1**** Loop1 decfsz Goto Decfsz Goto COUNT1,1 Loop1 COUNT2,1 Loop1 ;Subtract from 255 ;If COUNT is zero, carry on ;Subtract from 255 ;Go back to the start of our loop ;This delay counts down from ;255 to zero, 255 times ;****Delay finished, now turn the LED off**** movlw movwf 00h PORTA ;Turn the LED off by first putting ; it into the w register and then onthe Port ;****Add another delay**** Loop2 decfsz Goto decfsz goto COUNT1,1 Loop2 COUNT2,1 Loop2 ;This second loop keeps the ;LED turned off long enough for ;us to see it turned off ; ;****Now go back to the start of the program goto Start ;go back to Start and turn LED ;on again ;****End of the program**** end ;Needed by some compilers, ;and also just in case we miss ;the goto instruction Bạn cpmpile chương trình nạp vào PIC, dĩ nhiên bạn muốn thử cho hoạt động, có sẵn sơ đồ mạch cho bạn Xin chúc mừng, bạn vừa viết xong chương trình cho PIC làm cho hoạt động theo mong đợi Cho đến bạn học số 35 lệnh PIC đấy, mà bạn chưa thể điều khiển Port I/O Tại bạn khơng thử thay đổi Delay Loop cho nhanh để biết giá trị Delay Loop tối thiểu mà mắt người nhìn thấy đèn Led chớp tắt thay đổi tốc độ chớp tắt Led, ví dụ lần giây Trong trường hợp bạn cần phải thử thay đổi giá trị số COUNT khác Delay Loop Trong phần bàn đến gọi thủ tục (subroutine) để giúp tiếp tục viết chương trình nhỏ thông thường Thủ tục (subroutine): Dson Một thủ tục phần đoạn code hay phần chương trình mà bạn gọi thực thi lúc cần thiết Một thủ tục sử dụng mà bạn muốn thực thi chức nhiều lần, tức làm làm lại chức đó, ví dụ Delay Loop Cái thuận tiện thủ tục bạn thay đổi giá trị bên sau lần thực thi, ví dụ bạn thay đổi 10 lần gía trị cần thiết, quan trọng thủ tục bạn tiết kiệm nhớ chương trình chiếm đóng Pic Hãy xem subroutine sau: ROUTINE LABEL COUNT decfsz Goto equ 255 COUNT,1 LABEL RETURN Đầu tiên phải đặt cho subroutine tên, chọn tên ROUTINE, sau viết đoạn chương trình mà tơi muốn thực hiện, tơi viết lại chương trình Led chớp tắt phần trên, cuối kết thúc subroutine lệnh RETURN Bạn đặt subroutine nơi chương trình (MAIN) muốn thực thi bạn cần gọi lệnh CALL theo sau tên subroutine Subroutine thực thi đoạn code bên nó gặp lệnh RETURN dừng lại, chương trình tự động quay chương trình nơi mà gọi subroutine thực thi lệnh sau lệnh CALL Bạn CALL nhiều lần để thực thi subroutine bạn muốn, lý người ta sử dụng subroutine để giảm độ dài chương trình Tuy nhiên có hai thứ mà bạn phải nghĩ đến, thứ số phải khai báo trước bạn sử dụng mà trường hợp subroutine bạn khai báo thân đầu chương trình thông thường, nhiên lại khuyên bạn nên khai báo thứ đầu chương trình bạn biết, để thứ nơi dể tìm kiến hơn, có phải khơng? Vấn đề thứ hai quan trọng bạn phải bảo đảm đặt subroutine sau lệnh RETURN chương trình chương trình bạn dùng lệnh GOTO để nhảy qua subroutine, khơng thực thi lệnh mà bắt gặp bạn có muốn hay khơng Pic khơng phân biệt đâu chương trình đâu subroutine Hãy xem lại đoạn chương trình chớp Led mà lần ta sử dụng subroutine cho Delay Loop bạn thấy chương trình đơn giản đến mức xem subroutine làm việc ;*****Set up the Constants**** STATUS TRISA PORTA COUNT1 COUNT2 equ equ equ equ equ ;****Set up the Port**** 03h 85h 05h 08h 09h ;Address of the STATUS register ;Address of the tristate register for Port A ;Address of Port A ;First counter for our delay loops ;Second counter for our delay loops Dson bsf movlw movwf Bcf STATUS,5 00h TRISA STATUS,5 ;****Turn the LED on**** Start movlw movwf ;Switch to Bank ;Set the Port A pins ;to Output ;Switch back to Bank 02h ;Turn the LED on by first putting it PORTA ;into the w register and then on the Port ;****Add a delay call Delay ;****Delay finished, now turn the LED off**** movlw movwf 00h PORTA ;Turn the LED off by first putting it ;into the w register and then on the Port ;****Add another delay**** call Delay ;****Now go back to the start of the program goto Start ;****Here is our Subroutine ;go back to Start and turn LED on again Delay Loop1 decfsz Goto Decfsz Goto Return COUNT1,1 Loop1 COUNT2,1 Loop1 ;****End of the program**** end ;This second loop keeps the LED ;turned off long enough for us to ;see it turned off ; ;Needed by some compilers, and ;also ;just in case we miss the goto instruction Rõ ràng kích thước chương trình giảm nhiều sử dụng subroutine cho Delay Loop, lần ta muốn thực Delay để làm cho Led ON cho Led Off, ta cần gọi subroutine Delay Tại điểm kết thúc subroutine chương trình quay trở sau dịng lệnh CALL Nếu khơng sử dụng subroutine chương trình chớp Led cần đến 120byte nhớ chương trình, sử dụng subroutine cịn cần 103byte, thật số byte chênh lệch vấn đề quan trọng lắm, mà bạn có 1024byte để chứa chương trình Pic việc tiết kiệm số byte không uổng công nặn óc để làm subroutine, có phải không Trong phần tìm hiểu mà đọc Port Đọc Port (Reading from the I/O Ports): Cho đến bạn ghi lên Port để làm cho Led chớp tắt, tìm cách đọc lại nội dung chân I/O Port Trước tiên cần kết nối chân Port tới mạch bên theo dõi hoạt động Dson 10 Nếu bạn nhớ thứ nói đến phần trước, để setup I/O Port phải chuyển từ Bank0 sang Bank1, làm trước: STATUS TRISA PORTA Bsf equ 03h equ 85h equ 05h STATUS,5 ;Address of the STATUS register ;Address of the tristate register for Port A ;Address of Port A ;Switch to Bank Để gán cho Port trở thành Output, chúng gởi vào ghi TrisA để trở thành Input ta phải gởi đến ghi TrisA, đơn giản ! Movlw Movwf Bcf 01h TRISA STATUS,5 ;Set the Port A pins ;to Input ;Switch back to Bank Bây đặt bit0 PortA trở thành Input, mà ta phải làm kiểm tra lại xem chân mức cao hay thấp (mức1 hay mức 0), để làm điều ta sử dụng lệnh BTFSC lệnh BTFSS Lệnh BTFSC có nghĩa làm động tác thử xem bit định ghi có = hay khơng, bỏ qua lệnh Lệnh BTFSS ngược lại, có nghĩa làm động tác thử xem bit định ghi có = hay khơng, bỏ qua lệnh Chúng ta sử dụng lệnh nào?, tuỳ thuộc vào bạn mong đợi chương trình đọc Port Ví dụ: Nếu bạn mong đợi ngõ Input dùng lệnh BTFSS, xem này: Code here : BTFSS PortA,0 Goto start Carry on here : : Chương trình nhảy đến dịng “Carry on here” bit0 PortA = Bây bạn viết lại chương trình đèn Led chớp tốc độ cố định, mà đóng Switch đèn Led chớp chậm ½ Bạn hồn tồn tự làm mà, đừng có nhìn vào đoạn Code bên xem Chúng ta sử dụng mạch giống phần mà thêm Switch có đầu nối vào chân RA0 Pic đầu mắc lên nguồn ;*****Set up the Constants**** STATUS equ 03h TRISA equ 85h PORTA equ 05h COUNT1 equ 08h COUNT2 equ 09h ;****Set up the Port**** bsf STATUS,5 movlw 01h movwf TRISA ;Address of the STATUS register ;Address of the tristate register for Port A ;Address of Port A ;First counter for our delay loops ;Second counter for our delay loops ;Switch to Bank ;Set the Port A pins: ;bit 1to Output, bit to Input ... mạch cho bạn Xin chúc mừng, bạn vừa vi? ??t xong chương trình cho PIC làm cho hoạt động theo mong đợi Cho đến bạn học số 35 lệnh PIC đấy, mà bạn chưa thể điều khiển Port I/O Tại bạn khơng thử thay... mà ta muốn Pic phải làm bật tất Led lên, để làm điều ta phải gởi mức đến chân Led, xem làm đây: movlw 02h movwf 05h ; Ghi 02h vào ghi W 00010 ; vi? ??t theo dạng binary, đặt vào ; bit (chân 18) giữ... LABEL RETURN Đầu tiên phải đặt cho subroutine tên, chọn tên ROUTINE, sau vi? ??t đoạn chương trình mà tơi muốn thực hiện, tơi vi? ??t lại chương trình Led chớp tắt phần trên, cuối kết thúc subroutine

Ngày đăng: 20/08/2012, 09:41

Hình ảnh liên quan

Bảng dữ liệu (Data Table): - Tổng quan về vi điều khiển PIC.PDF

Bảng d.

ữ liệu (Data Table): Xem tại trang 21 của tài liệu.
động RC, nó có thể sẽ bị thay đổi tuỳ theo cấu hình của mạch điện. - Tổng quan về vi điều khiển PIC.PDF

ng.

RC, nó có thể sẽ bị thay đổi tuỳ theo cấu hình của mạch điện Xem tại trang 29 của tài liệu.
Prescaler nằm trên thanh ghi OPTION có địa chỉ 81h từ bit0 đến bit2, bên dưới là bảng chia tỷ lệ thời gian WDT - Tổng quan về vi điều khiển PIC.PDF

rescaler.

nằm trên thanh ghi OPTION có địa chỉ 81h từ bit0 đến bit2, bên dưới là bảng chia tỷ lệ thời gian WDT Xem tại trang 30 của tài liệu.

Từ khóa liên quan

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

Tài liệu liên quan