PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Những câu hỏi thường gặp (http://www.picvietnam.com/forum/forumdisplay.php?f=54)
-   -   Nhúng ASM vào trong C. (http://www.picvietnam.com/forum/showthread.php?t=1988)

Waterloo 14-02-2008 09:08 AM

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 14-02-2008 06:50 PM

Trích:

Nguyên văn bởi Waterloo (Post 14293)
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,

wantanamo69 15-03-2008 07:19 AM

ASM in CCS
 
Trích:

Nguyên văn bởi namqn (Post 14300)
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

minhsondaklak 24-03-2008 06:30 AM

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

asm {
...đặt code asm ở đây... }


Múi giờ GMT. Hiện tại là 06:40 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam