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 Bài Trong Ngày 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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 31-12-2008, 10:27 PM   #1
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Một chú ý về code mẫu trong các tutorial

Gần đây tôi nhận ra một số code mẫu trong các tutorial của tôi khi biên dịch với các mức tối ưu khác nhau đã không còn hoạt động đúng. Lý do là bộ tối ưu mã của các phiên bản MPLAB C Compiler for dsPIC DSCs mới đã loại bỏ hoàn toàn một số biến và câu lệnh, khi phát hiện những biến đó không hề được thay đổi giá trị trong chương trình chính (giá trị của những biến này chỉ được thay đổi trong phần code xử lý ngắt chẳng hạn).

Khắc phục vấn đề này rất đơn giản, bạn chỉ cần thêm từ khóa volatile trước khai báo của những biến đó (thường là những biến thuộc nhóm biến toàn cục). Ví dụ
Code:
volatile unsigned char flag;
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-11-2009, 09:10 PM   #2
Argentina
Đệ tử 1 túi
 
Argentina's Avatar
 
Tham gia ngày: Oct 2007
Bài gửi: 22
:
thưa anh Nam. hiện nay em vừa mượn được bộ KIT Explorer 16, sử dụng PIC24FJ128GA010, em có download code mẫu dùng cho KIT từ trang chủ của Microchip, em đã sửa lại như theo gợi ý của anh, nhưng chương trình vẫn báo lỗi.

Do mới làm quen với PIC nên em chưa hiểu phải khắc phục lỗi này ra sao, rất mong được anh giúp đỡ ạ.

Em cảm ơn anh.
Hình Kèm Theo
File Type: jpg error.jpg (283.3 KB, 43 lần tải)
File Kèm Theo
File Type: txt code.txt (6.7 KB, 42 lần tải)
Argentina vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-11-2009, 10:06 PM   #3
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi Argentina View Post
thưa anh Nam. hiện nay em vừa mượn được bộ KIT Explorer 16, sử dụng PIC24FJ128GA010, em có download code mẫu dùng cho KIT từ trang chủ của Microchip, em đã sửa lại như theo gợi ý của anh, nhưng chương trình vẫn báo lỗi.

Do mới làm quen với PIC nên em chưa hiểu phải khắc phục lỗi này ra sao, rất mong được anh giúp đỡ ạ.

Em cảm ơn anh.
Code của Microchip và của tôi viết cho MPLAB C30 (hiện nay được gọi là "MPLAB C Compiler for PIC24 MCUs and dsPIC DSCs") chứ không phải viết cho CCS C. Do đó, bạn phải tìm hiểu xem port code của Microchip sang CCS C ra sao cho bo mạch trên (có thể hỏi bên diễn đàn của CCS C).

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2010, 10:42 AM   #4
PSL
Đệ tử 1 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 20
:
Trích:
Nguyên văn bởi namqn View Post
Gần đây tôi nhận ra một số code mẫu trong các tutorial của tôi khi biên dịch với các mức tối ưu khác nhau đã không còn hoạt động đúng. Lý do là bộ tối ưu mã của các phiên bản MPLAB C Compiler for dsPIC DSCs mới đã loại bỏ hoàn toàn một số biến và câu lệnh, khi phát hiện những biến đó không hề được thay đổi giá trị trong chương trình chính (giá trị của những biến này chỉ được thay đổi trong phần code xử lý ngắt chẳng hạn).

Khắc phục vấn đề này rất đơn giản, bạn chỉ cần thêm từ khóa volatile trước khai báo của những biến đó (thường là những biến thuộc nhóm biến toàn cục). Ví dụ
Code:
volatile unsigned char flag;
Thân,
Microchip cũng có nhắc đến vấn đề này, khuyến cáo nên dùng khai báo volatile đối với những biến dùng cho ngắt. Nguyên văn:
"You should arrange to save global variables that may be modified in an ISR if you do
not want the value to be exported. Global variables modified by an ISR should be
qualified volatile."
DS51284J, trang 108. Trong một số tài liệu khác cũng có nhắc đến.
Các bạn nên lưu ý, không mới, nhưng quan trọng.
PSL vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-10-2011, 09:57 AM   #5
thanh_30april
Nhập môn đệ tử
 
Tham gia ngày: Jan 2010
Bài gửi: 9
:
Các anh ơi cho em hỏi chút:
/************************************************** *****************************
; Vidu2-1.c la chuong trinh viet bang C de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: Nhap nhay LED (noi vao RD0) o tan so 1 Hz *
************************************************** ******************************

; Tac gia : Nguyen Quang Nam *

; Don vi : PIC Viet Nam *

; Ten tap tin : Vidu2-1.c *

; Ngay : 03/8/2006 *

; Phien ban : 0.01 *

; Nhung tap tin can thiet khac: p30F4012.gld, p30f4012.h *

; Cong cu duoc dung: MPLAB 7.31 *
; C30 2.02 SE *
; ASM30 2.14 *
; LNK30 2.14 *

------------------------------------------------------------------------------*/
#include <p30F4012.h>

_FOSC(CSW_FSCM_OFF & FRC_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & MCLR_EN & PWMxL_ACT_HI & PWMxH_ACT_HI);
_FGS(CODE_PROT_OFF);

#define LED _LATD0 //LED noi vao RD0

//Cac prototype cho cac chuong trinh con
void Init_PORTS(void);
void Init_TMR1(void);

//Chuong trinh chinh
int main(void) {
Init_PORTS(); //Khoi tao cac cong I/O
Init_TMR1(); //Khoi tao Timer 1
while (1) { //Vong lap chinh
};
}

//Chuong trinh con khoi tao cac cong I/O, de noi voi LED
void Init_PORTS(void) {
LATD = 0; //Xoa thanh ghi chot cong D
TRISD = 0xFFFE; //LED noi vao chan RD0, la ngo ra
}

//Chuong trinh con khoi tao Timer 1, tran sau moi 0,5 giay o muc xung 8 Mips
void Init_TMR1(void) {
TMR1 = 0; //Xoa so dem trong TMR1
PR1 = 0xF424; //Nguong tran la 0,5 giay tuong ung voi clock = 32 MHz
_T1IF = 0; //Xoa co ngat cua Timer 1
T1CON = 0x8020; //Dung fcy lam clock, prescale = 1:64
_T1IE = 1; //Cho phep ngat Timer 1
}

//Chuong trinh xu ly ngat Timer 1
void _ISR _T1Interrupt(void) {
_T1IF = 0; //Xoa co ngat
_LATD0 ^= 1; //Lat trang thai LED
}
/////////////////////////////////////
Em không hiểu vì sao bác Nam cấu hình cho CLOCK như trên mà bảo clock=32MHz.Vì
em đọc theo datasheet với file p30f4012 thi cấu hình FRC_PLL4 tức là:7.37*4=29.48Mhz thôi chứ ạ.Mong các bác giải thích hộ em với
thanh_30april vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-10-2011, 07:13 PM   #6
kqha1025
Đệ tử 3 túi
 
Tham gia ngày: Oct 2008
Bài gửi: 57
:
Trích:
Nguyên văn bởi thanh_30april View Post
Các anh ơi cho em hỏi chút:
/************************************************** *****************************
; Vidu2-1.c la chuong trinh viet bang C de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: Nhap nhay LED (noi vao RD0) o tan so 1 Hz *
************************************************** ******************************

; Tac gia : Nguyen Quang Nam *

; Don vi : PIC Viet Nam *

; Ten tap tin : Vidu2-1.c *

; Ngay : 03/8/2006 *

; Phien ban : 0.01 *

; Nhung tap tin can thiet khac: p30F4012.gld, p30f4012.h *

; Cong cu duoc dung: MPLAB 7.31 *
; C30 2.02 SE *
; ASM30 2.14 *
; LNK30 2.14 *

------------------------------------------------------------------------------*/
#include <p30F4012.h>

_FOSC(CSW_FSCM_OFF & FRC_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & MCLR_EN & PWMxL_ACT_HI & PWMxH_ACT_HI);
_FGS(CODE_PROT_OFF);

#define LED _LATD0 //LED noi vao RD0

//Cac prototype cho cac chuong trinh con
void Init_PORTS(void);
void Init_TMR1(void);

//Chuong trinh chinh
int main(void) {
Init_PORTS(); //Khoi tao cac cong I/O
Init_TMR1(); //Khoi tao Timer 1
while (1) { //Vong lap chinh
};
}

//Chuong trinh con khoi tao cac cong I/O, de noi voi LED
void Init_PORTS(void) {
LATD = 0; //Xoa thanh ghi chot cong D
TRISD = 0xFFFE; //LED noi vao chan RD0, la ngo ra
}

//Chuong trinh con khoi tao Timer 1, tran sau moi 0,5 giay o muc xung 8 Mips
void Init_TMR1(void) {
TMR1 = 0; //Xoa so dem trong TMR1
PR1 = 0xF424; //Nguong tran la 0,5 giay tuong ung voi clock = 32 MHz
_T1IF = 0; //Xoa co ngat cua Timer 1
T1CON = 0x8020; //Dung fcy lam clock, prescale = 1:64
_T1IE = 1; //Cho phep ngat Timer 1
}

//Chuong trinh xu ly ngat Timer 1
void _ISR _T1Interrupt(void) {
_T1IF = 0; //Xoa co ngat
_LATD0 ^= 1; //Lat trang thai LED
}
/////////////////////////////////////
Em không hiểu vì sao bác Nam cấu hình cho CLOCK như trên mà bảo clock=32MHz.Vì
em đọc theo datasheet với file p30f4012 thi cấu hình FRC_PLL4 tức là:7.37*4=29.48Mhz thôi chứ ạ.Mong các bác giải thích hộ em với
Với loại Dspic cũ thì thạch anh nội là 7.37 Mhz còn với các em mới thì là 8Mhz thì phải, bạn xem lại datasheet của dspic mới nhất xem xem.
kqha1025 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-10-2011, 09:19 AM   #7
thanh_30april
Nhập môn đệ tử
 
Tham gia ngày: Jan 2010
Bài gửi: 9
:
Em xem datasheet bản mới mà anh,em download trên microchip cập nhật 12/05/2010.
Mà nếu theo anh nói thì nếu cấu hình PLL16 thì Fosc=8*16Mhz,từ đó ta tính ra Fcy =64Mips ah?chắc không phải anh ạ.Mong các anh giải thích giùm
thanh_30april vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-11-2011, 02:52 PM   #8
Zipper
Nhập môn đệ tử
 
Tham gia ngày: Nov 2011
Bài gửi: 3
:
chứ không phải viết cho CCS C. Do đó, bạn phải tìm hiểu xem port code của Microchip sang CCS C ra sao cho bo mạch trên
__________________
WOW Gold RS Gold Tera Gold
Zipper vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-06-2012, 09:22 AM   #9
ltluc253
Nhập môn đệ tử
 
Tham gia ngày: Aug 2011
Bài gửi: 6
:
hix, mình cũng đang gặp phải vấn đề thay đổi biến toàn cục trong ngắt mà không biết xử lý code thế nào.Đoạn code sau mình viết để test trên protues. nhưng biến ADCvalues của mình vẫn không thay đổi sau khi có ngắt ADC xảy ra.

#include <p33FJ16MC304.h>


_FOSCSEL(FNOSC_PRIPLL&IESO_OFF); //dung dao dong ngoai co bo PLL
_FOSC(FCKSM_CSDCMD&OSCIOFNC_OFF&POSCMD_XT); //chon che do XT
_FWDT(FWDTEN_OFF); //tat watchdog
_FGS( GSS_HIGH & GCP_ON ); //code protection


volatile int ADCvalues=0xFF00;

void Init_osc(void)
{
PLLFBD = 78; // M = 78
CLKDIV = CLKDIV&0xFF00; //PLLPOST=0 & PLLPRE = 0 , N1=2, N2=2
while (_COSC !=0b011); //dung bo PLL tao Fosc=40MHz, cho cho dao dong on dinh
while (_LOCK !=1); //cho PLL bat dau khoa pha
}

void Init_ADC(void)
{
AD1PCFGL = 0xFFFE; //chon AN0 lam ngo vao analog
_SSRC = 7; //ADC cham dut lay mau va kich hoat chuyen doi
AD1CON2 = 0;
AD1CHS0 = 0;
AD1CSSL = 0; //ko quet ngo vao
AD1CON3 = 0x1F01; //dung 31TAD cho lay mau
//dung TAD=2Tcy
_AD1IF = 0;
_AD1IE = 1;
_ASAM = 1; //tu dong lay mau.
}

void __attribute__((__interrupt__,auto_psv))_ADC1Interr upt(void)
{
ADCvalues = ADCBUF0;
PORTC = ADCvalues;
}

int main()
{
TRISB = 0x0000;
TRISC = 0x0000;
Init_osc();
Init_ADC();
_ADON = 1;
while(1)
{
PORTB = ADCvalues;
}

}


Mong mọi người giúp đỡ với, thanks.
ltluc253 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lờ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à 06:54 AM.


Đượ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