Ngắt
Là cơ cấu cho phép VĐK đáp một số sự kiện ngay thời điểm mà sự kiện đó xảy ra bất chấp VĐK đang làm gì!Đây là phần quan trọng của VĐK giúp VĐK giao tiếp với môi trường xung quanh..Khi xảy ra ngắt thì VĐK thực hiện chương trình ngắt,thực hiện xong chương trình ngắt,rồi lại quay lại chương trình chính.
16F84 có 4 ngắt
1.Hoàn thành việc viết vào EEPROM
2. Ngắt Timer 0 // Bạn tưởng tượng TMR0 như một cái đồng hồ.Nó cứ đếm,cứ đếm nếu vượt qua một giá trị nào đó thì ngắt xảy ra(ff-->00).
3. Ngắt RB-4,5,6,7 //có thay đổi trạng thái trên các chân này thì ngắt xảy ra
4.Ngắt ngoài RB0/INT trên chân RB0. // có xung thì ngắt xảy ra
Hình vẽ mô tả một cơ cấu ngắt.<chèn hình vẽ>
VD: Về ngắt TMR0 nội dung chương trình
Chương trình chính sẽ thực hiện Nháy Led đỏ tại chân RA1- chu kì 100ms/ 50 lần
Chương trình ngắt thực hiện Nháy Led xanh tại chân RB1- chu kì 1s/5 lần
Ví dụ đơn giản để các bạn kiểm tra khi nào chương trình chạy chương trình chính
khi nào chạy chương trình ngắt.
Chương trình như sau:
[code:1]
//CHUONG TRINH NGAT TIMER 0
//author:noisepic@gmail.com
//status:OK test !
//date: 29/07/2005
//***********************************************
#include<16f84A.h>
#include<def_84.h>
#fuses NOWDT,PUT,NOPROTECT,HS
#use delay(clock=4000000)
#INT_TIMER0
led()
{
unsigned int i;
for(i=0;i<50;i++)
{
PORTA=0x00;// LED PORTA tat
output_high(PIN_B4);
delay_ms(100);
output_low(PIN_B4);
delay_ms(100);
}
}
void main()
{
unsigned int i;
TRISB=0x00;// PORTA,PORTB output
TRISA=0x00;
while(TRUE)
{
disable_interrupts(GLOBAL);
for(i=0;i<5;i++)
{
PORTB=0x00;// led PORTB tat
PORTA=0x00;
delay_ms(1000);
PORTA=0xff;// led sang o PORTA
delay_ms(1000);
}
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
setup_timer_0(RTCC_INTERNAL);
set_timer0(100);
while(toif==0)
{
}
}
}
[/code:1]
Trong đó phần khai báo ban đầu ...chưa vội quan tâm .Khi nào học sâu quan tâm chưa muộn!
[code:1]
#include<16f84A.h>
#include<def_84.h>
#fuses NOWDT,PUT,NOPROTECT,HS
#use delay(clock=4000000)
[/code:1]
Khai báo phần cứng cho chương trình dịch biết dùng PIC nào? thạch anh bao nhiêu MHZ,...
Việc khai báo và nội dung chương trình ngắt
[code:1]
#INT_TIMER0
ham()
{
}
[/code:1]
Chương trình chính
main()
{
}
[code:1]
TRISB=0x00;
TRISA=0x00;// output
[/code:1]
Cấu hình I/O cho PORTA,PORTB
Trong chương trình chính bạn phải đảm bảo(GIE=0).Cái này được thực hiện bằng hàm
[code:1]
disable_interrupts(GLOBAL);[/code:1]
Sau đó lại GIE=1. sử dụng hàm enable_interrupts(GLOBAL)
Sử dụng ngắt TMR0
[code:1]enable_interrupts(INT_TIMER0);[/code:1]
[code:1]
setup_timer_0(RTCC_INTERNAL); [/code:1]chọn nguồn ngắt là xung đồng hồ bên trong PIC
[code:1] set_timer0(100); [/code:1]đặt giá trị ban đầu cho TMR0..và đợi nó đếm đến 256 =0xff và xảy ra tràn
// đợi nó đếm!
[code:1]
while(toif==0)
{
}
[/code:1]
-------------------------------------------------------------------------------------
Hi vọng bài viết này giúp các bạn mới làm quen với PIC sẽ dễ hiểu hơn,noisepic rất mong nhậnđược góp ý của mọi người để noisepic rút kinh nghiệm và POST tiếp!
-------------------------------------------------------------------------------------
Là cơ cấu cho phép VĐK đáp một số sự kiện ngay thời điểm mà sự kiện đó xảy ra bất chấp VĐK đang làm gì!Đây là phần quan trọng của VĐK giúp VĐK giao tiếp với môi trường xung quanh..Khi xảy ra ngắt thì VĐK thực hiện chương trình ngắt,thực hiện xong chương trình ngắt,rồi lại quay lại chương trình chính.
16F84 có 4 ngắt
1.Hoàn thành việc viết vào EEPROM
2. Ngắt Timer 0 // Bạn tưởng tượng TMR0 như một cái đồng hồ.Nó cứ đếm,cứ đếm nếu vượt qua một giá trị nào đó thì ngắt xảy ra(ff-->00).
3. Ngắt RB-4,5,6,7 //có thay đổi trạng thái trên các chân này thì ngắt xảy ra
4.Ngắt ngoài RB0/INT trên chân RB0. // có xung thì ngắt xảy ra
Hình vẽ mô tả một cơ cấu ngắt.<chèn hình vẽ>
VD: Về ngắt TMR0 nội dung chương trình
Chương trình chính sẽ thực hiện Nháy Led đỏ tại chân RA1- chu kì 100ms/ 50 lần
Chương trình ngắt thực hiện Nháy Led xanh tại chân RB1- chu kì 1s/5 lần
Ví dụ đơn giản để các bạn kiểm tra khi nào chương trình chạy chương trình chính
khi nào chạy chương trình ngắt.
Chương trình như sau:
[code:1]
//CHUONG TRINH NGAT TIMER 0
//author:noisepic@gmail.com
//status:OK test !
//date: 29/07/2005
//***********************************************
#include<16f84A.h>
#include<def_84.h>
#fuses NOWDT,PUT,NOPROTECT,HS
#use delay(clock=4000000)
#INT_TIMER0
led()
{
unsigned int i;
for(i=0;i<50;i++)
{
PORTA=0x00;// LED PORTA tat
output_high(PIN_B4);
delay_ms(100);
output_low(PIN_B4);
delay_ms(100);
}
}
void main()
{
unsigned int i;
TRISB=0x00;// PORTA,PORTB output
TRISA=0x00;
while(TRUE)
{
disable_interrupts(GLOBAL);
for(i=0;i<5;i++)
{
PORTB=0x00;// led PORTB tat
PORTA=0x00;
delay_ms(1000);
PORTA=0xff;// led sang o PORTA
delay_ms(1000);
}
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
setup_timer_0(RTCC_INTERNAL);
set_timer0(100);
while(toif==0)
{
}
}
}
[/code:1]
Trong đó phần khai báo ban đầu ...chưa vội quan tâm .Khi nào học sâu quan tâm chưa muộn!
[code:1]
#include<16f84A.h>
#include<def_84.h>
#fuses NOWDT,PUT,NOPROTECT,HS
#use delay(clock=4000000)
[/code:1]
Khai báo phần cứng cho chương trình dịch biết dùng PIC nào? thạch anh bao nhiêu MHZ,...
Việc khai báo và nội dung chương trình ngắt
[code:1]
#INT_TIMER0
ham()
{
}
[/code:1]
Chương trình chính
main()
{
}
[code:1]
TRISB=0x00;
TRISA=0x00;// output
[/code:1]
Cấu hình I/O cho PORTA,PORTB
Trong chương trình chính bạn phải đảm bảo(GIE=0).Cái này được thực hiện bằng hàm
[code:1]
disable_interrupts(GLOBAL);[/code:1]
Sau đó lại GIE=1. sử dụng hàm enable_interrupts(GLOBAL)
Sử dụng ngắt TMR0
[code:1]enable_interrupts(INT_TIMER0);[/code:1]
[code:1]
setup_timer_0(RTCC_INTERNAL); [/code:1]chọn nguồn ngắt là xung đồng hồ bên trong PIC
[code:1] set_timer0(100); [/code:1]đặt giá trị ban đầu cho TMR0..và đợi nó đếm đến 256 =0xff và xảy ra tràn
// đợi nó đếm!
[code:1]
while(toif==0)
{
}
[/code:1]
-------------------------------------------------------------------------------------
Hi vọng bài viết này giúp các bạn mới làm quen với PIC sẽ dễ hiểu hơn,noisepic rất mong nhậnđược góp ý của mọi người để noisepic rút kinh nghiệm và POST tiếp!
-------------------------------------------------------------------------------------
Comment