Ðăng Nhập

View Full Version : lênh ép ngắt timer dùng ngôn ngữ C là gì


hammecuala
01-05-2010, 03:20 AM
lúc trước học asm thì thẩyte6n PIC, timer có chức năng ép ngắt dùng lệnh: BSF PIR1,TMR1IF
Và lệnh cho timer chạy là :BSF T1CON,TMR1ON

hammecuala
01-05-2010, 03:40 AM
múc đích của mình là muốn làm cái bài dùng timer1 nhưng chỉ khi mình bấm nút nhấn thì timer1 mới bắt đầu đếm và khi mình nhấn nút nhấn thứ 2 thì timer 1 phải ngưng đếm và nhảy vào chương trình ngắt

namqn
01-05-2010, 10:12 AM
lúc trước học asm thì thẩyte6n PIC, timer có chức năng ép ngắt dùng lệnh: BSF PIR1,TMR1IF
Và lệnh cho timer chạy là :BSF T1CON,TMR1ON


đến khi hoc C thì chỉ thấy có lệnh cho timer chạy là: set_timer0()
còn lệnh ép ngắt thì kg có, mình tìm rồi thì có người nói là timer chay song song với chương trình nên kg thể can thiệp vào việc ngắt của nó dc

Xin các bẹn chỉ cho mình lệnh ép ngắt của timer dùng ngôn ngữ C
Bạn có thể viết TMR1IF = 1, với TMR1IF là bit TMR1IF trong thanh ghi PIR1 đã được trình dịch định nghĩa sẵn, hay bạn tự định nghĩa theo cú pháp mà trình dịch hỗ trợ.

Không rõ bạn đã học ngôn ngữ C chưa?

Thân,

hammecuala
01-05-2010, 01:09 PM
mình đã học C rồi, dùng CCS nên có thể đọc hiểu code đc, nếu bạn có gì chỉ dẫn bằng chương trình C thì càng tốt, thanks.

xin cho hỏi là mình muốn làm 1 bộ đếm thời gian giữa 2 lần nhấn nút(thực ra nó là 2 công tắc hành trình) rồi sau đó xuất giá trị thời gian đó ra LCD, mong bạn có thể chỉ cho mình là dùng timer1 đếm thời gian dc kg, hay phải capture của PIC nữa. nếu bạn có chương trình luôn thì hay quá

hammecuala
01-05-2010, 06:51 PM
nếu đc xin bac namqn qua trang này giup em với
http://www.picvietnam.com/forum/showthread.php?p=35611#post35611

tdm
02-05-2010, 02:22 PM
mình viết code như sau, muc đích là khi mình nhấn công tắc rồi thì dãy đèn led nó mới bắt đầu chạy, nhưng nó mình làm thì nó lại chạy ngay cả khi mình chưa nhấn nút

#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 0x06

int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count == 2000) // 2000*500us = 500000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
//Chuong trinh chinh
void main(void)
{
set_tris_b(0);
set_tris_a(0xff);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);
if(input(pin_A0)==0)
{
delay_ms(10);
set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us
a = 0x01;
}

while(true)
{
PORTB = a;
}
}
************************************************** ***
mình viết code như sau, muc đích là khi mình nhấn công tắc rồi thì dãy đèn led nó mới bắt đầu chạy, nhưng nó mình làm thì nó lại chạy ngay cả khi mình chưa nhấn nút

#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 0x06

int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count == 2000) // 2000*500us = 500000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
//Chuong trinh chinh
void main(void)
{
set_tris_b(0);
adcon1=0x06;//them lenh nay de port A la che do I/O
set_tris_a(0xff);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);
if(input(pin_A0)==0)
{
delay_ms(10);
set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us
a = 0x01;
}

while(true)
{
PORTB = a;
}
}

ledinhloi
03-05-2010, 06:39 PM
ban phai set tri x potb la (0xf1) thi moi chay duoc vi chan b0 la chan nhan nhan du lieu