PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và 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

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 08-12-2009, 04:16 PM   #1
tkpro
Đệ tử 4 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 61
:
External Interrupt! Help!

các bác cho e hỏi là e muốn dùng 02 ngắt ngoài trên các chân RB0 và RB1 của Pic 18F4550 thì làm như thế nào ah? thanh!
tkpro vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-12-2009, 06:16 PM   #2
dung h
Đệ tử 4 túi
 
Tham gia ngày: May 2009
Bài gửi: 74
:
thì bạn cứ khai báo như bình thường
enable_interrupts(INT_EXT) //sử dụng ngắt INT0
enable_interrupts(INT_EXT1) // INT1

ext_int_edge( H_TO_L ); // chọn cạnh sườn xung gây ra ngắt INT0 H_TO_L hoặc
// L_TO_H
ext_int_edge( 1,H_TO_L ); // cho INT1
enable_interrupts(GLOBAL) // cho phép ngắt toàn cục

sau khi khai báo song thì mỗi khi có thay đổi ở chân INT0,INT1 thì ct nhảy đến ct ngắt
#INT_EXT
void ngat_ext()
{
// cong viec
}
bạn viết thử xem!
dung h vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-12-2009, 06:22 PM   #3
tkpro
Đệ tử 4 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 61
:
Trích:
Nguyên văn bởi dung h View Post
thì bạn cứ khai báo như bình thường
enable_interrupts(INT_EXT) //sử dụng ngắt INT0
enable_interrupts(INT_EXT1) // INT1

ext_int_edge( H_TO_L ); // chọn cạnh sườn xung gây ra ngắt INT0 H_TO_L hoặc
// L_TO_H
ext_int_edge( 1,H_TO_L ); // cho INT1
enable_interrupts(GLOBAL) // cho phép ngắt toàn cục

sau khi khai báo song thì mỗi khi có thay đổi ở chân INT0,INT1 thì ct nhảy đến ct ngắt
#INT_EXT
void ngat_ext()
{
// cong viec
}
bạn viết thử xem!
cám on bạn
vấn đề là ở chỗ thằng INT0, lúc trước tôi viết:
#INT_EXT0
void ngat_ext()
{
// cong viec
}
enable_interrupts(INT_EXT0) nó báo lỗi ngay

còn thằng INT1 thì Ok
chương trình chạy được, mong bà con tham khảo và cho ý kiến
//-----------------
#include<18f4550.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock = 20000000)
#use rs232(baud=9600,parity=n,xmit=pin_C6,rcv=pin_C7)
# byte portA=0xf80
# byte portB=0xf81
# byte portC=0xf82
# byte portD=0xf83
# byte portE=0xf84
// cac pin cong A
#bit a0 = portA.0
#bit a1 = portA.1
#bit a2 = portA.2
#bit a3 = portA.3
#bit a4 = portA.4
#bit a5 = portA.5
#bit a6 = portA.6
#bit a7 = portA.7
//----cac pin cong B--
#bit b0 = portB.0
#bit b1 = portB.1
#bit b2 = portB.2
#bit b3 = portB.3
#bit b4 = portB.4
#bit b5 = portB.5
#bit b6 = portB.6
#bit b7 = portB.7
// cac pin cong C
#bit c0 = portC.0
#bit c1 = portC.1
#bit c2 = portC.2
#bit c3 = portC.3
#bit c4 = portC.4
#bit c5 = portC.5
#bit c6 = portC.6
#bit c7 = portC.7
// cac pin cong D
#bit d0 = portD.0
#bit d1 = portD.1
#bit d2 = portD.2
#bit d3 = portD.3
#bit d4 = portD.4
#bit d5 = portD.5
#bit d6 = portD.6
#bit d7 = portD.7
// cac pin cong E
#bit e0 = portE.0
#bit e1 = portE.1
#bit e2 = portE.2

//void bit_to_byte( )
//////////////////////////
//signed char i;
char j;
char k,mode;
char i=0;
// Ngat ngoai 0(EXT0)

# int_ext
void EXT_ISR()
{
mode++;
if(mode==100)mode=0;
}

// Ngat ngoai 1(EXT1)
///*
# int_ext1
void EXT_ISR1()
{
i++;
if(i==100)i=0;
}
//*/
///////////////////////
# int_rda
void nhan()
{
delay_us(100);
j=getc();
//portA=j;
}
void main()
{
set_tris_b(255);
set_tris_d(255);
set_tris_a(255);
enable_interrupts(int_rda);
enable_interrupts(INT_EXT);// cho EXT0
enable_interrupts(INT_EXT1); // cho EXT1
/////////////////////////
ext_int_edge(H_TO_L); // select interrups
ext_int_edge(1,L_TO_H ); // cho EXT1
enable_interrupts(global);
while(true)
{
//for(k=1;k<=100;k++)
//{
putc(i);
delay_ms(1000);
//}
}
}

thay đổi nội dung bởi: tkpro, 09-12-2009 lúc 02:38 PM. Lý do: Post cho anh e tham khao
tkpro vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-12-2009, 06:41 PM   #4
vinhlec4
Banned
 
Tham gia ngày: Dec 2009
Bài gửi: 65
:
ngắt trong 18f4331 lam nhu thế nào anh?
ham dò dường bằng led cua robo vì sau phải bỏ trong timer và nó hoạt động như thế nào zay
vinhlec4 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-12-2009, 07:20 PM   #5
vinhlec4
Banned
 
Tham gia ngày: Dec 2009
Bài gửi: 65
:
void main()
{
set_tris_b(0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(int_timer0);
enable_interrupts(global);
set_timer0(56);

while(true)
{
}
}
lệnh while đó thực hiện như thế nào mấy bác?
true co nghĩa là j?
mình mới vào lập trình nên hơi kém
vinhlec4 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-12-2009, 07:39 PM   #6
dung h
Đệ tử 4 túi
 
Tham gia ngày: May 2009
Bài gửi: 74
:
Trích:
Nguyên văn bởi vinhlec4 View Post
void main()
{
set_tris_b(0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(int_timer0);
enable_interrupts(global);
set_timer0(56);

while(true)
{
}
}
lệnh while đó thực hiện như thế nào mấy bác?
true co nghĩa là j?
mình mới vào lập trình nên hơi kém
while(true) hay while(1) la thực hiện vô hạn các công việc trong vòng lặp while

còn
while(true)
{
// không làm gì
}
tức là vdk chỉ chờ khồng làm gì cả
dung h 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à 07:12 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