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 07-08-2008, 03:51 PM   #1
RaulBlanco
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 6
:
Giao tiếp máy tính??

Em dùng con PIC 16F877A để đọc xung từ encoder về. 10ms thì xuất xung đọc được lên terminal v1.9b. Em đặt lệnh printf(xung) trong chương trình ngắt của timer tuy nhiên lại ko nhận dc gì cả. Xin các đại ca giúp đỡ. Đây là code của em:
PHP Code:
//chuong trinh ve dap ung he thong vong mo bang CT terminal voi tan so 19.61khz, %duty=50%, khong tai
#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_EXT
void ngat_RB()
{
   
xung++;
}
#INT_TIMER1
void timer1_isr()
{
   
v=xung*100/108;// v la van toc tuc thoi DC don vi vong/s
   
printf(v);//xuat ra termal van toc tuc thoi cua DC
   
set_timer1(59286);//lay mau trong 10ms
   
xung=0;

}


void main()
{

   
xung=0;
   
set_tris_b(0x01);
   
setup_timer_1 T1_DIV_BY_8);
   
ENABLE_INTERRUPTS(INT_EXT);
   
ext_int_edge(0,L_TO_H);
   
ENABLE_INTERRUPTS(INT_TIMER1);
   
ENABLE_INTERRUPTS(GLOBAL);
   
setup_timer_2 T2_DIV_BY_12551);
   
set_timer1(59286);
while(
1)
   {     
setup_ccp1(CCP_PWM);
         
setup_ccp2(CCP_OFF);
         
output_high(PIN_C3);
         
output_low(PIN_C4);
         
set_pwm1_duty(510);// %duty la 50 %
   
}


   }
//chay chung khoang vai giay thi ngung lay so lieu ve do thi. 
RaulBlanco vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-08-2008, 04:35 PM   #2
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 RaulBlanco View Post
Em dùng con PIC 16F877A để đọc xung từ encoder về. 10ms thì xuất xung đọc được lên terminal v1.9b. Em đặt lệnh printf(xung) trong chương trình ngắt của timer tuy nhiên lại ko nhận dc gì cả. Xin các đại ca giúp đỡ. Đây là code của em:
PHP Code:
//chuong trinh ve dap ung he thong vong mo bang CT terminal voi tan so 19.61khz, %duty=50%, khong tai
...
char data;
int a;
int16 xung,v;
#INT_EXT
void ngat_RB()
{
   
xung++;
}
#INT_TIMER1
void timer1_isr()
{
   
v=xung*100/108;// v la van toc tuc thoi DC don vi vong/s
   
printf(v);//xuat ra termal van toc tuc thoi cua DC <-- LỖI NẰM Ở ĐÂY
   
set_timer1(59286);//lay mau trong 10ms
   
xung=0;

}
...

   }
//chay chung khoang vai giay thi ngung lay so lieu ve do thi. 
Ở cái dòng comment LỖI.. đó bạn, printf(string) sẽ đợi cho đến khi gặp ký tự '\0' mới thoát khỏi hàm đó, bạn xuất biến v thì không có ký tự '\0' ở cuối.
Làm như sau:
PHP Code:
printf("%lu"v); 
sẽ định dạng thành chuỗi ascii, ví dụ v của bạn có giá trị hexal là 0x3031 thì bạn sẽ nhận được chuỗi kí tự ascii là '3', '0', '3', '1', '\0' sau hàm printf và hiển thị trên terminal
phamminhtuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-08-2008, 05:17 PM   #3
RaulBlanco
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 6
:
hic a ui vẩn ko được
RaulBlanco vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-08-2008, 10:39 AM   #4
hopeman
Đệ tử 6 túi
 
hopeman's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 146
:
Talking

Trích:
Nguyên văn bởi RaulBlanco View Post
Em dùng con PIC 16F877A để đọc xung từ encoder về. 10ms thì xuất xung đọc được lên terminal v1.9b. Em đặt lệnh printf(xung) trong chương trình ngắt của timer tuy nhiên lại ko nhận dc gì cả. Xin các đại ca giúp đỡ. Đây là code của em:
PHP Code:
//chuong trinh ve dap ung he thong vong mo bang CT terminal voi tan so 19.61khz, %duty=50%, khong tai
#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_EXT
void ngat_RB()
{
   
xung++;
}
#INT_TIMER1
void timer1_isr()
{
   
v=xung*100/108;// v la van toc tuc thoi DC don vi vong/s
   
printf(v);//xuat ra termal van toc tuc thoi cua DC
   
set_timer1(59286);//lay mau trong 10ms
   
xung=0;

}


void main()
{

   
xung=0;
   
set_tris_b(0x01);
   
setup_timer_1 T1_DIV_BY_8);
   
ENABLE_INTERRUPTS(INT_EXT);
   
ext_int_edge(0,L_TO_H);
   
ENABLE_INTERRUPTS(INT_TIMER1);
   
ENABLE_INTERRUPTS(GLOBAL);
   
setup_timer_2 T2_DIV_BY_12551);
   
set_timer1(59286);
while(
1)
   {     
setup_ccp1(CCP_PWM);
         
setup_ccp2(CCP_OFF);
         
output_high(PIN_C3);
         
output_low(PIN_C4);
         
set_pwm1_duty(510);// %duty la 50 %
   
}


   }
//chay chung khoang vai giay thi ngung lay so lieu ve do thi. 
thứ 1: mình ko hiểu tại sao lại phải để setup_ccp1(CCP_PWM); trong vòng while(1), bạn chỉ cần gọi nó 1 lần thôi.
thứ 2: setup_timer_2 ( T2_DIV_BY_1, 255, 1); thế mà set_pwm1_duty(510)???, duty chỉ tối đa là 255 thôi mà???
thứ 3: hình như trình tự đúng là :

setup_ccp1(CCP_PWM);
setup_timer_2 ( T2_DIV_BY_1, 255, 1);
__________________
mạch nạp - kit phát triển - linh kiện điện tử www.PNLabvn.com
hopeman 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à 09:59 PM.


Đượ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