PDA

View Full Version : giao tiếp rs232


ndc
18-10-2008, 05:57 PM
xin chào các bác
em mới học pic, em có một thắc mắc muốn hỏi các bác:
em dùng con 877a để nhận dữ liệu từ pc , nhưng em mới chỉ nhận dc 1 kí tự thôi.VD:em truyền kí tự "a"từ pc thì nó nhận dc
nhưng em muốn nhận dc 1 chuỗi kí tự ,nhưng kho biết phải lập trình cho nó thế nào.
vd như em muốn truyền chữ "hello" từ pc , thì ở vđk cũng nhận dc từ "hello" rồi sau đó nó truyền lại cho pc.
Mong các bác sớm giúp em!!!!
thanku

nguyenquoctoan
20-10-2008, 12:17 AM
bạn làm như vậy nè(mình đã làm như vậy với vb)
-trong vb xác định độ dài chuỗi cần truyền, giả sử là 4 ký tự đi,nuế chưa đủ thì thêm 0 trước vô,đủ rồi thì thôi...
-dưới vi điều khiển xác định số ký tự nhận là 4 nhận đủ thì thôi(dùng vòng lặp for)

naivatho
20-10-2008, 10:37 PM
Bạn toàn ơi.Bạn chỉ giúp mình code viết cho Pic để nó nhận kí tự mà bạn truyền xuống được không?
Mình cũng dùng truyền nhận VB mà mình mới truyền được thôi chứ mình viết code cho Pic nhận chưa được
Mình củng học BKTPHCM nhưng mình học bên cơ khí,mà muốn học điện cho biết
có gì bạn gởi mail cho mình được không
hhtien192@yahoo.com
ai biết thì chỉ giúp mình với
Thanks các bác nhiều!!!!!
Chúc các bác tuần mới vui vẻ!!!

nguyenquoctoan
20-10-2008, 11:22 PM
đoạn code có thể viết đơn giản như sau:
void getvalue()
{
int16 x;
int i;
char s[4]; “khai bao s 4 byte,so luong byte truyen xuong
for(i=0;i<4;i++)
s[i]=getc(); “nhan s vao tu tu dang chuoi,so ky tu trong moi chuoi
x=atol(s); “chuyen chuoi sang so
y=x;
printf("%lu",x); “xuat gia tri x ra pc so ko dau
}
hàm nhận dữ liệu từ vb đơn giản như sau, số lượng ký tự truyền và nhận phải đồng nhất
trong hàm chính
while(1)
{
if (y==0)
getvalue();
}
bạn bổ sung mấy khai báo khác, chạy ok thôi

dvnccbmacbt
21-10-2008, 01:17 AM
các bạn có thể dùng lệnh gets(str) để nhận 1 chuỗi ký tự từ máy tính. sau đó muốn làm j với chỗi đó cũng được. Mình gửi 1 ví dụ mình đã làm và đã chạy ok:

#INT_RDA
void ngat_serial()
{
gets(str); \\ NHAN CHUOI KY TU

printf("%s\r",str); \\GUI TRA CHUOI KY TU

//-------THAO TAC VOI CAC PHAN TU CUA CHUOI----//

if ((str[strlen(str)-2]=='1')&&(str[strlen(str)-1]=='p')) fini = 1;
else if ((str[strlen(str)-2]=='1')&&(str[strlen(str)-1]=='i')) fini = 2;
else if ((str[strlen(str)-2]=='1')&&(str[strlen(str)-1]=='d')) fini = 3;
else if ((str[strlen(str)-2]=='1')&&(str[strlen(str)-1]=='v')) fini = 4;
else if ((str[strlen(str)-2]=='2')&&(str[strlen(str)-1]=='p')) fini = 5;
else if ((str[strlen(str)-2]=='2')&&(str[strlen(str)-1]=='i')) fini = 6;
else if ((str[strlen(str)-2]=='2')&&(str[strlen(str)-1]=='d')) fini = 7;
else if ((str[strlen(str)-2]=='3')&&(str[strlen(str)-1]=='p')) fini = 8;
else if ((str[strlen(str)-2]=='3')&&(str[strlen(str)-1]=='i')) fini = 9;
else if ((str[strlen(str)-2]=='3')&&(str[strlen(str)-1]=='d')) fini = 10;
else if ((str[strlen(str)-2]=='v')&&(str[strlen(str)-1]=='m')) fini = 11;
else if ((str[strlen(str)-2]=='a')&&(str[strlen(str)-1]=='m')) fini = 12;
else if ((str[0]=='o')&&(str[1]=='n')) on = 1;
strncpy(value,str,strlen(str)-2);

// ----------------
}


Hi vọng giúp được các bạn.

naivatho
22-10-2008, 05:35 PM
Bác Toàn ơi! sao em viết code như bác thế mà pic vẫn không nhận và xuất lên máy tính được
em viết code của bác khi dịch vẫn dịch được
và chương trình VB của em cũng send và nhận được khi e nối chân 2 và 3 lại với nhau
Nhưng khi kết hợp lại thì k được.
Mong bác sớm giúp đỡ

naivatho
22-10-2008, 05:41 PM
Bác dvnccbmacbt
code của bác e đọc chưa hiểu hết nơi,nhất là đoạn code sau if.
bác chú thích giúp em được k ạ,e cũng muốn pic nhận chuỗi kí tự mà trên VB em truyền xuất sau đó xuất ra led ma trận mà chưa làm được,em đã có mạch và chương trình trên vb truyền được rồi ạ
vì em mới học nên mong bác sớm giúp đỡ

maiduy082
22-10-2008, 08:48 PM
Bác dvnccbmacbt
code của bác e đọc chưa hiểu hết nơi,nhất là đoạn code sau if.
bác chú thích giúp em được k ạ,e cũng muốn pic nhận chuỗi kí tự mà trên VB em truyền xuất sau đó xuất ra led ma trận mà chưa làm được,em đã có mạch và chương trình trên vb truyền được rồi ạ
vì em mới học nên mong bác sớm giúp đỡ


phần trên là nhận ký tự từ pc gửi ra ,còn sau đó là thao tác bạn dùng cho chuỗi ký tự đó thôi .
đoạn if chỉ la ví dụ thôi .
hay là bạn muốn biết chính xác đoạn code đó có chức nạng gì ???

nguyenquoctoan
22-10-2008, 08:51 PM
mình truyền giá trị 0<X<1000 cho bạn xem như sau
khi truyền và nhận tất cả phải ở dạng chuỗi
code vb:
rstr = txttruyen.Text 'dữ liệu cần truyền
If (Val(rstr) < 1000) And (Val(rstr) > 0) Then
l = Len(rstr) ‘gan l cho do dai c
If (l = 1) Then
rstr = "000" + rstr
End If
If (l = 2) Then
rstr = "00" + rstr
End If
If (l = 3) Then
rstr = "0" + rstr
End If
End If
If rstr = "" Then
' do anything if u want
Else
Call MoPort_Click 'goi hàm mở port khai báo thông số cần truyền
MSComm1.Output = rstr 'truyền dữ liệu xuống
End If
code c
#include<16f877a.h>
#device PIC16F877a*=16 ADC=10
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)
//hàm nhận dữ liệu
void getvalue()
{
int16 x;
int i;
char s[1]; //khai báo số lượng chuỗi truyền
for(i=0;i<4;i++) //số ký tự truyền xuống
s[i]=getc(); //nhan s vao tu tu dang chuoi
x=atol(s); //chuyen chuoi sang so
y=x; //số bạn cần truyền đây
printf("%lu",x); “xuat gia tri x ra pc so ko dau
}
//hàm main
void main()
{
while(1)
{
if (y==0)
getvalue();
}

}
hi vọng giúp được bạn

dvnccbmacbt
22-10-2008, 10:17 PM
đoạn code sau if không cần hiểu đâu. Mình chỉ minh họa thao tác với chuỗi thôi mà. Đoạn đó tùy ứng dụng của ban. Còn câu lệnh
[code]
gets(str);
[\code]
là nhận 1 chuỗi ký tứ cho đến khi nhận được ký tự kết thúc là "\r".

le.nhatcuong
23-10-2008, 07:47 AM
#include <16F876A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A2, rcv=PIN_A3)
int8 ch;

void main(void)
{
while(true)
{
ch = getc();
if (ch!=0)
{
putc(ch);
}
}
}

naivatho
23-10-2008, 10:11 PM
Em cám ơn các bác nhiều!!!
Để em thử xem em truyền và nhận được không rồi em liên hệ các bác giúp đỡ!!!
Đa tạ các bác

le.nhatcuong
25-10-2008, 01:18 AM
đoạn mã trên đơn giản nhất, khi nhận được sẽ truyền len PC lai đúng ký t75 vừa nhận

thanhduy_meo
28-10-2008, 08:20 AM
chào các pác! tui đang gặp khó khăn về giao tiếp vdk với máy tính.cụ thể là giao tiếp AVR với PC điểu khiển bằng VB6 hiển thị nhiệt độ con LM35.các cao thủ xin chỉ giúp với.tui khó khăn ở khâu truyền nhận làm sao VB nó lấy tín hiệu từ con AVR đấy.Xin cảm ơn các bạn trước hen.

namqn
28-10-2008, 07:20 PM
chào các pác! tui đang gặp khó khăn về giao tiếp vdk với máy tính.cụ thể là giao tiếp AVR với PC điểu khiển bằng VB6 hiển thị nhiệt độ con LM35.các cao thủ xin chỉ giúp với.tui khó khăn ở khâu truyền nhận làm sao VB nó lấy tín hiệu từ con AVR đấy.Xin cảm ơn các bạn trước hen.
Với những vấn đề liên quan đến AVR, bạn có thể hỏi tại www.dientuvietnam.net và www.avrvietnam.com.

Thân,

naivatho
03-11-2008, 04:29 PM
bác toàn ơi sao chương trình chạy được nhưng vẫn chưa truyền nhận được
đây là code của em
trên vb
Private Sub cmdtruyen_Click()
Dim rstr As String
rstr = txttruyen.Text
If (Val(rstr) < 1000) And (Val(rstr) > 0) Then
l = Len(rstr)
If (l = 1) Then
rstr = "000" + rstr
End If
If (l = 2) Then
rstr = "00" + rstr
End If
If (l = 3) Then
rstr = "0" + rstr
End If
End If
MSComm1.Output = rstr
End Sub

Private Sub Form_Load()
With MSComm1
.CommPort = 1
.Settings = "19200,N,8,1"
.PortOpen = True
.RThreshold = 1
End With
End Sub

Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = 2 Then
txtnhan.Text = txtnhan.Text + MSComm1.Input
End If
End Sub
code tren pic
#include<18f452.h>
#include <stdlib.h>
#use delay(clock=20000000)
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7)
int y;
void getvalue()
{
int16 x;
int i;
char s[1]; //khai báo so^' lu+o+.ng chuo^~i truye^`n
for(i=0;i<4;i++) //so^' ký tu+. truye^`n xuo^'ng
s[i]=getc(); //nhan s vao tu tu dang chuoi
x=atol(s); //chuyen chuoi sang so
y=x; //so^' ba.n ca^`n truye^`n ?ây
printf("%lu",x); //xuat gia tri x ra pc so ko dau
}

void main()
{
while(1)
{
if (y==0)
getvalue();
}

}
e vẫn chưa hiểu đoạn bác gán y =0 để làm gì!!!!
và chỗ getvalue(); là lấy giá trị đúng không bác
sao e vẫn chưa truyền nhận được
mong bác sớm hồi âm
e truyền số 100 mà không được

naivatho
03-11-2008, 04:29 PM
bác toàn ơi sao chương trình chạy được nhưng vẫn chưa truyền nhận được
đây là code của em
trên vb
Private Sub cmdtruyen_Click()
Dim rstr As String
rstr = txttruyen.Text
If (Val(rstr) < 1000) And (Val(rstr) > 0) Then
l = Len(rstr)
If (l = 1) Then
rstr = "000" + rstr
End If
If (l = 2) Then
rstr = "00" + rstr
End If
If (l = 3) Then
rstr = "0" + rstr
End If
End If
MSComm1.Output = rstr
End Sub

Private Sub Form_Load()
With MSComm1
.CommPort = 1
.Settings = "19200,N,8,1"
.PortOpen = True
.RThreshold = 1
End With
End Sub

Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = 2 Then
txtnhan.Text = txtnhan.Text + MSComm1.Input
End If
End Sub
code tren pic
#include<18f452.h>
#include <stdlib.h>
#use delay(clock=20000000)
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7)
int y;
void getvalue()
{
int16 x;
int i;
char s[1]; //khai báo so^' lu+o+.ng chuo^~i truye^`n
for(i=0;i<4;i++) //so^' ký tu+. truye^`n xuo^'ng
s[i]=getc(); //nhan s vao tu tu dang chuoi
x=atol(s); //chuyen chuoi sang so
y=x; //so^' ba.n ca^`n truye^`n ?ây
printf("%lu",x); //xuat gia tri x ra pc so ko dau
}

void main()
{
while(1)
{
if (y==0)
getvalue();
}

}
e vẫn chưa hiểu đoạn bác gán y =0 để làm gì!!!!
và chỗ getvalue(); là lấy giá trị đúng không bác
sao e vẫn chưa truyền nhận được
mong bác sớm hồi âm
e truyền số 100 mà không được

nguyenquoctoan
03-11-2008, 06:34 PM
mình gửi cho bạn chuơng trình mình đã test đây,sẵn giao diện luôn,bạn thao khảo đi,mình đã test ok roi

nguyenquoctoan
03-11-2008, 07:02 PM
-mình viết 1 cái đơn giản cho bạn test thư cái này mình đã test ok rồi,bạn tham khảo thử
-nuế kô chạy có thể phần cứng bạn có vấn đề, bạn kiểm tra lại phần cứng thư,chú ý chiều khi gắn tụ...

nguyenquoctoan
03-11-2008, 07:07 PM
đoạn code trên chỉ nhận được một lần(quên cho y=0 trong hàm getvalue),khi cho y = 0 thì quá trình luôn được tiếp diễn vì trong hàm chính dò nuế y=0 thì xảy ra quá trình nhận, bạn có thể dùng ngắt nối tiếp RDA để truyền nhận cũng được

nguyenquoctoan
03-11-2008, 11:40 PM
cho hỏi ở đây ai đã truyền số thập phân xuống và xuất số đó ra lcd chưa,xin chỉ giáo tiểu đệ,ví dụ truyền số 0.001,sao đó xuất y chang số đó ra lcd,và truyền một lúc 10 số như vậy xuất ra tuần tự,nói rõ công dụng hàm atof() (chuyển đổi string sang số chấm động)

naivatho
07-11-2008, 08:59 PM
Bác Toàn ơi!!
Sao Bác gởi cho em cái chương trình trên VB mà chỉ có cái form thôi
Ko có chương trình nên e chưa test được
Mong bác sớm gởi lại cho tiểu đệ
Chương trình của bác xuất ra lcd à.e chỉ cần pic nhận được sau đó xuất lên lại màn hình trên VB ở ô nhận thôi.để em biết rằng pic đã nhận được giá trị mà mình truyền xuống.
E đã viết chương trình trên VB rồi,nó truyền tốt và khi nối chân 2,với 3 của cổng Com lại thì nó hiển thị giá trị em truyền trên ô nhận nhưng khi đưa vào mạch pic thì khi truyền ô nhận trên VB chẳng xuất hiện được giá trị e muốn truyền !!!!!!
Mong các cao nhân giúp đỡ tiểu đệ

nguyenquoctoan
07-11-2008, 10:03 PM
cái đó file.exe đó chạy thôi,code trên píc là gửi cho bạn rồi,đã test mà sao kô chạy,chương trình đó có trả giá trị mà bạn gửi xuống pic nữa bạn xem ky đi,bạn chỉ cần dịch chương trình mình gửi nạp file hex vào chạy file.exe đó,nhấn connect sau đó đánh chuỗi cần truyền vào input, output sẽ hiện ở dòng dưới coi như ok

thang8831
06-01-2009, 04:55 PM
Các bác ah! Em thấy trong chương trình các bác viết không nói gì đến các hoạt động của VDK ở bên ngoài, tức em không thấy trong chương trình có khai báo các port mà VDK sẽ nhận hoặc xuất dữ liệu ra phần cứng và hoạt động của các chân đấy trong quá trình truyền và nhận dữ liệu với PC trên chương trình. Tiểu đệ còn non kiến thức mong các bác chỉ giúp. Cám ơn mọi người nhiều!

nguyenquoctoan
06-01-2009, 08:25 PM
khai báo chân txd và rxd, sử dụng modun rs232 ngay đoạn đầu,

thang8831
06-01-2009, 11:10 PM
ý em không phải hỏi về 2 chân đó bác ah! Mà em chưa hiểu ở chỗ các chân của các port mà mình thiết kế để điều khiển các phần cứng bên ngoài chẳng hạn xuất mức 1 hoặc 0 ra 1 chân nào đó hoặc dữ liệu nhận về ở 1 chân nào đấy sao không thấy các bác nói đến trong chương trình? Chương trình em chỉ thấy VĐK nhận và truyền trở lại bằng các hàm getc và putc mà chẳng thấy nó điều khiển cái gì thông qua chân nào cả. Mong các bác chỉ giúp em. Cám ơn mọi người nhiều!

tranvangvn
15-03-2009, 03:21 PM
Xin hỏi mọi người khai báo cái này mục đich là gì vậy
#include <16F876A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A2, rcv=PIN_A3)
em viết cho vi điều khiển bằng C nhưng máy tính toàn báo nỗi khung truyền vì thế C có cân không

digan
13-04-2009, 10:45 PM
Xin chào! Mình thử giao tiếp mãi mà ko dc không biết sai sót ở đâu. mình dùng cachs bật các led ở Port b để báo là có truyền thông
#include <16f877a.h>
#include <def_877a.h>
//#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOWRT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=9)
char buf;
int a;
// Ngat Truyen thong
#INT_RDA
Receive_isr()
{

buf=getc();
putc(buf);
PORTB=0x00;

Các cao thủ KT hộ với. tôi nghi là sai phần khai báo(đánh dấu), nhưng mục này thường copy nên ko rõ bản chất

phandinh
13-04-2009, 11:43 PM
bạn phải post toàn bộ code lên chứ. Mình cũng đang làm về cái này, có gì mình cùng thảo luận

digan
15-04-2009, 04:08 PM
hik mình mới làm truyền thông thui, khi truyền được thì mới làm các thao tác tiếp theo dc.Full code:
#include <16f877a.h>
#include <def_877a.h>
//#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOWRT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)


//=================================
int buf;
// Ngat Truyen thong
#INT_RDA
Receive_isr()
{

buf=getc();
//putc(buf);
PORTB=0xF0;
}


void main()
{
// Cho phep ngat
enable_interrupts(GLOBAL); // Cho phep tao ngat
enable_interrupts(INT_EXT); // Cho phep ngat ngoai tai chan RB0/INT
enable_interrupts(INT_RDA); // Cho phep ngat ngoai tai chan RB0/INT

TRISB = 0x00; // Tat ca PORTB deu la cong xuat du lieu
// Tat het cac LED
PORTB=0x0F;

While(1)
{


}
}

digan
15-04-2009, 08:10 PM
các tiền bối xem hộ với đệ đang cấp bách quá. code
#include "D:\RS232\RS232.h"
#include <float.h>
#include <math.h>
#include <string.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOWRT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)

char buf;
#int_EXT
EXT_isr()
{
}
#int_TBE
TBE_isr()
{
}
#int_RDA
RDA_isr()
{
buf=getc();
portb = 0x0f;
}

void main()
{
trisb=0x00;
portb = 0x00;
enable_interrupts(INT_EXT);
enable_interrupts(INT_TBE);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

while(1)
{

}
}

dịch báo warning: function not void and does not reurn value RDA_isr
mội ng jup với nha

bonsevich
16-04-2009, 10:53 PM
Kinh nghiệm khi làm mạch thực tế là bao giờ cũng phải đi từ đơn giản đến phức tạp. Một mạch sau khi làm xong trước hết phải test xem nó có chạy được chương trình cơ bản không đã. Đối với vi điều khiển, đơn giản nhất là chương trình test I/O và sử dụng hàm delay. Các bạn chưa test mà đã làm ngay chương trình rồi thì rất khó gỡ.
#include "D:\RS232\RS232.h" : không biết bạn còn thêm định nghĩa gì nữa, những định nghĩa ở dưới khá đủ rồi.
#include <float.h>,#include <math.h>,#include <string.h> với chương trình đơn giản không cần phải thêm những thứ này.
#include <def_877a.h> mình nghĩ là #include <16f877a.h> chứ nhỉ.
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) thiếu bits=8.
2 ngắt ngoài chưa thấy để làm gì thì có thể bỏ qua.
portb là cái gì thế nhỉ? cần phải có định nghĩa trước: #byte portb=6.

bạn thử sửa xem có chạy được không nhé. bạn nên thêm vào lênh putc(buf) sau lệnh getc() trong ngắt nhận. và so sánh ký tự nhận được với 1 giá trị nào đó rồi hãy bật cổng B
Chúc bạn thành công

digan
18-04-2009, 12:26 PM
<def_877a.h> là thư viên mình vào ra lấy trên mạng không biet có phải nó kiểm soát RC6, RC7 không:
#define W 0
#define F 1
//----- Register Files------------------------------------------------------
#byte INDF =0x00
#byte TMR0 =0x01
#byte PCL =0x02
#byte STATUS =0x03
#byte FSR =0x04
#byte PORTA =0x05
#byte PORTB =0x06
#byte PORTC =0x07
#byte PCLATH =0x0A
#byte INTCON =0x0B
#byte PIR1 =0x0C
#byte PIR2 =0x0D
#byte TMR1L =0x0E
#byte TMR1H =0x0F
#byte T1CON =0x10
#byte TMR2 =0x11
#byte T2CON =0x12
#byte SSPCON =0x14
#byte CCPR1L =0x15
#byte CCPR1H =0x16
#byte CCP1CON =0x17
#byte RCSTA =0x18
#byte TXREG =0x19
#byte RCREG =0x1A
#byte CCPR2L =0x1B
#byte CCPR2H =0x1C
#byte CCP2CON =0x1D
#byte ADRESH =0x1E
#byte ADCON0 =0x1F
/* bank 1 registers */
#byte OPTION_REG =0x81
#byte TRISA =0x85
#byte TRISB =0x86
#byte TRISC =0x87
#byte PIE1 =0x8C
#byte PIE2 =0x8D
#byte PCON =0x8E
#byte SSPCON2 =0x91
#byte PR2 =0x92
#byte SSPADD =0x93
#byte SSPSTAT =0x94
#byte TXSTA =0x98
#byte SPBRG =0x99
#byte ADRESL =0x9E
#byte ADCON1 =0x9F
/* bank 2 registers */
#byte EEDATA =0x010C
#byte EEADR =0x010D
#byte EEDATH =0x010E
#byte EEADRH =0x010F
/* bank 3 registers */
#byte EECON1 =0x018C
#byte EECON2 =0x018D

//----- STATUS Bits --------------------------------------------------------
// For Assembly Language - Note upper case
#define IRP 7
#define RP1 6
#define RP0 5
#define NOT_TO 4
#define NOT_PD 3
#define Z 2
#define DC 1
#define C 0
//----- INTCON Bits for c --------------------------------------------------------
#bit gie = 0x0b.7
#bit eeie = 0x0b.6
#bit t0ie = 0x0b.5
#bit inte = 0x0b.4
#bit rbie = 0x0b.3
#bit t0if = 0x0b.2
#bit intf = 0x0b.1
#bit rbif = 0x0b.0
//---------PORTA bits------------------
#bit ra5 =0x05.5
#bit ra4 =0x05.4
#bit ra3 =0x05.3
#bit ra2 =0x05.2
#bit ra1 =0x05.1
#bit ra0 =0x05.0
//---------PORTB bits------------------
#bit rb7 =0x06.7
#bit rb6 =0x06.6
#bit rb5 =0x06.5
#bit rb4 =0x06.4
#bit rb3 =0x06.3
#bit rb2 =0x06.2
#bit rb1 =0x06.1
#bit rb0 =0x06.0
//---------PORTC bits------------------
#bit rc7 =0x07.7
#bit rc6 =0x07.6
#bit rc5 =0x07.5
#bit rc4 =0x07.4
#bit rc3 =0x07.3
#bit rc2 =0x07.2
#bit rc1 =0x07.1
#bit rc0 =0x07.0
//----- PIR1 Bits ----------------------------------------------------------
#bit PSPIF =0x0C.7
#bit ADIF =0x0C.6
#bit RCIF =0x0C.5
#bit TXIF =0x0C.4
#bit SSPIF =0x0C.3
#bit CCP1IF =0x0C.2
#bit TMR2IF =0x0C.1
#bit TMR1IF =0x0C.0
//----- PIR2 Bits ----------------------------------------------------------
#bit CMIF =0x0D.6
#bit EEIF =0x0D.4
#bit BCLIF =0x0D.3
#bit CCP2IF =0x0D.0
//----- T1CON Bits ---------------------------------------------------------
#bit T1CKPS1 =0x10.5
#bit T1CKPS0 =0x10.4
#bit T1OSCEN =0x10.3
#bit T1SYNC =0x10.2
#bit TMR1CS =0x10.1
#bit TMR1ON =0x10.0
//----- T2CON Bits ---------------------------------------------------------
#bit TOUTPS3 =0x12.6
#bit TOUTPS2 =0x12.5
#bit TOUTPS1 =0x12.4
#bit TOUTPS0 =0x12.3
#bit TMR2ON =0x12.2
#bit T2CKPS1 =0x12.1
#bit T2CKPS0 =0x12.0
//-------------SSPCON bits--------------------------
#bit WCOL =0x14.7
#bit SSPOV =0x14.6
#bit SSPEN =0x14.5
#bit CKP =0x14.4
#bit SSPM3 =0x14.3
#bit SSPM2 =0x14.2
#bit SSPM1 =0x14.1
#bit SSPM0 =0x14.0
//---------------CCP1CON bits--------
#bit CCP1X =0x17.5
#bit CCP1Y =0x17.4
#bit CCP1M3 =0x17.3
#bit CCP1M2 =0x17.2
#bit CCP1M1 =0x17.1
#bit CCP1M0 =0x17.0
//---------------RCSTA bits-------------------
#bit SPEN =0x18.7
#bit RX9 =0x18.6
#bit SREN =0x18.5
#bit CREN =0x18.4
#bit ADDEN =0x18.3
#bit FERR =0x18.2
#bit OERR =0x18.1
#bit RX9D =0x18.0
//-----------------------CCP2CON bits----------
#bit CCP2X =0x1D.5
#bit CCP2Y =0x1D.4
#bit CCP2M3 =0x1D.3
#bit CCP2M2 =0x1D.2
#bit CCP2M1 =0x1D.1
#bit CCP2M0 =0x1D.0
//----- ADCON0 Bits --------------------------------------------------------
#bit ADCS1 =0x1F.7
#bit ADCS0 =0x1F.6
#bit CHS2 =0x1F.5
#bit CHS1 =0x1F.4
#bit CHS0 =0x1F.3
#bit ADGO =0x1F.2
#bit ADON =0x1F.0
//----- OPTION_reg Bits --------------------------------------------------------
#bit RBPU =0x81.7
#bit INTEDG =0x81.6
#bit T0CS =0x81.5
#bit T0SE =0x81.4
#bit PSA =0x81.3
#bit PS2 =0x81.2
#bit PS1 =0x81.1
#bit PS0 =0x81.0
//------------------TRISA bits---------------------------
#bit TRISA5 =0x85.5
#bit TRISA4 =0x85.4
#bit TRISA3 =0x85.3
#bit TRISA2 =0x85.2
#bit TRISA1 =0x85.1
#bit TRISA0 =0x85.0
//-----------------TRISB bits-----------------------------
#bit TRISB7 =0x86.7
#bit TRISB6 =0x86.6
#bit TRISB5 =0x86.5
#bit TRISB4 =0x86.4
#bit TRISB3 =0x86.3
#bit TRISB2 =0x86.2
#bit TRISB1 =0x86.1
#bit TRISB0 =0x86.0
//----------------TRISC bits-------------------
#bit TRISC7 =0x87.7
#bit TRISC6 =0x87.6
#bit TRISC5 =0x87.5
#bit TRISC4 =0x87.4
#bit TRISC3 =0x87.3
#bit TRISC2 =0x87.2
#bit TRISC1 =0x87.1
#bit TRISC0 =0x87.0
//----- PIE1 Bits ----------------------------------------------------------
#bit PSPIE =0x8C.7
#bit ADIE =0x8C.6
#bit RCIE =0x8C.5
#bit TXIE =0x8C.4
#bit SSPIE =0x8C.3
#bit CCP1IE =0x8C.2
#bit TMR2IE =0x8C.1
#bit TMR1IE =0x8C.0
//----- PIE2 Bits -----------------------------------------------------
#bit CMIE =0x8D.6
#bit EEIE =0x8D.4
#bit BCLIE =0x8D.3
#bit CCP2IE =0x8D.0
//----- PCON Bits ----------------------------------------------------------
#bit POR =0x8E.1
#bit BOD =0x8E.0
//-----------SSPCON2 bits---------------------------------------------
#bit GCEN =0x91.7
#bit ACKSTAT =0x91.6
#bit ACKDT =0x91.5
#bit ACKEN =0x91.4
#bit RCEN =0x91.3
#bit PEN =0x91.2
#bit RSEN =0x91.1
#bit SEN =0x91.0
//---------------------SSPSTAT bits------------------------
#bit STAT_SMP =0x94.7
#bit STAT_CKE =0x94.6
#bit STAT_DA =0x94.5
#bit STAT_P =0x94.4
#bit STAT_S =0x94.3
#bit STAT_RW =0x94.2
#bit STAT_UA =0x94.1
#bit STAT_BF =0x94.0
//----------------TXSTA bits-----------------
#bit CSRC =0x98.7
#bit TX9 =0x98.6
#bit TXEN =0x98.5
#bit SYNC =0x98.4
#bit BRGH =0x98.2
#bit TRMT =0x98.1
#bit TX9D =0x98.0
//--------------ADCON1 bits---------------
#bit ADFM =0x9F.7
#bit ADCS2 =0x9F.6
#bit PCFG3 =0x9F.3
#bit PCFG2 =0x9F.2
#bit PCFG1 =0x9F.1
#bit PCFG0 =0x9F.0
//-----------EECON1 bits----------
#bit EEPGD =0x018C.7
#bit WRERR =0x018C.3
#bit WREN =0x018C.2
#bit WR =0x018C.1
#bit RD =0x018C.0

phandinh
18-04-2009, 01:18 PM
*đây chỉ là file do người dùng định nghĩa thôi bạn.
ví dụ nhé :
bạn tên : Nguyễn Văn A , giới tính : nam , sinh ngày : ... , quê quán:.... : , lớp :.... , mssv : ....
Vậy thì nhà trường chỉ cần biết MSSV là có thề biết thông tin chi tiết về bạn.
Và khi bạn lên phòng đào tạo xin bảng điểm thì bạn chỉ cần ghi MSSV chứ không
cần phải dài dòng nữa..
*khi bạn khai báo #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts = 8)
thì c.trình tự hiểu địa chỉ của XMIT , RCV

0509592
19-04-2009, 07:16 PM
bonsevich
Nhập môn đệ tử

Tham gia ngày: Feb 2007
Bài gửi: 1
Thanks: 0
Thanked 0 Times in 0 Posts

Kinh nghiệm khi làm mạch thực tế là bao giờ cũng phải đi từ đơn giản đến phức tạp. Một mạch sau khi làm xong trước hết phải test xem nó có chạy được chương trình cơ bản không đã. Đối với vi điều khiển, đơn giản nhất là chương trình test I/O và sử dụng hàm delay. Các bạn chưa test mà đã làm ngay chương trình rồi thì rất khó gỡ.
#include "D:\RS232\RS232.h" : không biết bạn còn thêm định nghĩa gì nữa, những định nghĩa ở dưới khá đủ rồi.
#include <float.h>,#include <math.h>,#include <string.h> với chương trình đơn giản không cần phải thêm những thứ này.
#include <def_877a.h> mình nghĩ là #include <16f877a.h> chứ nhỉ.
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) thiếu bits=8.
2 ngắt ngoài chưa thấy để làm gì thì có thể bỏ qua.
portb là cái gì thế nhỉ? cần phải có định nghĩa trước: #byte portb=6.

bạn thử sửa xem có chạy được không nhé. bạn nên thêm vào lênh putc(buf) sau lệnh getc() trong ngắt nhận. và so sánh ký tự nhận được với 1 giá trị nào đó rồi hãy bật cổng B
Chúc bạn thành công

#include "D:\RS232\RS232.h" đây là include đường link cho bài của bạn digan thay vì include thư viện 16f877a.h

còn thư viện def_877a.h là thư viện tự định nghĩa địa chỉ của người dùng chứ không phải thư viện 16f877a.h như bạn bonsevich nghĩ! và nó không ảnh hưởng đến chương trình của bạn!

bonsevich
20-04-2009, 12:06 PM
@ 0509592
Mình biết đấy là định nghĩa của riêng các bạn. Nhưng trong một chương trình nhờ góp ý thì nên đưa lên đầy đủ tất cả những định nghĩa. Vả lại, để kiểm tra xem mạch có chạy được hay không chỉ cần sử dụng những định nghĩa đơn giản và cơ bản nhất mà thôi.

digan
23-04-2009, 01:00 AM
Ngâm cứu mãi khoản RS232 ko dc, tôi mua kit PICLAB40 về nghiên cứu để đảm bảo ko có lloi trong mạch cứng khi chạy đoạn code bên dưới và KT bằng serial port monitor thì thấy pic gửi lên toàn số 00 với chu kỳ ngắn (cỡ 0,3s), mọi ng chỉ giúp với.

#include<16f877.h>
#fuses XT,NOLVP,NOWDT,PUT
#use delay(clock=4000000) // defind crystal = 4MHz
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7)
// Uses RS232 Baud-rate 9600 , TX PIN = RC6, RX PIN = RC7
main()
{
char key_in;
while (true)
{
key_in=getc()
delay_ms(1000);
putc(key_in);
}
}

digan
23-04-2009, 09:07 AM
Ngâm cứu mãi khoản RS232 ko dc, tôi mua kit PICLAB40 về nghiên cứu để đảm bảo ko có lloi trong mạch cứng khi chạy đoạn code bên dưới và KT bằng serial port monitor cua CCS thì thấy pic gửi lên toàn số 00 liên tục, có thể đây là nguyên nhân ngắt nhận ko xảy ra. mọi ng chỉ giúp với.

#include<16f877.h>
#FUSES NOWDT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOWRT
#use delay(clock=4000000) // defind crystal = 4MHz
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7)
// Uses RS232 Baud-rate 9600 , TX PIN = RC6, RX PIN = RC7
main()
{
char key_in;
while (true)
{
key_in=getc()
delay_ms(1000);
putc(key_in);
}
}

bonsevich
23-04-2009, 11:36 AM
@ digan
Mình sửa code cho bạn, bạn thử xem có chạy tốt không nhé
#include<16f877.h> //cẩn thận nhầm 16f877a
#FUSES XT, NOWDT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOWRT
#use delay(clock=4000000) // defind crystal = 4MHz
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, bits=8)
// Uses RS232 Baud-rate 9600 , TX PIN = RC6, RX PIN = RC7
#int_RDA
void RDA_isr() {
char key_in;
key_in=getc()
//delay_ms(1000); trong 1s lại có ký tự gửi đến thì trả về không đúng
putc(key_in);
}
main()
{
enable_interrupts(global);
enable_interrupts(INT_RDA);
while (true)
{
}
}
digan vẫn chưa có mặt trong diễn đàn

bonsevich
23-04-2009, 11:43 AM
Bạn nên kiểm tra cổng Com của bạn trước, rồi đến con Max 232, rồi đến Pic. Sau khi ok rồi thì mới nạp chương trình rs232 vào. Có lần mình làm cổng Com bị lỗi, tự nối tắt chân 2 với chân 3 nên kiểm tra tưởng ngon nào ngờ không thể nào điều khiển được mạch. Con Max 232 nếu chuyển đổi mức điện áp không đúng thì cũng không chạy được, thành ra pic nó cũng không biết đấy là ký tự gì (trong trường hợp nhận dạng ký tự để điều khiển các cổng). PIC ít khi hỏng ngay cả khi cấp nguồn ngược, nhưng cũng không hoàn toàn loại trừ khả năng này.
Chúc bạn thành công

digan
23-04-2009, 12:19 PM
Mình thử trên PICLAB40 của TME và sử dụng luôn serial port monitor cua trình dịch CCS để test nên khả năng lỗi phần cứng dc giảm thiểu. khi nạp xong ct và vào serial port monitor thấy nhận dc dữ liệu hexa 00 00 00 00 00 00 tuần tự xuất hiện cho đến khi đầy màn hình. kiểm tra form VB tự viết thì ký tự nhận dc luôn là 0. Như vậy có phải là PIC phát dữ liệu liên tục lên PC ko?

digan
04-05-2009, 02:47 PM
Chán quá, lọ mọ một mình mãi vẫn không được. mình Post cả phần VB nhờ mọi ng kiểm tra xem có lối định dạng dữ liệu không nhé. Mình nối tắt chân 11 và 12 của Max232 để thử thì mình gửi chữ A nó trả về đúng chư A luôn.

Private Sub Exit_Click()
MSComm1.PortOpen = False
End
End Sub

Private Sub Form_Load()
With MSComm1
.CommPort = 1
.RThreshold = 1
.Settings = "9600,n,8,1"
.PortOpen = True

End With

TText.Text = "NHAP KY TU TRUYEN DI"
RText.Text = "KY TU NHAN DUOC"

End Sub

Private Sub MSComm1_OnComm()
If (MSComm1.CommEvent = comEvReceive) Then
buff = MSComm1.Input
a = Asc(buff)
RText.Text = a

End If

End Sub

Private Sub RButton_Click()
RText.Text = a
End Sub

Private Sub TButton_Click()
MSComm1.Output = TText.Text
End Sub
http://i424.photobucket.com/albums/pp325/digan/ScreenHunter_001.jpg


Phần Code cho pic mình dùng code do Đồng chí Bolsevik sửa giúp. (Thanks đồng chí!)

#include<16f877.h> //cẩn thận nhầm 16f877a
#FUSES XT, NOWDT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOWRT
#use delay(clock=4000000) // defind crystal = 4MHz
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, bits=8)
// Uses RS232 Baud-rate 9600 , TX PIN = RC6, RX PIN = RC7
#int_RDA
void RDA_isr() {
char key_in;
key_in=getc();
//delay_ms(1000); trong 1s lại có ký tự gửi đến thì trả về không đúng
putc(key_in);
}
main()
{
enable_interrupts(global);
enable_interrupts(INT_RDA);
while (true)
{
}
}

phandinh
04-05-2009, 03:44 PM
Nếu bạn đã chắc chắn khi nối chân 11, 12 của max 232 thì VB truyền nhận dc( gửi A , nhận A ) thì bạn kiểm tra xem ( thật kĩ ) từ chân 11,12 của max232 có đến đúng thứ tự chân RC6, RC7 hay không ? Mình nói lại bạn hãy kểm tra thật kĩ , xem 11, 12 trong data shet là ngõ vào hay ngõ ra .
Cũng chính vì quá tin tưởng Easy PiC ( phiên bản cũ ) của TM nên mình cũng bị như bạn.
chỉ cần đảo chéo RC6 , RC7 là dc.
còn PIClab 40 thì mình không biết thế nào

thienkien
28-05-2009, 01:51 PM
mình cũng mới làm giao tiếp, mình dùng chương trình kiểm tra đơn giản dưới đây thì nhận và gửi đều chính xác,..Nhưng khi muốn khai báo xung lên 40M ( thạch anh thật là 10M) dung hspll thì không nhận đúng nữa, nó gửi lên những ký tự lung tung,... không biết khi khai báo hspll thì có tính lai baurate không nhỉ????? #include<18f4550.h>
#fuses hs,noprotect,nowdt
#use delay(clock=10M)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,pari ty=N)
#use fast_io(b)
int16 dodai,dem=0;
int input_ready;
char mang[1000];

int8 text[100];
#int_rda
void nhan()
{
//disable_interrupts(int_timer0);
//if(kbhit())
mang[dem]=getc();
putc(mang[dem]);

if(mang[dem]==0x0d)
{
dodai=dem;
mang[dem]='\0';
input_ready=1;
dem=0;

}
dem++;


// enable_interrupts(int_timer0);

}

void main()
{
int16 i,j;

input_ready=0;
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_rda);
output_b(255);
while(1)
{
if(input_ready==1)
{
printf("CHUOI=%s",mang);
input_ready=0;
dem=0;
}



}
}

thienkien
29-05-2009, 07:40 PM
ko ai giúp minh à???chương trình truyền và nhận đều ok, chỉ có điều mình muốn hỏi là khi khai báo nhân xung thạch anh(10M*4) thì khai báo baurate nhu thế nào(có phải nhân : baud=9600*4 lên không nhỉ???? help!! gấp nhé các bạn

thienkien
30-05-2009, 11:40 AM
hik mình mới làm truyền thông thui, khi truyền được thì mới làm các thao tác tiếp theo dc.Full code:
#include <16f877a.h>
#include <def_877a.h>
//#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOWRT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)


//=================================
int buf;
// Ngat Truyen thong
#INT_RDA
Receive_isr()
{

buf=getc();
//putc(buf);
PORTB=0xF0;
}


void main()
{
// Cho phep ngat
enable_interrupts(GLOBAL); // Cho phep tao ngat
enable_interrupts(INT_EXT); // Cho phep ngat ngoai tai chan RB0/INT
enable_interrupts(INT_RDA); // Cho phep ngat ngoai tai chan RB0/INT

TRISB = 0x00; // Tat ca PORTB deu la cong xuat du lieu
// Tat het cac LED
PORTB=0x0F;

While(1)
{


}
}

bạn thử đổi int buf; thành char buf ;xem sao. Nếu ko được thì có lẽ là do phần cứng hoặc trình gửi trên PC thôi, mình test thử code bạn rồi, vẫn nhận được mà.Mầ bạn phải để putc(buf) lên thì mới kiểm tra được chứ! thời gian gửi tín hiệu nhanh ko kip thấy led sang đâu!)

quang_minh
04-07-2009, 10:00 PM
mấy bác cho e hỏi vấn đề như sau:
- Em lam mach 485, giao tiếp máy tính gồm có một hệ thống dùng 8951, và một hệ thống dùng PIC. Vấn đề là nếu cắm 8951 giao tiếp với MT thì OK, nhưng khi cắm chung mạng với PIC thì 8951 bị treo, không hoạt động nữa, trong khi PIC vẫn hoạt động tôt.
Em cũng đã cấp nguon riêng cho board 485 roi.
Mong các bác giúp đỡ

8051topic
29-11-2009, 09:42 AM
Mình thử trên PICLAB40 của TME và sử dụng luôn serial port monitor cua trình dịch CCS để test nên khả năng lỗi phần cứng dc giảm thiểu. khi nạp xong ct và vào serial port monitor thấy nhận dc dữ liệu hexa 00 00 00 00 00 00 tuần tự xuất hiện cho đến khi đầy màn hình. kiểm tra form VB tự viết thì ký tự nhận dc luôn là 0. Như vậy có phải là PIC phát dữ liệu liên tục lên PC ko?

Hi, mình cũng đang dùng serial port monitor của CCS, nó có phần send mã ASCII và HEX, bạn thử gửi một giá trị khác 0 xuống PIC xem sao, vì có thể bộ đệm đang là số 0 nên bạn thấy toàn 0 thôi, thay đổi giá trị để kiểm tra nhé bạn.

tieulongnu
22-12-2009, 03:00 AM
Anh em làm ơn xem giúp mình xem mạch chuyển đổi từ RS232 sang RS485 mình vẽ có đúng chưa,mình dùng kiểu truyền 4 dây. Rất cảm ơn.
http://www.mediafire.com/?1um2m5z2m5e

tieulongnu
22-12-2009, 04:17 AM
Nhờ các bạn xem giúp mình mạch chuyển đổi từ RS485 sang 232 có đúng chưa, mình chưa rõ 2 chân DE và RE của IC75176 trong 2 mạch chuyển đổi mình đã post sử dụng thế nào, Rất mong chỉ bảo
http://www.mediafire.com/?id2yzemnzzz

minhkhoa1990
20-06-2011, 02:45 PM
em cũng đang gặp vấn đè về truyền nhận rs232
mong các anh xem thử đoạn code có lỗi chỗ nào ko???
//////////////////////////////
#include <16F877a.h>
#include <def_877a.h>
# use delay (clock =12000000)
#fuses hs,nowdt,nolvp,noprotect
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)

#int_RDA
void ngat_RDA()
{
char data;
data=getc();
if(data=='1')
rb0=1;
else if (data=='2')
rb1=1;
}
void main()
{
//trisd=0x00;
//portd=0x00;
trisb=0x00;
trisc=0x80;
portb=0x00;
enable_interrupts(int_RDA);
enable_interrupts(global);
}

em mô phỏng bằng cổng com ảo Serial Port Driver

danghien719
20-06-2011, 07:57 PM
cái này dể thôi mà.
mình ra đọc báo đây (đến giờ rồi :D)
tí nữa mình vào bầy cho
có gì hỏi qua yahoo cũng đc
danghien_004

danghien719
20-06-2011, 08:09 PM
em cũng đang gặp vấn đè về truyền nhận rs232
mong các anh xem thử đoạn code có lỗi chỗ nào ko???
//////////////////////////////
#include <16F877a.h>
#include <def_877a.h>
# use delay (clock =12000000)
#fuses hs,nowdt,nolvp,noprotect
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)

#int_RDA
void ngat_RDA()
{
char data;
data=getc();
if(data=='1')
rb0=1;
else if (data=='2')
rb1=1;
}
void main()
{
//trisd=0x00;
//portd=0x00;
trisb=0x00;
trisc=0x80;
portb=0x00;
enable_interrupts(int_RDA);
enable_interrupts(global);
}

em mô phỏng bằng cổng com ảo Serial Port Driver

code của bạn như thế là OK rồi. có điều trong code chưa có biến toàn cục data, nếu bạn code như vậy thì nên khai báo : char data
còn khi khai báo rs232 thì đã định nghĩa 2 chân RC6 và RC7 rồi ko cần set tris nữa đâu.
Thân

minhkhoa1990
21-06-2011, 01:40 PM
code của bạn như thế là OK rồi. có điều trong code chưa có biến toàn cục data, nếu bạn code như vậy thì nên khai báo : char data
còn khi khai báo rs232 thì đã định nghĩa 2 chân RC6 và RC7 rồi ko cần set tris nữa đâu.
Thân
mình cảm ơn đã quan tâm nhưng mình nghĩ biến data là cục bộ cũng được mà. tại data chỉ dùng trong hàm phục vụ ngắt nối tiếp..
nếu chương trình này ok thì chắc sai trong vb rồi. ???????
thân

stupid11
22-06-2011, 01:11 AM
bạn minhkhoa1990 chỉ cần thêm vòng lặp while(true) trong main là chạy thôi.


void main()
{
.....
while(true)
{
; //không làm gì cả,chỉ chờ ngắt xảy ra..
}
}


Nếu bạn viết như thế thì khi nhảy vào ngắt set đèn sáng,rồi thoát ngắt..chạy trong main có portb=0x00 thì làm sao mà đèn sáng được chứ...

stupid11
22-06-2011, 01:21 AM
Bạn thử dùng chương trình (VB+PIC+Phần mềm COM ảo) đơn giản này do minh viết:
http://www.picvietnam.com/forum/attachment.php?attachmentid=4327&d=1305211415

minhkhoa1990
22-06-2011, 01:45 AM
Bạn thử dùng chương trình (VB+PIC+Phần mềm COM ảo) đơn giản này do minh viết:
http://www.picvietnam.com/forum/attachment.php?attachmentid=4327&d=1305211415

uh cảm ơn bạn nhé. có vòng lăp while(true) ko mà cũng quên..hii
uh mà cho mình hỏi ban biết giao tiếp rs232 2 con pic cung luc ko??

stupid11
22-06-2011, 09:40 AM
uh cảm ơn bạn nhé. có vòng lăp while(true) ko mà cũng quên..hii
uh mà cho mình hỏi ban biết giao tiếp rs232 2 con pic cung luc ko??

Ý bạn là 3 thiết bị 1 PC + 2 PIC phải ko?
Không được đâu bạn ạ,vì RS232 chỉ cho phép liên kết điểm-điểm thôi..tức chỉ có 2 thiết bị trên đường truyền RS232..Một giải pháp là dùng RS485...,bạn chỉ dùng các mạch chuyển đổi RS232-RS485 (có trên diễn dàn) sau đó lập trình tương tự như cho RS232 thôi...

phatcddt08a
22-06-2011, 09:27 PM
Ý bạn là 3 thiết bị 1 PC + 2 PIC phải ko?
Không được đâu bạn ạ,vì RS232 chỉ cho phép liên kết điểm-điểm thôi..tức chỉ có 2 thiết bị trên đường truyền RS232..Một giải pháp là dùng RS485...,bạn chỉ dùng các mạch chuyển đổi RS232-RS485 (có trên diễn dàn) sau đó lập trình tương tự như cho RS232 thôi...

stupid11 vẫn khỏe chứ ông làm đề tài xong chưa ! thằng bạn cùng phòng ông lam quang báo xong chưa nhỉ .tui vẫn chưa xong nè.hình như cái quang báo của bạn ông là 16x64 một màu đứng không.không biết bạn của ông quet hàng hay quet cột nhỉ .còn tui làm quét hàng chạy chữ dc từ trên xuống dưới hoặc ngược lại theo phong chữ ngang thì không khó nhưng chạy từ trái qua phải không dc.còn làm từ trái qua phải ngược lại theo phong chữ đứng thì cho chay chữ từ trên xuống dước khó quá .nếu mà hai phong chữ thì tui mới lam dc 4 kieu do.còn nếu ma dùng một phong chũ tui bo tay rồi.không biết ông bạn của ông làm như thế nào nhỉ.tính nhờ ông bạn chỉ giáo tý

stupid11
22-06-2011, 10:14 PM
stupid11 vẫn khỏe chứ ông làm đề tài xong chưa ! thằng bạn cùng phòng ông lam quang báo xong chưa nhỉ .tui vẫn chưa xong nè.hình như cái quang báo của bạn ông là 16x64 một màu đứng không.không biết bạn của ông quet hàng hay quet cột nhỉ .còn tui làm quét hàng chạy chữ dc từ trên xuống dưới hoặc ngược lại theo phong chữ ngang thì không khó nhưng chạy từ trái qua phải không dc.còn làm từ trái qua phải ngược lại theo phong chữ đứng thì cho chay chữ từ trên xuống dước khó quá .nếu mà hai phong chữ thì tui mới lam dc 4 kieu do.còn nếu ma dùng một phong chũ tui bo tay rồi.không biết ông bạn của ông làm như thế nào nhỉ.tính nhờ ông bạn chỉ giáo tý

Mình đang làm mô hình...,thằng bạn mình nó làm,mô phỏng chạy rồi đấy...giờ nó đang làm phần cứng.hôm nào qua hỏi nó....có gì trao đổi qua mail nhé.,chứ trao đổi ngoài luồng thế này ko hay cho lắm..Hjj.

phatcddt08a
23-06-2011, 02:59 AM
có gì mình qua bạn luôn nhà cũng gần mà.