PDA

View Full Version : xin mọi người giúp đỡ về Ngắt trong PIC


daythienha2007
30-11-2008, 07:43 PM
mình định viết chương trình cho PIC 18f4431 nhận 1 số từ PIC khác(16f887).Mình thực hiện bằng cách cho nó đếm xung qua chân interrupts được truyền từ con PIC khác(16f887).Ví dụ muón gửi số 10 tới PIC8f4431 mình truyên 10 xung vào chân interrupts của PIC8f4431Mình viết chương trình ngắt ở 18f4431 như sau:
#include <18f4431.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT
#use delay(clock=20000000)
int32 count=0 ;

#int_ext1
void dem_xung()
{
count=count+1;
}

void main()
{

ext_int_edge(0,L_TO_H);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT1);
while(true)
{

output_high(pin_b6);
{
if(count==20)
output_high(pin_b7); // nếu nhận được 20 xung thì cho sáng led chân RB7

}

}
}
Và chương trình tạo xung từ PIC6f887 như sau:
#include <16f887.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT
#use delay(clock=20000000)
int32 cycle,i=1;


void main()

{ output_high(pin_b6);
cycle=200;
for(i=1;i<=10;++i)
{
output_high(pin_b7);//kiểm tra xem code có hoạt động hay ko
delay_us(cycle);
output_low(pin_b7);
delay_us(cycle);
}
}


ko bít chương trình có jì sai ko mà sao thây khi có ngắt ở chân interrupts,thì chân RB7 ở PIC8f4431 sáng ,bất chấp số xung nhận được là bao nhiêu.Mình thử đổi số xung truyền ở PIC6f887 thì hiện tươngj này vẫn xảy ra.Hình như PIC8f4431 nhân không đúng số xung mình đã truyền.Chẳng bit tại sao
Mình hiện chưa ngĩ ra cách nào để truyền 1 giá trị từ PIC này sang PIC khác.nên dùng cách thô thiển này.Nếu bạn nào có cao kiến hay hơn,xin chỉ giúp

daythienha2007
30-11-2008, 07:59 PM
mình ko muốn dung I2C để truyền dữ liệu,các bạn có cách nào ko

tungtot_vl
01-12-2008, 04:29 PM
thời gian tạo xung trong 16f877 của bạn quá nhanh, do đó nên khi bậc nguồn lên là 18f đã nhận đủ 20 xung và là cho bit b7 sáng. trong chương trình bạn lại không cho b7 tắt nên nó cứ sang mãi là đúng rồi. các dâu {} của lệnh if bạn viết cũng sai rồi. tốt nhất là bạn cho thời gian tạo sung trong 16f chậm lại. trong 18f khi nhận đủ 20 xung thì sáng đèn, delay rồi lại tắt đèn. khi count =20 thi bạn gán nó lại =0 để lập lại từ đầu

daythienha2007
01-12-2008, 07:36 PM
thời gian tạo xung trong 16f877 của bạn quá nhanh, do đó nên khi bậc nguồn lên là 18f đã nhận đủ 20 xung và là cho bit b7 sáng. trong chương trình bạn lại không cho b7 tắt nên nó cứ sang mãi là đúng rồi. các dâu {} của lệnh if bạn viết cũng sai rồi. tốt nhất là bạn cho thời gian tạo sung trong 16f chậm lại. trong 18f khi nhận đủ 20 xung thì sáng đèn, delay rồi lại tắt đèn. khi count =20 thi bạn gán nó lại =0 để lập lại từ đầu
mình đã thay đổi tần số tạo xung khác nhau,nghĩa là cho chu kì lớn ra nhwng vẫn gặp hiện tượng tương tự.Mình cũng lấy đông hồ ra đo thấy PIC16f887 vẫn còn đang xuất xung(nghĩa là chưa xuất đuôs xung cần thiết)mà RB7 của PIC18 đã sáng rồi.Mình thấy rất khó hiểu.Mong bạn tungtot_vl & mọi người giải đáp giúp

dvkkt
01-12-2008, 08:39 PM
void main()
{

ext_int_edge(0,L_TO_H);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT1);
while(true)
{

output_high(pin_b6);

{ <<<------ ????

if(count==20)
output_high(pin_b7); // nếu nhận được 20 xung thì cho sáng led chân RB7

}

}
}


Bạn xem lại chổ mình để dấu ?.

daythienha2007
01-12-2008, 11:01 PM
void main()
{

ext_int_edge(0,L_TO_H);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT1);
while(true)
{

output_high(pin_b6);

{ <<<------ ????

if(count==20)
output_high(pin_b7); // nếu nhận được 20 xung thì cho sáng led chân RB7

}

}
}


Bạn xem lại chổ mình để dấu ?.
mình chwa hiểu ý của bạn.chõ đó có gì trục trặc à.Xin bạn chỉ giúp.....

cskiller
02-12-2008, 08:58 AM
Trong ngữ cảnh này thì dấu cặp dấu {} dù trước if hay sau if cũng không có ý nghĩa nên không ảnh hưởng đến chương trình.
Chương trình này chạy chưa đúng là do chưa thực hiện thiết lập giá trị TRIS cho các chân IO trên PORTB của PIC.

daythienha2007
03-12-2008, 08:00 PM
Trong ngữ cảnh này thì dấu cặp dấu {} dù trước if hay sau if cũng không có ý nghĩa nên không ảnh hưởng đến chương trình.
Chương trình này chạy chưa đúng là do chưa thực hiện thiết lập giá trị TRIS cho các chân IO trên PORTB của PIC.
để mình thử set TRIS xem sao?
cám ơn nhé

tdungk7
08-12-2008, 12:24 AM
Trong ngữ cảnh này thì dấu cặp dấu {} dù trước if hay sau if cũng không có ý nghĩa nên không ảnh hưởng đến chương trình.
Chương trình này chạy chưa đúng là do chưa thực hiện thiết lập giá trị TRIS cho các chân IO trên PORTB của PIC.

Chào bạn.

Đúng là dấu {} đó không có ý nghĩa gì cả, ta bỏ đi thì hơn


Một chút tranh luận nhỏ nhỏ:

Do bạn daythienha2007 dùng các lệnh output_low(), output_high() nên không bị ảnh hưởng bởi lệnh set_tris. Mà nếu có bị ảnh hưởng thì led trên port B phải không sáng mới đúng.

Bạn xem lại nhé

tdungk7
08-12-2008, 12:35 AM
mình đã thay đổi tần số tạo xung khác nhau,nghĩa là cho chu kì lớn ra nhwng vẫn gặp hiện tượng tương tự.Mình cũng lấy đông hồ ra đo thấy PIC16f887 vẫn còn đang xuất xung(nghĩa là chưa xuất đuôs xung cần thiết)mà RB7 của PIC18 đã sáng rồi.Mình thấy rất khó hiểu.Mong bạn tungtot_vl & mọi người giải đáp giúp


Chào bạn, bạn thử thay lệnh delay_us(cycle) bằng delay_ms(cycle) với cycle=500 xem thử nhé, cũng là để dễ nhìn qua led xem 16f877 phát đến xung thứ mấy rồi. Chứ ngắt ngoài EXT_INT làm sao nhận nổi xung us, nó không được thiết kế để truyền dữ liệu (đòi hỏi tốc độ cao) mà dùng để đáp ứng ngắt.



output_high(pin_b6);
{
if(count==20)
output_high(pin_b7); // nếu nhận được 20 xung thì cho sáng led chân RB7

}


đoạn lênh này có thể bỏ hai dấu {} đi, và sau lệnh output_high(pin_b7) nên thêm 2 dòng:

delay_ms(1000); // sáng led 1s báo có dữ liệu truyền xong
output_low(pin_b7); // tắt led đi báo đợi dữ liệu mới


Mình viết như thế này để bạn dễ theo dõi PIC chạy bằng mắt thường. Chứ truyền dữ liệu người ta dùng khối chuyên dụng I2C hoặc theo chuẩn RS232,...

phungmap123
08-12-2008, 04:29 PM
xin các bác làm ơn bớt chút thời gian, giải quyết dùm em vấn đề này tí nha, cảm ơn các bác nhiều :
trong chuơng trình của em có sử dụng 2 ngắt là : ngắt portb và ngắt timer1 . Khi mô phỏng với từng chương trình riêng lẻ thì nó chạy đúng, nhưng khi ráp cả 2 chuơng trình lại thì nó báo là : " STACK FLOW ", và dữ liệu xuất ra cũng bị sai.
em nghĩ là khi kết hợp cả 2 chương trình lại thì thanh ghi nào đó(STATUS, PCLATH, FSR, W) bị thay đổi dữ liệu và làm chương trình sai.
tài liệu thì chỉ nói là ' khi dùng ngắt thì nên cất các ô nhớ này vào 16 byte cao của bank nào cũng được ' , nhưng tới giờ em vẫn chưa tìm ra được cách cất các dữ liệu này.
PIC mà em dùng là : PIC 16F877A
em đang cần gấp lắm,mong các bác giúp đỡ !

namqn
08-12-2008, 05:28 PM
xin các bác làm ơn bớt chút thời gian, giải quyết dùm em vấn đề này tí nha, cảm ơn các bác nhiều :
trong chuơng trình của em có sử dụng 2 ngắt là : ngắt portb và ngắt timer1 . Khi mô phỏng với từng chương trình riêng lẻ thì nó chạy đúng, nhưng khi ráp cả 2 chuơng trình lại thì nó báo là : " STACK FLOW ", và dữ liệu xuất ra cũng bị sai.
em nghĩ là khi kết hợp cả 2 chương trình lại thì thanh ghi nào đó(STATUS, PCLATH, FSR, W) bị thay đổi dữ liệu và làm chương trình sai.
tài liệu thì chỉ nói là ' khi dùng ngắt thì nên cất các ô nhớ này vào 16 byte cao của bank nào cũng được ' , nhưng tới giờ em vẫn chưa tìm ra được cách cất các dữ liệu này.
PIC mà em dùng là : PIC 16F877A
em đang cần gấp lắm,mong các bác giúp đỡ !
Nếu bạn dùng ngôn ngữ cấp cao (C chẳng hạn) thì trình biên dịch có nhiệm vụ hiện thực điều này cho bạn. Nếu bạn dùng hợp ngữ thì mục 14.12-Context Saving During Interrupts trong datasheet của PIC16F877A đã có một ví dụ cụ thể.

Thân,

daythienha2007
08-12-2008, 07:27 PM
Chào bạn, bạn thử thay lệnh delay_us(cycle) bằng delay_ms(cycle) với cycle=500 xem thử nhé, cũng là để dễ nhìn qua led xem 16f877 phát đến xung thứ mấy rồi. Chứ ngắt ngoài EXT_INT làm sao nhận nổi xung us, nó không được thiết kế để truyền dữ liệu (đòi hỏi tốc độ cao) mà dùng để đáp ứng ngắt.



output_high(pin_b6);
{
if(count==20)
output_high(pin_b7); // nếu nhận được 20 xung thì cho sáng led chân RB7

}


đoạn lênh này có thể bỏ hai dấu {} đi, và sau lệnh output_high(pin_b7) nên thêm 2 dòng:

delay_ms(1000); // sáng led 1s báo có dữ liệu truyền xong
output_low(pin_b7); // tắt led đi báo đợi dữ liệu mới


Mình viết như thế này để bạn dễ theo dõi PIC chạy bằng mắt thường. Chứ truyền dữ liệu người ta dùng khối chuyên dụng I2C hoặc theo chuẩn RS232,...
mình đã sử thực hiện được ngắt theo ý muốn rồi.Cám ơn bạn Ttungk7 đã góp ý,thực ra mình đang thiết kế drive cho động cơ bước,yêu cầu là kích 1 xung thì quay 1 bước,nên ko thể dùng I2C ,RS232 để truyền dữ liệu.Sẵn đay mình cũng muốn hỏi là,bạn nào đã viết chương trình bằng CCS để đọc encoder bằng module QIE (PIC18f4431)chưa,có thể hướng dẫn mình sử dụng ko,nếu có code mẫu,past lên để mọi người tham khảo càng tốt.mình nghe nói module QIE chuyên dùng để đọc tín hiệu encoder.

nms48
28-12-2008, 04:47 PM
cho mình hỏi tí: minh mô phỏng mà chay kô đúng ,có ai biết chương trình còn sai chỗ nào kô.(mình thấy timer0 chay ko đúng.timer1 thì dường như là chưa chạy)

nguyen lý như sau: lúc có xung cạnh lên thì khởi tạo timer0 5ms.khi timer0 tràn thì xuất xung ra D0 và khời tạo timer1 10ms.khi timer1 tràn thì xuất xung ra D1,bình thường thì xuất xung ra D2

chương trình mình như sau:

#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

// ngat ngoai---------------
#int_EXT
void EXT_isr()
{
set_timer0(40534); //khoi tao timer0 5ms thi tran

}

//ngat timer0------------------
#int_timer0
void timer0_isr()
{
output_high(pin_D0);
delay_us(10);
output_low(pin_D0);
set_timer1(15534); // khoi tao timer1 10ms

}
//ngat timer1--------------
#int_timer1
void timer1_isr()
{ output_high(pin_D1);
delay_us(10);
output_low(pin_D1);
}

// chuong trinh chinh
void main()
{
enable_interrupts(INT_EXT);
ext_int_edge(L_TO_H);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
enable_interrupts(int_timer0);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(int_timer1);
enable_interrupts(global);

while(true)
{
output_high(pin_d2);
delay_ms(100);
output_low(pin_d2);
delay_ms(100);
}
}

cám ơn các bạn rất nhiều và mong được giúp đỡ sớm

nms48
30-12-2008, 11:17 PM
trời ơi các cao thủ của làng pic đâu hết rùi : giúp minh với nếu kô mình chết chắc hichic.còn 3 ngày nữa nộp luận văn rùi, mình cũng biết làm luận văn thì tự nghiên cưu là chính -----nhưng mình đang bí ........help help me................

kô lẽ cả một diễn đàn với những người nhiệt thành như thế này mà kô biết cái chương trình của mình sai chỗ nào hay sao????????

namqn
31-12-2008, 01:07 AM
Timer 0 trong PIC16F877(A) là một timer 8-bit, việc bạn thiết lập số đếm 16-bit cho nó không làm thay đổi thực tế này. Trình dịch mà bạn đang dùng sẽ chỉ dùng 8 bit thấp của giá trị mà bạn đã mô tả để đặt vào thanh ghi đếm của Timer 0. Do đó, có thể dự đoán rằng Timer 0 không chạy đúng ý đồ ban đầu của bạn.

Trong vòng lặp chính, bạn không bao giờ xuất logic '0' ra D2.

Bạn đang thực hiện luận văn mà lại chờ cho đến khi chỉ còn 5 ngày là đến hạn nộp mới đặt câu hỏi ở diễn đàn thì chính bạn mới là người đáng trách, không nên trách các thành viên của diễn đàn. Diễn đàn hoạt động trên tinh thần tự nguyện, cùng giúp nhau tiến bộ, và không thành viên nào có nghĩa vụ phải đảm bảo rằng ai đó làm kịp bài tập, đồ án, hoặc luận văn để nộp, đặc biệt với những trường hợp chỉ còn vài ngày là hết hạn nộp.

Thân,

nms48
31-12-2008, 11:10 AM
xin lỗi các bạn và đặc biệt là anh namqn. mình sơ ý wa. cám ơn anh đã giúp em.
em post lên diễn đàn cái code cũ mà kô để ý.xin chân thành xin lỗi về sai sót này .

#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

// ngat ngoai
#int_EXT
void EXT_isr()
{
set_timer0(7); //4ms tran
}

//ngat timer0
#int_timer0
void timer0_isr()
{

set_timer1(40534);
output_high(pin_D0);
delay_us(10);
output_low(pin_D0);

}
// ngat timer1
#int_timer1
void timer1_isr()
{
output_high(pin_D1);
delay_us(10);
output_low(pin_D1);

}

// chuong trinh chinh
void main()
{
enable_interrupts(INT_EXT);
ext_int_edge(L_TO_H);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);
enable_interrupts(int_timer0);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(int_timer1);
enable_interrupts(global);


while(true)
{

output_high(pin_d2);
delay_ms(10);
output_low(pin_d2);
delay_ms(10);
}
}

chuong trình chạy được timer0 nhưng khỏang 0.8ms là xuất xung rồi trong khi đó em cần timer0 chờ ngắt ngoài rồi mới được phép ngắt. còn timer1 thì kô chạy(tại vì kô thấy xuất xung ra D1).
mong anh giup em lần này nữa.thân chào anh

namqn
31-12-2008, 05:16 PM
Với Timer 0, bạn đang định thời bằng 16*(256 - 7) = 3984 chu kỳ máy, tức là 0,7968 ms với tần số xung clock là 20 MHz. Timer 0 là timer chạy tự do, không thể tắt (bạn sẽ không tìm thấy bit nào trong các thanh ghi liên quan đến Timer 0 để tắt nó). Do đó, những gì bạn quan sát được với Timer 0 là hợp lý.

Bạn làm thế nào để biết chân D1 có thay đổi trạng thái hay không? Bạn không quan sát được sự thay đổi của chân D1 bằng những biện pháp hiện thời không có nghĩa là chân D1 không thay đổi trạng thái.

Thân,

nms48
31-12-2008, 05:42 PM
em xin lỗi,nhưng anh có thể chỉ cho em cách làm như thế nào để xuất xung được như ý không. nếu timer0 kô thể tắt thì phải làm như thế nào (chuyển qua dùng timer2 chăng)

ko trách gì em đã clear cờ ngắt của timer0 cũng kô dc.(timer0 là timer chạy tự do -em cám ơn anh về thông tin này lắm lắm)

còn chân d1 em quan sát bằng osillicope nhưng ko thấy xung nào cả.em nghĩ lả do timer0 ngắt thì timer1 mới hoạt động nhưng có lẽ do timer1 chưa kip ngắt timer0 đã sét lại giá trị cho timer1 rùi.

chân thành cám ơn anh và mong anh giúp.chúc anh vui

namqn
31-12-2008, 06:01 PM
em xin lỗi,nhưng anh có thể chỉ cho em cách làm như thế nào để xuất xung được như ý không. nếu timer0 kô thể tắt thì phải làm như thế nào (chuyển qua dùng timer2 chăng)

ko trách gì em đã clear cờ ngắt của timer0 cũng kô dc.(timer0 là timer chạy tự do -em cám ơn anh về thông tin này lắm lắm)

còn chân d1 em quan sát bằng osillicope nhưng ko thấy xung nào cả.em nghĩ lả do timer0 ngắt thì timer1 mới hoạt động nhưng có lẽ do timer1 chưa kip ngắt timer0 đã sét lại giá trị cho timer1 rùi.

chân thành cám ơn anh và mong anh giúp.chúc anh vui
Theo tôi, đúng như bạn đã nghĩ rằng Timer 1 không hề tạo ngắt. Lý do là sau mỗi 0,8 ms thì ngắt Timer 0 sẽ đặt lại số đếm cho Timer 1, nên ngắt Timer 1 sẽ không bao giờ xảy ra (vì cần khoảng 5 ms mới đạt đến điều kiện tạo ngắt).

Bạn nên mô tả bài toán gốc, vì bạn chưa có được giải thuật đúng.

Thân,

nms48
31-12-2008, 06:37 PM
cám ơn anh namqn

bài toán em cần là:" khi có ngắt ngoài(ngắt cạnh lên) thì khởi tạo timer0 5ms, khi timer0 ngắt thì khởi tạo time1 10ms đồng thởi xuất ra D0 một xung có độ rộng là 10us. khi timer1 ngắt thì xuất ra D1 một xung cũng có độ rộng là 10us còn chương trình chính thì để đọc adc"
em đã viết và nạp cho pic hàng ngàn lần rùi nhưng vẫn ko dc(em dùng pic 18f4520 chứ kô phải 16f877).em mới làm quen pic được khoảng 1 tháng.

một lần nữa cám ơn anh.
chào anh

namqn
31-12-2008, 06:52 PM
cám ơn anh namqn

bài toán em cần là:" khi có ngắt ngoài(ngắt cạnh lên) thì khởi tạo timer0 5ms, khi timer0 ngắt thì khởi tạo time1 10ms đồng thởi xuất ra D0 một xung có độ rộng là 10us. khi timer1 ngắt thì xuất ra D1 một xung cũng có độ rộng là 10us còn chương trình chính thì để đọc adc"
em đã viết và nạp cho pic hàng ngàn lần rùi nhưng vẫn ko dc(em dùng pic 18f4520 chứ kô phải 16f877).em mới làm quen pic được khoảng 1 tháng.

một lần nữa cám ơn anh.
chào anh
Tôi nghĩ bài toán của bạn nên đặt ra như sau: Khi có tín hiệu bên ngoài (cạnh lên) thì cần chờ 5 ms, khi hết 5 ms đó thì tạo một xung có độ rộng 10 us ra chân RD0, và chờ tiếp 10 ms. Khi hết 10 ms đó thì tạo một xung có độ rộng 10 us ra chân RD1.

Với PIC18F4520 thì bạn có thể dùng Timer 0 như một timer 8-bit hay 16-bit, và cũng có thể bật/tắt nó theo ý muốn. Bạn đã lãng phí thời gian của chính mình và của người khác khi post code cho PIC16F877, trong khi thực sự lại sử dụng PIC18F4520. Cần chú ý là PIC18 có 2 mức ưu tiên ngắt, và việc thiết lập ngắt trong PIC18 liên quan đến nhiều thanh ghi hơn so với PIC16.

Nếu bài toán của bạn có thể mô tả như trên thì bạn có thể thực hiện với 1 timer chứ không nhất thiết phải dùng đến 2 timer.

Thân,

daythienha2007
31-12-2008, 07:18 PM
cho mình hỏi tí: minh mô phỏng mà chay kô đúng ,có ai biết chương trình còn sai chỗ nào kô.(mình thấy timer0 chay ko đúng.timer1 thì dường như là chưa chạy)

nguyen lý như sau: lúc có xung cạnh lên thì khởi tạo timer0 5ms.khi timer0 tràn thì xuất xung ra D0 và khời tạo timer1 10ms.khi timer1 tràn thì xuất xung ra D1,bình thường thì xuất xung ra D2

chương trình mình như sau:

#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

// ngat ngoai---------------
#int_EXT
void EXT_isr()
{
set_timer0(40534); //khoi tao timer0 5ms thi tran

}

//ngat timer0------------------
#int_timer0
void timer0_isr()
{
output_high(pin_D0);
delay_us(10);
output_low(pin_D0);
set_timer1(15534); // khoi tao timer1 10ms

}
//ngat timer1--------------
#int_timer1
void timer1_isr()
{ output_high(pin_D1);
delay_us(10);
output_low(pin_D1);
}

// chuong trinh chinh
void main()
{
enable_interrupts(INT_EXT);
ext_int_edge(L_TO_H);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
enable_interrupts(int_timer0);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(int_timer1);
enable_interrupts(global);

while(true)
{
output_high(pin_d2);
delay_ms(100);
output_low(pin_d2);
delay_ms(100);
}
}

cám ơn các bạn rất nhiều và mong được giúp đỡ sớm
Khi bạn thiết lập timer :" setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
enable_interrupts(int_timer0); "
thì timer0ddax chạy rôif,khong fải tới lúc bạn set_timer0 nó mới chạy đâu.Tương tự đối với timer1.Hơn nưa Thời gian bạn delay quá ngắn,sao bạn biết timer1 ko chạy

nguyenquoctoan
31-12-2008, 09:09 PM
mình nghĩ là enable_interrupts(global); ngắt toàn cục thì tất cả các ngắt mới xảy ra chứ,phải vậy kô,

nms48
01-01-2009, 02:26 AM
mình cám ơn các bạn đã giúp đỡ mình

bởi vì protues 6 kô có pic18f4520 nên kô mô phỏng dc. nên em đành phải chuyển wa mô phỏng bằng pic16f877. xin lỗi các bạn nhé.

anh namqn có thể nói rõ hơn cho em về " Với PIC18F4520 thì bạn có thể dùng Timer 0 như một timer 8-bit hay 16-bit, và cũng có thể bật/tắt nó theo ý muốn"

anh có thể bật mí cho em thêm một tí về điều đó dc ko. em cũng clear_interrupt(int_timer0) hoặc disable_interrupts(int_timer0) rồi nhưng vẫn kô đc.

bây giờ thời gian của em gấp quá rồi. mong anh giúp đỡ em

thân chào anh

nms48
01-01-2009, 02:33 AM
mình nghĩ là enable_interrupts(global); ngắt toàn cục thì tất cả các ngắt mới xảy ra chứ,phải vậy kô,

đúng như ý bạn thì khi cho phép enable_interrupts(global) thì tất cả các ngắt mới ngắt đc.

bạn xem lại lý thuyết về pic thì sẽ rõ.

namqn
01-01-2009, 04:38 AM
mình cám ơn các bạn đã giúp đỡ mình

bởi vì protues 6 kô có pic18f4520 nên kô mô phỏng dc. nên em đành phải chuyển wa mô phỏng bằng pic16f877. xin lỗi các bạn nhé.

anh namqn có thể nói rõ hơn cho em về " Với PIC18F4520 thì bạn có thể dùng Timer 0 như một timer 8-bit hay 16-bit, và cũng có thể bật/tắt nó theo ý muốn"

anh có thể bật mí cho em thêm một tí về điều đó dc ko. em cũng clear_interrupt(int_timer0) hoặc disable_interrupts(int_timer0) rồi nhưng vẫn kô đc.

bây giờ thời gian của em gấp quá rồi. mong anh giúp đỡ em

thân chào anh
Bạn tắt bit T08BIT (bit 6) trong thanh ghi T0CON thì Timer 0 sẽ là một timer 16-bit, ngược lại (bật bit T08BIT) thì Timer 0 sẽ là một timer 8-bit. Bạn dùng bit TMR0ON (bit 7) cũng của thanh ghi T0CON đó để bật/tắt Timer 0 của PIC18F4520. Những thông tin này đều có trong mục 11, datasheet của PIC18F4520.

Tôi không dùng CCS C nên không thể viết code cho bạn copy and paste được, bạn phải tự tìm hiểu xem thiết lập Timer 0 của PIC18F4520 trong CCS C ra sao.

Như tôi đã nói ở trên, bạn chờ đến khi chỉ còn vài ngày mới bắt đầu hỏi thì chính là bạn đã tự hại mình thôi. Hy vọng có bạn nào đó có thể viết giúp cho bạn đoạn code đó.

Thân,

nms48
01-01-2009, 11:42 AM
cám ơn anh đã giúp em trong thời gian qua..

các bạn có thể giúp mình bật/tắt timer0 được không?

mong reply sớm .thân chào các bạn