PDA

View Full Version : Lỗi timer2 của 16F886


datk45d
19-12-2008, 11:51 AM
Chào các bác.
Em vừa mua mấy con 16f886 về dùng thử, em cũng mới học về PIC. Em làm một chương trình phát xung nho nhỏ ra mấy chân PORTC, dùng timer2. Tuy nhiên nếu dùng prescaler và postscaler cùng tỉ lệ 1:16 thì mới chạy, còn không thì không chạy. Các bác xem code nhé:
//---------------------------------------------------
#include <pic16f887.h>
unsigned char dem;
void main()
{
TRISC=0;//C out
//max frequency:
//OSCCON=(7<<IRCF0)|(1<<SCS)|(1<<HTS);
//OSCTUNE=15;
//timer2:
T2CON=(1<<TMR2ON)|(15<<TOUTPS0)|(1<<T2CKPS1);//dòng này chuối
PR2=10;
while(1)
{
if((PIR1&(1<<TMR2IF))!=0)
{
PIR1=PIR1&(255-(1<<TMR2IF));
if(++dem==10)
PORTC=0;
else if(dem==20)
{
dem=0;
PORTC=7;
}
}
}
}
//========================================
Nếu thay dòng chuối như sau thì không chạy:
T2CON=(1<<TMR2ON);
hoặc:
T2CON=(1<<TMR2ON)|(9<<TOUTPS0)|(1<<T2CKPS1);//postscaler 16
hoặc:
T2CON=(1<<TMR2ON)|(15<<TOUTPS0);

Các bác xem giúp em lỗi gì với.

namqn
19-12-2008, 04:38 PM
Bạn cho biết đang dùng trình biên dịch nào luôn.

Thân,

datk45d
19-12-2008, 05:17 PM
em dùng Hi-Tech ANSI C compiler, bản lite

datk45d
19-12-2008, 06:00 PM
không biết có đúng là nó không, lúc build thì có dòng này, hi vọng bác nhìn nó sẽ rõ hơn:
//--------------------------------------------------------------
HI-TECH C PRO for the PIC10/12/16 MCU family (Lite) V9.60PL3
Copyright (C) 1984-2008 HI-TECH SOFTWARE
(1273) Omniscient Code Generation not available in Lite mode
//--------------------------------------------------------------
Tiện thể cho em hỏi luôn là muốn tìm phần giải thích chi tiết tập lệnh asm cho một con pic thì tìm ở đâu ạ.

namqn
19-12-2008, 08:11 PM
Chào các bác.
Em vừa mua mấy con 16f886 về dùng thử, em cũng mới học về PIC. Em làm một chương trình phát xung nho nhỏ ra mấy chân PORTC, dùng timer2. Tuy nhiên nếu dùng prescaler và postscaler cùng tỉ lệ 1:16 thì mới chạy, còn không thì không chạy. Các bác xem code nhé:
...
Các bác xem giúp em lỗi gì với.
Tôi dùng prescale = 1:1, postscale = 1:16 với chương trình sau thì Timer2 làm việc bình thường:
#include <htc.h>
#include <pic16f887.h>

__CONFIG(HS & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT & BORDIS & IESODIS & FCMDIS & LVPDIS & DEBUGDIS);
__CONFIG(BORV21);

unsigned char cnt;

void interrupt PIC16_ISR(void)
{
}

void Init_Ports(void)
{
TRISB = 0xFE;
ANSELH = 0x00;
}

void Init_Timer2(void)
{
T2CON = 0x78; //1:1 prescaler, 1:16 postscaler
PR2 = 249;
// TMR2IE = 1;
TMR2IF = 0;
TMR2ON = 1;
// PEIE = 1;
// GIE = 1;
}


void main(void)
{
Init_Ports();
Init_Timer2();
cnt = 250;
RB0 = 0;
while (1)
{
if (cnt == 0)
{
RB0 = RB0 ^ 1;; //Toggle every 1 milion inst. cycles
cnt = 250;
}
if (TMR2IF == 1)
{
cnt--;
TMR2IF = 0;
}
};
}

Tôi chưa dùng ngắt. Chương trình đã thử nghiệm trên mạch thực, dùng PIC16F886.

Thân,

namqn
19-12-2008, 08:14 PM
...
Tiện thể cho em hỏi luôn là muốn tìm phần giải thích chi tiết tập lệnh asm cho một con pic thì tìm ở đâu ạ.
Datasheet của PIC đều có phần nói về tập lệnh hợp ngữ. Chẳng hạn như trong datasheet của PIC16F886 (PIC16F88x nói chung), mục 15 có trình bày đầy đủ về tập lệnh hợp ngữ.

Thân,

datk45d
19-12-2008, 10:35 PM
Datasheet của PIC đều có phần nói về tập lệnh hợp ngữ. Chẳng hạn như trong datasheet của PIC16F886 (PIC16F88x nói chung), mục 15 có trình bày đầy đủ về tập lệnh hợp ngữ.

Thân,
Cảm ơn bác. Chắc tại lúc trước xem lướt qua thấy nó nói ít quả em tưởng chỉ là summary.