|
Tài trợ cho PIC Vietnam |
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 |
31-12-2008, 10:27 PM | #1 |
Trưởng lão PIC bang
|
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;
__________________
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 |
23-11-2009, 09:10 PM | #2 |
Đệ tử 1 túi
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. |
23-11-2009, 10:06 PM | #3 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
11-11-2010, 10:42 AM | #4 | |
Đệ tử 1 túi
Tham gia ngày: Apr 2006
Bài gửi: 20
: |
Trích:
"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. |
|
28-10-2011, 09:57 AM | #5 |
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 |
28-10-2011, 07:13 PM | #6 | |
Đệ tử 3 túi
Tham gia ngày: Oct 2008
Bài gửi: 57
: |
Trích:
|
|
29-10-2011, 09:19 AM | #7 |
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 |
01-06-2012, 09:22 AM | #9 |
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. |
|
|