ngắt ngoài

duongvanthuy_qt

Trứng gà
các anh các chị cho em hỏi 1 vấn đề được không ạ?
Em đang muốn làm mạch đo tốc độ động cơ . Em sử dụng mạch thu phát hồng ngoại để tạo xung kích cho ngắt ngoài của PIC 16f877A anh chị có thể chỉ giúp em phuong pháp với.Tức là đếm thời gian giửa 2 xung thudduowcj từ mạch thu hồng ngoại.
em cảm ơn nhiều !!!
 
bạn có thể dùng chế độ capture của pic để bắt cạnh trên hay cạnh dưới (có nhiều mode bắt cạnh nữa bạn có thể lựa chọn ) .
 

duongvanthuy_qt

Trứng gà
Em khởi tạo Timer0 như thế này ? bây giờ em muốn khi thoả điều kiện ngắt ngoài thì chương trình thực hiện ngắt Timer0 và giá trị của thanh ghi TRM0 sau khi được ngắt là 1 số 8 bit vậy làm thế nào để đổi giá trị đó sang thập phân ạ???


// khoi tao Timer0 va ngat ngoai external interrupt
TOCS=0; // Su dung bo giao dong thach anh 4MHz
PSA=0; // Khong su dung bo chia tan
GIE=1; // cho phep ngat toan cuc
T0IE=1; // Cho phep ngat Timer0 khi co co tran
T0IF=0; // Xoa co bao ngat khi tran Timer0
TMR0=0X00; // Gan gia tri ban dau cho
//thang ghi chua trong Timer0
INTE=1; // Cho phep ngat ngoai
 

duongvanthuy_qt

Trứng gà
mọi người có thể cho em hỏi chỉ cần có xung ở chân RB0 là thỏa mản điều kiện ngắt ngoài phải không ạ??? lúc đó cờ ngắt ngoài INTF nó tự set lên 1 hay sao?
 

eMagic

Gà mẹ
Staff member
Code:
void interrupt isr()
{
	if(INTE && INTF)
		{
			gettimer++;
			if(gettimer==1) 	
				time_old = (TMR1H<<8)|TMR1L;
			if(gettimer==2)		
			{
				time_new = (TMR1H<<8)|TMR1L;
				time_long=time_new-time_old;
                                time_old=time_new;
				gettimer=1;
			}
                        INTF=0;
               }
}
đây là chương trình mình đếm thời gian 1 vòng quay bằng ngắt hồng ngoại ( chữ U)
gettimer khởi tạo bằng 0;
sử dụng timer1 để đếm thời gian.
 

duongvanthuy_qt

Trứng gà
anh Admin ơi cho em hỏi thêm 1 xí về đoạn Code của anh với.
nếu giả sử Timer1 tràn rồi thì làm sao nó đếm được nửa. Mà nếu giả sử nó có chế độ reload giống 8051 thì time_long=time_new-time_old; nó bị sai mất vì time_old lớn hơn time_new.
anh giải thích em với , Em cảm ơn rất nhiều !!!
 

duongvanthuy_qt

Trứng gà
void interrupt isr()
{
if(INTE && INTF)
{
T0IF=1;
gettimer++;
if(gettimer==1)
{
T0IF=0;
TRM0=0x00;
}
if(gettimer==2)
{
time=TMR0;
gettimer=1;
T0IF=0;
TMRO=0X00;

}
INTF=0;
}
}
code em sửa lại thế này có được không ạ? ở đây em dùng Timer0 . Anh chỉ gió em với vì em mới học Pic nên chưa biết mấy. Cảm ơn Anh
 

eMagic

Gà mẹ
Staff member
anh Admin ơi cho em hỏi thêm 1 xí về đoạn Code của anh với.
nếu giả sử Timer1 tràn rồi thì làm sao nó đếm được nửa. Mà nếu giả sử nó có chế độ reload giống 8051 thì time_long=time_new-time_old; nó bị sai mất vì time_old lớn hơn time_new.
anh giải thích em với , Em cảm ơn rất nhiều !!!
đúng như bạn nói thi time_new< time_ola( do tràn) thì nó không đúng nữa, mình cũng đã nghĩ đến nhưng thấy chạy 16bit nên chắc cũng lâu mới gặp 1 lần nên không chỉnh lại , hi

Thầy code của bạn có vẻ hợp lý bạn thử xuất ra LCD giá trị time xem.
 

kid_boy

Trứng gà
bạn có thể dùng chế độ capture của pic để bắt cạnh trên hay cạnh dưới (có nhiều mode bắt cạnh nữa bạn có thể lựa chọn ) .
Cách này cực khó và khổ vô biên, hic.
 

duongvanthuy_qt

Trứng gà
mới học Pic được mấy buổi mà thấy nó hay wa' ! Em có 1 kinh nghiệm rằng cứ siêng đọc và phân tích data sheet là hiểu được chương trình của mình cần làm gì và hơn nửa là sự nhiệt tình chỉ dạy của mấy anh chị trên diễn đàn hihihih!!!
 
Top