PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 10-11-2011, 01:06 AM   #1
internet.com
Đệ tử 1 túi
 
Tham gia ngày: Sep 2010
Bài gửi: 18
:
Smile Giúp em cái code này với! Timer0

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:
Code:
// 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;
	}
}

thay đổi nội dung bởi: internet.com, 10-11-2011 lúc 03:46 PM.
internet.com vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-11-2011, 02:54 PM   #2
internet.com
Đệ tử 1 túi
 
Tham gia ngày: Sep 2010
Bài gửi: 18
:
Có ai tìm lỗi sai dùm em với! Em chân thành cảm ơn!
internet.com vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-11-2011, 02:59 PM   #3
rocket42
Đệ tử 4 túi
 
rocket42's Avatar
 
Tham gia ngày: Jun 2010
Nơi Cư Ngụ: Tọa Thiên
Bài gửi: 72
:
Send a message via Yahoo to rocket42
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!
rocket42 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-11-2011, 03:37 PM   #4
internet.com
Đệ tử 1 túi
 
Tham gia ngày: Sep 2010
Bài gửi: 18
:
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:
Code:
#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);
}

thay đổi nội dung bởi: internet.com, 10-11-2011 lúc 03:45 PM.
internet.com vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-11-2011, 10:10 AM   #5
delta21
Đệ tử 5 túi
 
delta21's Avatar
 
Tham gia ngày: Mar 2010
Bài gửi: 95
:
Send a message via Yahoo to delta21
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
Code:
// 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;
	}
}
__________________
Chỉ sợ thiếu tiền......
delta21 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-11-2011, 03:58 PM   #6
internet.com
Đệ tử 1 túi
 
Tham gia ngày: Sep 2010
Bài gửi: 18
:
Ồ! Cảm ơn bạn!
internet.com vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 11:24 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam