![]() |
kỹ thuật bảng pic
hiện tại em đang tự học pic theo tut pic16f877a từ dễ đến khó, đọc xong có một chỗ em không hiểu là vấn đề kỹ thuật bảng cho pic. em thấy việc đọc giá trị trong bảng sao giống giống với việc gọi một chuong trình con quá (em chỉ đoán vậy thôi), vậy mục đích chính của kỹ thuật bảng là gì, mong các anh giải đáp giúp em.
đây là đoạn code trong tut pic6f877a, nhờ các anh giải thích kỹ hoạt động giúp em. ORG 0x000 GOTO start start ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐ ; Khởi tạo PORT B ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐ BCF STATUS,RP1 BSF STATUS,RP0 ; chọn BANK1 CLRF TRISB ; PORTB <‐ outputs BCF STATUS,RP0 ; chọn BANK0 ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐ ; Vòng lặp chính của chương trình ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐ Loop1 CLRF count ; reset thanh ghi Loop2 MOVF count, 0 ; đưa giá trị thanh ghi “count” v o thanh ghi W CALL table ; gọi chương trình con “table” MOVWF PORTB ; xuất giá trị chứa trong thanh ghi W ra PORTB CALL delay100ms INCF count, 0 ; tăng giá trị thanh ghi “count” ; kết quả chứa t rong thanh ghi W XORLW d’8’ ; thực hiện phép toán XORgiữa thanh ghi W và ; giá trị 8, kết quả chứa trong t hanh ghi W BTFSC STATUS,Z ; kiểm tra bit Z (Zero) GOTO Loop1 ; nhảy về label Loop1 nếu Z = 1 INCF count, 1 ; thực thi lệnh này nếu Z = 0 GOTO Loop2 ;================================================= ========================== ; Các chương trình con ;================================================= ========================== ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐ ; Chương trình con cho kĩ thuật bản g ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐ table ADDWF PCL,1 ; cộng giá trị trong thanh ghi W vào thanh ghi ; PCL, kết quả chứa trong thanh ghi PCL RETLW b’10000000’ ; dữ liệu của bảng RETLW b’01000000’ RETLW b’00100000’ RETLW b’00010000’ RETLW b’00001000’ RETLW b’00000100’ RETLW b’00000010’ RETLW b’00000001’ |
nhân tiện cho em hỏi thêm, tai sao khi lập trình phải khởi tạo các biến??
vd: count1 EQU 0x20 hoặc SW4 EQU 3 hoặc LED1 EQU 4 . vậy lệnh EQU là gắn địa chỉ cho nhãn à??? tại em xem trong một tài liệu tháy viết lệnh có tác dụng là "gắn giá trị cho tên của hằng số" (giống như đánh só nhà à???), nếu tài liệu đúng thì giá trị ở đây là gì???? |
Hiện nay rất ít người lập trình asm. Khi lập trình asm thì chỉ có người lập trình mới hiểu được. Người khác rất khó có thể sửa lỗi vì ngôn ngữ máy đọc rất khó hiểu, khó sửa đổi. Em nên chuyển qua C thì có thể có nhiều người giải thích cho em hơn. Lời khuyên.
|
em cũng muốn chuyển qua C lập trình cho nhanh và dễ nhưng mỗi tội là em có quá ít tài liệu hướng dẫn lập trình c cho pic, trình độ tiếng anh lại có hạn nên không thể đọc nổi tài liệu hướng dẫn của nước ngoài, mà ở tỉnh em thì cũng chả có mấy người học pic để mong được giúp đỡ. chán thật, hay máy anh cho em vài cái link hay tài liệu c cho pic bằng tiếng vệt với, càng cơ bản càng tốt, em cảm ơn nhiều
|
không ai kíu em với, giải thích kỹ giúp em lệnh equ thôi cũng được
|
rốt cục lệnh EQU là gán giá trị cho tham số hay là địa chỉ cho tham số???
|
lenh SW3 EQU 3 la khai bao hang ten la "SW3" voi gia tri hang la 3
|
ban xem lai lenh "count1 EQU 0x20 " hay la lenh "count1 RES 0x20"
|
Trích:
|
có thêm tí thắc mắc nữa nè, trong tập lệnh thì lệnh SET mới là khởi tạo biến, lệnh EQU là khởi tạo hằng, tuy nhiên mình thử thay đổi SET bằng EQU và ngược lại thì chương trình vẫn có thể chạy được, vậy hai cái lệnh này khác nhau chỗ nào
|
Trích:
" Nếu hiểu nôm na theo cách này, bạn có thể sẽ dễ hiểu nó hơn, một hằng là một giá trị. Giá trị đó có thể nằm trong thanh ghi dữ liệu (bộ nhớ dữ liệu), nhưng cũng có thể nằm trong lệnh điều khiển (bộ nhớ chương trình). Điều này khẳng định rằng, hằng là một giá trị. Một khi bạn đặt một tên nào đó, để đại diện cho một hằng số, có nghĩa là thay vì bạn viết cái giá trị đó, thì bạn viết cái tên đại diện đó, để dễ nhớ. Chẳng hạn, bạn viết chữ pi, đại diện cho hằng số có giá trị 3.1415926.... Trong khi đó, nếu bạn đặt một biến pi, thì có nghĩa là bạn xác định địa chỉ của thanh ghi dữ liệu nào đó, mà mỗi khi bạn truy xuất đến biến pi, có nghĩa là bạn đang thao tác với thanh ghi ở địa chỉ mà biến pi đại diện. Ví dụ: bạn đặt biến pi ở thanh ghi 0x20 chẳng hạn. Điều đó có nghĩa là khi ban làm gì với biến pi, chính là bạn đang làm việc với thanh ghi ở địa chỉ 0x20. Nhưng bạn sẽ thấy rằng, vậy biến pi và hằng số pi có gì khác nhau? Bây giờ biến pi và hằng pi cũng đều mang giá trị cả. Nhưng các bạn nên nhớ, trong câu lệnh lúc nào vị trí của biến (thanh ghi) F, và vị trí của hằng số k (trong cấu trúc một câu lệnh MPASM, tôi sẽ post lại bài này từ dddt). có sự phân biệt rõ ràng. Vậy tùy theo vị trí bạn đặt nó ở đâu, nó sẽ là biến, hoặc là hằng. Nếu là biến, nó chỉ mang giá trị của dịa chỉ của thanh ghi nằm trong bộ nhớ dữ liệu, nếu là hằng, nó nằm đâu cũng được kể cả ở bộ nhớ dữ liệu và bộ nhớ chương trình." tuy nhiên trong một đoạn code mà mình đọc trong tut khác cũng downd ở picvn thì lại thế này processor 16f877a include <p16f877a.inc> __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF ;--------------------------------------------------------------------------------------------------------------- ;khai báo hằng ;--------------------------------------------------------------------------------------------------------------- SW1 EQU 0 SW2 EQU 1 SW3 EQU 2 SW4 EQU 3 LED1 EQU 4 LED2 EQU 5 LED3 EQU 6 LED4 EQU 7 ;---------------------------------------------------------------------------------------------------------------- ;Khai báo biến ;---------------------------------------------------------------------------------------------------------------- count EQU 0x20 ; biến dùng cho chương trình dịch led count1 EQU 0x21 ; các biến dùng cho chuơng trình delay counta EQU 0x22 countb EQU 0x23 ;chuơng trình ;---------------------------------------------------------------------------------------------------- ORG 0x000 GOTO start start ..................... ..................... ..................... end nếu như trên thì lệnh equ đều được đặt tại cùng một vị trí, vậy thì cái nào mới là hằng cái nào là biến, có sự khác biệt nào ở đây |
riêng phần khai báo hằng trong đoạn code trên :
;--------------------------------------------------------------------------------------------------------------- ;khai báo hằng ;--------------------------------------------------------------------------------------------------------------- SW1 EQU 0 SW2 EQU 1 SW3 EQU 2 SW4 EQU 3 LED1 EQU 4 LED2 EQU 5 LED3 EQU 6 LED4 EQU 7 mình thử thay đổi các giá trị 0, 1,.....6, 7 bằng các giá trị như 0x7a, 0x7b, 0x7d ,0x7e, 0x7f thì chương trình vẫn có thể chạy được, vậy cái mà mình thay đổi là hằng hay biến |
ừm đùng rồi đó, mình đọc thấy họ viết EQU và SET là lệnh của assembler, còn câu hỏi của bạn :"bạn dùng lệnh gì để đổi LED4 lại thành 0x7f" thì thay vì viết LED4 EQU 4 mình viết LED4 EQU 0x7f, vậy mà chương trình vẫn chạy được. sorry vì mình hỏi hơi nhiều nhưng mà tính mình khi tự học cái gì mà không rõ bản chất của nó thì phải tìm cách hiểu được mới thôi
|
Trích:
SW1 EQU 0;SW1 có giá trị là 0 SW2 EQU 1;SW2 có giá trị là 1 SW3 EQU 2; SW4 EQU 3; LED1 EQU 4; LED2 EQU 5; LED3 EQU 6; LED4 EQU 7; DIA_CHI EQU 0x20;DIA_CHI có giá trị 0x20 nếu bạn viết như sau: MOVLW ,DIA_CHI ;LÚC NÀY THANH GHI W CÓ GIÁ TRI LÀ 0x20 MOVWF PORTB;PORTB CÓ GIÁ TRI LÀ 0x20 CÒN NẾU VIẾT NHƯ SAU: MOVLW DIA_CHI MOVWF FSR MOVF INDF,W ;LÚC NÀY DỮ LIỆUTRONG Ô NHỚ 0x20 ĐƯỢC ĐƯA VÀO W MOVWF PORTB |
đây là nguyên đoạn code của nó:
processor 16f877a ; KHAI BAO CHIP include <p16f877a.inc> ; KHAI BAO HEADER FILE __CONFIG _CP_OFF&_WDT_OFF&_BODEN_OFF&_PWRTE_ON&_XT_OSC&_WRT _OFF&_LVP_OFF&_CPD_OFF ;KHAI BAO CONFIG ;----------------------------------------------------------------------- ;KHai bao hang ;----------------------------------------------------------------------- SW1 EQU 0 SW2 EQU 1 SW3 EQU 2 SW4 EQU 3 LED1 EQU 4 LED2 EQU 5 LED3 EQU 6 LED4 EQU 7 ;------------------------------------------------------------------------ ;Chuong trinh chinh ;------------------------------------------------------------------------ ORG 0x000 GOTO start start BCF STATUS, RP1 BCF STATUS, RP0 ;chon bank 0 CLRF PORTB ;xoa PORTB BSF STATUS, RP0 ;chon bank 1 MOVLW b'00001111' MOVWF TRISB ;thiet lap pin IO cho PORTB BCF STATUS, RP0 ;chon bank 0 loop BTFSS PORTB, SW1 ;kiem tra trang thai SW1 CALL congtac1 ;thuc thi lenh nay neu SW1 duoc nhan BTFSS PORTB, SW2 CALL congtac2 BTFSS PORTB, SW3 CALL congtac3 BTFSS PORTB, SW4 CALL congtac4 GOTO loop ;---------chuong trinh con congtac----------- congtac1 CLRF PORTB ;xoa portb BSF PORTB, LED1 ;bat led1 RETURN ;tro ve chuong trinh chinh congtac2 CLRF PORTB BSF PORTB, LED2 RETURN congtac3 CLRF PORTB BSF PORTB, LED3 RETURN congtac4 CLRF PORTB BSF PORTB, LED4 RETURN END ;Ket thuc chuong trinh giờ mình đổi thành thế này: processor 16f877a ; KHAI BAO CHIP include <p16f877a.inc> ; KHAI BAO HEADER FILE __CONFIG _CP_OFF&_WDT_OFF&_BODEN_OFF&_PWRTE_ON&_XT_OSC&_WRT _OFF&_LVP_OFF&_CPD_OFF ;KHAI BAO CONFIG ;----------------------------------------------------------------------- ;KHai bao hang ;----------------------------------------------------------------------- SW1 SET 0X20 SW2 SET 0X21 SW3 SET 0X22 SW4 SET 0X23 LED1 SET 0X24 LED2 SET 0X25 LED3 SET 0X26 LED4 SET 0X27 ;------------------------------------------------------------------------ ;Chuong trinh chinh ;------------------------------------------------------------------------ ORG 0x000 GOTO start start BCF STATUS, RP1 BCF STATUS, RP0 ;chon bank 0 CLRF PORTB ;xoa PORTB =>PORTB=00000000 BSF STATUS, RP0 ;chon bank 1 MOVLW b'00001111' MOVWF TRISB ;thiet lap pin IO cho PORTB BCF STATUS, RP0 ;chon bank 0 loop BTFSS PORTB, SW1 ;kiem tra trang thai SW1 CALL congtac1 ;thuc thi lenh nay neu SW1 duoc nhan BTFSS PORTB, SW2 CALL congtac2 BTFSS PORTB, SW3 CALL congtac3 BTFSS PORTB, SW4 CALL congtac4 GOTO loop ;---------chuong trinh con congtac----------- congtac1 CLRF PORTB ;xoa portb BSF PORTB, LED1 ;bat led1 RETURN ;tro ve chuong trinh chinh congtac2 CLRF PORTB BSF PORTB, LED2 RETURN congtac3 CLRF PORTB BSF PORTB, LED3 RETURN congtac4 CLRF PORTB BSF PORTB, LED4 RETURN END ;Ket thuc chuong trinh kết quả: thay đổi phần khai báo hằng mầ chương trình vẫn chạy như nhau, pó tay |
Múi giờ GMT. Hiện tại là 10:27 AM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam