PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Hỏi về timer0,1,2 của pic16f877A? (http://www.picvietnam.com/forum/showthread.php?t=1242)

lequocbao 10-12-2008 01:04 PM

Tại sao mình phải set_timer1(15536); tới 02 lần luôn vậy bạn?
Còn nữa ,nếu mình muốn dừng ngắt thì phải dùng khai báo:
disable_interrupt(global); phải không?nếu đúng thì mình phải đặt khai báo đó ở chổ nào?

tungtot_vl 10-12-2008 05:05 PM

pic
 
NHƯ VẬY CON SỐ 2 Ở (T=2*(256-56)*1US)Ơ ĐÂU RA VẬY[/QUOTE]

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);

lequocbao 11-12-2008 04:37 PM

Pác tungtot_vl ơi!: pác coi hộ lại giúp cái ngắt timer0 1s của pác sao mà khi mở nguồn thì khoảng 30s sau ngắt mới làm việc vậy pác.Sau khi ngắt đã làm việc thì nhấn reset thì ngắt làm việc lại liền còn cúp nguốn thì chịu khó đợi 30s nữa.Vậy là nó bị trục trặc chổ nào phải không pác?

crazy_baby 18-12-2008 05:20 PM

1 Attachment(s)
các pro xem giúp em cái code này với .mạch đồng hồ , hh:mm:ss , dùng ngắt timer0 nhưng không hiểu tại sao lại không xảy ra ngắt . code nè :
Code:

#include<16f877a.h>
#include<def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#device *=16 ADC=8
#use delay(clock=20000000)
int16 count;
int8 h10,h1,m10,m1,s10,s1,i;//khai bao bien gio,phut,giay
#int_TIMER0
void timer0()
{
set_timer0(6);
++count;
if(count==5000)
{
++s1;
      if(s1==9){
                s1=0;
                ++s10;
                          if(s10==5)
                              {
                                  s10=0;
                                      ++m1;

                                            if(m1==9){
                                                  ++m10;
                                                      m1=0;
                                                            if(m10==5){
                                                                  m10=0;
                                                                  ++h1;
                                                                  if(h1==2){h1=0;
                                                                    ++h10;
                                                                    if(h10==1){h10=0;}
}
}
}

}
}
count=0;

}



}
void main()
{
trisd=0x00;
trise=0x00;
s1=0;
s10=0;
m1=0;
m10=0;
h1=0;
h10=0;
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
enable_interrupts(global);


while(1)
{
i=0;
for(i=0;i<=5;i++)
{
porte=i;
switch(i)
{
case 0: portd=h10;break;
case 1: portd=h1;break;
case 2: portd=m10;break;
case 3: portd=m1;break;
case 4: portd=s10;break;
case 5: portd=s1;break;
}
}
}


}


hoaphonglan 03-01-2009 08:49 PM

khi su dung timer ban phai chon ty le chia tang so trong timer roi moi tinh theo chu moi khi timer giam ung voi 1 nhip dem cua bo chia tang ma ban chon(tuy theo timer co ty le chia tang so 1/1 ;1/4/..

namqn: xin nhắc bạn viết bài bằng tiếng Việt có dấu. Bạn tham khảo luồng sau về cách gõ tiếng Việt trên diễn đàn: http://www.picvietnam.com/forum/showthread.php?t=862.

lexuantien 18-03-2009 04:22 AM

Trích:

Nguyên văn bởi lequocbao (Post 21302)
Pác tungtot_vl ơi!: pác coi hộ lại giúp cái ngắt timer0 1s của pác sao mà khi mở nguồn thì khoảng 30s sau ngắt mới làm việc vậy pác.Sau khi ngắt đã làm việc thì nhấn reset thì ngắt làm việc lại liền còn cúp nguốn thì chịu khó đợi 30s nữa.Vậy là nó bị trục trặc chổ nào phải không pác?

mình thấy mạch vẫn chạy ổn mà bạn , bạn coi lại cái mạch của bạn thử coi!

lexuantien 18-03-2009 04:42 AM

Trích:

Nguyên văn bởi lequocbao (Post 21270)
Tại sao mình phải set_timer1(15536); tới 02 lần luôn vậy bạn?
Còn nữa ,nếu mình muốn dừng ngắt thì phải dùng khai báo:
disable_interrupt(global); phải không?nếu đúng thì mình phải đặt khai báo đó ở chổ nào?

Mình cũng từng viết chương trình điều khiển led giống vậy , mình trả lời bạn trong giới hạn hiểu biết của mình thôi:

1. Vì sao phải set_timer1(15536); tới 02 lần ?
set_timer1(15536); trong hàm void main(void) là để tính thời gian bắt đầu đếm của Timer0 . Còn set_timer1(15536); trong hàm void interrupt_timer0() thì sau khi tính giá trị xong thì nó sẽ gán giá trị của set_timer1(15536); vào hàm này.
2. Khai báo disable_interrupt(global); được hiểu là cấm ngắt . Còn đặt ở đâu thì bạn tham khỏa trong đoạn Code sau:
Code:

#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);
  enable_interrupts(int_timer0);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); // so 2 la o cho T_dinhthi=2*(256-6)*1us = 500 us
  enable_interrupts(global);
  set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us
  a = 0x01;
  disable_interrupts(global);
  while(true)
  {
      PORTB = a;
  }
}



Múi giờ GMT. Hiện tại là 05:51 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam