PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Thực hành (http://www.picvietnam.com/forum/forumdisplay.php?f=20)
-   -   ngắt timer (http://www.picvietnam.com/forum/showthread.php?t=2684)

lekhoa 08-08-2008 11:03 PM

ngắt timer
 
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
Code:

#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

Trích:

Nguyên văn bởi lekhoa (Post 18039)
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
Code:

#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

Trích:

Nguyên văn bởi lekhoa (Post 18039)
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
Code:

#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.


Múi giờ GMT. Hiện tại là 12:15 PM.

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