PDA

View Full Version : pc nhận dữ liệu từ pic không đúng


nhoacquy2512
03-12-2009, 01:02 AM
mình đang tìm hiểu về giao tiếp cổng com với pic,mình viết 1 đoạn chương trình để test dữ liệu truyền từ pic lên máy tính qua max232,trên máy tính mình dùng chương trình terminal để kiểm tra dữ liệu truyền lên có chính xác không,nhưng khi test thì dữ liệu truyền lên không chính xác,vd trong chương trình dưới mình gửi số 3 lên máy tính,nhưng mình lại nhận được mã hex là "FA"mình đã thử nhiều giá trị khác,nhưng vẫn không nhận được chính xác,vầy là tại sao nhỉ.mong các bạn giúp!
đây là code mình viết để test :

//================================================== =================
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=12000000)
#use rs232 (baud=19200 , parity=n , xmit=pin_C6 , rcv=pin_C7,bi ts=8 )
//================================================== ===========================
//==========PHAN KHAI BAO PHAN CUNG===========================================
//----------------------------------------------------------------------------
#define nut RB0
#define led RB5
//----------------------------------------------------------------------------
//=====PHAN KHAI BAO BIEN============================================== =======
char c;

//================================================== =============================
void main()
{
// Thiet lap che do cho PORTB
TRISB = 0x0f; // p0-p3 PORTB la cong xuat du lieu,p7-p5 la nhap du lieu
PORTB = 0x00;
while (1)
{ c='3';
if(nut==0)
{ while(nut==0) {};
led=1;
putc(c);
}
delay_ms(100);
PORTB = 0x00;
}
}

dung h
03-12-2009, 08:07 AM
chương chình của bạn lỗi rất nhiều hay bạn đươc lên không hết
1- bạn chưa khai báo tên chip sử dụng
2- bạn sử dụng PORTB,TRISB mà chưa định nghĩa cho nó
3- bạn dùng portb mà RB0 làm đầu vào cho nut nhấn juif bạn lại còn PORTB = 0x00;
4-#define nut RB0
#define led RB5 bạn phai khai báo # bit
khi bạn viết chương trình song thì hẫy test trên poteus
trước
sau đay mình đã sủa ct của bạn chay tốt lạm sem thử và thấy mình sai ở đâu nhé

//================================================== =================
#include <16f877.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use rs232 (baud=9600 , parity=n , xmit=pin_C6 , rcv=pin_C7,bits=8 )
//================================================== ===========================
//==========PHAN KHAI BAO PHAN CUNG===========================================
//----------------------------------------------------------------------------
#byte TRISB = 0x086
#byte PORTB = 0x006
#byte TRISC = 0x087
#byte TRISD = 0x088
#byte PORTD = 0x008

#bit nut =PORTB.0
#bit led = PORTB.5
//----------------------------------------------------------------------------
//=====PHAN KHAI BAO BIEN============================================== =======
char c;

//================================================== =============================
void main()
{
// Thiet lap che do cho PORTB
TRISC = 0x80; // de chan receive la dau vao
TRISB = 0x0f; // p0-p3 PORTB la cong xuat du lieu,p7-p5 la nhap du lieu
PORTB = 0x00;
TRISD=0x00;

PORTD=0x00;

c='3';
while (1)
{

if(nut==0)
{ while(nut==0) {};
led=1;
putc(c);
PORTD = 0xff;
}
delay_ms(1000);
PORTD = 0x00;
}
}

nhoacquy2512
03-12-2009, 11:13 AM
- mình đã khai báo trisa va trisb trong thư viện rui def_877a,chắc lúc mình copy code lên bị thiếu
- #define nut RB0 và #define led RB5 mình khai báo như thế vẵn đúng mà,trước giờ mình toàn khai báo thế thôi,không thể sai được
- portb minh cho về không là để reset lại chân cho nút nhấn,không ảnh hưởng gì cả,vì khi chưa nhấn nút thì trạng thái chân của pic lun ở mức cao mà
- mình thiếu cái trisc=0x80,không bít có phải là nguyên nhân không,để mình thử,thank bạn nhiều

nhoacquy2512
03-12-2009, 11:24 AM
vẫn không được bạn ah,data vẫn sai,mặc dù mình truyền các số nhỏ như 1,2,3 nhưng dữ liệu nhận đc trên pc vẫn không đúng,nó cứ lung tung cả lên,không theo quy luật nào cả

Delfy_Coltech
03-12-2009, 01:34 PM
vẫn không được bạn ah,data vẫn sai,mặc dù mình truyền các số nhỏ như 1,2,3 nhưng dữ liệu nhận đc trên pc vẫn không đúng,nó cứ lung tung cả lên,không theo quy luật nào cả

Lỗi giao tiếp không chỉ do code mà còn do phần cứng không đảm bảo. Bạn check lại mạch xem có bị nhiễu ở đâu không nhé. Và chú ý cả baudrate nữa!

dung h
03-12-2009, 02:26 PM
ban xem tốc độ baud bạn đặt giữa máy tính và vdk đã đúng chưa? nếu mạch phần cứng ok thì dữ liệu nhận sai chủ yếu do tốc độ baud . ở trong ct của mình mình dặt baud =9600 .
khi bạn dùng virtual teminal để nhận tì bạn nên tốc dộ baud và giao thức truyền nhận giống với bạn dặt ở vdk.
còn đây là ct của bạn mình test trên proteus chay ok

nhoacquy2512
03-12-2009, 06:01 PM
mình đã sửa đc rùi,hjhj,do tốc độ baud sai^^!1 kinh nghiệm quý báu
-ah`.có bạn nào làm về giao tiếp 1 dây chưa,mình đang làm pic6f877a giao tiếp với ds18b20,nhưng thấy nhiều chỗ khó hiểu quá,nhất là phần chương trình,mình có thể viết chương trình ccs theo giao tiếp i2c bằng cách lấy chân sda của pic được không

lehung872000
04-12-2009, 10:00 PM
Chào các bác!
Mình cũng đang làm về cổng com giao tiếp pic và máy tính.phần cứng mình đã test kĩ,nhung không hiểu sao phần mền terminal chẳng nhận được tín hiệu gì cả,chỉ thấy chân dcd,cts sáng lên,mình sửa mãi mà chưa được ,mong các bác giúp đỡ.