View Full Version : vidu ve ngat ngoai
maruko
13-08-2011, 03:53 AM
các bác ơi. em có sửa lại code 1 ví dụ đơn giản về ngắt ngoài . sau khi suẳ chuơng trình cứ báo lỗi mà em k biết lỗi đó do đâu.
nhờ các bác testgiups em với. em cảm ơn
#include <16f877a.h>
#include <def_877a.h>
#device *=16
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
//#define led PIN_D1
//#use fast_io(b)
//#use fast_io(d)
boolean i = 1;
#int_ext
void ext_int_isr()
{
if(i == 1)
{
//output_high(led);
potrd =255;
i = 0;
}
else
{
//output_low(led);
portd=0;
i = 1;
}
}
void main()
{
// set_tris_b(0x01);
//set_tris_d(0x00);
TRISB =0x00;
TRISd =0x00;
portd=0x00;
port_b_pullups(true);
enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai
enable_interrupts(global); // Cho phep ngat toan cuc
while(1);
}
goldstar09
13-08-2011, 09:39 AM
Chào bạn.
Bạn đang dùng chức năng ngắt trên chân RB0?(ngắt ngoài). Không rõ bạn nhận được lỗi như thế nào từ trình biên dịch CCS?
Bạn khai báo biến i là biến kiểu boolean, tức là chỉ có hai giá trị 0, 1. Nhưng mình không thấy bạn tham chiếu giá trị i này vào đâu cả, cho nên có lẽ câu lệnh kiểm tra (i==1) không có ý nghĩa là chương trình đã vào hàm xử lý ngắt. Bạn lại định nghĩa các chân portB là ngõ ra??, theo mình các chân này phải là đầu vào số, như vậy bạn mới có thể đọc và kiểm tra được mức logic trên các chân này chứ. Thông cảm nếu nói sai!
Thân.
maruko
13-08-2011, 11:32 AM
vâng ! em đang dùng chức năng ngắt trên chân RB0?(ngắt ngoài)
code của em la :
#include <16f877a.h>
#include <def_877a.h>
#device *=16
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
//#define led PIN_D1
boolean i = 1;
#int_ext
void ext_int_isr()
{
if(i == 1)
{
potrd =255;
i = 0;
}
else
{
portd=0;
i = 1;
}
}
void main()
{
TRISB =0xff;
TRISd =0x00;
port_b_pullups(true);
enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai
enable_interrupts(global); // Cho phep ngat toan cuc
while(1);
}
trình dịch cứ báo lỗi ở phần TRISTD VÀ TRISTB mặc dù em đã khai báo thư viện #include <def_877a.h> rồi .lỗi như trong file ảnh em gửi ấy. các bác suẳ lỗi giúp em với. em cảm ơn các bác nhiều
hcmut.khoamaisi
14-08-2011, 04:27 PM
Bạn đã add file def_877a.h vào mục device của PIC chưa?Mấy lỗi này theo mình nghĩ là toàn do thư viện thôi hà !!! bạn thử sửa bỏ 2 dòng :
TRISB =0xff;
TRISd =0x00;
Thay vào đó là dùng 2 lệnh:
set_tris_b(0xff);
set_tris_d(0x00);
ocean_86
14-08-2011, 04:48 PM
các bác ơi. em có sửa lại code 1 ví dụ đơn giản về ngắt ngoài . sau khi suẳ chuơng trình cứ báo lỗi mà em k biết lỗi đó do đâu.
nhờ các bác testgiups em với. em cảm ơn
#include <16f877a.h>
#include <def_877a.h>
#device *=16
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
//#define led PIN_D1
//#use fast_io(b)
//#use fast_io(d)
boolean i = 1;
#int_ext
void ext_int_isr()
{
if(i == 1)
{
//output_high(led);
potrd =255;
i = 0;
}
else
{
//output_low(led);
portd=0;
i = 1;
}
}
void main()
{
// set_tris_b(0x01);
//set_tris_d(0x00);
TRISB =0x00;
TRISd =0x00;
portd=0x00;
port_b_pullups(true);
enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai
enable_interrupts(global); // Cho phep ngat toan cuc
while(1);
}
chào bạn
bạn thử bỏ dòng này đi xem #include <def_877a.h>
và mình không hiểu cách viết này có đúng không bạn enable_interrupts(INT_EXT_H2L);
sau while(1) hình như không có dấu chấm.
bạn kiểm tra lại nha
chúc thành công
maruko
17-08-2011, 11:29 AM
các bác ơi, sửa giúp em đoạn code này với . code chạy rồi nhưng khi nạp vào mạch mô phỏng thì k thấy chạy các bác ah
em dùng ngắt ngoài trên chân RB1 nối với phím bấm và 1led nối với RD1
khi chạy mô phỏng thì bật lên cái led sáng ngay.ấn phím thì k thấy led tắt. mặc dù em ấn phím có thấy sự thay đổi trạng thái trên chân RB1
các bác xem giúp em với
#include <16f877a.h>
#use delay(clock = 20Mhz)
//#device *=16
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use fast_io (b)
#use fast_io (D)
boolean i = 1;
#int_ext
void ext_int_isr(){
if(i == 1){
i=input(PIN_b1);
output_high(pin_d1);
i = 0;
}
else{
output_low(pin_d1);
i = 1;
}
}
void main(){
set_tris_b(0xff);
set_tris_D(0x00);
port_b_pullups(true);
enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai
enable_interrupts(global); // Cho phep ngat toan cuc
while(1);
}
thank các bác nhiều
pstin
20-08-2011, 04:43 PM
Thấy lạ lạ!!!!!!!!. Lúc đầu i=1 thì thực hiện lệnh if và led sáng, rồi cho i=0, vòng chương trình tiếp theo thực hiện lệnh else và tắt led, và set i=1, lặp lại mãi như vậy. Theo tui nghĩ led sẽ chớp tắt liên tục tốc độ quá nhanh và bạn thấy led luôn sáng!!!!!!!!.
Thử sửa:
#include <16f877a.h>
#use delay(clock = 20Mhz)
//#device *=16
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use fast_io (b)
#use fast_io (D)
boolean i = 1;
#int_ext
void ext_int_isr(){
i=input(PIN_b1);
if(i == 1){
output_high(pin_d1);
}
else{
output_low(pin_d1);
}
}
void main(){
set_tris_b(0xff);
set_tris_D(0x00);
port_b_pullups(true);
enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai
enable_interrupts(global); // Cho phep ngat toan cuc
while(1);
}
Tui thì khai báo nút nhấn trong chương trình chính luôn, và việc nhấn phím thì rất đơn giản.
Chúc vui!!!!!!!!
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.