PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > dsPIC - Bộ điều khiển tín hiệu số 16-bit

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 03-03-2008, 10:30 AM   #1
ajack
Nhập môn đệ tử
 
Tham gia ngày: Jan 2008
Bài gửi: 6
Thanks: 2
Thanked 0 Times in 0 Posts
Cho mình hỏi về Clock Switching...

Mình đang dùng dòng dsPIC33F, 256GP. Trước đây mình chỉ dùng AVR, nhưng mà vì AVR không bán 32-bit ở Việt Nam nên mình chuyển sang dùng dsPIC, vì vậy mình chưa dùng con PIC nào trước ngoại trừ dsPIC...
Mình đang dùng C30 Compiler ở máy trong phòng lab của trường (có licene cho C30). Mình có thắc mắc sau đây:
Mình muốn sử dụng Primary Oscillator with PLL (nhưng mà phải switch từ internal FRC).
đây là đoạn code của mình
Code:
_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

	// Set New Oscillator Selection
//	__builtin_write_OSCCONH(0b011);
	OSCCONbits.NOSC = 0b011;

	// Request Clock Switching by Setting OSWEN bit
//	__builtin_write_OSCCONL(0b01);
	OSCCONbits.OSWEN = 1;


	// Wait for Clock switch to occur
	while(OSCCONbits.OSWEN == 0) {}
}
có vấn đề là mình không sử dụng function __builtin_write_OSCCONH (và __builtin_write_OSCCONL) được!
mình quyết định là viết ASM cho riêng function __builtin_write_OSCCONH:
Code:
	// Place the New Oscillator Selection (NOSC=0b101) in W0
	asm volatile("MOV #0x15,w0");
	// OSCCONH (high byte) Unlock Sequence
	asm ("MOV #OSCCONH, w1");
	asm volatile("MOV #0x78, w2");
	asm volatile("MOV #0x9A, w3");
	asm volatile("MOV.B w2, [w1]");	// Write 78h
	asm volatile("MOV.B w3, [w1]");	// Write 9Ah
	// Set New Oscillator Selection
	asm volatile("MOV.B w0, [w1]");
và ASM cho riêng function __builtin_write_OSCCONL:
Code:
	// Place 0x01 in W0 for setting clock switch enabled bit
	asm volatile("MOV #0x01, w0");
	// OSCCONL (low byte) Unlock Sequence
	asm volatile("MOV #OSCCONL, w1");
	asm volatile("MOV #0x46, w2");
	asm volatile("MOV #0x57, w3");
	asm volatile("MOV.B w2, [w1]");	// Write 46h
	asm volatile("MOV.B w3, [w1]");	// Write 9Ah
	// Enable Clock Switch
	asm volatile("MOV.B w0, [w1]");	//Request Clock Switching by Setting OSWEN bit
nhưng cũng không được, cái code này là mình làm theo trong datasheet của nó, và trong phần help của C30 cũng chỉ như vậy...
Cái thắc mắc ở đây nữa là tại vì muốn ghi vào register OSCCONH thì phải unlock, mà unlock bằng cách ghi giá trị 0x78 trước rồi giá trị 0x94???
Thứ 2 nữa là mình không biết cách nào để add đoạn mã ASM vào trong C30, ngoại trừ cách mỗi hàng ASM đều phải... asm volatile
Thứ 3 là dù có viết bằng ASM thì nó cũng không nhận ra register OSCCONH và OSCCONL, phải khai báo như thế nào để nó nhận ra được register đó là high bye và low byte của register OSCCON?
Và cuối cùng là làm sao để dùng được những function built-in? Mình thấy trong C30 help thì đâu cần phải include header gì hết cũng vẫn dùng được function built-in

thay đổi nội dung bởi: ajack, 03-03-2008 lúc 07:42 PM.
ajack vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt
Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam