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)
-   -   Sửa lỗi (http://www.picvietnam.com/forum/showthread.php?t=2891)

tungnh 06-10-2008 04:17 PM

Sửa lỗi
 
các bác có thể cho em biết khi em biên dịch nó báo lỗi thể này, em không tài nào sửa được. các câu lệnh không lỗi . Có phải đây là lỗi do trình biên dịch hay không?
C:\DOCUME~1\Lenovo\LOCALS~1\Temp/ccy7qmcV.s:7299: Error: Cannot use psvpage on a symbol (_s) that is not located in a code, psv, or eedata section.

namqn 06-10-2008 06:42 PM

Trích:

Nguyên văn bởi tungnh (Post 19367)
các bác có thể cho em biết khi em biên dịch nó báo lỗi thể này, em không tài nào sửa được. các câu lệnh không lỗi . Có phải đây là lỗi do trình biên dịch hay không?
C:\DOCUME~1\Lenovo\LOCALS~1\Temp/ccy7qmcV.s:7299: Error: Cannot use psvpage on a symbol (_s) that is not located in a code, psv, or eedata section.

Với thông tin mà bạn đã đưa, e rằng không thể giúp bạn. Tập tin "ccy7qmcV.s" là tập tin gì mà lại nằm ở một thư mục tạm, và ở dòng 7299 của nó có những gì.

Dựa vào đâu bạn cho rằng câu lệnh không lỗi? Trình biên dịch bạn đang dùng là trình biên dịch gì?

Thân,

tungnh 07-10-2008 01:06 AM

Hi, a Nam thông cảm cho em, tai em mới bập bõm làm quen với dspic nên đoán mò a ạ,
khi biên dịch nó báo lỗi thế này
Link Error: Could not allocate section .data_0x400 at 0x400
Link Error: Could not allocate program memory
Em nghĩ là do câu lệnh sau có vấn đề :
const unsigned char __attribute__ ((space(psv), address (0x0400)))
chuoi0[]=" Lo Nhiet \0",
chuoi1[]= "Dat nhiet do = \0",
chuoi2[]=" Dat kp = \0",
chuoi3[]=" Dat ki = \0",
chuoi4[]=" Dat kd = \0",
chuoi5[]= " Nhiet do thuc = \0";
unsigned char __attribute__ ((space(psv), address (0x0500)))
s[15]; // khai báo biến tạm
Khi em bỏ lệnh : unsigned char __attribute__ ((space(psv), address (0x0500)))
s[15];
nó lại báo lỗi thế này :
C:\DOCUME~1\Lenovo\LOCALS~1\Temp/ccrApifs.s:6362: Error: Cannot use psvpage on a symbol (_s) that is not located in a code, psv, or eedata section.

A sửa giúp em. em dùng con dspic30f4012 , C30 complier
à nếu em muốn xuất số 0.0123 ra LCD. Trong C thường em biết có hàm ftoa để chuyển kiểu float sang kiểu char, vậy trong C30 có hỗ trợ hàm này không anh, anh có thể chỉ cho em thuật toán hiển thị số 0.0123 ra màn hình LCD ko ạ. Cám ơn anh nhiều

namqn 07-10-2008 07:05 PM

Cách giải quyết đơn giản là bạn đặt các chuỗi hằng của bạn (chuoi0[], chuoi1[], ...) ở cuối vùng nhớ chương trình của dsPIC (với dsPIC30F4012 thì bạn cứ dùng địa chỉ từ 0x7000 trở lên đến 0x7FFF). Sau khi bạn vừa ý với chương trình đã viết thì mới điều chỉnh vị trí các chuỗi hằng này (hoặc cứ để chúng ở cuối vùng nhớ chương trình cũng chẳng sao). Như vậy sẽ tránh việc code của bạn đè lên các chuỗi hằng này khi chương trình dài ra, dẫn đến lỗi cấp phát bộ nhớ như bạn đã thấy.

Về các biến, bạn không dùng thuộc tính psv cho chúng, vì chúng được lưu vào RAM chứ không lưu vào bộ nhớ chương trình hay EEPROM. Chẳng hạn, biến s của bạn chỉ cần khai báo như sau:
Code:

        unsigned char s[15];
Thân,

tungnh 08-10-2008 04:24 PM

Cám ơn anh Nam nhé, e đã sủa được rồi . Em đọc và sủa như sau:
const unsigned char __attribute__ ((space(auto_psv)))
chuoi0[]=" cty CEVT \0",
chuoi1[]= "Dat nhiet do = \0",
chuoi2[]=" Dat kp = \0",
chuoi3[]=" Dat ki = \0",
chuoi4[]=" Dat kd = \0",
chuoi5[]= " Nhiet do thuc = \0";
unsigned char __attribute__ ((space(auto_psv)))
s[15];
Em để tự động định địa chỉ.
Thưa anh, em muốn hỏi anh ở phần hiển thị LCD. Trong tutorial 4 của anh có sử dụng các tín hiệu data của LCD cho cổng E. Nhưng giờ em muốn nối thể này (tại em làm tiếp cái của người khác đang làm ) : Cổng F cho D4,D5 ; E4,E5 cho D6,D7. Giờ em khai báo như thế này có được không :
Code:

#define        LCD_DAT1        LATE                       
#define        LCD_TRIS1        TRISE
#define  LCD_TAM                    LATF
#define  LCD_TRIS2        TRISF
void Init_PORTS(void)
    LCD_DAT1&= 0xFF;
    LCD_TAM&= 0xF0;
    LCD_TRIS1 = 0xFF;
    LCD_TRIS2 = 0XF0;
còn ở hàm LCD_cmd4() và hàm LCD_dat4() thì em viết lại như sau:
void LCD_cmd4(unsigned char cmd) {
    unsigned temp1, i;
    //LATDbits.LCD_RW = 0;
    LATBbits.LCD_RS = 0;                //Dat che do xuat lenh
    temp1 = LCD_DAT1 & 0xFF        ;        //Lay trang thai hien thoi cua LCD_DAT
    LCD_DAT1 = temp1 | (cmd >> 4);        //Xuat 4 bit cao
    LATBbits.LCD_EN = 1;                //Tao xung Enable
    for (i = 0; i < 2; i++);        //keo dai toi thieu 1 us
    LATBbits.LCD_EN = 0;
    temp1 = LCD_TAM & 0xF0;        //Lay trang thai hien thoi cua LCD_DAT1
    LCD_TAM = temp1 | (cmd & 0x0F);        //Xuat 4 bit thap
    LATBbits.LCD_EN = 1;                //Tao xung Enable
    for (i = 0; i < 2; i++);        //keo dai toi thieu 1 us
    LATBbits.LCD_EN = 0;
                                }

//Chuong trinh con xuat du lieu o che do 4 bit
//------------------------------------------------------------------------------
void LCD_dat4(unsigned char dat) {
    unsigned temp2, i;
    //LATDbits.LCD_RW = 0;
    LATBbits.LCD_RS = 1;                //Dat che do xuat du lieu
    temp2 = LCD_DAT1 & 0xFF;        //Lay trang thai hien thoi cua LCD_DAT
    LCD_DAT1 = temp2 | (dat >> 4);        //Xuat 4 bit cao
    LATBbits.LCD_EN = 1;                //Tao xung Enable
    for (i = 0; i < 2; i++);        //keo dai toi thieu 1 us
    LATBbits.LCD_EN = 0;
    temp2 = LCD_TAM & 0xF0;        //Lay trang thai hien thoi cua LCD_DAT
    LCD_TAM = temp2 | (dat & 0x0F);        //Xuat 4 bit thap
    LATBbits.LCD_EN = 1;                //Tao xung Enable
    for (i = 0; i < 2; i++);        //keo dai toi thieu 1 us
    LATBbits.LCD_EN = 0;
                                }

Mạc dù em biên dịch không báo lỗi nhưng khi nắp mạch thật thì không hiển thị được LCD. Mong anh giúp em !

namqn 08-10-2008 11:47 PM

Code của tôi dùng cho trường hợp 4 bit dữ liệu vào ra LCD nằm ở 4-bit của port E. Bạn dùng cả hai port E và F để xuất/nhập dữ liệu với LCD thì trước khi xuất xung Enable bạn phải thao tác dữ liệu trên cả hai port E và F, để ghi ra LCD. Code hiện thời của bạn chưa làm được điều đó.

Thân,

tungnh 09-10-2008 09:26 PM

Bác cho em hỏi thêm : Những cảnh báo sau co "nguy hiểm" không bác :
Code:

C:\Documents and Settings\Lenovo\Desktop\lonhiet.c: In function '_INT0Interrupt':
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c:860: warning:  PSV model not specified for '_INT0Interrupt';
  assuming 'auto_psv' this may affect latency
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c: In function '_INT1Interrupt':
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c:868: warning:  PSV model not specified for '_INT1Interrupt';
  assuming 'auto_psv' this may affect latency
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c: In function '_INT2Interrupt':
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c:878: warning:  PSV model not specified for '_INT2Interrupt';
  assuming 'auto_psv' this may affect latency
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c: In function '_ADCInterrupt':
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c:883: warning:  PSV model not specified for '_ADCInterrupt';
  assuming 'auto_psv' this may affect latency
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c: In function '_T1Interrupt':
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c:887: warning:  PSV model not specified for '_T1Interrupt';
  assuming 'auto_psv' this may affect latency


namqn 09-10-2008 11:26 PM

Trích:

Nguyên văn bởi tungnh (Post 19454)
Bác cho em hỏi thêm : Những cảnh báo sau co "nguy hiểm" không bác :
Code:

C:\Documents and Settings\Lenovo\Desktop\lonhiet.c: In function '_INT0Interrupt':
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c:860: warning:  PSV model not specified for '_INT0Interrupt';
  assuming 'auto_psv' this may affect latency
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c: In function '_INT1Interrupt':
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c:868: warning:  PSV model not specified for '_INT1Interrupt';
  assuming 'auto_psv' this may affect latency
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c: In function '_INT2Interrupt':
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c:878: warning:  PSV model not specified for '_INT2Interrupt';
  assuming 'auto_psv' this may affect latency
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c: In function '_ADCInterrupt':
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c:883: warning:  PSV model not specified for '_ADCInterrupt';
  assuming 'auto_psv' this may affect latency
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c: In function '_T1Interrupt':
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c:887: warning:  PSV model not specified for '_T1Interrupt';
  assuming 'auto_psv' this may affect latency


Những cảnh báo trên chỉ nhắc nhở rằng bạn không chọn mô hình PSV cho các trình xử lý ngắt, do đó auto_psv sẽ được giả định. Những cảnh báo này không "nguy hiểm".

Thân,

tungnh 10-10-2008 12:57 AM

Anh ơi em viết hàm con hiển thị số dạng float ra màn hình cụ thể như sau :
Code:

void hienthi( float o, unsigned char a[15])
{
        LCD_cmd4(LCD_homeL1);                        // ve dau dong thu 2
        Delay_ms(100);
        _PSV=1;
        PSVPAG = __builtin_psvpage(a);
        idx = 0;
        Delay_ms(50);
        while (a[idx]) {                //Xuat chuoi ra dong thu nhat cua LCD
        LCD_dat4(a[idx++]);
        Delay_ms(1);}
//////// Doi kieu float sang char/////////
          i=0;
          l=0;
        o=(o*1000)/10;
out=(long int)(o + 0.5);       
ra=out;
        while(out!=0)
            {
          in= (long int)( out%10);
          out=(long int)(out/10);
          i=i+1;
            }

          j=i-1;

          for (k=i;k!=0;k--)
            {
            doi_mu(j);
            in=(long int)(ra/mu);
            ra=(long int)( ra%mu);
            doi_asci(in);
            s[l]=ch;
            j--;
            l++;
            } 

        LCD_cmd4(LCD_homeL2);                        // ve dau dong thu 2
        Delay_ms(100);
                _PSV=1;
        PSVPAG = __builtin_psvpage(s);
        idx = 0;
        Delay_ms(50);
        while (s[idx]) {                //Xuat chuoi ra dong thu nhat cua LCD
        LCD_dat4(s[idx++]);
        Delay_ms(1);}
}

ở hàm main em viết
Code:

int main()
                {
                init......
        hienthi(t_dat,chuoi1);
                }

Em viết như vậy nó báo lỗi thế này ( con trỏ báo lỗi ở cuối hàm hienthi()) .
Code:

C:\Documents and Settings\Lenovo\Desktop\lonhiet2.c:183: warning: passing argument 2 of 'hienthi' discards qualifiers from pointer target type
C:\Documents and Settings\Lenovo\Desktop\lonhiet2.c: In function 'hienthi':
C:\Documents and Settings\Lenovo\Desktop\lonhiet2.c:497: internal compiler error: in instantiate_virtual_regs_lossage, at function.c:1442

Còn khi em không viết hàm con hienthi() mà đua thẳng vào hàm main thì nó không báo lỗi nữa ( nếu đưa thẳng vào hàm main thì chương trình sẽ rất dài ) Em sửa từ sáng đến giờ không biết sai ở đâu. ánh giúp em với ( xin lỗi anh vì em mới học nên hỏi hơi nhiều )

namqn 10-10-2008 03:16 AM

Không rõ a[] và s[] của bạn được khai báo ra sao. PSV chỉ dùng cho các hằng được lưu trong bộ nhớ chương trình hay trong EEPROM. Bạn không cần truyền con trỏ của các mảng này đến hàm hienthi() của bạn (cứ dùng chúng như mảng hằng toàn cục).

Lập trình cho PIC khác với lập trình cho máy tính nói chung, vì tài nguyên của PIC rất hạn chế. Theo tôi, cách thực hiện của bạn khá rối rắm.

Bạn có thể tham khảo các đoạn code C sau về chuyển dữ liệu nhị phân thành chuỗi ASCII, và phần code liên quan đến việc hiện thực phép chia cho 10:
http://www.piclist.com/techref/langu...onvertbase.htm

Thân,

tungnh 12-10-2008 11:35 PM

Trích:

Nguyên văn bởi namqn (Post 19435)
Code của tôi dùng cho trường hợp 4 bit dữ liệu vào ra LCD nằm ở 4-bit của port E. Bạn dùng cả hai port E và F để xuất/nhập dữ liệu với LCD thì trước khi xuất xung Enable bạn phải thao tác dữ liệu trên cả hai port E và F, để ghi ra LCD. Code hiện thời của bạn chưa làm được điều đó.

Thân,

Em đã cấu hình lại chân và thực hiện thao tác bit như anh nói nhưng không hiểu sao nó không chạy. đây là code em viết lại :
Code:


#include "p30f4012.h"

        _FOSC(CSW_FSCM_OFF & FRC_PLL4);                //Clock = 32 MHz
        _FWDT(WDT_OFF);
        _FBORPOR(MCLR_EN & PBOR_OFF & PWMxL_ACT_HI & PWMxH_ACT_HI);
        _FGS(CODE_PROT_OFF);

//------------------------------------------------------------------------------
//Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh)

#define        ms_count        125                        //So dem tuong ung voi 1 ms, cho timer 1

#define        EN                        LATB2                        //Tin hieu Enable cho LCD, chan RB2              //
#define        RS                        LATB1                        //Tin hieu Reset cho LCD, chan RB1                // 
#define        D4                        LATF2                //Cac tin hieu Data cho LCD, chan RE0..RE3 (D4..D7)          //                                                            //                                                                                                                      //                                                                        //
#define        LCD_TRISD4        TRISD4
#define        D5                        LATF3
#define        LCD_TRISD5        TRISD5
#define        D6                        LATE4
#define LCD_TRISD6        TRISD6
#define        D7                        LATE5
#define LCD_TRISD7        TRISD7                                                      //                                                                                                                                                                  //       

#define        LCD_homeL1        0x80                        //Ve dau dong 1
#define        LCD_homeL2        0xC0                        //Ve dau dong 2

//Cac prototype cho cac chuong trinh con
void Init_PORTS(void);                                //Khoi tao cac cong I/O
void Init_TMR1(void);                                //Khoi tao Timer 1
void Delay_ms(unsigned int);                //Tao tre mot so ms
void Init_LCD(void);                                //Khoi tao LCD
void LCD_cmd4(unsigned char);                //Xuat lenh ra LCD qua giao tiep 4-bit
void LCD_dat4(unsigned char);                //Xuat du lieu ra LCD qua giao tiep 4-bit

//Bang hang so trong ROM
const unsigned char __attribute__ ((space(psv), address (0x0400)))
        //Chuoi ky tu se xuat ra LCD
        Chuoi1[]="Hello world!\0";                //Chuoi ky tu se duoc xuat ra LCD

//Cac bien toan cuc
unsigned char time_out, idx;

//------------------------------------------------------------------------------
//Chuong trinh chinh
int main(void) {
        Init_TMR1();                                //Khoi tao cho TMR1
        Init_PORTS();                                //Khoi tao cac cong I/O
        _PSV=1;
        PSVPAG = __builtin_psvpage(Chuoi1);
        idx = 0;
        Delay_ms(50);
        Init_LCD();
        Delay_ms(500);
        while (Chuoi1[idx]) {                //Xuat chuoi ra dong thu nhat cua LCD
                LCD_dat4(Chuoi1[idx++]);
                Delay_ms(1);
        };
        LCD_cmd4(LCD_homeL2);
        Delay_ms(1);
        idx = 0;
        while (Chuoi1[idx]) {                //Xuat chuoi ra dong thu hai cua LCD
                LCD_dat4(Chuoi1[idx++]);
                Delay_ms(1);
        };
        while (1) {                        //Vong lap chinh
        };
}

//Chuong trinh con khoi tao Timer 1
//TMR1 duoc dung de dem so ms troi qua, o muc xung 8 Mips (fcy = 8 MHz)
//------------------------------------------------------------------------------
void Init_TMR1(void) {
        TMR1 = 0;                        //Xoa so dem trong TMR1
        PR1 = ms_count;                //TMR1 tran moi ms
        _T1IF = 0;                        //Xoa co ngat cua Timer 1
        T1CON = 0x0020;                //Dung fcy lam clock, prescale = 1:64, tat Timer 1
        _T1IE = 1;                        //Cho phep ngat Timer 1
}

//Chuong trinh con khoi tao cac cong I/O, de noi voi LED
//------------------------------------------------------------------------------
void Init_PORTS(void) {
                                                        LATFbits.D4 = 0;
                                                        LATFbits.D5 = 0;
                                                        LATEbits.D6 = 0;
                                                        LATEbits.D7 = 0;
                                                        _TRISF2 = 0;
                                                        _TRISF3 = 0;        //Cac chan du lieu LCD la ngo ra
                                                        _TRISE4 = 0;
                                                        _TRISE5 = 0;
                                                        //LATFbits.LCD_BL = 1;
                                                        //_TRISF3 = 0;                        //RF3 la ngo ra, noi vao back light LED
                                                        LATBbits.EN = 0;
                                                        _TRISB2 = 0;                        //RE8 la ngo ra, noi vao Enable cua LCD
                                                        //LATDbits.LCD_RW = 0;
                                                        //_TRISD0 = 0;                        //RD0 la ngo ra, noi vao R/W cua LCD
                                                        LATBbits.RS = 0;
                                                        _TRISB1 = 0;                        //RD1 la ngo ra, noi vao Reset cua LCD
}

//Chuong trinh con delay bang timer 1, nhan 1 tham so la so ms can delay
//------------------------------------------------------------------------------
void Delay_ms(unsigned n) {
        PR1 = n*ms_count;                        //Dat nguong tran vao PR1
        time_out = 0;                                //Xoa co het thoi gian cho
        T1CONbits.TON = 1;                        //Bat timer 1
        while (time_out == 0);                //Cho den khi het thoi gian cho
        T1CONbits.TON = 0;                        //Tat timer 1
        TMR1 = 0;
}

//Chuong trinh con khoi tao module LCD
//------------------------------------------------------------------------------
void Init_LCD(void)
{
        Delay_ms(1);                // Delay 1 mS
        LCD_cmd4(0x32);        // 4 bits interface
        LCD_cmd4(0x28);        // Display 2 rows, font of sistem is 5x7
        LCD_cmd4(0x0e);        // Display and blink the cursor
        LCD_cmd4(0x01);        // Clear screen and return to the head of the first line
        LCD_cmd4(0x06);        // Shift all display to the right
        Delay_ms(3);                // Delay 3 mS
}
void Write2Pins(unsigned char Nibber)
{
        LATFbits.D4 = (Nibber & 0x08)>>3;
        LATFbits.D5 = (Nibber & 0x04)>>2;
        LATEbits.D6 = (Nibber & 0x02)>>1;
        LATEbits.D7 = (Nibber & 0x01);
}

//Chuong trinh con xuat lenh o che do 4 bit
//------------------------------------------------------------------------------
void LCD_dat4(unsigned char Data)
{
        unsigned char LowNibble,HighNibble;
        LowNibble        = Data & 0x0f;
        HighNibble        = (Data & 0xf0)>>4;

        Write2Pins(HighNibble);
        LATBbits.RS = 0;
        LATBbits.EN = 1;
        LATBbits.EN = 0;
        Write2Pins(LowNibble);
        LATBbits.EN = 1;
        LATBbits.EN = 0;

        Delay_ms(11);
}


//Chuong trinh con xuat du lieu o che do 4 bit
//------------------------------------------------------------------------------
void LCD_cmd4(unsigned char Str)
{
        unsigned char LowNibble,HighNibble;
        LowNibble        = Str & 0x0f;
        HighNibble        = (Str & 0xf0)>>4;

        Write2Pins(HighNibble);
        LATBbits.RS = 0;
        LATBbits.EN = 1;
        LATBbits.EN = 0;
        Write2Pins(LowNibble);
        LATBbits.EN = 1;
        LATBbits.EN = 0;

        Delay_ms(11);
}
//Chuong trinh xu ly ngat Timer 1
//------------------------------------------------------------------------------
void _ISR _T1Interrupt(void) {
        _T1IF = 0;                        //Xoa co ngat
        time_out = 1;
}


namqn 13-10-2008 12:53 AM

Chương trình con Write2Pins() của bạn đang thực hiện ghi bit thấp nhất của nibble ra D7, còn bit cao nhất của nibble ra D4. Tương tự cho các bit còn lại. Đây có thể là lý do khiến chương trình của bạn chạy không đúng ý đồ.

Theo tôi hiểu, chân D7 của bạn (LATE5) đang nối vào chân tương ứng (D7) của module LCD, và tương tự cho các chân còn lại.

Thân,

tungnh 14-10-2008 10:39 AM

1 Attachment(s)
Em cũng đã sửa lại rồi, nhưng vẫn không được anh ạ.
nó không báo lỗi gì cả . Em đưa bất kỳ file hex nào vào kitpic2 nó đều cảnh báo sau. lỗi ở đâu

namqn 14-10-2008 05:40 PM

Trích:

Nguyên văn bởi tungnh (Post 19568)
Em cũng đã sửa lại rồi, nhưng vẫn không được anh ạ.
nó không báo lỗi gì cả . Em đưa bất kỳ file hex nào vào kitpic2 nó đều cảnh báo sau. lỗi ở đâu

Những phiên bản sau này của PICkit 2 Programmer đều kiểm tra xem các từ cấu hình có được đặt trong code hay không, nếu có ít nhất một từ cấu hình không được đặt giá trị tường minh trong code thì bạn sẽ được cảnh báo như vậy.

Code của bạn đã đặt các từ cấu hình FOSC, FWDT, FBORPOR, và FGS, như vậy là đủ. Tuy nhiên, PICkit 2 Programmer vẫn tìm kiếm giá trị cho FICD (chỉ được đề cập từ datasheet phiên bản DS70135F, tháng 7 năm 2008).

Đây không phải là lỗi, chỉ là cảnh báo rằng một vài từ cấu hình không được đặt giá trị tường minh trong code (ở trường hợp này là FICD). Bạn có thể thêm dòng sau vào code của bạn để không gặp cảnh báo này nữa:

Code:

        _FICD( ICS_NONE );
Thân,

tungnh 15-10-2008 09:24 AM

Em thử vẫn vẫn cảnh báo như vậy anh ạ . Em thử chương trình khác nó cũng cảnh báo như vậy nhưng vẫn chạy, còn chương trình LCD thì nó vẫn không chịu hiển thị. Anh xem lại cho em chương trình LCD xem sao.
Code:


#include "p30f4012.h"

        _FOSC(CSW_FSCM_OFF & FRC_PLL4);                //Clock = 32 MHz
        _FWDT(WDT_OFF);
        _FBORPOR(MCLR_EN & PBOR_OFF & PWMxL_ACT_HI &  PWMxH_ACT_HI);
        _FGS(CODE_PROT_OFF);
            _FICD(ICS_NONE);

//------------------------------------------------------------------------------
//Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh)

#define        ms_count        125                        //So dem tuong ung voi 1 ms, cho timer 1

#define        EN                        LATB2                        //Tin hieu Enable cho LCD, chan RB2              //
#define        RS                        LATB1                        //Tin hieu Reset cho LCD, chan RB1                // 
#define        D4                        LATF2                //Cac tin hieu Data cho LCD, chan RE0..RE3 (D4..D7)          //                                                            //                                                                                                                      //                                                                        //
#define        LCD_TRISD4        TRISD4
#define        D5                        LATF3
#define        LCD_TRISD5        TRISD5
#define        D6                        LATE4
#define LCD_TRISD6        TRISD6
#define        D7                        LATE5
#define LCD_TRISD7        TRISD7                                                      //                                                                                                                                                                  //       

#define        LCD_homeL1        0x80                        //Ve dau dong 1
#define        LCD_homeL2        0xC0                        //Ve dau dong 2

//Cac prototype cho cac chuong trinh con
void Init_PORTS(void);                                //Khoi tao cac cong I/O
void Init_TMR1(void);                                //Khoi tao Timer 1
void Delay_ms(unsigned int);                //Tao tre mot so ms
void Init_LCD(void);                                //Khoi tao LCD
void LCD_cmd4(unsigned char);                //Xuat lenh ra LCD qua giao tiep 4-bit
void LCD_dat4(unsigned char);                //Xuat du lieu ra LCD qua giao tiep 4-bit

//Bang hang so trong ROM
const unsigned char __attribute__ ((space(psv), address (0x0400)))
        //Chuoi ky tu se xuat ra LCD
        Chuoi1[]="Hello world!\0";                //Chuoi ky tu se duoc xuat ra LCD

//Cac bien toan cuc
unsigned char time_out, idx;

//------------------------------------------------------------------------------
//Chuong trinh chinh
int main(void) {
        Init_TMR1();                                //Khoi tao cho TMR1
        Init_PORTS();                                //Khoi tao cac cong I/O
        _PSV=1;
        PSVPAG = __builtin_psvpage(Chuoi1);
        idx = 0;
        Delay_ms(50);
        Init_LCD();
        Delay_ms(500);
        while (Chuoi1[idx]) {                //Xuat chuoi ra dong thu nhat cua LCD
                LCD_dat4(Chuoi1[idx++]);
                Delay_ms(1);
        };
        LCD_cmd4(LCD_homeL2);
        Delay_ms(1);
        idx = 0;
        while (Chuoi1[idx]) {                //Xuat chuoi ra dong thu hai cua LCD
                LCD_dat4(Chuoi1[idx++]);
                Delay_ms(1);
        };
        while (1) {                        //Vong lap chinh
        };
}

//Chuong trinh con khoi tao Timer 1
//TMR1 duoc dung de dem so ms troi qua, o muc xung 8 Mips (fcy = 8 MHz)
//------------------------------------------------------------------------------
void Init_TMR1(void) {
        TMR1 = 0;                        //Xoa so dem trong TMR1
        PR1 = ms_count;                //TMR1 tran moi ms
        _T1IF = 0;                        //Xoa co ngat cua Timer 1
        T1CON = 0x0020;                //Dung fcy lam clock, prescale = 1:64, tat Timer 1
        _T1IE = 1;                        //Cho phep ngat Timer 1
}

//Chuong trinh con khoi tao cac cong I/O, de noi voi LED
//------------------------------------------------------------------------------
void Init_PORTS(void) {
                                                        LATFbits.D4 = 0;
                                                        LATFbits.D5 = 0;
                                                        LATEbits.D6 = 0;
                                                        LATEbits.D7 = 0;
                                                        _TRISF2 = 0;
                                                        _TRISF3 = 0;        //Cac chan du lieu LCD la ngo ra
                                                        _TRISE4 = 0;
                                                        _TRISE5 = 0;
                                                        //LATFbits.LCD_BL = 1;
                                                        //_TRISF3 = 0;                        //RF3 la ngo ra, noi vao back light LED
                                                        LATBbits.EN = 0;
                                                        _TRISB2 = 0;                        //RE8 la ngo ra, noi vao Enable cua LCD
                                                        //LATDbits.LCD_RW = 0;
                                                        //_TRISD0 = 0;                        //RD0 la ngo ra, noi vao R/W cua LCD
                                                        LATBbits.RS = 0;
                                                        _TRISB1 = 0;                        //RD1 la ngo ra, noi vao Reset cua LCD
}

//Chuong trinh con delay bang timer 1, nhan 1 tham so la so ms can delay
//------------------------------------------------------------------------------
void Delay_ms(unsigned n) {
        PR1 = n*ms_count;                        //Dat nguong tran vao PR1
        time_out = 0;                                //Xoa co het thoi gian cho
        T1CONbits.TON = 1;                        //Bat timer 1
        while (time_out == 0);                //Cho den khi het thoi gian cho
        T1CONbits.TON = 0;                        //Tat timer 1
        TMR1 = 0;
}

//Chuong trinh con khoi tao module LCD
//------------------------------------------------------------------------------
void Init_LCD(void)
{
        Delay_ms(1);                // Delay 1 mS
        LCD_cmd4(0x32);        // 4 bits interface
        LCD_cmd4(0x28);        // Display 2 rows, font of sistem is 5x7
        LCD_cmd4(0x0e);        // Display and blink the cursor
        LCD_cmd4(0x01);        // Clear screen and return to the head of the first line
        LCD_cmd4(0x06);        // Shift all display to the right
        Delay_ms(3);                // Delay 3 mS
}
void Write2Pins(unsigned char Nibber)
{
        LATEbits.D7 = (Nibber & 0x08)>>3;
        LATEbits.D6 = (Nibber & 0x04)>>2;
        LATFbits.D5 = (Nibber & 0x02)>>1;
        LATFbits.D4 = (Nibber & 0x01);
}

//Chuong trinh con xuat lenh o che do 4 bit
//------------------------------------------------------------------------------
void LCD_dat4(unsigned char Data)
{
        unsigned char LowNibble,HighNibble;
        LowNibble        = Data & 0x0f;
        HighNibble        = (Data & 0xf0)>>4;

        Write2Pins(HighNibble);
        LATBbits.RS = 0;
        LATBbits.EN = 1;
        LATBbits.EN = 0;
        Write2Pins(LowNibble);
        LATBbits.EN = 1;
        LATBbits.EN = 0;

        Delay_ms(11);
}


//Chuong trinh con xuat du lieu o che do 4 bit
//------------------------------------------------------------------------------
void LCD_cmd4(unsigned char Str)
{
        unsigned char LowNibble,HighNibble;
        LowNibble        = Str & 0x0f;
        HighNibble        = (Str & 0xf0)>>4;

        Write2Pins(HighNibble);
        LATBbits.RS = 0;
        LATBbits.EN = 1;
        LATBbits.EN = 0;
        Write2Pins(LowNibble);
        LATBbits.EN = 1;
        LATBbits.EN = 0;

        Delay_ms(11);
}
//Chuong trinh xu ly ngat Timer 1
//------------------------------------------------------------------------------
void _ISR _T1Interrupt(void) {
        _T1IF = 0;                        //Xoa co ngat
        time_out = 1;
}



Múi giờ GMT. Hiện tại là 06:53 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