Hỏi ý nghĩa lệnh asm

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • DIEP
    Đệ tử 1 túi
    • Oct 2007
    • 15

    #1

    Hỏi ý nghĩa lệnh asm

    Xin các bạn giải thích ý nghĩa lệnh bz và bnz trong đoạn code sau:

    drive2
    movf porta,w ;Read PORTA
    sublw b'000000110' ;Check motor position
    bnz drive4 ;Unmatch
    movf mode,w ;Read mode
    sublw d'1' ;Right ?
    bz drive3 ;Yes. Right
    movlw b'00000101' ;No. Set Left data
    goto drive_end ;Jump to PORTA write
  • tungnh
    Đệ tử 5 túi
    • Sep 2007
    • 94

    #2
    Nguyên văn bởi DIEP View Post
    Xin các bạn giải thích ý nghĩa lệnh bz và bnz trong đoạn code sau:

    drive2
    movf porta,w ;Read PORTA
    sublw b'000000110' ;Check motor position
    bnz drive4 ;Unmatch ---->>>>>>>>>>>> if result # 0 goto drive4
    movf mode,w ;Read mode
    sublw d'1' ;Right ?
    bz drive3 ;Yes. Right --->>>>>>>>>>>>> if result = 0 goto drive3
    movlw b'00000101' ;No. Set Left data
    goto drive_end ;Jump to PORTA write
    Lệnh bz là lệnh nhảy.Nếu kết quả = 0 thì nhảy đến nhãn, với lệnh bnz thì kết quả khác 0 thì nhảy đến nhãn.
    Windows CE 6 R3

    Comment

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

      #3
      BZ và BNZ là hai lệnh giả (Pseudo-instruction) được xây dựng dưới dạng các macro trong trình hợp dịch (assembler) MPASM.

      BZ nhan sau khi hợp dịch sẽ được khai triển thành
      Code:
      	BTFSC	3, 2
      	GOTO	nhan
      Còn BNZ nhan sau khi hợp dịch sẽ được khai triển thành
      Code:
      	BTFSS	3, 2
      	GOTO	nhan
      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

      • Babade
        Nhập môn đệ tử
        • Jan 2010
        • 4

        #4
        các anh ơi kíu em với.Em đang làm đồ án vxl lập trình robot dùng 16f877a mà chưa biết j nhìu.Em cóp nhạt vài đoạn code viet lại thi robot toan di lùi.Các cao thủ kíu em bàn thua này với.
        doan code cua em the này,các bác đọc đừng cười nhé
        ----------------------------------------------------------------
        #include "16f877a.h"
        #include "DEF_877A.H"
        #INT_EXT
        #use delay(clock=12000000hz)
        #fuses HS,NOWDT,NOPROTECT,NOLVP
        /*DINH NGHIA CHAN*/
        #define tien1 rc1
        #define LUI1 rc0
        #define tien2 rc2
        #define LUI2 rc3
        #define CHAY1 rc4
        #define CHAY2 rc5
        #define GAT3 rc6
        #define hanh_trinh ra4

        #define SENSOR PORTB
        /*#define SENSOR1 rb1
        #define SENSOR2 rb2
        #define SENSOR3 rb3
        #define SENSOR4 rb4
        #define SENSOR5 rb5
        #define SENSOR6 rb6*/
        /*KHAI BAO CON*/
        void trai_tien();
        void trai_lui();
        void trai_dung();
        void fai_tien();
        void fai_lui();
        void fai_dung();

        void TIEN();
        void LUI();
        void RE_TRAI();
        void RE_FAI();
        void STOP();
        void GAT_VAT();
        void DO_VAT();
        void KIEM_TRA_VACH();
        void GIUA_VACH();
        void kt_SENSOR();
        void TOI_DICH();
        /*CHUONG TRINH CON CO BAN*/
        void trai_tien()
        {
        CHAY1=1;
        TIEN1=1;
        LUI1=0;
        }
        void trai_lui()
        {
        CHAY1=1;
        TIEN1=0;
        LUI1=1;
        }
        void trai_dung()
        {
        CHAY1=0;
        }
        void fai_tien()
        {
        CHAY2=1;
        TIEN2=1;
        LUI2=0;
        }
        void fai_lui()
        {
        CHAY2=1;
        TIEN2=0;
        LUI2=1;
        }
        void fai_dung()
        {
        CHAY2=0;
        }
        void TIEN()
        {
        trai_tien();
        fai_tien();
        }
        void LUI()
        {
        trai_lui();
        fai_lui();
        }
        void RE_FAI(int i)
        {
        fai_dung();
        trai_tien();
        }
        void RE_TRAI(int i)
        {
        trai_dung();
        fai_tien();
        }
        void STOP()
        {
        trai_dung();
        fai_dung();
        }
        /*HAM HO TRO*/
        void trai_tien(int i)
        { CHAY1=1;
        SETUP_TIMER_2(T2_DIV_BY_4,124,1);
        SETUP_CCP2(CCP_PWM);
        SET_PWM2_DUTY(i);
        }
        void fai_tien(int i)
        {
        CHAY2=1;
        SETUP_TIMER_2(T2_DIV_BY_4,124,1);
        SETUP_CCP1(CCP_PWM);
        SET_PWM1_DUTY(i);
        }
        /*XU LY TOC DO*/

        void TOC_DO (signed int TOC_DO_TRAI, signed int TOC_DO_FAI)
        {
        int TRAI_PWM_i=0,FAI_PWM_i=0;
        /* TRAI */
        if( TOC_DO_TRAI >= 0 )
        {
        TRAI_PWM_i = 1.25*TOC_DO_TRAI;
        TRAI_TIEN(TRAI_PWM_i);
        }
        else
        {
        TOC_DO_TRAI = -TOC_DO_TRAI;
        TRAI_PWM_i = 1.25*TOC_DO_TRAI;
        /* FAI */
        if( TOC_DO_FAI >= 0 )
        {
        FAI_PWM_i = 1.25*TOC_DO_FAI;
        FAI_TIEN(FAI_PWM_i);
        }
        else
        {
        TOC_DO_FAI = -TOC_DO_FAI;
        FAI_PWM_i = 1.25*TOC_DO_FAI;

        }
        }
        }
        /* DIEU KHIEN CHINH*/


        void GAT_VAT()
        {
        STOP();
        GAT3=1;
        {
        char x=0;
        TRISA = 0b00010000;
        TRISC=0x0;
        PORTC=0;
        SETUP_TIMER_0(RTCC_EXT_H_TO_L);
        SET_RTCC(0);
        while (true)
        {
        x=GET_RTCC();
        if (x==2) GAT3=0;
        }
        }

        }


        void main()
        {
        TRISB=0x01;
        TRISC=0x00;
        enable_interrupts(GLOBAL);
        enable_interrupts(INT_EXT);
        }

        switch (SENSOR)
        {
        case 0b11111110 : GAT_VAT(); break;
        case 0b11111100 : GAT_VAT(); break;
        case 0b11000000 : GAT_VAT(); break;
        case 0b11100000 : GAT_VAT(); break;
        case 0b10100000 : GAT_VAT(); break;
        case 0b10110000 : GAT_VAT(); break;
        case 0b10010000 : GAT_VAT(); break;
        case 0b10011000 : GAT_VAT(); break;
        case 0b10001000 : GAT_VAT(); break;
        case 0b10001100 : GAT_VAT(); break;
        case 0b10000100 : GAT_VAT(); break;
        case 0b00000000: LUI() ; break;
        case 0b00010000: TIEN() ; break;
        case 0b00110000: RE_TRAI(80) ; break;
        case 0b00100000: RE_TRAI(60) ; break;
        case 0b01100000: RE_TRAI(40) ; break;
        case 0b01000000: RE_TRAI(30) ; break;
        case 0b00011000: RE_FAI(80) ; break;
        case 0b00001000: RE_FAI(60) ; break;
        case 0b00001100: RE_FAI(40) ; break;
        case 0b00000100: RE_FAI(20) ; break;
        case 0b01111100: TIEN() ; break;
        case 0b01111110: STOP() ; break;
        }
        }

        Comment

        Working...