PDA

View Full Version : ngắt timer


lekhoa
08-08-2008, 11:03 PM
Các bác xem giúp em chương trình này, ko biết bị lỗi gì mà chương trình chỉ xuất ra v=5 liên tục ( mục tiêu của em là tăng v lên 1 đơn vị sau mỗi 10ms = ngắt của timer1) . thx nhieu
#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6, rcv=PIN_C7)
#include <def_877a.h>
#include <math.h>
#include <ctype.h>
#include <stdlib.h>
char data;
int a;
int16 xung,v;

#INT_TIMER1
void timer1_isr()
{
v=v+1;
set_timer1(59286);
}
void main()
{ setup_timer_1 ( T1_DIV_BY_8);
ENABLE_INTERRUPTS(INT_TIMER1);
ENABLE_INTERRUPTS(GLOBAL);
set_timer1(59286);
x=5;
while(1)
{
delay_ms(100);
printf("%x",v);
}
}

namqn
08-08-2008, 11:13 PM
Chương trình của bạn gán cho x = 5, thay vì gán giá trị đầu là 5 cho v. Biến v của bạn vẫn được tăng lên sau mỗi ngắt timer, nhưng lệnh printf không in ra v, mà có lẽ in ra chuỗi "%x", với x là biến được khởi tạo bằng 5. Tôi không rõ hành vi của lệnh printf trong CCS C như thế nào khi nó được truyền các tham số kiểu này (tôi không dùng CCS C).

Thân,

phamminhtuan
09-08-2008, 12:11 AM
Các bác xem giúp em chương trình này, ko biết bị lỗi gì mà chương trình chỉ xuất ra v=5 liên tục ( mục tiêu của em là tăng v lên 1 đơn vị sau mỗi 10ms = ngắt của timer1) . thx nhieu
#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6, rcv=PIN_C7)
#include <def_877a.h>
#include <math.h>
#include <ctype.h>
#include <stdlib.h>
char data;
int a;
int16 xung,v;

#INT_TIMER1
void timer1_isr()
{
v=v+1;
set_timer1(59286);
}
void main()
{ setup_timer_1 ( T1_DIV_BY_8);
ENABLE_INTERRUPTS(INT_TIMER1);
ENABLE_INTERRUPTS(GLOBAL);
set_timer1(59286);
x=5;
while(1)
{
delay_ms(100);
printf("%x",v);
}
}
Mình không thấy bạn khai báo biến x, chắc chắn dịch sẽ báo lỗi chứ đừng nói gì tới việc in được ra số 5.

Có lẽ bạn post chương trình chưa đầy đủ vì có vài biến khai báo chẳng để làm gì, vài biến thì phải làm nhưng lại không khai báo, nếu đúng y chang như chương trình này thì kết quả của bạn ra luôn là 5 là hoàn toàn vô lý vì "chưa dịch được"

minhdt10
09-08-2008, 01:04 PM
Các bác xem giúp em chương trình này, ko biết bị lỗi gì mà chương trình chỉ xuất ra v=5 liên tục ( mục tiêu của em là tăng v lên 1 đơn vị sau mỗi 10ms = ngắt của timer1) . thx nhieu
#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6, rcv=PIN_C7)
#include <def_877a.h>
#include <math.h>
#include <ctype.h>
#include <stdlib.h>
char data;
int a;
int16 xung,v;

#INT_TIMER1
void timer1_isr()
{
v=v+1;
set_timer1(59286);
}
void main()
{ setup_timer_1 ( T1_DIV_BY_8);// --> setup_timer_1 ( T1_internal | T1_DIV_BY_8);
ENABLE_INTERRUPTS(INT_TIMER1);
ENABLE_INTERRUPTS(GLOBAL);
set_timer1(59286);
x=5; // --> v=5;
while(1)
{
delay_ms(100);
printf("%x",v);
}
}

Tôi thấy bạn phamminhtuan nói đúng, nếu chương trình đúng như vậy thì chắc chắn dịch sẽ có lỗi, bạn thử thay x bởi v, chỗ setup_timer1 nữa thử xem, có phải bạn dùng dao động nội không

popeye_ts22
30-08-2008, 11:21 PM
Sau ngắt phải xóa cờ tràn TMR1IF=0;
Bạn lekhoa nhầm ở biến x như các bác đã nói.

0509592
31-08-2008, 01:35 AM
hành vi của lệnh :printf("%x",v);
bạn muốn làm gì với lện này??
nếu hiện thị lên LCD hay led 7 vạch thì lệnh này không hiện kết quả như bạn nói được.