thắcmawec về lệnh RRF(RLF) trong pic....

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • kakalevanhoi
    Đệ tử 1 túi
    • Jul 2010
    • 12

    #1

    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 đỡ
  • unisa
    Đệ tử 2 túi
    • May 2005
    • 27

    #2
    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
       
         [COLOR=Red][I]CALL  LOOP_DELAY[/I][/COLOR] sửa thành [B][COLOR=Red]CALL DELAY[/COLOR][/B]
         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:
    [B]BTFSS f,b [/B][I]với b thuộc [0,7][/I]
    - 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    
        [COLOR=Red][I][B]MOVLW    D'127'[/B][/I][/COLOR] [B][I]=> thừa[/I][/B]
        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
    Last edited by unisa; 30-08-2010, 01:59 AM.

    Comment

    • namqn
      Trưởng lão PIC bang
      • Feb 2006
      • 3020

      #3
      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

      Comment

      • unisa
        Đệ tử 2 túi
        • May 2005
        • 27

        #4
        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

        Comment

        • unisa
          Đệ tử 2 túi
          • May 2005
          • 27

          #5
          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

          Comment

          Working...