![]() |
|
Tài trợ cho PIC Vietnam |
Những câu hỏi thường gặp Những lỗi cơ bản thường gặp khi làm việc với PIC hoặc những vấn đề cơ bản nhất thường được hỏi trong những năm qua |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#1 |
Nhập môn đệ tử
Tham gia ngày: Nov 2007
Bài gửi: 7
: |
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. |
![]() |
![]() |
#2 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
![]() |
![]() |
#3 | |
Nhập môn đệ tử
Tham gia ngày: Feb 2008
Bài gửi: 5
: |
ASM in CCS
Trích:
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 |
|
![]() |
![]() |
#4 |
Đệ tử 5 túi
Tham gia ngày: Jan 2008
Bài gửi: 96
: |
Nhúng asm trong MikroC
Với MikroC, nhúng asm như sau:
asm { ...đặt code asm ở đây... } thay đổi nội dung bởi: minhsondaklak, 24-03-2008 lúc 06:47 AM. |
![]() |
![]() |
|
|