PDA

View Full Version : thắcmawec về lệnh RRF(RLF) trong pic....


kakalevanhoi
28-08-2010, 10:44 AM
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 đỡ

unisa
29-08-2010, 04:39 PM
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.

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:

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

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 đã :D 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

namqn
29-08-2010, 05:30 PM
...
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,

unisa
30-08-2010, 02:54 AM
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é


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
30-08-2010, 03:36 AM
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


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