|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
|
26-05-2008, 08:22 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Sep 2007
Bài gửi: 6
: |
Giao Tiếp Máy Tính Với PIC6F877A
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); } } thay đổi nội dung bởi: namqn, 26-05-2008 lúc 10:25 PM. |
26-05-2008, 10:39 PM | #2 |
Trưởng lão PIC bang
|
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,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
26-05-2008, 11:42 PM | #3 |
Nhập môn đệ tử
Tham gia ngày: Sep 2007
Bài gửi: 6
: |
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 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); } } thay đổi nội dung bởi: namqn, 27-05-2008 lúc 12:45 AM. |
27-05-2008, 12:57 AM | #4 |
Trưởng lão PIC bang
|
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); } }
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
27-05-2008, 06:54 PM | #5 |
Đệ tử 1 túi
Tham gia ngày: Jul 2007
Bài gửi: 22
: |
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) |
27-05-2008, 07:01 PM | #6 |
Đệ tử 1 túi
Tham gia ngày: Jul 2007
Bài gửi: 22
: |
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 |
27-05-2008, 09:43 PM | #7 |
Nhập môn đệ tử
Tham gia ngày: Sep 2007
Bài gửi: 6
: |
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
|
28-05-2008, 12:48 AM | #8 |
Đệ tử 6 túi
Tham gia ngày: Mar 2006
Bài gửi: 129
: |
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. |
28-05-2008, 01:03 AM | #9 |
Nhập môn đệ tử
Tham gia ngày: Sep 2007
Bài gửi: 6
: |
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 ý
|
28-05-2008, 01:23 AM | #10 |
Đệ tử 6 túi
Tham gia ngày: Mar 2006
Bài gửi: 129
: |
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. |
20-02-2009, 12:54 PM | #11 |
Đệ tử 3 túi
Tham gia ngày: Jan 2009
Bài gửi: 52
: |
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?
|
07-03-2009, 11:45 AM | #12 |
Đệ tử 6 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
: |
|
|
|