PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp cổng COM và LPT (http://www.picvietnam.com/forum/forumdisplay.php?f=44)
-   -   giao tiếp rs232 (http://www.picvietnam.com/forum/showthread.php?t=2959)

ndc 18-10-2008 05:57 PM

giao tiếp rs232
 
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:
Code:

#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

Trích:

Nguyên văn bởi naivatho (Post 19798)
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

Trích:

Nguyên văn bởi thanhduy_meo (Post 19918)
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.netwww.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

1 Attachment(s)
-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

Trích:


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


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam