PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Giao Tiếp Máy Tính Với PIC6F877A (http://www.picvietnam.com/forum/showthread.php?t=2424)

RaulBlanco 26-05-2008 08:22 PM

Giao Tiếp Máy Tính Với PIC6F877A
 
1 Attachment(s)
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:
Code:

#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

Code:

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
Code:

#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:
Code:

#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

Trích:

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


Múi giờ GMT. Hiện tại là 03:19 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