PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   ngắt onchange RB (http://www.picvietnam.com/forum/showthread.php?t=7626)

tumi_kt 28-12-2010 05:02 PM

ngắt onchange RB
 
Mình có đoạn code dùng ngắt RB trên 3 pin RB4-RB6.ý tưởng là ứng với từng phím nhấn sẽ làm LED nháy theo 1 kiểu khác nhau.nhưng sao code ko chạy nhỉ?bro nào biết lỗi này nằm ở đâu ko?chỉ giúp mình với. code mình như sau: thankssssssss!!!!!!!!

#include <16f877a.h>
#include <def_16f877a.h>
#fuses NOPROTECT,HS,NOWDT
#use delay(clock=2000000)
char kieu_led;
void chuong_trinh();
#int_rb
void rb_isr()
{
chuong_trinh();
}
void chuong_trinh()
{
if(!input(pin_b4))
portd=0xff;
else if(!input(pin_b5))
portd=0x00;
else if(!input(pin_b6))
portd=0x0f;
}
void main()
{
trisb=0xf0;//portb input
trisd=0x00;//portd output

enable_interrupts(global);
enable_interrupts(int_rb);
ext_int_edge(h_to_l);

while(1)
{
chuong_trinh();
}
}

sunshine 28-12-2010 07:29 PM

Sẳn đó anh chị coi dùm em vấn đế này. Khi có tín hiệu ngắt từ RB[4:7] thì nó nhảy vào chương trình ngắt. Em dùng nhưng lệnh sau để kiểm tra nhưng chân ở RB[4:7] để thoát ra
; KIEM TRA PHIM BAM
KIEMTRA
BTFSS PORTB, 4
GOTO EXIT_INT
BTFSS PORTB, 5
GOTO EXIT_INT
BTFSS PORTB, 6
GOTO EXIT_INT
BTFSS PORTB, 7
GOTO EXIT_INT
GOTO KIEMTRA

Lúc đó khi nhấn nút thì nó nhảy ra nhưng khi đợi 1 lúc rồi buông tay ra thì nó nhảy lại vào chương trình ngắt. Em đã CLRF RBIF trước khi thoát ngắt. Mong các bác giúp dùm em làm sao thoát ngắt mà không bị ảnh hưởng bởi hiện tượng trên.
Cách nổi ở port B: Bình thường thì mức cao, nhấn thì xuống mức thấp.
Cho em hỏi là ngắt RB[4:7] không phải chọn cạnh xung đúng không ?( Đọc trong datasheet 16F877A nối vậy )
Em xin cám ơn anh chị.

duyphuoc 16-01-2011 08:09 AM

Tôi thấy bạn tumi_kt chưa set R pullup
Còn ngắt trên Port B là ngắt onchange nhé bạn sunshine, nghĩa là bất kỳ thay đổi nào trên các chân của Port B cũng dẫn ngắt cả. Thân!

tdm 21-01-2011 12:59 PM

Trích:

Nguyên văn bởi tumi_kt (Post 41138)
Mình có đoạn code dùng ngắt RB trên 3 pin RB4-RB6.ý tưởng là ứng với từng phím nhấn sẽ làm LED nháy theo 1 kiểu khác nhau.nhưng sao code ko chạy nhỉ?bro nào biết lỗi này nằm ở đâu ko?chỉ giúp mình với. code mình như sau: thankssssssss!!!!!!!!

#include <16f877a.h>
#include <def_16f877a.h>
#fuses NOPROTECT,HS,NOWDT
#use delay(clock=2000000)
char kieu_led;
void chuong_trinh();
#int_rb
void rb_isr()
{
chuong_trinh();
}
void chuong_trinh()
{
if(!input(pin_b4))
portd=0xff;
else if(!input(pin_b5))
portd=0x00;
else if(!input(pin_b6))
portd=0x0f;
}
void main()
{
trisb=0xf0;//portb input
trisd=0x00;//portd output


enable_interrupts(global);
enable_interrupts(int_rb);
ext_int_edge(h_to_l);

while(1)
{
chuong_trinh();
}
}

bài này sửa như sau:
Code:

#include <16f877a.h>
#include <def_16f877a.h>
#fuses NOPROTECT,HS,NOWDT
#use delay(clock=2000000)
char kieu_led;
#int_rb
void rb_isr()
{
delay_ms(10);//chống dội phím
if(!input(pin_b4))
{
 portd=0xff;
while(!input(pin_b4))//chờ nhả phím
 {
 }
delay_ms(10);//chống dội phím
}
 else if(!input(pin_b5))
{
 portd=0x00;
while(!input(pin_b5))//chờ nhả phím
 {
 }
delay_ms(10);//chống dội phím
}
 else if(!input(pin_b6))
{
 portd=0x0f;
while(!input(pin_b6))//chờ nhả phím
 {
 }
delay_ms(10);//chống dội phím
}
}
void main()
{
trisb=0xf0;//portb input
trisd=0x00;//portd output
port_b_pullups(true);
enable_interrupts(global);
enable_interrupts(int_rb);
ext_int_edge(h_to_l);

while(1)
  {
  }
}



Múi giờ GMT. Hiện tại là 08:53 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam