10-11-2011, 01:06 AM | #1 |
Đệ tử 1 túi
Tham gia ngày: Sep 2010
Bài gửi: 18
: |
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. |
10-11-2011, 02:54 PM | #2 |
Đệ 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!
|
10-11-2011, 02:59 PM | #3 |
Đệ tử 4 túi
|
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! |
10-11-2011, 03:37 PM | #4 |
Đệ 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. |
21-11-2011, 10:10 AM | #5 |
Đệ tử 5 túi
|
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...... |
23-11-2011, 03:58 PM | #6 |
Đệ tử 1 túi
Tham gia ngày: Sep 2010
Bài gửi: 18
: |
Ồ! Cảm ơn bạn!
|
|
|