PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   kỹ thuật bảng pic (http://www.picvietnam.com/forum/showthread.php?t=4830)

congtri91 27-08-2009 01:23 PM

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’

congtri91 27-08-2009 01:24 PM

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ì????

manhha2799 27-08-2009 01:48 PM

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.

congtri91 27-08-2009 07:26 PM

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

congtri91 27-08-2009 09:10 PM

không ai kíu em với, giải thích kỹ giúp em lệnh equ thôi cũng được

congtri91 27-08-2009 09:11 PM

rốt cục lệnh EQU là gán giá trị cho tham số hay là địa chỉ cho tham số???

014104118 27-08-2009 10:25 PM

lenh SW3 EQU 3 la khai bao hang ten la "SW3" voi gia tri hang la 3

014104118 27-08-2009 10:28 PM

ban xem lai lenh "count1 EQU 0x20 " hay la lenh "count1 RES 0x20"

congtri91 27-08-2009 11:00 PM

Trích:

Nguyên văn bởi 014104118 (Post 29022)
ban xem lai lenh "count1 EQU 0x20 " hay la lenh "count1 RES 0x20"

không, nó là count1 EQU 0x20 , đây chỉ là cái lệnh hởi tạo biến trong hàm delay thôi, mình hỏi vì mình chưa hiểu về nó lắm. có phải khi viết lệnh này thì sẽ tạo ra một thanh ghi có tên COUNT1 ở địa chỉ 20h không??? xem datasheet thì 20h đến 7fh là thanh ghi mục đích chung mà

congtri91 28-08-2009 07:01 AM

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

congtri91 28-08-2009 07:51 PM

Trích:

Nguyên văn bởi ngocthanh07 (Post 29040)
Hằng số và Biến số khác nhau ở chỗ nào tin rằng nếu bạn đã từng học hết lớp 7 đã hiểu được. Chữ Hằng có nghĩa là "không thay đổi" còn chữ biến có nghĩa "thay đổi được"

cái vấn đề chính ở đây là mình thấy trong các tut mà mình down về thì chưa nói cụ thể về việc sử dụng nó thế nào cho đúng. đây là một đoạn trích dẫn trong bài vdk pic học nhanh đi vào ưng dụng:

" 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

congtri91 28-08-2009 07:56 PM

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

congtri91 28-08-2009 09:40 PM

ừ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

tdm 29-08-2009 10:41 AM

Trích:

Nguyên văn bởi congtri91 (Post 29054)
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

theo tôi cách viết trên được hiểu như sau:
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

congtri91 29-08-2009 09:35 PM

đâ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