PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   Giúp em cái code này với! Timer0 (http://www.picvietnam.com/forum/showthread.php?t=11748)

internet.com 10-11-2011 01:06 AM

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;
        }
}


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:
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);
}


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
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;
        }
}


internet.com 23-11-2011 03:58 PM

Ồ! Cảm ơn bạn!


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

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