PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 30-11-2008, 07:43 PM   #1
daythienha2007
Đệ tử 2 túi
 
Tham gia ngày: Apr 2008
Bài gửi: 26
:
xin mọi người giúp đỡ về Ngắt trong PIC

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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-11-2008, 07:59 PM   #2
daythienha2007
Đệ tử 2 túi
 
Tham gia ngày: Apr 2008
Bài gửi: 26
:
mình ko muốn dung I2C để truyền dữ liệu,các bạn có cách nào ko
daythienha2007 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-12-2008, 04:29 PM   #3
tungtot_vl
Đệ tử 6 túi
 
tungtot_vl's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 154
:
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
tungtot_vl vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-12-2008, 07:36 PM   #4
daythienha2007
Đệ tử 2 túi
 
Tham gia ngày: Apr 2008
Bài gửi: 26
:
Trích:
Nguyên văn bởi tungtot_vl View Post
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
daythienha2007 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-12-2008, 08:39 PM   #5
dvkkt
Đệ tử 3 túi
 
dvkkt's Avatar
 
Tham gia ngày: Oct 2007
Nơi Cư Ngụ: TPHCM
Bài gửi: 55
:
Send a message via Yahoo to dvkkt
Code:
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 ?.
dvkkt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-12-2008, 11:01 PM   #6
daythienha2007
Đệ tử 2 túi
 
Tham gia ngày: Apr 2008
Bài gửi: 26
:
Trích:
Nguyên văn bởi dvkkt View Post
Code:
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.....
daythienha2007 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-12-2008, 08:58 AM   #7
cskiller
Đệ tử 4 túi
 
Tham gia ngày: Aug 2008
Bài gửi: 89
:
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.
__________________
Quang báo RG/RGB 6/8/12/16 bits màu
Phone No: 0905.034.086
Email: lmquyen@gmail.com
cskiller vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-12-2008, 08:00 PM   #8
daythienha2007
Đệ tử 2 túi
 
Tham gia ngày: Apr 2008
Bài gửi: 26
:
Trích:
Nguyên văn bởi cskiller View Post
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é
daythienha2007 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-12-2008, 12:24 AM   #9
tdungk7
Đệ tử 1 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Ho Chi Minh city
Bài gửi: 20
:
Trích:
Nguyên văn bởi cskiller View Post
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-12-2008, 12:35 AM   #10
tdungk7
Đệ tử 1 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Ho Chi Minh city
Bài gửi: 20
:
Trích:
Nguyên văn bởi daythienha2007 View Post
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,...
tdungk7 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-12-2008, 04:29 PM   #11
phungmap123
Nhập môn đệ tử
 
Tham gia ngày: Nov 2008
Bài gửi: 1
:
Arrow cách để cất dữ liệu và lấy dữ liệu ra khi xuất hiện ngắt

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 đỡ !
phungmap123 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-12-2008, 05:28 PM   #12
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi phungmap123 View Post
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,
__________________
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-12-2008, 07:27 PM   #13
daythienha2007
Đệ tử 2 túi
 
Tham gia ngày: Apr 2008
Bài gửi: 26
:
Trích:
Nguyên văn bởi tdungk7 View Post
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.
daythienha2007 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-12-2008, 04:47 PM   #14
nms48
Đệ tử 1 túi
 
Tham gia ngày: Dec 2008
Bài gửi: 11
:
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:

Code:
#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

thay đổi nội dung bởi: nms48, 31-12-2008 lúc 10:47 AM.
nms48 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-12-2008, 11:17 PM   #15
nms48
Đệ tử 1 túi
 
Tham gia ngày: Dec 2008
Bài gửi: 11
:
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????????
nms48 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam