PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 03-05-2008, 02:07 PM   #1
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Đoạn chương trình PIC gửi một ký tự
Code:
#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT,NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, parity=N, xmit=pin_C6, rcv=pin_C7, bits=9)
char c;
void main()
{
putc(c);
while(1)
{
}
}
Đoạn trên tôi gửi số 1 ký tự ( chẳng hạn 1 số từ 0 đến 255) lên máy tính. Trên máy tính tôi nhận số đó và đổi ra số Hex hiện ra ô receivetxt thì trong chương trình con mscomm_oncomm() tôi viết như sau :
Code:
Private Sub MSComm1_OnComm()
Dim buffer() As Byte
Dim j1 As String
If MSComm1.CommEvent = comEvReceive Then
    buffer = MSComm1.Input
    If buffer(0) < 16 Then
    j1 = "0" & Hex(buffer(0))
    Else
    j1 = Hex(buffer(0))
    End If
txtreceive.Text = j1
End If
End Sub
còn MScomm1_oncomm() là gì thì chắc bạn phải đọc thêm trong sách !
Chương trình trên để truyền 1 ký tự lên máy tính. Hoàn toàn tương tự bạn lại thêm một lệnh putc() như vậy nữa để truyền ký tự thứ 2 lên máy tính. Thế nhưng thực tế bạn lại không thể truyền được ký tự thứ 2 này vì tốc độ xử lý của PIC6F877a đáp ứng ko kịp (có lẽ vậy), nên giữa 2 lệnh putc() này bạn thêm một lệnh delay một khoảng thời gian nào đó thì mới truyền đúng được. Đó là một ví dụ nhỏ để chứng tỏ với bạn rằng chỉ có chính mình xoắn tay vào làm nó thì mới thành công được.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-05-2008, 09:36 PM   #2
mamie86
Nhập môn đệ tử
 
Tham gia ngày: Sep 2006
Nơi Cư Ngụ: hue city
Bài gửi: 3
:
Mình cũng đang làm giao tiếp với cổng COM nhưng có một số điều chưa rõ, mong các bạn chỉ thêm.
Chương trình bạn uydanh trền 1 byte lên PC, thế khi truyền nhiều byte ( putc (byte1); putc(byte2) ; ... ) thì trong vb xử lý như thế nào nhỉ ? Trong chương trình bạn UYDANH mình sửa lại như sau có đúng không?

Private Sub MSComm1_OnComm()
Dim buffer() As Byte
Dim j1,j2 As String
If MSComm1.CommEvent = comEvReceive Then
buffer = MSComm1.Input
j1 = cstr(buffer(0))
j2 = cstr(buffer(1))
txtreceive1.Text = j1
txtreceive2.Text = j2
End If
End Sub
(.RThreshold = 1 ; .InputLen = 0)
Kết quả : chỉ xuất dữ liệu byte2 lên ô :txtreceive1.Text,
còn ô : txtreceive2.Text thì bằng 0
Làm thế nòa để tách từng byte trên PC nhi?
mamie86 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-05-2008, 11:54 PM   #3
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Bạn đặt Rthreshold bằng 1, Inputlen=0 có nghĩa là cứ nhận được 1 byte thì xảy ra ngắt, biến buffer sẽ chứa toàn bộ bộ đệm thu cổng COM rồi xóa toàn bộ bộ đệm thu đó.
Nên khi bạn gửi byte1 lên thì mscomm_omcomm xảy ra buffer(0) chứa byte1 đó. Sau đó xóa byte1 vừa nhận trong bộ đệm thu.
Bạn lại tiếp tục gửi byte2 lên, quá trình được lặp lại, buffer(0) chứa byte2 còn buffer(1) ko chứa gì hết nên bằng 0.
Mình nghĩ là như vậy.
Bạn chỉ cần sửa lại Rthreshold bằng 2 để nhận 2 byte rồi mới ngắt rồi xử lý luôn một lần. Nếu không bạn phải khai báo cái mảng buffer của bạn là Static (mình chỉ nghĩ thế thôi chứ chưa thử).
Cách làm trên là của thầy tôi dạy. Tôi nghĩ là đúng ko thể sai được. Nhưng thực tế thì tui nhận lâu lâu vẫn bị sai.
Để khắc phục, ở dưới PIC tôi gửi lặp lại khoảng 3 lần cho chắc. Xác suất gửi đúng là tăng lên rất nhiều dù bạn có gửi bao nhiêu byte đi nữa.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-05-2008, 12:53 AM   #4
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi uydanh View Post
...
Cách làm trên là của thầy tôi dạy. Tôi nghĩ là đúng ko thể sai được. Nhưng thực tế thì tui nhận lâu lâu vẫn bị sai.
Để khắc phục, ở dưới PIC tôi gửi lặp lại khoảng 3 lần cho chắc. Xác suất gửi đúng là tăng lên rất nhiều dù bạn có gửi bao nhiêu byte đi nữa.
Tại sao thầy của bạn không đề cập đến các biện pháp bắt tay, các biện pháp chống và sửa sai? Nếu tôi cảm thấy việc truyền thông tin không đảm bảo, tôi thường dùng cách gửi trả lại những gì vừa nhận được, như vậy bên phát sẽ biết được dữ liệu có được nhận đúng hay không và quyết định có cần gửi lại dữ liệu đó hay không.

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-01-2013, 02:07 AM   #5
mrtamtran
Nhập môn đệ tử
 
Tham gia ngày: Jan 2013
Bài gửi: 5
:
Kính mong thầy namqn giúp đỡ ạ ! ^_^

Thầy namqn ơi , thầy giúp em vấn đề này với ạ !
Em đang lập trình trên MPLAB với con PIC24FJ128GA010
Tất cả các việc :
- Truyền 1 kí tự , chuỗi lên PC thì OK
- Nhận 1 kí tự từ máy tính truyền xuống thì cũng OK
Nhưng Em đang mắc chỗ NHẬN 1 CHUỖI KÍ TỰ TỪ PC to Vi điều khiển
Code của em BUILD SUCCESSED nhưng không nhận được và không hiển thị lên màn hình như mong muốn ạ !
Em kính mong thầy giúp em với ạ !
Em xin cảm ơn Thầy nhiêu nhiều ạ !

Toàn bộ code của em ở đây thầy ạ !

http://www.mediafire.com/?7c4ft7pt6q9r7r6

TRẦN MINH TÂM
--->Trân Trọng<---
mrtamtran vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-05-2008, 09:48 AM   #6
tyhon
Đệ tử 1 túi
 
Tham gia ngày: Nov 2007
Bài gửi: 22
:
[/code]
Đoạn trên tôi gửi số 1 ký tự ( chẳng hạn 1 số từ 0 đến 255) lên máy tính.

Chương trình trên để truyền 1 ký tự lên máy tính. Hoàn toàn tương tự bạn lại thêm một lệnh putc() như vậy nữa để truyền ký tự thứ 2 lên máy tính. Thế nhưng thực tế bạn lại không thể truyền được ký tự thứ 2 này vì tốc độ xử lý của PIC6F877a đáp ứng ko kịp (có lẽ vậy), nên giữa 2 lệnh putc() này bạn thêm một lệnh delay một khoảng thời gian nào đó thì mới truyền đúng được. Đó là một ví dụ nhỏ để chứng tỏ với bạn rằng chỉ có chính mình xoắn tay vào làm nó thì mới thành công được.[/QUOTE]


Anh ơi, nhưng khi em vẽ bằng Proteus để kiểm tra quá trình truyền nhận thì không thấy hiện lên gì cả.Ở đây em dùng vỉtual terminal để giả lập (tức cho hiện lên màn hình ).Anh xem hộ em
Cảm ơn anh nhiều nhiều!
File Kèm Theo
File Type: rar Test.rar (10.3 KB, 226 lần tải)
tyhon vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-05-2008, 08:43 PM   #7
tyhon
Đệ tử 1 túi
 
Tham gia ngày: Nov 2007
Bài gửi: 22
:
Trích:
Nguyên văn bởi uydanh View Post
Đoạn chương trình PIC gửi một ký tự
Code:
#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT,NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, parity=N, xmit=pin_C6, rcv=pin_C7, bits=9)
char c;
void main()
{
putc(c);
while(1)
{
}
}
Chương trình trên để truyền 1 ký tự lên máy tính. Hoàn toàn tương tự bạn lại thêm một lệnh putc() như vậy nữa để truyền ký tự thứ 2 lên máy tính. Thế nhưng thực tế bạn lại không thể truyền được ký tự thứ 2 này vì tốc độ xử lý của PIC6F877a đáp ứng ko kịp (có lẽ vậy), nên giữa 2 lệnh putc() này bạn thêm một lệnh delay một khoảng thời gian nào đó thì mới truyền đúng được. Đó là một ví dụ nhỏ để chứng tỏ với bạn rằng chỉ có chính mình xoắn tay vào làm nó thì mới thành công được.

Anh ơi ! đây là chương trình gửi 1 ký tự lên máy tính.
Anh cho em hỏi là mình có tín hiệu tuơng tự ở bên ngoài vào adc ở trong pic thì ta được dạng số.Ở đây em vẫn chưa hiểu là mình truyền cái khung số này (vi dụ sau khi qua adc ta được 10011001) hay là truyền dạng ký tự(mã ASCII) lên máy tính.Nếu mà truyền dạng ký tự hay chuỗi thì mình lại phải viết chuơng trình cho nó chuyển từ số sang ký tự hay là chuỗi rồi mới truyền lên máy tính hả anh?
Rất mong thư!
tyhon vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-05-2008, 02:04 AM   #8
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Thầy em có đề cập hết chứ anh Nam. Lý thuyết thì thầy nói hết nhưng chương trình mẫu thì thầy chỉ viết cho trường hợp ko bắt tay thôi. Còn bắt tay thì tự sinh viên nguyên cứu thêm. Do em mới học nên cùi bắp. Thực tế sau vài lần truyền sai, em cũng đã nghĩ đến chuyện phải "bắt tay " rồi.
Cái cách của anh Nam nói trên, em thấy rất hay. Em sẽ thử nó. Thanks anh Nam.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-05-2008, 12:06 PM   #9
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Chương trình trên đã được tôi test ngoài mạch thực. Chắc chắn truyền được. Bạn nên làm một cái mạch test hoàn chỉnh để học.
Vì mình cũng đang làm cái này nên mình biết : chúng ta ai cũng muốn học thật nhanh nhưng thực tế nó lại "lung tung" chuyện, không thể ngồi đọc sách, đọc hướng dẫn mà thành công được.
Với lại cái protues ko phải cái gì cũng mô phỏng được đâu bạn à.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-05-2008, 09:24 PM   #10
tyhon
Đệ tử 1 túi
 
Tham gia ngày: Nov 2007
Bài gửi: 22
:
Trích:
Nguyên văn bởi uydanh View Post
Chương trình trên đã được tôi test ngoài mạch thực. Chắc chắn truyền được. Bạn nên làm một cái mạch test hoàn chỉnh để học.
Vì mình cũng đang làm cái này nên mình biết : chúng ta ai cũng muốn học thật nhanh nhưng thực tế nó lại "lung tung" chuyện, không thể ngồi đọc sách, đọc hướng dẫn mà thành công được.
Với lại cái protues ko phải cái gì cũng mô phỏng được đâu bạn à.

Anh ơi!anh gửi cho em cái code kia thì có phải là khi ta gửi một ký tự thì máy cũng sẽ nhận một ký tự.Vậy mình muốn kiểm tra(mô phỏng )trên máy thì phải dùng Proteus để làm chứ anh
mô phỏng đúng thì mới làm được mạch thực chứ, anh cho em hỏi giả sử nhử chương trình kia mình muốn mô phỏng thì cần phải vẽ như thế nào?
Có phải anh bảo là test mạch thực nhưng em mới bắt đầu anh có thể hướng dẫn em
Cảm ơn anh nhiều!
tyhon vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-05-2008, 12:09 PM   #11
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Trong chương trình trên, nếu ở dưới bạn gửi ký tự c=12 thì trên máy tính bạn nhận được trong ô txtreceive là 0C.
Bạn cố test lại đi.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-05-2008, 11:32 PM   #12
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Mĩnh đã từng thử trên protues các mạch đơn giản như nhấp nháy led, hiện thị led 7 đoạn... chứ chưa bao giờ mô phỏng quá trình truyền nhận nên không biết. Mà mình nghĩ tốt nhất bạn nên làm 1 cái mạch thực , không quá khó đâu. Bạn làm cái mạch test hết sức bình thường gồm : nguồn, thạch anh, các led nối port v.vv... rầt bình thường. Còn phần mạch truyền lên máy tính thì bạn mắc đúng theo mạch trong trang sau đảm bảo OK http://www.winpicprog.co.uk/pic_tuto...s232_board.htm
Bạn cẩn thận khi vẽ mạch in thì coi chừng cái cổng COM bạn rất dễ vẽ ngược chân. Bạn chú ý.
À, thêm một cái nữa . Nhiều người đã từng làm với protues đã nói rằng : mô phỏng với protues không phải lúc nào cũng đúng.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-05-2008, 07:19 AM   #13
tyhon
Đệ tử 1 túi
 
Tham gia ngày: Nov 2007
Bài gửi: 22
:
Thanks anh nhiều ! Cái này anh vẽ mạch in trên ORCARD ah
Em sẽ bắt tay vào làm ngay
tyhon vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-05-2008, 04:53 AM   #14
tyhon
Đệ tử 1 túi
 
Tham gia ngày: Nov 2007
Bài gửi: 22
:
Trích:
Nguyên văn bởi uydanh View Post
Mĩnh đã từng thử trên protues các mạch đơn giản như nhấp nháy led, hiện thị led 7 đoạn... chứ chưa bao giờ mô phỏng quá trình truyền nhận nên không biết. Mà mình nghĩ tốt nhất bạn nên làm 1 cái mạch thực , không quá khó đâu. Bạn làm cái mạch test hết sức bình thường gồm : nguồn, thạch anh, các led nối port v.vv... rầt bình thường. Còn phần mạch truyền lên máy tính thì bạn mắc đúng theo mạch trong trang sau đảm bảo OK http://www.winpicprog.co.uk/pic_tuto...s232_board.htm
Bạn cẩn thận khi vẽ mạch in thì coi chừng cái cổng COM bạn rất dễ vẽ ngược chân. Bạn chú ý.
À, thêm một cái nữa . Nhiều người đã từng làm với protues đã nói rằng : mô phỏng với protues không phải lúc nào cũng đúng.


Em trước đây chỉ làm với 8051 về cách hiển thị led đơn giản nên chỉ cắm trên bo chứ không làm mạch in giờ thời gian rất gấp nên gặp khó khăn . Khi em vẽ layout thì nó cứ đòi add linh kiện vào nhưng em không biết chọn thế nào mong anh giúp đỡ.
Anh cho em hỏi thêm là mạch sau thì các chân rc0-rc7 là của pic hay chỉ là jum để pic cắm vào thôi à, nếu là jum thì khi hai chân rc6 và rc7 nối với chân của pic thì nối như thế nào, em vẫn chưa tưởng tượng ra
Hình Kèm Theo
File Type: gif serial.gif (5.5 KB, 665 lần tải)
tyhon vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-12-2009, 12:26 AM   #15
mua_sao_bang
Nhập môn đệ tử
 
Tham gia ngày: Jul 2009
Bài gửi: 7
:
giao tiếp máy tính

em đang làm bài tập về giao tiếp máy tính, sử dụng 16f877(ngôn ngữ C) qua cổng Com.Nhưng em gặp vấn đề là khi truyền tín hiệu từ 1 cảm biến đến máy tính hiển thị trên 1 textbox.Nhưng khi có 2 tín hiệu cảm biến truyền đển máy tính hiển thị trên 2 textbox thì em không biêt đó là dữ liệu của textbox nào khi nhận được.(em sử dụng ngat MSComm1_OnComm)>
Mong các Pro giải thích giúp em.Thanks
mua_sao_bang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 02:40 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam