PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 27-08-2009, 01:23 PM   #1
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-08-2009, 01:24 PM   #2
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
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ì????
congtri91 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-08-2009, 01:48 PM   #3
manhha2799
Đệ tử 5 túi
 
Tham gia ngày: Apr 2007
Bài gửi: 121
:
Send a message via Yahoo to manhha2799
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.
__________________
Bảng ledsigns chất lượng cao...
http://www.ledviet.info - manhha2700@yahoo.com
Đt:0949299699
manhha2799 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-08-2009, 07:26 PM   #4
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-08-2009, 09:10 PM   #5
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-08-2009, 09:11 PM   #6
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
rốt cục lệnh EQU là gán giá trị cho tham số hay là địa chỉ cho tham số???
congtri91 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-08-2009, 10:25 PM   #7
014104118
Nhập môn đệ tử
 
Tham gia ngày: Aug 2008
Bài gửi: 9
:
lenh SW3 EQU 3 la khai bao hang ten la "SW3" voi gia tri hang la 3
014104118 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-08-2009, 10:28 PM   #8
014104118
Nhập môn đệ tử
 
Tham gia ngày: Aug 2008
Bài gửi: 9
:
ban xem lai lenh "count1 EQU 0x20 " hay la lenh "count1 RES 0x20"
014104118 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-08-2009, 11:00 PM   #9
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
Trích:
Nguyên văn bởi 014104118 View Post
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-08-2009, 07:01 AM   #10
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-08-2009, 07:51 PM   #11
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
Trích:
Nguyên văn bởi ngocthanh07 View Post
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-08-2009, 07:56 PM   #12
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-08-2009, 09:40 PM   #13
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
ừ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
congtri91 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-08-2009, 10:41 AM   #14
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi congtri91 View Post
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
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-08-2009, 09:35 PM   #15
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
đâ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
congtri91 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 10:52 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam