PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   Một chú ý về code mẫu trong các tutorial (http://www.picvietnam.com/forum/showthread.php?t=3392)

namqn 31-12-2008 10:27 PM

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,

Argentina 23-11-2009 09:10 PM

2 Attachment(s)
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.

namqn 23-11-2009 10:06 PM

Trích:

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

PSL 11-11-2010 10:42 AM

Trích:

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

thanh_30april 28-10-2011 09:57 AM

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

kqha1025 28-10-2011 07:13 PM

Trích:

Nguyên văn bởi thanh_30april (Post 50958)
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.

thanh_30april 29-10-2011 09:19 AM

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

Zipper 21-11-2011 02:52 PM

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

ltluc253 01-06-2012 09:22 AM

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.


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

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