RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

Nhúng ASM vào trong C.

Collapse
This topic is closed.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • Waterloo
    Nhập môn đệ tử
    • Nov 2007
    • 7

    #1

    Nhúng ASM vào trong C.

    Hi folks,

    Các vị tiền bối cho em hỏi nếu dùng CSS hay HTPIC mà muốn viết cả C lẫn ASM vào trong 1 chương trình thì làm thế nào? Các bác có ví dụ nào thì cho một vài chiêu nhé.


    Em cám ơn nhiều.
  • namqn
    Trưởng lão PIC bang
    • Feb 2006
    • 3020

    #2
    Nguyên văn bởi Waterloo View Post
    Hi folks,

    Các vị tiền bối cho em hỏi nếu dùng CSS hay HTPIC mà muốn viết cả C lẫn ASM vào trong 1 chương trình thì làm thế nào? Các bác có ví dụ nào thì cho một vài chiêu nhé.

    Em cám ơn nhiều.
    Bạn đọc hướng dẫn về các directive #asm và #endasm của tài liệu hướng dẫn sử dụng CCS C. Tôi cho là tài liệu hướng dẫn của HTPIC C cũng có những hướng dẫn tương tự.

    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

    • wantanamo69
      Nhập môn đệ tử
      • Feb 2008
      • 5

      #3
      ASM in CCS

      Nguyên văn bởi namqn View Post
      Bạn đọc hướng dẫn về các directive #asm và #endasm của tài liệu hướng dẫn sử dụng CCS C. Tôi cho là tài liệu hướng dẫn của HTPIC C cũng có những hướng dẫn tương tự.

      Thân,
      ;/////////////////////////////////////////////////

      Thi du cho CCS:

      //-------------------------------
      /////////////////////////////////
      //

      #INT_GLOBAL
      void isr() {
      #asm
      //store current state of processor
      MOVWF save_w
      SWAPF status,W
      BCF status,5
      BCF status,6
      MOVWF save_status
      // Save anything else your code may change
      // You need to do something with PCLATH if you have GOTOs

      // remember to check to see what interrupt fired if using more than one!!

      // code for isr
      BCF t0if
      INCF counter,F
      BTFSC zero_flag
      INCF (&counter+1),F
      //
      // cho label coi co work khong
      goto TestLabel
      nop
      TestLabel:
      // restore processor and return from interrupt
      SWAPF save_status,W
      MOVWF status
      SWAPF save_w,F
      SWAPF save_w,W
      #endasm
      }

      ;///////////////////////////////////

      Thi du cho MCC18:

      //------------------- NutSelec

      //if portA.1 = 0 then // Bam nut Selec (sel cai option dang hi-light)
      if (!NutSelec) // Bam nut Selec (sel cai option dang hi-light)
      {
      DelayMs (20);
      ChoSelecNha:
      if (!NutSelec) goto ChoSelecNha; // debounce
      //
      //Select CuSoMenu // Coi la dang o hang nao
      switch (CuSoMenu)
      {
      case 3: // Neu dang o hang 2 thi "1_ CAT pophai"
      CatPoPhai(); // -- o screen nay se hoi po-phai so may --
      ClearScreen();
      SubChkMenu();
      break;
      case 4: // Neu dang o hang 3 thi "2_ Lay pophai"
      LayPoPhai(); // -- o screen nay se hoi po-phai so may --
      ClearScreen();
      SubChkMenu();
      break;
      case 5: // Neu dang o hang 4 thi "3_ Amb adjust"
      // Goi Amb adjust
      #asm nop #endasm //---> chu-y: Inline asenbly
      break;
      case 6: // Neu dang o hang 5 thi "4_ -- Exit --"
      // Goi -- Exit --
      #asm nop #endasm
      goto XongMenuVe;
      //break;
      } //EndSelect

      } //Endif
      //----------------------
      //

      Another example cho MCC18:

      Cai nay viet cho serial temperature (MAX6675)



      _asm

      //MOVLB 1 // sel bank
      clrf BitCountK ,1
      movlw 8 //; 8 bit (bit 15-8)
      TiepTucHet16_8:
      cpfslt BitCountK,1
      bra Lay7_0 //; Da doc het 8 bits cua hi-byte, xuong lay Lowe byte
      bsf PORTE, 0, ACCESS // _/"" SCK len
      NOP // them 2 nop cho clk lau hon
      btfsc PORTE, 2, ACCESS //RE2 //; Coi la bit-in CAO/THAP ?
      goto BitInCao
      bcf STATUS, 0, ACCESS //; bit nay THAP
      goto ProcessBits
      BitInCao:
      bsf STATUS, 0, ACCESS //C //; bit nay CAO
      ProcessBits:
      bcf PORTE, 0, ACCESS // ""\_ SCK xuong (lay bit xong roi)
      rlcf A12BitRet+1, 1, 1 //; bang cach rotate bit vao (da set hay clr o tren)
      incf BitCountK, 1,1 // 1, 0 //; tang so bit da dem
      goto TiepTucHet16_8 //; va doc cho den het 8 bits truoc

      _endasm

      //;;-----------

      _asm

      Lay7_0: //;--- Doc 8 bits ---
      //MOVLB 1 // sel bank
      clrf BitCountK, 1 //; bat dau 8 bit khac
      movlw 8 //; 8 bit (bit 7-0)
      TiepTucHet7_0:
      cpfslt BitCountK, 1
      bra DaHet12b2 //; Da doc het 12 bits roi
      bsf PORTE, 0, ACCESS //; _/"" SCK len
      NOP // them 2 nop cho clk lau hon
      btfsc PORTE, 2, ACCESS //RE2 Coi la bit-in CAO/THAP ?
      goto BitInCao2
      bcf STATUS, 0, ACCESS //; cho bit nay THAP
      goto ProcessBits2
      BitInCao2:
      bsf STATUS, 0, ACCESS //; cho bit nay CAO
      ProcessBits2:
      bcf PORTE, 0, ACCESS // ""\_ SCK xuong (lay bit xong roi)
      rlcf A12BitRet, 1, 1 //; chuan bi cho next bit
      incf BitCountK, 1, 1 //; tang so bit da dem
      goto TiepTucHet7_0 //; va doc cho den het 8 bits sau
      //;;
      //;;-----------
      DaHet12b2: //; Da doc het 16 (12) bits roi
      //;;



      _endasm

      A12BitTemp = A12BitRet; // de in ra coi bit 2 OPEN hay CLOSE

      ////============ thay bang asm ------------------/\-------


      _asm // --- cho them de biet la probe gan hay khong ---

      bcf ProbeOpen, 0, 1 // cho bit nay THAP truoc di la co probe connected
      btfsc A12BitRet, 2, 1 // Coi la bit2 CAO/THAP ?
      bsf ProbeOpen, 0, 1 // bit cao tuc la probe khong gan

      //_endasm

      //--- Bay gio lay 12 bits cua temperature ra ---

      movlw 0b01111111 //b'01111111' // bo bit 15 (dummy bit)
      andwf A12BitRet+1, 1, 1
      movlw 0b11111000 //b'11111000' // bo bit 2-0 (dummy bit)
      andwf A12BitRet, 1, 1
      //
      // Da co 12 bits, bay gio cho dung position (shift right 3 lan ca hai bytes)
      //
      bcf STATUS,0, ACCESS // clr carry cho chac chan
      rrcf A12BitRet+1,1, 1 // mot bit right
      rrcf A12BitRet , 1, 1

      bcf STATUS,0, ACCESS // clr carry cho chac chan
      rrcf A12BitRet+1, 1, 1 // mot bit right
      rrcf A12BitRet, 1, 1

      bcf STATUS,0, ACCESS // clr carry cho chac chan
      rrcf A12BitRet+1, 1, 1 // mot bit right
      rrcf A12BitRet, 1, 1



      //--- da co Nhiet Do trong "A12BitRet" ---

      _endasm


      TC_CS = 1;
      //TC_CLK = 0;

      A12BitTempL = A12BitRet; // de in ra coi bit 2 OPEN hay CLOSE
      //A12BitTempH = A12BitRet+1; // de in ra coi bit 2 OPEN hay CLOSE
      A12BitTempH = A12BitRet >> 8; //


      }

      //========================================
      //

      Regards,

      LB

      Comment

      • minhsondaklak
        Đệ tử 5 túi
        • Jan 2008
        • 96

        #4
        Nhúng asm trong MikroC

        Với MikroC, nhúng asm như sau:

        asm {
        ...đặt code asm ở đây... }
        Last edited by minhsondaklak; 24-03-2008, 06:47 AM.
        minhsondaklak@yahoo.com

        Comment

        Working...