PIC Vietnam

Go Back   PIC Vietnam > Robotics > Thực hành

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Thực hành Bắt đầu làm một robot như thế nào? Mẹo vặt? Kỹ thuật? Công nghệ?... Hãy bắt tay vào việc...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 08-08-2008, 11:03 PM   #1
lekhoa
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 1
:
Post 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);
   }
   }

thay đổi nội dung bởi: namqn, 08-08-2008 lúc 11:09 PM.
lekhoa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-08-2008, 11:13 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-08-2008, 12:11 AM   #3
phamminhtuan
Super Moderator
 
phamminhtuan's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 150
:
Trích:
Nguyên văn bởi lekhoa View Post
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"

thay đổi nội dung bởi: phamminhtuan, 09-08-2008 lúc 12:40 AM.
phamminhtuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-08-2008, 01:04 PM   #4
minhdt10
Đệ tử 1 túi
 
Tham gia ngày: May 2008
Bài gửi: 18
:
Trích:
Nguyên văn bởi lekhoa View Post
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
minhdt10 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-08-2008, 11:21 PM   #5
popeye_ts22
Đệ tử 2 túi
 
popeye_ts22's Avatar
 
Tham gia ngày: Jul 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 42
:
Send a message via Yahoo to popeye_ts22
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.
__________________
Best Regard.
popeye_ts22 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-08-2008, 01:35 AM   #6
0509592
Đệ tử 3 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 58
:
hành vi của lệnh rintf("%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.
0509592 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam