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   #16
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   #17
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   #18
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   #19
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 04-05-2008, 02:04 AM   #20
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, 09:48 AM   #21
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 04-05-2008, 12:06 PM   #22
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, 12:09 PM   #23
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, 09:24 PM   #24
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, 11:32 PM   #25
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   #26
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 05-05-2008, 08:43 PM   #27
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 06-05-2008, 10:39 AM   #28
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Bạn truyền sao cũng được ! Nó tùy vào quy định của bạn thôi.
Thí dụ bạn muốn truyền số 3 lên máy tính, bạn có thể truyền giá trị 3 tức là putc(3), lúc đó nó sẽ truyền chuổi bit 00000011. Còn nếu bạn truyền mã ascii thì bạn phải truyễn mã 33H tức là putc(0x33), lúc đó nó sẽ truyền chuổi bit 00110011.
Như vậy truyền bằng cách nào đi nữa thì cũng chỉ có một chuổi bit mà thôi. Do đó trên máy tính bạn phải viết chương trình thu nhận cho đúng. Thí dụ bên dưới bạn putc(3) thì trên máy tính bạn nhận số 3, nhưng nếu bạn truyền theo ascii putc(0x33) thì trên máy tính bạn lại nhận 33H, muốn ra giá trị 3 thì bạn có thể làm một phép trừ 33H-30H chẳng hạn. Nói chung hoàn toàn do bạn quy định, truyền thế nào thì phải có cách nhận thích hợp thế đó.
Còn việc chuyển từ số sang ký tự hay chuổi như bạn nói là không có ý nghĩa. Vì dù ký tự hay số thì đều là một chuổi bit hết . Putc() là 1 byte lên máy tính.

thay đổi nội dung bởi: uydanh, 06-05-2008 lúc 10:46 AM.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-05-2008, 05:52 PM   #29
tyhon
Đệ tử 1 túi
 
Tham gia ngày: Nov 2007
Bài gửi: 22
:
Wink

Thanks anh nhiều nhiều
Ah trao đổi với anh lâu rồi nhưng vẫn chưa biết anh ở đâu nhỉ ?
Nếu có thể rất vui được gặp anh!
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   #30
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
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à 08:35 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