Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 75 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
75
Dung lượng
0,92 MB
Nội dung
Dson 1 1 HƯỚNG DẪN PIC TUTORIAL TIẾNG VIỆT Thanh ghi (Register): Thanh ghi được đặt trong PIC, nó có thể được ghi, đọc. Hãy tưởng tượng các thanh ghi giống như các mẩu giấy mà chúng ta có thể đọc hay viết thông tin lên nó. Hình bên dưới mô tả file thanh ghi (register file) được ánh xạ vào Dson 2 2 PIC16F84. PIC được chia làm 2 phần, Bank0 và Bank1. Dson 3 3 Bank1 dùng để điều khiển các hoạt động của PIC, ví dụ như nói cho nó biết những bit nào trên PortA là đi vào (Input) và những bit nào xuất ra (Output). Bank0 dùng để thao tác trên dữ liệu, ví dụ ta muốn làm cho bit nào đó trên PortA lên mức cao, đầu tiên ta ta phải chuyển đến Bank1 để set 1 bit của 1 chân cụ thể nào đó trên PortA trở thành Output, sau đó ta chuyển đến Bank0 và gởi mức 1 tới chân đó. Những thanh ghi thông thường nhất trên Bank1 mà chúng ta sẽ sử dụng là các thanh ghi STATUS, TRISA and TRISB. Đầu tiên chúng ta hãy quay vào Bank1, thanh ghi TRISA cho phép ta chọn chân nào đó trên PortA làm ngõ Output hay Input, thanh ghi TRISB cho phép ta chọn chân nào đó trên PortB làm ngõ Output hay Input, thanh ghi STATUS cho phép chọn sử dụng Bank0 hay Bank1. STATUS: Để thay đổi từ Bank0 sang Bank1 ta sử dụng thanh ghi trạng thái STATUS, set bit5 của thanh ghi trạng thái lên1 để chọn Bank1 hoặc xoá bit5 về 0 để chọn Bank0, thanh ghi STATUS có địa chỉ 03H. TRISA và TRISB: 2 thanh ghi TRISA and TRISB đặt tại địa chỉ 85H và 86H, để lập trình cho các chân trên 2 thanh ghi này thông thường người ta gởi mức 0 hay 1 đến các bit tương ứng trên thanh ghi, có thể làm điều này trong cả 2 dạng hoặc là bằng số binary (bin) hay hex. Dùng kiểu binary thì rõ ràng hơn là kiểu hex nhưng mà trông lượm thượm hơn !. Dson 4 4 Trên PortA ta có 5 chân tương ứng 5 bit, nếu muốn đặt 1 trong 5 chân này thành Output ta phải gởi 1 đến bit tương ứng với nó, những bít này có tên bit đúng chính xác với tên của nó, nói cách khác bit0 là RA0, bit1 là RA1, bit2 là RA2…. Hãy xem ví dụ: Nếu ta muốn set RA0, RA3 và RA4 thành Output và 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 RA4 RA3 RA2 RA1 RA0 Bit Number 4 3 2 1 0 Binary 0 0 1 1 0 Tương tự chúng ta cũng làm như vậy cho TRISB. PORTA và PORTB: Để làm cho 1 trong những chân Output lên mức cao ta gởi 1 đến bit tương ứng trên thanh ghi PORTA hoặc PORTB, giống như cách làm trên thanh ghi TRISA và TRISB, có thể kiểm tra lại trên từng chân của Port. Thanh ghi W: Thanh ghi W là là thanh ghi mụch đích chung mà có thể đặt lên nó bất kỳ giá trị nào ta muốn, khi gán cho thanh ghi W một giá trị nào đó, ta có thể cộng nó với 1 giá trị khác hoặc có thể copy nó (Mov). Nếu bạn gán 1 giá trị nào đó lên thanh ghi W thì nội dung trước đó của nó sẽ bị ghi đè lên. Xem ví dụ sử dụng PortA: Đầu tiên chúng ta cần chọn Bank0 hoặc Bank1 bằng cách set trên thanh ghi STATUS, địa chỉ của STATUS là 03H và hãy set bit5 của nó lên 1 theo cách sau: Dson 5 5 BSF 03h,5 BSF có nghĩa là Bit Set F, từ F nghĩa là chúng ta sẽ sử dụng một vị trí nào đó trong memory hoặc trong thanh ghi, 2 con số “03H” sau câu lệnh BSF nghĩa là địa chỉ của thanh ghi STATUS, con số “5” tức là bit5 của nó, như vậy ý nghĩa của câu lệnh trên là set bit5 của STATUS lên 1. Bây giờ chúng ta thao tác trong Bank1. MOVLW b'00110' Ta đã đặt giá trị binary 00110 vào trong thanh ghi mụch đích chung W, chữ b có nghĩa là binary, dĩ nhiên ta cũng có thể viết lại trong dạng số hex, nó như sau: MOVLW 06h MOVLW có nghĩa là là ‘Move Literal Value Into W’ tạm dịch là di chuyển giá trị của Literal vào thanh ghi W, để rõ ràng hơn ta có thể nói là “ đặt giá trị trực tiếp sau đây (06H) vào trong thanh ghi W “ Bây giờ ta tiếp tục đặt giá trị đó vào trong thanh ghi TRISA để thiết lập trạng thái cho Port: MOVWF 85h Lệnh này có nghĩa là “MOV nội dung của W vào (thanh ghi có) địa chỉ 85h”, trong trường hợp này con trỏ địa chỉ sẽ trỏ tới TRISA, thanh ghi Dson 6 6 TRISA bây giờ chứa giá trị 00110, xem lại mô tả các câu lệnh bằng hình sau: Port A Pin RA4 RA3 RA2 RA1 RA0 Binary 0 0 1 1 0 Input/Output O O I I O Bây giờ chúng ta sẽ thiết lập các chân trên PORTA, hãy quay về Bank0 để thao tác trên các dữ liệu. BCF 03h,5 Lệnh BCF thì đối nghịch với BSF, nó có nghĩa là “ Bit Clear F” tạm dịch là xoá bit nào đó trong vùng memory hay trong thanh ghi nào đó, trong trường hợp này là thanh ghi STATUS (vì địa chỉ của nó là 03H) và lệnh này xoá bit5 của STATUS. Bên dưới là đoạn code: BSF 03h,5 ; vào Bank 1 MOVLW 06h ; Đặt giá trị 00110 vào W MOVWF 85h ; Move 00110 vào trong TRISA BCF 03h,5 ; Quay trở về Bank 0 Hãy đọc kỹ đoạn code trên cho đến khi nào bạn hiểu nó đang làm cái gì. Ghi lên Port: Trong phần trên chúng ta đã nói đến làm thế nào để thiết lập các chân của Port trở thành Input hay Output, trong phần này ta sẽ nói tiếp làm sao có thể gởi data tới Port và trong phần kế tiếp chúng ta sẽ kết thúc với một đoạn Dson 7 7 code làm cho đèn Led chớp tắt với cả sơ đồ mạch để có thể hiểu rõ con Pic làm việc chính xác đến mức độ nào, đừng có thử compile và nạp đoạn code vào con Pic của bạn vì nó chỉ là ví dụ mà thôi. Đầu tiên hãy setup bit2 của Port A thành Output. Bsf 03h,5 ; Vào Bank 1 Movlw 00h ; Đặt giá trị 00000 vào trong W Movwf 85h ; Copy 00000 vào trong TRISA, tất ; cả các chân bây giờ sẽ trở ;thànhOutput bcf 03h,5 ; Quay trở về Bank0 Đoạn code trên là những gì đã nói trong phần trước, chỉ khác là bây giờ ta set tất cả các chân của PortA trở thành Output bằng cách gởi giá trị 0 đến thanh ghi w (thanh ghi W là loại thanh ghi có 3 trạng thái tri-state register). Bây giờ những gì mà ta muốn con Pic phải làm là bật tất cả Led lên, để làm điều này ta phải gởi mức 1 đến các chân Led, hãy xem làm như thế nào đây: movlw 02h ; Ghi 02h vào thanh ghi W. nó là 00010 nếu ; viết theo dạng binary, như vậy nó đặt 0 vào ; bit 2 (chân 18) trong khi giữ các chân khác ở ; ;mức 0. movwf 05h ;Bây giờ copy nội dung của W (02H) vào ;PortA (địa chỉ là 05H). Con Led bây giờ đã bật on, chúng ta thử tắt nó xem: Dson 8 8 movlw 00h ; Ghi 00h vào thanh ghi W. nó là 00000 nếu ; viết theo dạng binary, như vậy nó đặt 0 vào ; tất cả các chân. movwf 05h ; Bây giờ copy nội dung của W ( 02H) vào ; PortA Bây giờ Led đã bị tắt. Để làm cho led sáng, tắt liên tục chúng ta phải làm cho chương trình quay trở lại điểm bắt đầu bằng cách đặt nhãn cho chương trình và nói cho nó biết đó là điểm bắt đầu mà nó phải quay lại thực hiện lần nữa. Rất đơn giản, hãy đặt 1 cái nhãn có tên là START ngay tại điểm bắt đầu của đoạn code. Start movlw 02h ; Write 02h to the W register. In binary ; this is 00010, which puts a ‘1’ on pin2 ; while keeping the other pins to ‘0’ movwf 05h ; Now move the contents of W (02h) ; onto the PortA, whose address is 05h movlw 00h ; Write 00h to the W register. This puts a ; 0’ on all pins. movwf 05h ; Now move the contents of W (0h) onto ; the Port A, whose address is 05h goto Start ; Goto where we say Start Bây giờ hãy xem lại đoạn code: Bsf 03h,5 Movlw 00h Dson 9 9 Movwf 85h bcf 03h,5 Start movlw 02h Movwf 05h Movlw 00h Movwf 05h Goto Start Chúng ta chỉ nhìn thấy toàn những con số, bạn muốn hiểu được nó thì phải nhớ hết tất cả những địa chỉ của các thanh ghi, các Port …. Nhưng ngay cả khi bạn nhớ được tất cả thì một đoạn code ngắn nhất như trên cũng có thể làm bạn bối rối, để giải quyết vấn đề này hãy gán cho các con số địa chỉ bằng 1 cái tên bằng lệnh EQU. EQU đơn giản là thay một cái gì đó bằng một cái gì đó !, nó không phải là câu lệnh của con PIC mà nó là câu lệnh của assembler, với lệnh EQU bạn có thể gán bất kỳ địa chỉ thanh ghi nào bằng 1 cái tên gợi nhớ hoặc gán một cái tên cho một hằng số trong đoạn chương trình. Hãy thử gán vài hằng số bằng những cái tên bạn sẽ thấy nó dể đọc đến như thế nào. STATUS equ 03h ; this assigns the word STATUS to the value of 03h, ; which is the address of the STATUS register. TRISA equ 85h ; This assigns the word TRISA to the value of 85h, ; which is the address of the Tri-State register for ; PortA PORTA equ 05h ;This assigns the word PORTA to 05h which is the ; address of Port A. Dson 10 10 Bây giờ hãy thiếp lập các giá trị hằng số và đặt chúng vào chương trình, các giá trị hằng số phải được định nghĩa trước khi đặt vào chương trình và hãy nhớ phải luôn đặt chúng vào vị trí bắt đầu của chương trình. Bây giờ hãy xoá hết các ghi chú sau các câu lệnh, bạn thử nhìn xem có dể dàng hiểu được đoạn code trên khi không có các dòng ghi chú: STATUS equ 03h TRISA equ 85h PORTA equ 05h Bsf STATUS,5 m o v l w 00h m o v w f TRISA bcf STATUS,5 Start movlw 02h M o v w f PORTA m o v l w 00h [...]... miss ;the goto instruction Bạn có thể cpmpile chương trình này và nạp nó vào con PIC, dĩ nhiên là bạn sẽ muốn thử cho nó hoạt động, ở đây có sẵn sơ đồ mạch cho bạn Xin chúc mừng, bạn vừa mới viết xong 1 chương trình cho con PIC và đã làm cho nó hoạt động theo mong đợi Cho đến bây giờ bạn đã học được 7 trong số 35 lệnh của con PIC rồi đấy, nhưng mà như vậy bạn vẫn chưa thể điều khiển được các Port I/O của... hơn cách này đó là dùng lệnh INCF trong con Pic, cú pháp là: INCF ,d Với là thanh ghi, hoặc địa chỉ mà ta chỉ định, còn d thì nói cho con Pic biết nơi đặt kết quả Nếu d=0 thì kết quả lưu trong thanh ghi W, nếu d=1 kết quả sẽ được lưu trong thanh ghi chỉ định nằm trước nó (tức là ) Bằng cách này ta có thể tiết kiệm ½ bộ nhớ của Pic Nếu ta muốn kết quả lưu trong W thì sử... FFh) thì con Pic sẽ bỏ qua lệnh kế tiếp, đoạn code bên dưới sẽ mô tả lệnh này: Dson 33 33 Loop Incfsz 0C Goto Loop : : Rest of program Trong đoạn code trên, địa chỉ 0Ch sẽ tăng lên 1 sau đó chương trình nói cho con Pic quay về nhãn Loop và gia tăng 0Ch lên lần nữa, nó làm tiếp tục như vậy cho tới khi 0Ch =127 (FFh) Lần này khi tăng lên 1, nội dung của 0Ch sẽ =0 Lệnh INCFSZ sẽ nói cho con Pic bíêt hãy... con Pic cho ta 2 món chế biến từ hàm ADD, đó là ADDLW và ADDWF, bạn cũng có thể đoán rằng nó cũng tương tự như các hàm ở trên Lệnh ADDLW cộng nội dung của thanh ghi W với một số xác định, cú pháp là: ADDLW Lệnh ADDWF cộng nội dung của thanh ghi W với một thanh ghi bất kỳ, kết quả lưu trong W, cú pháp là: ADDWF ,d là thanh ghi mà chúng ta chỉ định và d nói cho con Pic biết... thôi được rồi, xem như bạn đã đoán ra, hàm SUB này trừ 1bit với 1bit khác Một lần nữa con Pic lại cho ta 2 món được chế biến từ hàm SUB, đó là SUBLW and SUBWF, cú pháp thì giống y như là những món của hàm ADD nhưng mà thay vì cộng thì nó trừ Lệnh INCF và INCFSZ: Dson 32 32 Nếu chúng ta muốn cộng 1 với một số trong Pic, đơn giản ta sử dụng hàm ADD và số 1, cái bất tiện là đầu tiên ta phải bỏ con số 1 vào... nghiệm xương máu của tôi ! Nếu bạn theo sát từ đầu đến giờ thì bạn đã biết tổng cộng 10 trong số 35 lệnh của con Pic 16F84 rồi đấy và tất cả những thứ mà bạn biết chỉ đơn giản là làm cho con Led chớp tắt !, thật phí phạm thời gian có phải không ?, còn tôi thì nghĩ thật là phí phạm bộ nhớ của con Pic nếu phải viết chương trình dài như vậy chỉ để chớp tắt, nhan chậm đèn Led !, phải có cách gì đó làm cho hay... dụng nó, trong phần này sẽ nói tiếp các toán hạng và lệnh Logic mà con Pic có hỗ trợ Dson 30 30 Bây giờ ta sẽ nói làm sao thao tác trên các bit riêng rẽ, thực hiện vài thuật toán thông thường trên dữ liệu Sẽ không có ví dụ nữa nhưng mà sẽ giải thích cặn kẽ làm thế nào dùng các toán hạng trong các đoạn code nhỏ Lệnh ANDLW và ANDWF: Con Pic cho ta 2 món được chế biến từ hàm AND, đó là lệnh ANDLW và ANDWF... Dson 36 36 Trong đoạn code trên, con Pic sẽ đi ra khỏi Loop nếu bit0 trong thanh ghi STATUS ( hay cờ Carry) bị xoá về 0, nói cách khác nếu cờ Carry=0 lệnh GOTO sẽ được thực hiện Lệnh BTFSS: Lệnh này có nghĩa là “Bit Test Register F, And Skip If Set” tạm dịch là kiểm tra bit trong thanh ghi F và bỏ qua lệnh kế nếu=1 Nó giống như là lệnh BTFSC nhưng mà chỉ khác là con Pic sẽ bỏ qua lệnh kế tiếp nếu bit=1... RETURN của chương trình chính trừ phi trong chương trình chính bạn dùng lệnh GOTO để nhảy qua subroutine, nếu không nó sẽ thực thi bất kỳ lệnh nào mà nó bắt gặp bất kể bạn có muốn hay không bởi vì con Pic không phân biệt được đâu là chương trình chính đâu là subroutine Hãy xem lại đoạn chương trình chớp Led nhưng mà lần này ta sử dụng subroutine cho Delay Loop bạn sẽ thấy chương trình đơn giản đến mức... lưu trong thanh ghi W Lệnh ANDWF cho phép ta AND thanh ghi W với một thanh ghi khác, ví dụ như với PortA, cú pháp là: ANDWF ,d là thanh ghi mà ta chỉ định, ví dụ PortA, d nói cho Pic biết nơi lưu kết quả Nếu d=0 thì kết quả lưu vào thanh ghi W và d=1 thì kết quả lưu vào thanh ghi đứng trước d Hai đoạn code bên dưới sẽ mô tã 1 ví dụ cho mỗi hàm AND Đầu tiên kiểm tra trạng thái PortA . Dson 1 1 HƯỚNG DẪN PIC TUTORIAL TIẾNG VIỆT Thanh ghi (Register): Thanh ghi được đặt trong PIC, nó có thể được ghi, đọc. Hãy tưởng tượng các thanh. ghi (register file) được ánh xạ vào Dson 2 2 PIC1 6F84. PIC được chia làm 2 phần, Bank0 và Bank1. Dson 3 3 Bank1 dùng để điều khiển các hoạt động của PIC, ví dụ như nói cho nó biết những bit nào. Led chớp tắt với cả sơ đồ mạch để có thể hiểu rõ con Pic làm việc chính xác đến mức độ nào, đừng có thử compile và nạp đoạn code vào con Pic của bạn vì nó chỉ là ví dụ mà thôi. Đầu tiên hãy