PDA

View Full Version : dsPIC Tutorial 2-Các kỹ thuật cơ bản


namqn
03-05-2006, 11:39 PM
Tutorial 2 cho dsPIC, viết trong ASM30. Bà con đừng nôn nóng nhé, sẽ có các tutorial viết bằng C30. Những vấn đề cơ bản về dsPIC nên được viết bằng ASM30, để hiểu rõ hơn cấu trúc của chip.

Tutorial này chỉ có các ví dụ về LED, nhưng có nhiều kỹ thuật cơ bản và khá nhiều lệnh cơ bản được đề cập, do đó các bạn đừng bỏ qua nó. Tôi sẽ dựa vào những kỹ thuật và lệnh cơ bản này để viết tiếp các tutorial khác.

Các tập tin nguồn và .hex nằm trong tập tin .zip nhé.

Chúc thành công nhé!

Thân,

namqn
08-08-2006, 07:58 PM
Như đã thông báo, dưới đây là link để download các mã nguồn viết trong C30 (và các tập tin .hex đã được dịch ra) cho các ví dụ của tutorial này. Các mã nguồn C30 được chuyển đổi từ các mã nguồn ASM30, với chú thích khá chi tiết, do đó tôi sẽ không viết tutorial cho phiên bản C30.
http://picvietnam.com/download/upload/namqn/Vidu2C30.zip

Chúc thành công!

Thân,

namqn
23-11-2006, 06:49 PM
Của em đây!

Thân,

typhn
26-11-2006, 10:01 PM
Chào bác nam.trước em có làm với pic6F877A,bây giờ em chuyển sang học về DSPIC.
Bác có thể nói rõ hơn về thanh ghi LATX được ko bác.
Con 877A ko có thanh ghi này và em đọc trong datasheet thì ko hiểu lắm.
Thanh ghi TrisX thì vẫn giống 877A,để định ngiã cổng vào/ra
Còn thanh ghi PortX trong 877A để xuất dữ liệu ra là mức cao hay thấp.
Còn trong các ví dụ của bác,em chưa thấy được vai trò của PortX
Và dường như bác toàn sử dụng LatX.
Bác nói rõ hơn cho em được ko
Thanks bác

namqn
27-11-2006, 02:25 AM
Chào bác nam.trước em có làm với pic6F877A,bây giờ em chuyển sang học về DSPIC.
Bác có thể nói rõ hơn về thanh ghi LATX được ko bác.
Con 877A ko có thanh ghi này và em đọc trong datasheet thì ko hiểu lắm.
Thanh ghi TrisX thì vẫn giống 877A,để định ngiã cổng vào/ra
Còn thanh ghi PortX trong 877A để xuất dữ liệu ra là mức cao hay thấp.
Còn trong các ví dụ của bác,em chưa thấy được vai trò của PortX
Và dường như bác toàn sử dụng LatX.
Bác nói rõ hơn cho em được ko
Thanks bác
Trong các PIC cấp thấp (chẳng hạn như PIC16F877A), chỉ có một thanh ghi xuất nhập, và do hiệu ứng read-modify-write, các thao tác đối với các thanh ghi ngõ vào/ngõ ra có thể gây ra những khó khăn, buộc người dùng phải thực hiện các chuỗi thao tác nhất định để tránh những rắc rối có thể có. Tôi đã nói về read-modify-write ở một luồng khác, bạn hãy dùng chức năng Search của diễn đàn để tìm.

Kể từ dòng PIC cấp cao (PIC18), Microchip đã sử dụng hai thanh ghi đệm cho các thao tác xuất nhập, là LATx và PORTx. Như vậy, khi ghi ra các ngõ ra, chúng ta sẽ thao tác thanh ghi LATx, còn khi đọc vào từ các ngõ vào, chúng ta sẽ thao tác thanh ghi PORTx, và sẽ tránh được các rắc rối liên quan đến hiệu ứng read-modify-write.

Bạn có thể thấy tôi sử dụng các thanh ghi PORTx ở tutorial 3, khi đọc trạng thái của các switch.

Thân,

typhn
27-11-2006, 08:46 PM
ah,thì ra là vậy,cảm ơn bác.
Bác cho em hỏi câu nữa,nếu bác có thời gian.
Nếu 1 cổng định nghĩa là lối vào(như RE0) chẳng hạn thì nó ở trạng thái
trở kháng cao phải ko bác( tức là ko phải mức 0 mà cũng chả phải mức 1).

namqn
28-11-2006, 01:25 AM
ah,thì ra là vậy,cảm ơn bác.
Bác cho em hỏi câu nữa,nếu bác có thời gian.
Nếu 1 cổng định nghĩa là lối vào(như RE0) chẳng hạn thì nó ở trạng thái
trở kháng cao phải ko bác( tức là ko phải mức 0 mà cũng chả phải mức 1).
Một chân được định nghĩa là ngõ vào sẽ có bộ đệm ngõ ra bị disable. Chân đó sẽ được dùng như một ngõ vào dạng CMOS, với đặc tính Schmitt Trigger cho đa số chân.

Thân,

longho559
26-02-2007, 12:06 PM
//Chuong trinh con khoi tao Timer 1, tran sau moi 1 giay o muc xung 8 Mips
void Init_TMR1(void) {
TMR1 = 0; //Xoa so dem trong TMR1
PR1 = 0x7A12; //Nguong tran la 1 giay tuong ung voi clock = 32 MHz
_T1IF = 0; //Xoa co ngat cua Timer 1
T1CON = 0x8030; //Dung fcy lam clock, prescale = 1:256, bat Timer 1
_T1IE = 1; //Cho phep ngat Timer 1
}
Trong đoạn chương trình trên em ko hiểu phần nhập giá trị PR1 = 0x7A12; sao lại ra 1 giây và phần T1CON = 0x8030; anh Nam có thể giải thích rõ hơn được ko?

namqn
26-02-2007, 05:55 PM
T1CON<5:4> = '11' sẽ cho prescale là 1:256 (nghĩa là 256 chu kỳ máy thì timer 1 mới đếm thêm 1 đơn vị), và T1CON<15> = '1' để bật timer. Vậy T1CON = 1000 0000 0011 0000 = 0x8030.

PR1 = 0x7A12 = 31250.

Với tần số thực thi lệnh (Fosc/4) = 8 MIPS = 8000000, thời gian để timer 1 tràn là 8000000/(256*31250) = 1 (giây).

Thân,

hoanf
10-08-2007, 11:17 AM
Chào anh namqn!

Trong tài liệu của anh đưa, em có thấy sử dụng chương trình mô phỏng dsPIC30F4012. Anh có thể cho biết đó là chương trình mô phỏng gì và share chương trình đó được kô.

Thanks
hoanf

namqn
10-08-2007, 06:06 PM
Chào anh namqn!

Trong tài liệu của anh đưa, em có thấy sử dụng chương trình mô phỏng dsPIC30F4012. Anh có thể cho biết đó là chương trình mô phỏng gì và share chương trình đó được kô.

Thanks
hoanf
Có lẽ bạn nhìn vào sơ đồ nguyên lý của mạch nên nhận xét như vậy. Tôi chỉ tạo ra ký hiệu cho dsPIC4012 trong Proteus thôi, chứ ngoài MPLAB SIM ra thì tôi chưa biết có phần mềm nào có thể mô phỏng dsPIC.

Thân,

ajack
03-03-2008, 05:51 PM
// Timer 1 initialize: Internal Cycle Clock, với period_value = 16000, internal cycle là 16MIPs
void init_Timer1 (unsigned int Period_Value)
{
T1CONbits.TON = 0; // Disable Timer
T1CONbits.TCS = 0; // Select internal instruction cycle clock
T1CONbits.TGATE = 0; // Disable Gated Timer mode
T1CONbits.TCKPS = 0b00; // Select 1:1 Prescaler
TMR1 = 0x00; // Clear timer register
PR1 = Period_Value; // Load the period value,
IPC0bits.T1IP = 0x01; // Set Timer 1 Interrupt Priority Level
IFS0bits.T1IF = 0; // Clear Timer 1 Interrupt Flag
IEC0bits.T1IE = 1; // Enable Timer1 interrupt
T1CONbits.TON = 1; // Start Timer
}

Không hiểu tại sao mà mình không tạo được interrupt 1ms, mà lâu hơn 1ms

namqn
03-03-2008, 06:41 PM
// Timer 1 initialize: Internal Cycle Clock, với period_value = 16000, internal cycle là 16MIPs
void init_Timer1 (unsigned int Period_Value)
{
T1CONbits.TON = 0; // Disable Timer
T1CONbits.TCS = 0; // Select internal instruction cycle clock
T1CONbits.TGATE = 0; // Disable Gated Timer mode
T1CONbits.TCKPS = 0b00; // Select 1:1 Prescaler
TMR1 = 0x00; // Clear timer register
PR1 = Period_Value; // Load the period value,
IPC0bits.T1IP = 0x01; // Set Timer 1 Interrupt Priority Level
IFS0bits.T1IF = 0; // Clear Timer 1 Interrupt Flag
IEC0bits.T1IE = 1; // Enable Timer1 interrupt
T1CONbits.TON = 1; // Start Timer
}

Không hiểu tại sao mà mình không tạo được interrupt 1ms, mà lâu hơn 1ms
Mức độ lâu hơn ra sao: lâu hơn một chút, hay gấp đôi, gấp ba, hay nhiều hơn nữa? Bạn dựa vào đâu để cho rằng dsPIC chạy ở 16 MIPS?

Thân,

ajack
03-03-2008, 07:11 PM
mình đã config cho dsPIC chạy ở chế độ 16 MPIs như sau:

_FOSCSEL(FNOSC_FRC); // Select Internal FRC at POR
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT); // Enable Clock Switching and Configure POSC in XT mode
_FWDT(FWDTEN_OFF); // Disable Watchdog Timer

int main (void)
{
// Configure PLL prescaler, PLL postscaler, PLL divisor
PLLFBD = 62; // M = 64
CLKDIVbits.PLLPOST = 1; // N2 = 4 N2 = 2 x (PLLPOST+1)
CLKDIVbits.PLLPRE = 2; // N1 = 4 N1 = PLLPRE + 2

// Fosc calculation equation:
// Fosc = Fin x M/(N1+N2) = 8x64/(4x4) = 32MHz
// Fcy = 0.5Fosc = 16MIPs

/******* Clock Switching *******/
// Set New Oscillator Selection
__builtin_write_OSCCONH(3);

// Request Clock Switching by Setting OSWEN bit
__builtin_write_OSCCONL(1);

// Wait for Clock switch to occur
while(OSCCONbits.LOCK != 1);
...
}


tại vì trong datasheet của dsPIC33F, mình thấy nó ghi là không nên thay đổi những thông số của PLL, nên để lúc đầu là internal FRC rồi chỉnh thông số, rồi sau đó hãy chuyển sang PriO w/ PLL
Nhưng bạn thấy trên phần init_Timer1 của mình intialize như vậy thì đúng là nếu như dsPIC chạy ở 16 MIPs thì timer sẽ interrupt ở 1ms chứ?
Hơn nữa, đây là intterupt trong timer1 để mình kiểm tra:

// Timer 1 Interrupt Routine
void __attribute__((__interrupt__)) _T1Interrupt( void )
{
_count++;
home_it();
line_2();
LATAbits.LATA4 = ~LATAbits.LATA4;
if ( _count==1000 )
{
_count = 0;
LATAbits.LATA5 = ~LATAbits.LATA5; // PORTA.5 nối với đèn LED
}

IFS0bits.T1IF = 0; // Clear Timer 1 flag
}


đáng lý ra thì cứ phải 1s là đèn LED sẽ nhấp nháy, vậy mà chắc cũng 10s...

namqn
03-03-2008, 08:25 PM
Bạn thử comment các hàm home_it() và line2() xem. Ngắt của bạn xảy ra mỗi ms, không nên để các hàm xuất tín hiệu ra LCD (tôi đoán vậy) vào trình xử lý ngắt.

Thân,

nghean
02-04-2008, 08:18 PM
Trong ví dụ 2-4.c - Tutorial 2 của anh Nam đó có dòng khai báo bảng hằng số trong ROM là
const unsigned __attribute__ ((space(psv), address (0x0200)))
LED_PAT[10] = {0xFFFE, 0xFFFD, 0xFFFB, 0xFFF7, 0xFFEF, 0xFFDF, 0xFFEF, 0xFFF7, 0xFFFB, 0xFFFD};
anh cho em hỏi là mình muốn khai báo bảng sin gồm 2000 phần tử float (tức cần khoảng 8Kbyte) thì có được không? cách truy cập nó như thế nào?

namqn
02-04-2008, 09:07 PM
Trong ví dụ 2-4.c - Tutorial 2 của anh Nam đó có dòng khai báo bảng hằng số trong ROM là
const unsigned __attribute__ ((space(psv), address (0x0200)))
LED_PAT[10] = {0xFFFE, 0xFFFD, 0xFFFB, 0xFFF7, 0xFFEF, 0xFFDF, 0xFFEF, 0xFFF7, 0xFFFB, 0xFFFD};
anh cho em hỏi là mình muốn khai báo bảng sin gồm 2000 phần tử float (tức cần khoảng 8Kbyte) thì có được không? cách truy cập nó như thế nào?
Tất nhiên là được, miễn là dsPIC của bạn có đủ chỗ trống trong bộ nhớ chương trình cho bảng hằng số đó. Bạn chỉ cần khai báo tương tự như trên, thay từ khóa unsigned bằng từ khóa float, và dùng một biến float để truy cập các phần tử của bảng, theo cách mà tôi đã minh họa trong tutorial.

PSV là một cửa sổ 32 kB, về nguyên tắc là bạn có thể thực hiện yêu cầu trên.

Thân,

nghean
02-04-2008, 09:54 PM
Em đã thử khai báo
float __attribute__ ((space(psv), address (0x0200)))
Sin[2001];
bởi vì đang cần tính các giá trị sin sau mới đưa vào bảng
nhưng khi biên dịch báo lỗi
Link Error: Could not allocate section .data_0x200 at 0x200
Link Error: Could not allocate program memory
vậy có cách nào khai báo môt mảng như trên tính các giá trị rồi lưu vào ROM k anh?
cảm ơn anh

chukhivuitinh
26-04-2008, 05:52 PM
bác nam cho em hỏi ,làm sao để set mức xung là 5Mips or 8Mips khi sử dụng dao động nội ??? em chỉ thấy set mỗi cái FRC_PLL4

namqn
26-04-2008, 06:18 PM
Em đã thử khai báo
float __attribute__ ((space(psv), address (0x0200)))
Sin[2001];
bởi vì đang cần tính các giá trị sin sau mới đưa vào bảng
nhưng khi biên dịch báo lỗi
Link Error: Could not allocate section .data_0x200 at 0x200
Link Error: Could not allocate program memory
vậy có cách nào khai báo môt mảng như trên tính các giá trị rồi lưu vào ROM k anh?
cảm ơn anh
Để lưu bảng vào flash, các phần tử của bảng phải là hằng số vào thời điểm biên dịch mã nguồn. Do đó, bạn nên dùng một công cụ khác để tạo ra bảng giá trị trước (Excel chẳng hạn), rồi copy các giá trị đó vào khai báo bảng hằng số của bạn.

Trong khai báo trên, bạn đã bỏ mất từ khóa const, do đó thông báo lỗi đầu tiên cho thấy trình biên dịch thông báo không thể cấp phát bộ nhớ dữ liệu cho bạn ở địa chỉ 0x200 (vì trình biên dịch hiểu là bạn cần RAM cho 2001 ô nhớ kiểu float, bắt đầu ở địa chỉ 0x200).

Thân,

namqn
26-04-2008, 06:28 PM
bác nam cho em hỏi ,làm sao để set mức xung là 5Mips or 8Mips khi sử dụng dao động nội ??? em chỉ thấy set mỗi cái FRC_PLL4
Tôi cho là không thể thiết lập 5 MIPS khi dùng bộ dao động nội của dsPIC, vì các FRC của dsPIC30F có tần số 7.37 hoặc 8 MHz, và để dùng tần số thực thi lệnh từ 2 MIPS trở lên với bộ dao động nội, chúng ta sẽ cần dùng bộ PLL. Lấy ví dụ dsPIC30F4012, chúng ta chỉ có thể dùng PLL x4, x8 hoặc x16.

Nếu tần số của FRC là 8 MHz, để có tần số thực thi lệnh là 8 MIPS thì chỉ cần dùng FRC với PLL x4 (chính là cấu hình FRC_PLL4).

Thân,

chukhivuitinh
28-04-2008, 01:22 AM
Em thắc mắc bởi vì trong vd 2_1 có dòng :
"Hai dòng lệnh 26 và 27 đặt ngưỡng tràn tương ứng với 0,5
giây ở tần số thực thi lệnh là 5 MHz (tức là chip có clock bằng 20 MHz)."
rồi xuống cuối ví dụ a có dòng :
"điều chỉnh ngưỡng tràn để LED sẽ nhấp nháy
đúng 1 Hz (với mã hiện tại thì LED sẽ nhấp nháy ở 1,6 Hz, vì tần số thực thi lệnh
của chip sẽ là 8 MHz với bộ dao động nội 8 MHz và PLLx4 được kích hoạt) "

Sau khi đọc câu trả lời của a thì em đã hiểu ý nghĩa của dòng cuối này ,chứ trước đó em ko hiểu tại sao cùng set PLL4 mà sao trên thì 5MHz ,dưới thì 8 Mhz .Nhưng em đọc trong cái dsPIC Manual thì thấy FRC là 7,37 Mhz ,vậy PLLx4 = 29.48Mhz ,PLLx8 = 58.96 Mhz ,PLLx16 = 117.92 Mhz ,vậy đâu dùng 8Mhz được ,và giá trị nhỏ nhất của bộ dao động nội là 29.48Mhz ??? mà sao người ta để lẻ thế nhỉ ???

Ah ,anh giải thích thêm dùm em về cách khai báo biến :
ở vd 2-3 :
_ .bss cho đoạn chứa các dữ liệu không khởi tạo giá trị
(.data cho đoạn chứa các dữ liệu khởi tạo giá trị <<< là hằng số ??? )
_ .align 2 << ???
_ count: .space 2 << khai bao biến count 16bit
ở vd 2-4 :
_ .section Table,psv, address(0x0200) <<< khai báo bảng Table có địa chỉ 0x0200 ,vậy psv ở đây nghĩa là jì ???Trong cái tag Output em chẳng thấy cái psv này đâu cả :section address length (PC units) length (bytes) (dec)
------- ------- ----------------- --------------------
.reset 0 0x4 0x6 (6)
.ivt 0x4 0x7c 0xba (186)
.aivt 0x84 0x7c 0xba (186)
.text 0x100 0x4c 0x72 (114)
.dinit 0x14c 0x2 0x3 (3)
.isr 0x14e 0x2 0x3 (3)
Table 0x200 0x14 0x1e (30)
__FOSC 0xf80000 0x2 0x3 (3)
__FWDT 0xf80002 0x2 0x3 (3)
__FBORPOR 0xf80004 0x2 0x3 (3)
__FGS 0xf8000a 0x2 0x3 (3)

Total program memory used (bytes): 0x21c (540) 1%


Tiếp tục ^_^ ,trong vd 2-4 PSV là bit 2 trong thanh ghi Core Control Register CORCON
vậy dòng :
_ mov #psvpage(Table),W0 <<< xác định địa chỉ trang chứa Table vào W0 ???
_ mov W0, PSVPAG <<< ghi cái địa chỉ này vào thanh ghi PSVPAG
_ mov #psvoffset(Table),W1 <<< ghi vị trí các số hạng vào W1 ???
_ mov W1, W2 <<< lấy vị trí đầu bảng ,em coi watch thì thấy vị trí này là 0x8200 ???
_ add W1,#(1082), W3 <<< lấy vị trí cuối bảng ,10*2 = 10 giá trị 2byte ??? em koi watch thì vị trí này là 0x8214 ???? 10 giá trị mà sao lại 0x8214 ??
_ #psvpage với #psvoffset em kiếm trong datasheet với cái 70157C mà ko thấy nói .Cái này do định nghĩa sẵn trong chip ah ???

Típ nữa ^_^ :
dòng:
_ mov [W1++], W0 <<< [] là lấy giá trị thứ W1 ,ghi vào W0 sau đó tăng giá trị W1 ??? ,em koi watch thì sau dòng lệnh này W1 từ 0x8200 -> 0x8202 (tăng 2 giá trị) ,W0 thì gán giá trị đầu tiên của Table .Sau đó W1 từ 0x8202 ->0x8204 (tăng 2 giá trị) ,W0 thì đc gán giá trị thứ 2 ,vậy ++ ở đây là tăng 2 giá trị àh ???

em mới học nên hem bit nhìu @_@ ,a giúp em hen ^_^ ,thanks a

namqn
28-04-2008, 02:43 AM
Về việc tại sao tần số là 8 MHz mà không phải là 7.37 MHz như trong tài liệu, bạn đọc post #15 ở luồng sau:
http://www.picvietnam.com/forum//showthread.php?t=553

Về .bss, .align, .space, và .section, đề nghị bạn đọc tài liệu hướng dẫn của ASM30, link download dưới đây, nếu bạn chưa biết (tôi không muốn và cũng không thể giải thích tất cả những gì đã có trong tài liệu hướng dẫn):
http://ww1.microchip.com/downloads/en/DeviceDoc/51317G.pdf

Về các lệnh hợp ngữ của dsPIC, bạn đọc tài liệu tham khảo của dsPIC30F, link download dưới đây, nếu bạn chưa biết:
http://ww1.microchip.com/downloads/en/DeviceDoc/70046E.pdf

Bạn xem hình 4-7 của tài liệu trên để thấy được không gian PSV được ánh xạ vào vùng địa chỉ bắt đầu từ 0x8000, do đó bảng được khai báo ở 0x0200 sẽ có địa chỉ 0x8200 khi thực thi code.

Các toán tử psvpage() và psvoffset() do ASM30 cung cấp, đã được đề cập đến trong tutorial.

0x14 = 20

W1++ để chỉ đến ô dữ liệu kế tiếp, toán hạng đang dùng là word, địa chỉ được sử dụng là địa chỉ byte, do đó sẽ tăng 2 để chỉ đến word kế tiếp.

Thân,

hopeman
11-06-2008, 04:30 PM
em mới có mấy con dsPIC nhưng chân bé quá, hàn ko nổi
cũng muốn học dùng MPLab và dsPIC nhưng ko có mạch
có chương trình nào có giả lập mấy con dsPIC ko anh Nam nhỉ?

namqn
11-06-2008, 07:05 PM
em mới có mấy con dsPIC nhưng chân bé quá, hàn ko nổi
cũng muốn học dùng MPLab và dsPIC nhưng ko có mạch
có chương trình nào có giả lập mấy con dsPIC ko anh Nam nhỉ?
MPLAB IDE hỗ trợ mô phỏng các dsPIC, nhưng không mô phỏng tốt ngoại vi. Proteus có thể mô phỏng tốt ngoại vi cùng với vi điều khiển, nhưng chỉ hỗ trợ PIC24 vào thời điểm hiện tại. Tôi cũng tin rằng CCS PCD, HI-TECH PICC, và IAR Embedded Workbench có thể mô phỏng dsPIC, nhưng tôi không dùng các sản phẩm này.

Thân,

conglong
04-03-2009, 05:21 PM
Thầy Nam cho em hỏi: em lấy code (vidu2_1) và thay bởi 30F2010 (vì em đang dung con này) ở hàng :
" .equ __30F2010, 1 "
Thì khi biên dịch mplap báo lối là:
" Error: undefined symbol `FRC_PLL4' in operation "
Còn khi em thay hàng:
" config __FOSC, CSW_FSCM_OFF & FRC_PLL4 "
bởi hàng :
" config __FOSC, CSW_FSCM_OFF & XT_PLL16 "
thì lại biên dịch được.
Nên em nghĩ con 2010 nó không có chế độ dao đông nội !!! phải không thầy ?
Nếu nối vào 2 chân OSC1 với OSC2 bởi thạch anh 10 Mhz thì mình có được thiết lập chế độ dao động nội không hả thầy ? ý em là đối với dsPIC thì phần cứng phụ thuộc vào phần mềm hay ngược lại ?
cảm ơn thầy !
chúc vui !

namqn
04-03-2009, 05:52 PM
Thầy Nam cho em hỏi: em lấy code (vidu2_1) và thay bởi 30F2010 (vì em đang dung con này) ở hàng :
" .equ __30F2010, 1 "
Thì khi biên dịch mplap báo lối là:
" Error: undefined symbol `FRC_PLL4' in operation "
Còn khi em thay hàng:
" config __FOSC, CSW_FSCM_OFF & FRC_PLL4 "
bởi hàng :
" config __FOSC, CSW_FSCM_OFF & XT_PLL16 "
thì lại biên dịch được.
Nên em nghĩ con 2010 nó không có chế độ dao đông nội !!! phải không thầy ?
Nếu nối vào 2 chân OSC1 với OSC2 bởi thạch anh 10 Mhz thì mình có được thiết lập chế độ dao động nội không hả thầy ? ý em là đối với dsPIC thì phần cứng phụ thuộc vào phần mềm hay ngược lại ?
cảm ơn thầy !
chúc vui !
dsPIC30F2010 có bộ dao động nội FRC, nhưng không có chế độ FRC nối vào PLL. Nếu bạn dùng
config __FOSC, CSW_FSCM_OFF & FRC
thì sẽ không có vấn đề gì.

Bạn có thể nối thạch anh ngoài vào mạch dao động của dsPIC mà vẫn dùng bộ dao động nội. Thực tế, đây là một tính năng của dsPIC. dsPIC có thể chuyển qua lại giữa các nguồn dao động ở chế độ vận hành bình thường (tính năng này được Microchip gọi là Clock Switching, trong các ví dụ của tôi để đơn giản hóa tôi đã thiết lập tắt chức năng này: CSW_FSCM_OFF).

Bạn thiết kế phần cứng theo khả năng của dsPIC, và viết firmware tương thích với phần cứng đó.

Thân,

conglong
04-03-2009, 07:21 PM
dsPIC30F2010 có bộ dao động nội FRC, nhưng không có chế độ FRC nối vào PLL. Nếu bạn dùng
config __FOSC, CSW_FSCM_OFF & FRC
thì sẽ không có vấn đề gì.

Bạn có thể nối thạch anh ngoài vào mạch dao động của dsPIC mà vẫn dùng bộ dao động nội. Thực tế, đây là một tính năng của dsPIC. dsPIC có thể chuyển qua lại giữa các nguồn dao động ở chế độ vận hành bình thường (tính năng này được Microchip gọi là Clock Switching, trong các ví dụ của tôi để đơn giản hóa tôi đã thiết lập tắt chức năng này: CSW_FSCM_OFF).

Bạn thiết kế phần cứng theo khả năng của dsPIC, và viết firmware tương thích với phần cứng đó.

Thân,
Dạ vâng em đã làm như thầy chỉ , em thiết lập lại mode dao động thì nó không còn lỗi nữa.
Nhưng khi em dùng mạch nạp ICD2 nạp chương trình xuống dsPIC2010 (vidu2_1) thì nó không chạy thầy ơi ! Phần cứng em thiết lập chắc chắn đúng rồi (vì đây là ứng dụng đơn giản chỉ nối từ RD0 1 con led với con trở 1K xuống GND và cấp đủ các chân nguồn cho dsPIC). Lúc đầu em nghĩ là dsPIC bị chết nhưng nếu bị chết thì làm sao mà ICD2 vẫn detect được nó,và program bình thường , đúng không thầy ?
Còn em dùng chế độ debug với ICD2 thì nó nhấp nháy led bình thường giống như mịnh muốn !!!! vậy là sao hả thầy ??? bạn nào biết nó bị lỗi gì thì chỉ mình với !

Em cảm ơn thầy ! và các bạn !
Trân trọng !

namqn
04-03-2009, 10:18 PM
Dạ vâng em đã làm như thầy chỉ , em thiết lập lại mode dao động thì nó không còn lỗi nữa.
Nhưng khi em dùng mạch nạp ICD2 nạp chương trình xuống dsPIC2010 (vidu2_1) thì nó không chạy thầy ơi ! Phần cứng em thiết lập chắc chắn đúng rồi (vì đây là ứng dụng đơn giản chỉ nối từ RD0 1 con led với con trở 1K xuống GND và cấp đủ các chân nguồn cho dsPIC). Lúc đầu em nghĩ là dsPIC bị chết nhưng nếu bị chết thì làm sao mà ICD2 vẫn detect được nó,và program bình thường , đúng không thầy ?
Còn em dùng chế độ debug với ICD2 thì nó nhấp nháy led bình thường giống như mịnh muốn !!!! vậy là sao hả thầy ??? bạn nào biết nó bị lỗi gì thì chỉ mình với !

Em cảm ơn thầy ! và các bạn !
Trân trọng !
Có lẽ bạn đã chọn build configuration là "Debug" trong MPLAB IDE (hộp thoại nằm trên thanh công cụ Project Manager, xem hình đính kèm bên dưới). Nếu đúng như vậy thì bạn chỉ có thể chạy code với debugger.

Để chạy code trên board như bình thường thì bạn cần đổi lại build configuration là "Release".

Thân,

conglong
05-03-2009, 10:23 AM
Có lẽ bạn đã chọn build configuration là "Debug" trong MPLAB IDE (hộp thoại nằm trên thanh công cụ Project Manager, xem hình đính kèm bên dưới). Nếu đúng như vậy thì bạn chỉ có thể chạy code với debugger.

Để chạy code trên board như bình thường thì bạn cần đổi lại build configuration là "Release".

Thân,
Dạ đúng rồi thầy !
Nó chạy rồi thầy ạ , cảm ơn thầy nhiều!
Trân trọng !

truongbkauto
14-10-2013, 10:49 PM
em muốn mô phỏng dòng dspic30f nhưng trên protus mà không có.em có biết đến MPLAB Sim nhưng nó không có các thành phần như điện trở hay là tụ điện...ý em là muốn mô phỏng 1 mạch hoàn chỉnh...bác có cách nào giúp em được không?

trinh819
17-10-2013, 10:55 PM
Init_PORTS:
clr LATB
clr LATD ;Xoa thanh ghi chot cho cong D
mov #0xFFFD, W0 ;LED noi vao cong D, chan RD0
mov W0, TRISD
return
anh nam oi . tai sao trong vi du 2.1 em thay doi ngo ra la RD1 mà khi em thuc hien lai không nhấp nháy được như ngõ ra RD0 và em hay port xuat cung ko duoc . vd em thay la rb0 chi sang chu ko nhap nhay . CODE EM THAY DOI GIONG O TREN . CAM ON ANH

trinh819
17-10-2013, 10:58 PM
E thay đổi ngõ ra la RD1 nhưng ko nhấp nhdduwwocwj. khi chuyển sang portb cung được. anh nam co thể em giup em dk ko. code em thay đổi .
Init_PORTS:

clr LATD ;Xoa thanh ghi chot cho cong D
mov #0xFFFD, W0 ;LED noi vao cong D, chan RD1
mov W0, TRISD
return
Cảm ơn anh.

trinh819
17-10-2013, 11:09 PM
E thay đổi ngõ ra la RD1 nhưng ko nhấp nhdduwwocwj. khi chuyển sang portb cung được. anh nam co thể em giup em dk ko. code em thay đổi .
Init_PORTS:

clr LATD ;Xoa thanh ghi chot cho cong D
mov #0xFFFD, W0 ;LED noi vao cong D, chan RD1
mov W0, TRISD
return
Cảm ơn anh.