View Full Version : Giao Tiếp Máy Tính Với PIC6F877A
RaulBlanco
26-05-2008, 08:22 PM
Chào các huynh.Đệ hiện đang làm Đồ án và có phần giao tiếp máy tính,dùng PIC6F877A.Đệ dùng chương trình VB gửi kí tự xuống cho VĐKPIC và cho xuất giá trị nhận được ra portd (portd Đệ nối với các LED đơn).Nhưng Đệ gửi các ký tự chữ xuống thì kết quả xuất như nhau,ký tự số thì kết quả như nhau.
-Khi Đệ gửi các kí hiệu chữ như a,b,m,h.... thì các chân D7(MSB),D6,D5,D4,D3 ở mức cao ,các chân còn lại ở mức thấp và giá trị trả về trên VB là ÿ
-Khi Đệ gửi các kí hiệu số 1,2,3,4.... thì chân D7 sáng,các chân còn lại ở mức thấp và giá trị trả về trên VB là þ
Như Đệ biết thì VB gửi xuống là gửi mã ASCII.Vậy thì mình gửi các ký tự khác nhau thì kết quả xuất LED phải khác nhau.Nếu Đệ gửi giá trị cần yêu cầu xuống,ví dụ Đệ gửi từ VB xuống giá trị 300 thì làm sao đểPIC cũng nhận được giá trị là 300 vậy các huynh?Đệ thực sự bị vướng ở chỗ này.Đệ up đoạn code chương trình VB và code CCS nhờ các huynh xem giúp và hướng giùm Đệ hướng giải quyết để Đệ có thể hoàn thành Đồ Án thật tốt.Đệ cám ơn các huynh nhiều.
Code CCS C:
#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=4800, xmit=PIN_C6, rcv=PIN_C7)
#include <def_877a.h>
unsigned char data;
#INT_RDA
void data_receive(void)
{
delay_us(10);
data = getc();
}
void main()
{
set_tris_d(0);
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_RDA);
while(true)
{
portd=data;
putc(data);
}
}
(Đệ ko bik cách chèn code như mấy huynh làm trong diễn đàn nên cứ up lên,mong MOD thông cảm)
namqn
26-05-2008, 10:39 PM
Bạn chưa cho biết code trong VB ra sao, làm sao khẳng định là nó gửi theo kiểu ASCII hay kiểu khác.
Để định dạng code, bạn chọn đoạn code cần định dạng rồi nhấn nút thứ ba bên phải sang, ở hàng thứ hai trên thanh công cụ (có hình giống như ký tự #). Bạn cũng có thể cần phải chuyển sang khung lớn khi soạn thảo để có thể thấy thanh công cụ.
Thân,
RaulBlanco
26-05-2008, 11:42 PM
Anh Nam ơi,em chuyển sang khung lớn nhưng vẫn không thấy thanh công cụ đâu,còn lúc bài mới thì có thấy.
EM cám ơn anh góp ý nhưng code VB em có đưa kèm theo trong file rar đó anh.Để em đưa lên đây lun mấy anh coi cho tiện
Private Sub cmdExit_Click()
MSComm1.PortOpen = False
End
End Sub
Private Sub cmdSend_Click()
Dim out As String
out = txtTransmit.Text
MSComm1.Output = out
End Sub
Private Sub Form_Load()
MSComm1.CommPort = 3
MSComm1.Settings = "4800,n,8,1"
MSComm1.PortOpen = True
MSComm1.RThreshold = 1
End Sub
Private Sub MSComm1_OnComm()
If (MSComm1.CommEvent = comEvReceive) Then
txtReceive.Text = txtReceive.Text + MSComm1.Input
End If
End Sub
Mà anh nam ơi,đoạn Code CCS C em sửa lại như sau
#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=4800, xmit=PIN_C6, rcv=PIN_C7)
#include <def_877a.h>
#INT_RDA
void data_receive(void)
{
portd=getc();
}
void main()
{
set_tris_d(0);
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_RDA);
while(true)
{
putc(portd);
delay_ms(2000);
}
}
em gửi nhạn giá trị qua thẳng portd lun,ko wa biến data nữa thì thấy có khả wan hơn.em gửi xuống chữ a(mã ASCII 61H) thì kết quả theo led là 60H và nhận về "`",b(62H) kết quả vẫn là 60H và vẫn nhân về "`" nhưng chữ c(63H) thì kết quả led xuất đúng và nhận đúng chữ c,chữ d vẫn đúng.em thử gửi tiếp số thì số 1,2 kết quả xuất led và nhận sai.em nghi ngờ 2 chân D1 và Do nên lấy đồng hồ ra đo thì mức Vôn chỉ được 2 V,chính vì thế nên kết quả sai.Anh góp ý giùm đệ với được không?
namqn
27-05-2008, 12:57 AM
Bạn thử như sau xem sao:
#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=4800, xmit=PIN_C6, rcv=PIN_C7)
#include <def_877a.h>
unsigned char data;
#INT_RDA
void data_receive(void)
{
data = getc();
}
void main()
{
set_tris_d(0);
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_RDA);
while(true)
{
output_d(data);
putc(data);
delay_ms(2000);
}
}
Thân,
cuong86vt
27-05-2008, 06:54 PM
Bạn còn một thiếu sót:
Ở đây khi bạn truyền 1 ký tự từ VB xuống VDK thì dữ liệu mà bạn truyền đi sẽ được đổi thành mã ASCII, tương tự như vậy từ VDK lên VB thì cũng được đổi thành mã ASCII luôn, nếu bạn dùng:
txtReceive.Text = txtReceive.Text + MSComm1.Input
thì chưa thể nhận về đúng kí tự mà bạn đã truyền đi, mà bạn phải đổi dữ liệu ASCII nhận về trong MSComm1.Input trở lại thành kí tự string thường bằng lệnh: Asc(MSComm1.Input)
cuong86vt
27-05-2008, 07:01 PM
Bạn thử đổi Code VB của bạn một chút xem sao:
Dim dulieu as String
Private Sub MSComm1_OnComm()
If (MSComm1.CommEvent = comEvReceive) Then
dulieu = Asc(MSComm1.Input)
txtReceive.Text = txtReceive.Text + dulieu
End If
End Sub
hoac la:
Private Sub MSComm1_OnComm()
If (MSComm1.CommEvent = comEvReceive) Then
txtReceive.Text = txtReceive.Text + Asc(MSComm1.Input)
End If
End Sub
RaulBlanco
27-05-2008, 09:43 PM
Em cám ơn các anh đã cho em ý kiến,em cũng thử như các anh hướng dẫn rồi nhưng không được.Cuối cùng em thử chương trình Terminal do anh bên dientuvietnam nói thì việc gửi nhận đã chính xác.Như vậy là chương trình VB của em có vấn đề thật,mà em cũng ko bik phải sửa sao đây.Anh Cuong86vt ơi,em thử làm như anh chỉ thì các giá trị em nhận được chỉ là các con số,ví dụ như chữ a thì nhận được là 0248,chữ b là 128.Nhờ anh giải thích giùm em với,em hiểu ý anh nói là việc chuyển đổi mã ASCII nhưng giá trị sao lại ra thế này.Nhờ các anh góp ý giúp em chỉnh sửa lại code VB để gửi nhạn chính xác như Terminal vì em sợ dùng chương trình này mà không có code đi kèm thì Thầy em không chấp nhận,với lại em cũng muốn hiểu nguyên do
scentoflove
28-05-2008, 12:48 AM
Nếu bạn gửi 1 ký tự xuống thi
dim out as char
mscomm1.output=chr(out)
và khi nhận thì chuyển ngược lại
in= asc(mscomm1.input)
Chương trình trên PIC chỉ cần thì bạn nên để putc ngay sau dòng getc đừng để trong while(1) vì như vậy sau 2s sẽ xuất data mặc dù bạn chưa send gì xuống cho pic.
RaulBlanco
28-05-2008, 01:03 AM
Em thử gửi kí tự là để tét thử xem mạch Vb của em gửi nhận có được không.Còn cái chính của em là em muốn gửi một giá trị số xuống như 300,500,1000...(tốc độ động cơ yêu cầu) để từ đó hiệu chỉnh và xuất ra duty cho chính xác.Mong anh cho em vài ý
scentoflove
28-05-2008, 01:23 AM
Khi bạn xuất được 1 ký tự bạn có thề xuất được 1 chuỗi. Có 2 cách để thực hiện:
_ Xuất 1 chuỗi giá trị mscomm1.output="300" như vậy bạn phải lập trình pic để nhận được chuỗi này và chuyển lại thành số.
_ Chuyển giá trị cần gửi từ decimal sang hex như 300d = 0x12C như vậy bạn sẽ send lần lượt 2 byte 0x01 và 0x2C sau đó trên pic bạn nhận 2 giá trị này và kết hợp lại thành 300d.
Tùy theo độ phức tạp của thông tin gửi đi má bạn chon cách gửi nào ít byte truyền nhất để tiết kiệm thời gian.
xuanhiendk2
20-02-2009, 12:54 PM
Các bạn cho mình hỏi trong CCS muốn viết tiếng Việt thì viết như thế nào? Và nó sẽ được mã hóa sang mã ASCII ra sao?
phandinh
07-03-2009, 11:45 AM
Các bạn cho mình hỏi trong CCS muốn viết tiếng Việt thì viết như thế nào? Và nó sẽ được mã hóa sang mã ASCII ra sao?
Hình như mã ASCII để mã hóa kí tự tiếng Anh mà bạn
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.