ElecTel
01-01-2012, 01:46 PM
Đọc về kỹ thuật tạo ngắt ưu tiên của anh ChiBang bên điễn đàn điện tử em cũng tập tành viết đoạn code đọc xung encode nhưng có một vài điều thắc mắc ...
Trong hàm ngắt, viết như sau:
Ngắt_1()
{
//Chèn mã lệnh: disable ngắt 1,2,3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 1
}
Ngắt_2()
{
//Chèn mã lệnh: disable ngắt 2,3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 2
}
Ngắt_3()
{
//Chèn mã lệnh: disable ngắt 3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 3
}
Em làm theo mẩu trên và đây là code
#include <16F877A.h>
#include <DEF_877A.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NOLVP
#use delay(clock=20000000)
//#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_E0 ////
#define LCD_RS_PIN PIN_E1 ////
#define LCD_RW_PIN PIN_E2
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7
#include <lcd.c>
int16 h=0,chuc,tram,h1,donvi,k=0;
int16 count=0;
#int_RB
void ngat_RB()
{
disable_interrupts(int_rb); // tắt tất cả các ngắt
disable_interrupts(int_timer0);
GIE =1;
if(RBIF)
{
if(RB0==1||RB0==0) // kiểm tra cạnh lên và xuống ..
h++; // đếm xung
RBIF=0;
}
}
#int_timer0
void ngat_timer0()
{
disable_interrupts(int_timer0); // tắt ngắt timer0
GIE =1;
if(tmr0if)
{
++count;
if(count==5000)
{
count=0;
h1=h;
k = h1+10;
h=0; // reset lại giá trị biến h
set_timer0(6);
tmr0if=0;
}
}
}
void main()
{
set_tris_b(0b11110001);
lcd_init();
delay_ms(100);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us
enable_interrupts(int_rb);
ext_int_edge(L_to_H);
enable_interrupts(global);
while(1)
{
tram =h1/100; // hiển thị gia trị của h1 và k lên LCD
h1=h1%100;
chuc=h1/10;
donvi=h1%10;
lcd_gotoxy(1,1);
LCD_Putc(tram+0x30);
LCD_Putc(chuc+0x30);
LCD_Putc(donvi+0x30);
tram =k/100;
k=k%100;
chuc=k/10;
donvi=k%10;
lcd_gotoxy(1,2);
LCD_Putc(tram+0x30);
LCD_Putc(chuc+0x30);
LCD_Putc(donvi+0x30);
}
}
Kết quả :
http://i1226.photobucket.com/albums/ee409/toancs1990/multi3.jpg
Không có gì xảy ra hết .... ???? Các anh có thể cho em biết đoạn code trên sai chổ nào ko ??? mò mẩm từ sáng qua tới giờ ..... hixxx http://matcuoi.com/smilies/7smiley_vn8.jpg
Trong hàm ngắt, viết như sau:
Ngắt_1()
{
//Chèn mã lệnh: disable ngắt 1,2,3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 1
}
Ngắt_2()
{
//Chèn mã lệnh: disable ngắt 2,3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 2
}
Ngắt_3()
{
//Chèn mã lệnh: disable ngắt 3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 3
}
Em làm theo mẩu trên và đây là code
#include <16F877A.h>
#include <DEF_877A.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NOLVP
#use delay(clock=20000000)
//#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_E0 ////
#define LCD_RS_PIN PIN_E1 ////
#define LCD_RW_PIN PIN_E2
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7
#include <lcd.c>
int16 h=0,chuc,tram,h1,donvi,k=0;
int16 count=0;
#int_RB
void ngat_RB()
{
disable_interrupts(int_rb); // tắt tất cả các ngắt
disable_interrupts(int_timer0);
GIE =1;
if(RBIF)
{
if(RB0==1||RB0==0) // kiểm tra cạnh lên và xuống ..
h++; // đếm xung
RBIF=0;
}
}
#int_timer0
void ngat_timer0()
{
disable_interrupts(int_timer0); // tắt ngắt timer0
GIE =1;
if(tmr0if)
{
++count;
if(count==5000)
{
count=0;
h1=h;
k = h1+10;
h=0; // reset lại giá trị biến h
set_timer0(6);
tmr0if=0;
}
}
}
void main()
{
set_tris_b(0b11110001);
lcd_init();
delay_ms(100);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us
enable_interrupts(int_rb);
ext_int_edge(L_to_H);
enable_interrupts(global);
while(1)
{
tram =h1/100; // hiển thị gia trị của h1 và k lên LCD
h1=h1%100;
chuc=h1/10;
donvi=h1%10;
lcd_gotoxy(1,1);
LCD_Putc(tram+0x30);
LCD_Putc(chuc+0x30);
LCD_Putc(donvi+0x30);
tram =k/100;
k=k%100;
chuc=k/10;
donvi=k%10;
lcd_gotoxy(1,2);
LCD_Putc(tram+0x30);
LCD_Putc(chuc+0x30);
LCD_Putc(donvi+0x30);
}
}
Kết quả :
http://i1226.photobucket.com/albums/ee409/toancs1990/multi3.jpg
Không có gì xảy ra hết .... ???? Các anh có thể cho em biết đoạn code trên sai chổ nào ko ??? mò mẩm từ sáng qua tới giờ ..... hixxx http://matcuoi.com/smilies/7smiley_vn8.jpg