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 28-08-2010, 10:44 AM   #1
kakalevanhoi
Đệ tử 1 túi
 
Tham gia ngày: Jul 2010
Bài gửi: 12
:
Unhappy thắcmawec về lệnh RRF(RLF) trong pic....

chào mọi người...mình có chút théc méc mong mọi người giúp đỡ..
minh vừa mới bắt đầu học bít nên gặp chút khó khen,có gì không đúng mong mọi người chỉ giáo.minh viết 1 c.trinh cho led,nó chạy thì ok rồi,nhưng ma` khi mô phỏng sao lại thấy ko chạy như ý mình.
LIST P=16F877A ; LIST DIRECTIVE TO DEFINE PROCESSOR
#INCLUDE <P16F877A.INC> ; PROCESSOR SPECIFIC VARIABLE DEFINITIONS
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
; CP: code protect (o che do off de co the nap nhieu lan)
; WDT: WATCHDOG TIMER
; PWRTE:POWER UP ENABLE
; BODEN:...
; XT: THACH ANH <4 MHZ
; HS: 20MHZ > THACH ANH >4 MHZ
; RC: RES(10K) + CAP (33pF)
;================================================= =============
;==========KHAI BAI BIEN CHO HAM DELAY=========================
;
DELAY_VARIABLE UDATA
D_VAL1 RES 2
D_VAL2 RES 2

;================================================= =============
ORG 0x00
NOP
GOTO MAIN
;================================================= =============
ORG 0x0004
;GOTO INTER_GLOBAL (NHAY DEN VUNG NGAT)
;================================================= =============
ORG 0x0005 ;DIA CHI la`m VIEC BAN DAU CUA HAM MAIN

MAIN ;CHUONG TRINH CHINH

BANKSEL TRISB
CLRF TRISB



BANKSEL PORTB
MOVLW 0x00
LOOP MOVWF PORTB

CALL LOOP_DELAY
RRF PORTB,1
BTFSS PORTB,0

GOTO LOOP
;================================================= ===========
DELAY ; DELAY FUNCTION

BANKSEL D_VAL1
MOVLW D'127'
MOVWF D_VAL1 ;D_VAL1 = 127
MOVLW D'127'
MOVWF D_VAL2 ;D_VAL2 = 127
LOOP_DELAY

DECFSZ D_VAL1, F
GOTO LOOP_DELAY
MOVLW D'127'

MOVWF D_VAL1 ;D_VAL1 = 127
DECFSZ D_VAL2, F
GOTO LOOP_DELAY

RETURN ; EXIT DELAY FUNCTION
;================================================= =========================
END



mình dùng lệnh RRF ở PORTB.ban đầu ở portb la` 0000 0000
sau khi dùng RRF thi sẽ la` 1000 0000 va` tip tục la` 0100 0000 va` 0010 0000........
thì đáng lẽ led ban đầu sẽ sáng chân RB7,sau đó la` RB6 va` tip tục ..vậy ma` nó nháy theo kỉu gì đâu ko như ý minh.
con cái này nữa la` sao?khi mình bỏ lệnh BTFSS thi nó chỉ có led RB7 sáng.mong mọi người giúp đỡ
kakalevanhoi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-08-2010, 04:39 PM   #2
unisa
Đệ tử 2 túi
 
Tham gia ngày: May 2005
Bài gửi: 27
:
Hix, mình cũng mới học Pic, tí toáy sửa thử đoạn code của bạn, nếu có sai mong anh em chỉ dẫn thêm.

1. Theo thiết kế của bạn thí hình như bạn làm mức 1 = led sáng, mức 0 = led tắt, trong thiết kế vđk nói chung không nên làm như thế mà phải làm ngược lại, tức là cực + anode led nối vào nguồn còn cực catode led nối vào trở, rồi vđk, khi đó chân vđk mức 0 = đèn sáng. Phải thiết kế như vậy vì khi mức 1 của vđk xuất port, xong đổ ra rất bé, nếu bạn kéo nhiều led thì không chịu nổi, vđk chạy bậy hoặc led không sáng. Cái này mình làm bên 89 nhiều nên rành.

2.
Code:
BANKSEL PORTB
       MOVLW   0x00
LOOP   MOVWF   PORTB
   
     CALL  LOOP_DELAY sửa thành CALL DELAY
     RRF     PORTB,1
3. Lệnh RRF như sau:
RRF f,d với d thuộc [0,1]
nếu d = 0: dữ liệu sau khi dịch đc lưu trong thanh ghi w
nếu d = 1: dữ liệu sau khi dịch đc lưu vào chính nó (vào f)

4. Lệnh BTFSS (bit test file skip Set) như sau:
Code:
BTFSS f,b với b thuộc [0,7]
- nếu b = 0, làm jì đó (thường là nhảy đến 1 nhãn nào đó)
- nếu b = 1, làm jì đó (thường là nhảy đến 1 nhãn nào đó)
tức là sau lệnh kiểm tra xem portb.0 của bạn = 0 hay = 1, liền sau đó là 2 dòng bên dưới để xử lý, không hiểu bạn bỏ trống vậy là sao nhỉ.

5. chỗ này
Code:
MOVLW    D'127'
    MOVWF    D_VAL1                ;D_VAL1 = 127    
    MOVLW    D'127' => thừa
    MOVWF    D_VAL2                ;D_VAL2 = 127
chỗ mình ghi thừa có cũng đc, ko có cũng đc, vì bạn nạp giá trị vào thanh ghi W ở trên = 127 rồi, nếu xuống dưới nạp y chang thì ko cần nạp lại, do thanh ghi w vẫn còn mang giá trị 127 mà, trừ khi trước đó có lệnh tác động làm thay đổi giá trị thanh ghi w thì mới phải nạp lại giá trị 127 thui.

Túm lại, bạn kím nhầm cái ví dụ tùm lum rùi, mới học pic thì tìm mí bài đơn giãn tập viết 1 led, nút nhấn ... cho hiểu lệnh cái đã mình cũng mới học pic đây thui.
Lên trang này, tìm bài học pic 1 ngày tham khảo đi bạn nhé, chúc thành công

thay đổi nội dung bởi: unisa, 30-08-2010 lúc 02:59 AM.
unisa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-08-2010, 05:30 PM   #3
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi unisa View Post
...
1. Theo thiết kế của bạn thí hình như bạn làm mức 1 = led sáng, mức 0 = led tắt, trong thiết kế vđk nói chung không nên làm như thế mà phải làm ngược lại, tức là cực + anode led nối vào nguồn còn cực catode led nối vào trở, rồi vđk, khi đó chân vđk mức 0 = đèn sáng. Phải thiết kế như vậy vì khi mức 1 của vđk xuất port, xong đổ ra rất bé, nếu bạn kéo nhiều led thì không chịu nổi, vđk chạy bậy hoặc led không sáng. Cái này mình làm bên 89 nhiều nên rành.
...
PIC không giống các vi mạch họ 89. Khả năng sink (hút) và source (cấp) dòng của các chân PIC hoàn toàn giống nhau (vì PIC dùng công nghệ CMOS). Do đó, không cần phải sử dụng thủ thuật như bạn đã nêu trên.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-08-2010, 02:54 AM   #4
unisa
Đệ tử 2 túi
 
Tham gia ngày: May 2005
Bài gửi: 27
:
mình đã viết lại chương trình của bạn và test ok trên poteus 7.5 sp3, chưa có điều kiện test thực tế nhưng như vậy cũng tạm ok rùi, bạn tham khảo nhé

Code:
    LIST P=16F877A ; LIST DIRECTIVE TO DEFINE PROCESSOR
    #INCLUDE <P16F877A.INC> ; PROCESSOR SPECIFIC VARIABLE DEFINITIONS

DATA_LED    EQU    H'0B'
D_VAL1         EQU H'0C'
D_VAL2         EQU H'0D'
D_VAL3        EQU    H'0E'
;================================================= =============
    ORG 0x00
    GOTO MAIN
;================================================= =============
    ORG 0x04
;GOTO INTER_GLOBAL (NHAY DEN VUNG NGAT)
;================================================= =============
    ORG 0x05 ;DIA CHI la`m VIEC BAN DAU CUA HAM MAIN

MAIN ;CHUONG TRINH CHINH

    BANKSEL TRISB
    CLRF TRISB
    BANKSEL PORTB
ABC
    MOVLW    B'10000000'
    MOVWF    DATA_LED    ; NAP GIA TRI W VAO DATA_LED
    MOVWF    PORTB        ; LED 7 SANG (TUONG UNG PORTB.7 = 1)
    CALL    DELAY        
LOOP 
    RRF        DATA_LED,1    ; XOAY PHAI DATA_LED
    MOVF    DATA_LED,0    ; NAP GIA TRI DATA_LED NGUOC TRO LAI W
    MOVWF    PORTB        ; LAY GIA TRI W XUAT RA PORTB
    CALL    DELAY

    BTFSS    DATA_LED,0    ; NEU PORTB.0 = 0 THÌ NHAY DEN LOOP,NEU = 1 THÌ NHAY DEN ABC
    GOTO     LOOP
    GOTO    ABC
;================================================= ===========
DELAY ; DELAY FUNCTION

    BANKSEL D_VAL1
    MOVLW D'255'
    MOVWF D_VAL1 ;D_VAL1 = 255
    MOVWF D_VAL2 ;D_VAL2 = 255
    MOVLW D'20'
    MOVWF D_VAL3
LOOP_DELAY

    DECFSZ D_VAL1
    GOTO LOOP_DELAY
    NOP
    DECFSZ D_VAL2
    GOTO LOOP_DELAY
    NOP
    DECFSZ D_VAL3
    GOTO LOOP_DELAY

    RETURN ; EXIT DELAY FUNCTION
;================================================= =========================
    END
unisa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-08-2010, 03:36 AM   #5
unisa
Đệ tử 2 túi
 
Tham gia ngày: May 2005
Bài gửi: 27
:
tuy nhiên mình gặp rắc rối với lệnh xoay, khi mình xoay trực tiếp Portb thì không được, không hiểu sao nữa

Code:
ABC
    MOVLW    B'10000000'
    MOVWF    PORTB        ; LED 7 SANG (TUONG UNG PORTB.7 = 1)
    CALL    DELAY   
     
LOOP 
    RRF        PORTB,1    ; XOAY PHAI PORTB
    CALL    DELAY
    GOTO     LOOP
mình đọc 1 tutorial của Nguyễn Trung chính về 877A có cái ví dụ xoay trực tiếp PortB, nhưng mình làm mãi không đc mà phải mượn qua trung gian ô nhớ khác
unisa 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à 05:35 PM.


Đượ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