View Full Version : timer
conchocon
13-12-2009, 12:16 AM
chào các bạn mình mới học Pic nên mình có nhiều thứ không biết
thứ 1 : lúc mình xài ngắt timer (mình xài con 16f877a) thì phải khai báo ra sao ??
và bạn nào có thể cho mình xem ví dụ cụ thể thì tốt quá.
thứ 2: giả sử mình muốn sau 10s hoặc 1 phút thì led sáng chẳng hạn thì mình tính toán như thế nào (thạch anh 20Mh)
thứ 3 : bạn nào có thể cho mình ví dụ 2 led sáng tắt sau 1 phút mà dùng ngắt timer ko ?
Mình viết = C. (CCS)
cám ơn các bạn nhiều.
dung h
13-12-2009, 07:03 AM
muốn sử dụng ngắt timer bạn cần thiết lập như sau: mình giả sử dùng ngắt timer 0
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_4); // TIMER0 sử dụng dao động nội
// xung cho timer0 = osc/4
enable_interrrupts(INT_TIMER0) ; // cho phep ngắt timer0
enable_interrupts(GLOBAL) ; // cho phep ngat toàn cục
set_timer0( timer) ; // giả sử sử dung osc 20MHz ,timer0 8bit
// timer = (256-value)*div*(4/20000000)= xx us
khi đó cứ mỗi khi có cờ timer tràn thì chương trình nhảy đến ngắt timer
#int_timer0
void ngat_timer0()
{
// công việc
}
còn bạn muốn ngắt 1s hay 1 phút thì cho 1 biến tăng dần số lần tràn
counter++;
conchocon
13-12-2009, 05:14 PM
#fuses LP, HS, RC, WDT, NOWDT
#int_timer0
void ngat_timer0()
{
output_high(PIN_B0);
////khai bao timer ra sao o day ;
output_low(PIN_B0);
}
void main()
{ /////con conter ++ thi minh phai khai bao ra sao minh chua hieu ve 1s hay 1 phut la phai lam sao
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
set_timer0(100);////minh ko hieu nen khai gia tri bao nhieu ca.
while(1)
{
ngat_timer0();
}
}
minh viet chuong trinh sang va tat trong vong 1 phut nhung chua biet phai lam timer ra sao ca
dienbk36
23-03-2010, 08:39 PM
//minh vua viet dc chuong trinh tao tre 0,5s dung timer0,ban thu doc xem co giup gi dc ko nhe
#include<16f877a.h>
#byte PORTB=0x06
#byte TRISB=0x86
#use delay(clock=20000000)
#int_timer0
int16 count=0;
//chuong trinh ngat timer0
void interrupts_timer0()
{
set_timer0(0);//khoi tao gia tri dem ban dau la 0
++count;
if(count==39062)//Ttimer0=256*39062:(20000000)=0,5
{
count=0;
PORTB^=(1<<0);
}
}
//chuong trinh chinh
void main()
{
TRISB=0x00;//dat cac chan cua portb o la chan ra
PORTB=1;//dat dien ap cao cho pin RBO}
enable_interrupts(int_timer0);//cho phep ngat timer0
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); //prescaler=1:256
enable_interrupts(global);
while(1)
{
interrupts_timer0();
}
}
dienbk36
23-03-2010, 08:42 PM
theo nhu minh hieu timer neu dung 1 minh no chi la lam nhiem vu dem,no chi co tac dụng khi chúng ta kết hợp với ngắt nữa đúng ko,các pro cho ý kiến với
hcmut.khoamaisi
25-03-2010, 05:47 PM
Timer có tác dụng tạo ngắt,như trong con 8051 thì có 5 ngắt:2 ngắt bằng timer(timer0,timer1),2 ngắt ngoài và 1 ngắt cổng nối tiếp(SBUF).
Trong 8051 có thanh ghi IE(interrupt enable) ở địa chỉ A8H.Đây là thanh ghi 8 bit được địa chỉ hóa từng bit cụ thể như phía dưới nhằm xác định trạng thái ngắt nào(timer hay ngắt ngoài hay SBUF)
+ IE.7(kí hiệu:EA,địa chỉ AFH):khi IE.7=1 cho phép toàn bộ các ngắt hoạt động,ngược lại là cấm toàn bộ
+ IE.6(địa chỉ AFH) : chưa được định nghĩa
+ IE.5(kí hiệu:ET2,địa chỉ ADH):Cho phép ngắt timer 2(8052)
+ IE.4(kí hiệu:ES,địa chỉ ACH):Cho phép ngắt của cổng nối tiếp
+ IE.3(kí hiệu:ET1,địa chỉ ABH):Cho phép ngắt timer 1
+ IE.2(kí hiệu:EX1,địa chỉ AAH):Cho phép ngoài 1
+ IE.1(kí hiệu:ET0,địa chỉ A9H):Cho phép ngắt timer 0
+ IE.0(kí hiệu:EX0,địa chỉ A8H):Cho phép ngoài 0
Đối với con 8051 là như vậy còn PIC thế nào thì mình chưa học.
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.