Ðăng Nhập

View Full Version : Giúp em cái code này với! Timer0


internet.com
10-11-2011, 01:06 AM
Em muốn cho led đảo trạng thái sau mỗi 1s. Pic 16f877a, XTAL 4MHz. Led được kết nối với chân RD0. Em mô phỏng chưa chạy. Mong các anh chị giúp đỡ!:)
Đây là code em viết:

// MCU : 16f877a
// XTAL : 4MHz
// Connection: A led is connected to RD0.
// Desctiption: Timer0 has overflowed: the led will blink after every 1 second.

#include <htc.h>

__CONFIG(XT & WDTDIS & LVPDIS & DEBUGDIS);

#define _XTAL_FREQ 4000000

unsigned char count=0;

//Ham main *******************************
void main(void)
{
ANSEL=0;
ANSELH=0;

TRISD=0;
PORTD=0x00;

T0SE=0; //USE INTERNAL CLOCK

PSA=0; //USE PRESCALER
PS2=0; PS1=1; PS0=1; //1:16

T0IF=0; //Clear int flag
T0IE=1; //Enable tmr0 int
GIE=1; //Enable glb int

TMR0=0x06; //TMR0 init

while(1); //Waiting for int, so we dont do anything
}

void interrupt isr(){
if(T0IE && T0IF){ //Check if int flag is set
++count;
if(count==250){ //250*1us*(256-6)*16=1s
RD0^=1; //Blink the led
count=0;
}
T0IF=0;
TMR0=0x06;
}
}

internet.com
10-11-2011, 02:54 PM
Có ai tìm lỗi sai dùm em với! Em chân thành cảm ơn!:)

rocket42
10-11-2011, 02:59 PM
Bạn chưa có chỉ thị báo rõ là hàm void interrupt isr() là hàm ngắt. Bởi vậy code của hàm này không được lưu vào vị trị vector ngắt trong bộ nhớ chuơng trình.
Vì vậy khi xảy ra ngắt sẽ ko có gì xảy ra
chúc vui!

internet.com
10-11-2011, 03:37 PM
Cái trên dùng HT PIC mà bạn? Cú pháp như thế không sai đâu. Vấn đề là sao mô phỏng chưa chạy nữa.:(

Tiện thể, chương trình viết theo CCS như thế này thì chạy OK rồi:

#include <16F877A.h>

#fuses NOWDT,PUT,XT,NOPROTECT

#byte PORTD = 0x08
#bit RD0=PORTD.0

unsigned char count;

#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count == 250)
{
count=0;
RD0^=1;
}
}


void main(void)
{
set_tris_d(0);
PORTD=0X00;

enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);
enable_interrupts(global);

set_timer0(6);

while(1);
}

delta21
21-11-2011, 10:10 AM
bạn setup timer0 sai rồi,ở đây dùng timer ở chế độ định thì,không phải là chế độ counter
nên bạn phải set T0CS = 0 ,thì mới dùng được Fosc/4.chương trình của bạn là lại set T0SE,tức là xung ngoài vào nên timer không chạy.
còn ct dưới bạn dùng ccs thì nó đã set up timer0 giùm bạn rồi!!

mình sửa lại ct cho bạn :D
// MCU : 16f877a
// XTAL : 4MHz
// Connection: A led is connected to RD0.
// Desctiption: Timer0 has overflowed: the led will blink after every 1 second.

#include <htc.h>

__CONFIG(XT & WDTDIS & LVPDIS & DEBUGDIS);

#define _XTAL_FREQ 4000000

unsigned char count=0;

//Ham main *******************************
void main(void)
{
ANSEL=0x00;
ANSELH=0x00;

TRISD=0x00;
PORTD=0x00;

T0CS=0; //USE INTERNAL CLOCK không phải T0SE


PSA=0; //USE PRESCALER
PS2=0; PS1=1; PS0=1; //1:16

T0IF=0; //Clear int flag
T0IE=1; //Enable tmr0 int
GIE=1; //Enable glb int

TMR0=0x06; //TMR0 init

while(1){}; //Waiting for int, so we dont do anything
}

void interrupt isr(){
if(T0IE && T0IF){ //Check if int flag is set
++count;
if(count==250){ //250*1us*(256-6)*16=1s
RD0^=1; //Blink the led
count=0;
}
T0IF=0;
TMR0=0x06;
}
}

internet.com
23-11-2011, 03:58 PM
Ồ! Cảm ơn bạn!