PDA

View Full Version : Giao tiếp máy tính??


RaulBlanco
07-08-2008, 03:51 PM
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://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_1, 255, 1);
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.

phamminhtuan
07-08-2008, 04:35 PM
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://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:
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

RaulBlanco
07-08-2008, 05:17 PM
hic a ui vẩn ko được

hopeman
08-08-2008, 10:39 AM
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://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_1, 255, 1);
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);