PDA

View Full Version : Lỗi trong MPLAB C18


lybao_huy
24-03-2010, 08:41 AM
mục đích của đoạn code này là làm nhấp nháy đèn led .
#include <p18cxxx.h>
#pragma config WDT = OFF
#pragma config FOSC = HS
#pragma config CPUDIV = OSC1_PLL2
#pragma config PWRT = ON
#pragma config BOR = ON
#pragma config BORV = 3
#pragma config MCLRE = ON
#pragma config LVP = OFF
void main (void)
{
TRISA=0;
OSCCONbits.SCS0=0; OSCCONbits.SCS1=0;//chọn bộ dao động chính
while(1){
PORTAbits.AN0=1;
delay();//hàm delay tôi không nêu ra ở đây,thời gian delay là 1s;
PORTAbits.AN0=0;
delay();//hàm delay tôi không nêu ra ở đây,thời gian delay là 1s;
}
với cách viết như trên thì nó chạy rất tốt. nhưng khi thay đổi:
OSCCONbits.SCS0=1; OSCCONbits.SCS1=0;//chọn bộ dao động timer1 làm xung hệ thống.
thì nó cũng có thời gian delay như trên(mặc dù tôi không có đặt bất cứ thạch anh vào timer1),tôi tưởng nó bị nhiễu từ bộ dao động chính, nên cho 2 pin của timer1 xuống đất,nhưng kết quả vẫn vậy,tôi không hiểu. có ai giải thích dùm hộ.

Tôi còn có một thắc mắc nữa là:
cũng là đoạn code trên nhưng:
OSCCONbits.SCS0=0; OSCCONbits.SCS1=0;//chọn bộ dao động chính
while(1){
PORTAbits.AN0=~LATAbits.LATA0;//toggle pin A0
delay();
}
đoạn code này cũng chạy tốt.nhưng
while(1){
PORTAbits.AN0=~PORTAbits.AN0;//toggle pin A0
delay();
}
lại không chạy, mặc dù pin A0 nối ra đèn led thông qua một điện trở và không có tụ .

sit_alone76816
25-03-2010, 12:05 PM
Bạn ơi cho mình hỏi ý nghĩa của đoạn này là gì vậy bạn

#pragma config LVP = OFF

mình còn thấy có đoạn sau nữa, mà không biết ý nghĩa như thế nào ?

#pragma config PBADEN = OFF
#pragma config BOR = OFF
#pragma config PWRT = OFF


Mong bạn giải thích giùm nha bạn. Trân trọng cảm ơn !

lybao_huy
25-03-2010, 02:45 PM
#pragma config LVP = OFF //Single-Supply ICSP Enable bit:
Đoạn này có nghĩa là tắt chế độ lập trình ICSP điện thế thấp(Low-Voltage ICSP programming). Bạn xem tại trang 302 data sheet của PIC8F4550 tại mục : 25.10 Single-Supply ICSP Programming.

#pragma config PBADEN = OFF
Đoạn này có nghĩa là PORTB<4:0> pins are configured as digital I/O on Reset . Tức là các Pins này là chân ra/vào số lúc reset.
#pragma config BOR = OFF
Đoạn này có nghĩa là Brown-out Reset disabled in hardware and software . Tức không có khả năng reset lúc điện thế cấp cho con PIC xuống thấp dưới ngưỡng(có thể làm cháy con PIC).
#pragma config PWRT = OFF
Đoạn này có nghĩa là tắt Power-up Timer Enable bit:

Tất cả những cái này bạn có thể xem tại mục SPECIAL FEATURES OF THE CPU của tất cả các Datasheet của PIC.
Để có thể config những cái này bạn xem trong file hlpPIC18ConfigSet tại C:\MCC18\doc.

bien_van_khat
25-03-2010, 03:12 PM
mục đích của đoạn code này là làm nhấp nháy đèn led .
#include <p18cxxx.h>
#pragma config WDT = OFF
#pragma config FOSC = HS
#pragma config CPUDIV = OSC1_PLL2
#pragma config PWRT = ON
#pragma config BOR = ON
#pragma config BORV = 3
#pragma config MCLRE = ON
#pragma config LVP = OFF
void main (void)
{
TRISA=0;
OSCCONbits.SCS0=0; OSCCONbits.SCS1=0;//chọn bộ dao động chính
while(1){
PORTAbits.AN0=1;
delay();//hàm delay tôi không nêu ra ở đây,thời gian delay là 1s;
PORTAbits.AN0=0;
delay();//hàm delay tôi không nêu ra ở đây,thời gian delay là 1s;
}
với cách viết như trên thì nó chạy rất tốt. nhưng khi thay đổi:
OSCCONbits.SCS0=1; OSCCONbits.SCS1=0;//chọn bộ dao động timer1 làm xung hệ thống.
thì nó cũng có thời gian delay như trên(mặc dù tôi không có đặt bất cứ thạch anh vào timer1),tôi tưởng nó bị nhiễu từ bộ dao động chính, nên cho 2 pin của timer1 xuống đất,nhưng kết quả vẫn vậy,tôi không hiểu. có ai giải thích dùm hộ.


Ở đây có 2 vấn đề:
- Trong các bit cấu hình ko thấy bạn cho phép clock switching.
- Nếu bạn chịu khó đọc mục oscillator, phần clock switching sẽ thấy:
"The system clock will continue to operate from
the old clock until the new clock is ready."
Timer1 bạn ko lắp thạch anh, tức là ko hoạt động, PIC sẽ ko chuyển sang nguồn dao động timer 1.


Tôi còn có một thắc mắc nữa là:
cũng là đoạn code trên nhưng:
OSCCONbits.SCS0=0; OSCCONbits.SCS1=0;//chọn bộ dao động chính
while(1){
PORTAbits.AN0=~LATAbits.LATA0;//toggle pin A0
delay();
}
đoạn code này cũng chạy tốt.nhưng
while(1){
PORTAbits.AN0=~PORTAbits.AN0;//toggle pin A0
delay();
}
lại không chạy, mặc dù pin A0 nối ra đèn led thông qua một điện trở và không có tụ .

- Bạn ko disable tính năng analog trên chân RA0, nhưng vẫn thấy LED sáng, có lẽ bạn đang chạy ở chế độ debug?
Nếu bạn chuyển sang chế độ release thì không có đoạn code nào phía trên làm LED sáng cả!

lybao_huy
25-03-2010, 06:16 PM
Cảm ơn bạn đã giải thích dùm về phần dao động.
bạn có thể giải thích cho tôi sự ảnh hưởng Debug và Release lên code không?.
tôi đã chuyển sang release như bạn nói nhưng nó vẫn thế.

bien_van_khat
26-03-2010, 08:21 AM
Cảm ơn bạn đã giải thích dùm về phần dao động.
bạn có thể giải thích cho tôi sự ảnh hưởng Debug và Release lên code không?.
tôi đã chuyển sang release như bạn nói nhưng nó vẫn thế.

Khi bạn chọn debug hay release ở cái dropdown list trong MPLAB thì chỉ thay đổi lựa chọn của trình biên dịch, cái này ko ảnh hưởng gì.

Khác biệt là khi bạn dùng ICD2, PICkit2, ICD3, PICkit3 hoặc realICE để hardware debug PIC. Khi đó các tool debug này sẽ tự động cấu hình các chân có tính năng analog trở về digital mà ko cần cấu hình trong code.

Chân RA0 là 1 chân Analog, trước khi sử dụng nó như 1 digital IO để xuất led, bạn phải tắt tính năng analog trên chân này đi.

lybao_huy
26-03-2010, 10:11 AM
Oh, rất tuyệt, tôi cảm ơn bạn nhiều lắm.
cho tôi hỏi nữa nhé:

1- các tool debug này làm thế nào mà tự động cấu hình các chân có tính năng analog trở về digital mà ko cần cấu hình trong code.

2-nên chọn MPLAB C hay HTPIC để lập trình cho PIC, DSPIC.

bien_van_khat
26-03-2010, 10:58 AM
Oh, rất tuyệt, tôi cảm ơn bạn nhiều lắm.
cho tôi hỏi nữa nhé:

1- các tool debug này làm thế nào mà tự động cấu hình các chân có tính năng analog trở về digital mà ko cần cấu hình trong code.

2-nên chọn MPLAB C hay HTPIC để lập trình cho PIC, DSPIC.

1 - Các loại chip hỗ trợ hardware debug đều có module debugger ở trong chip.
Các tool debugger giao tiếp với module này để điều khiển hoạt động của chip, do đó nó có thể làm rất nhiều thứ chứ ko chỉ tự cấu hình các chân.

2 - C18, C30 được hỗ trợ đầy đủ trong các bộ thư viện của microchip. Nên nếu sử dụng C18, C30 bạn sẽ thuận tiện hơn khi làm ứng dụng liên quan đến USB, Ethernet, Filesystem, graphic, zigbee....

HTTPIC hiện tại cũng thuộc về Microchip cho nên có thể tương lai cũng đc hỗ trợ nhiều hơn.

lybao_huy
26-03-2010, 02:08 PM
cảm ơn ban nhiều lắm. Lúc nào bí, tôi sẽ hỏi tiếp(Bạn thật là nhiệt tình)

lybao_huy
26-03-2010, 03:44 PM
Cho tôi hỏi vài câu này nhé.
1-
có gì khác nhau giữa
#pragma idata table
char array[10] = {0, 1, 2, 3, 4, 5};
#pragma idata

ram char array[10]={0,1,2,3,4,5};
không.

2-
có 2 chế độ:Extended Mode and non-Extended Mode.
trong trường hợp nào ta dùng Extended Mode.
và trong trường hợp nào dùng non-Extended Mode.

3-
#pragma interrupt isr1 isr_tmp save=section("isr_tmp") nosave=section(".tmpdata")
vậy khi nào ta dùng save=section(""), nếu không dùng thì có sao không.

xin giải thích dùm hộ tôi với(tôi gặp nhiều trục trặc là do sử dụng quen CCS rùi, nên khi dùng MPLAC C có nhiều bỡ ngỡ quá) cảm ơn bạn trước.

const_nos
26-03-2010, 09:56 PM
Nếu bạn cần giúp đỡ thì tạo 1 thread mới
Không được spam câu hỏi trong các thread về chủ đề khác làm loãng nội dung

thanhphong169
30-03-2010, 10:25 PM
chào các Pro
Mình viết chương trình bằng C18,gặp phải lỗi.
Error - could not find definition of symbol 'ReadADC' in file './ct_dknd_PID.o'.
Errors : 1
Mình đã add cac file.h,.lib,.lkr rồi.Chỉ đường dẫn cho các file này rồi.Nhưng khi dich vẫn bị lỗi.Các pro giúp mình với

lybao_huy
30-03-2010, 11:03 PM
Bạn thêm file adc.h ở trong C:\MMC18\h bằng cách #include <adc.h> vào đầu chương trình, chứ add nó vào không ăn thua gì đâu.

thanhphong169
31-03-2010, 09:54 AM
Mình đã include <adc.h>,include<18p67j60.h> rồi nhưng mà vẫn bị lỗi như trên.Chẳng hiểu sao nữa.

lybao_huy
31-03-2010, 09:38 PM
bạn coi lại cái lệnh đọc adc cũng như thiết lập các tham số có phải thuộc 18p67j60 không vì trong thư viện nó có rất nhiều hàm cũng cho ADC nhưng lại không phải cho 18p67j60 mà có thể cho 18p4550, lúc đầu làm bạn nên viết chương trình đơn giản để có thể quản lý .

tranquoclap
31-07-2010, 01:08 AM
Em mới cài MPLAB v 8.30 trên vista,sau khi tạo mới project,nhấn vào file->new thì gặp lỗi như trên hình!Bác nào giúp em với!Trước đó em da cài v 8.50 cũng lỗi giống thế!