PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   Giao tiếp PIC với máy tính (http://www.picvietnam.com/forum/showthread.php?t=2306)

tyhon 27-04-2008 12:19 PM

Giao tiếp PIC với máy tính
 
Hiện giờ em đang làm về phần lập trình giao tiếp giữa Pic(16f877a) với Pc qua RS232 dùng phần mềm CCS
Anh nào đã làm về phần này thì rất cần sự giúp đỡ
mail của em là qvinh_bk86@yahoo.com.vn
Rất mong thư!

uydanh 27-04-2008 05:43 PM

"Tôi ngàn năm đợi"
 
Trích:

Nguyên văn bởi tyhon (Post 15823)
Hiện giờ em đang làm về phần lập trình giao tiếp giữa Pic(16f877a) với Pc qua RS232 dùng phần mềm CCS
Anh nào đã làm về phần này thì rất cần sự giúp đỡ
mail của em là qvinh_bk86@yahoo.com.vn
Rất mong thư!

Giống như mình ! hehhe
Mình cũng đang làm cái này. Bạn tìm trên picvietnam 2 tài liệu này :
1. Về CCS của bạn Linh
2. Tài liệu dịch phần help CCS của txt
3. Đọc trực tiếp Help của CCS luôn (tương đối dễ hiểu).
Bạn tìm về đọc có gì không hiểu thì "quăng" lên đây, mới có người chỉ giúp.
Chứ theo kinh nghiệm "đi kiếm ăn" của mình, bạn cứ đặt câu hỏi chung chung kiểu này thì chỉ có "tôi ngàn năm đợi " thôi. hehehhehhehe

tyhon 28-04-2008 08:40 AM

Giúp đỡ
 
[QUOTE=uydanh;15827]Giống như mình ! hehhe
Mình cũng đang làm cái nà.

Em muốn chuyển tín hiệu tương tự ở bên ngoài vào pic rồi vào máy tính
thế bắt đầu có phải là lập trinh cho tín hiệu tương tự ấy thành số rồi mới chuyển vào máy tính phài không anh? Đến bước chuyển vào máy tính thì em không rõ
Mong anh chỉ giáo giúp em, em đang rất cần

uydanh 28-04-2008 06:16 PM

PIC6F877a có tích hợp sẵn bộ ADC. Bạn chỉ cần biết cách sử dụng nó thôi . Hình như cũng đơn giản ,đặc biệt nếu viết bằng CCS (mà mình cũng chưa xài bộ ADC bao giờ hehehhe). Trong tutorial của bạn Linhnc hình như có ví dụ sử dụng bộ ADC thu thập nhiệt độ sử dụng IC LM335. Bạn down về xem thử.
Sau khi tín hiệu analog được chuyển thành dạng digital, bạn lại đẩy nó từ PIC lên máy tính qua giao tiếp cổng COM.
Như vậy bạn cần biết 2 phần :
1. Sử dụng bộ ADC trong PIC như thế nào.
2. Giao tiếp PIC với máy tính như thê nào.
Bao nhiêu đó chắc là đủ xài rồi. Mình cũng đang học thôi, còn rất "cùi bắp". Rất mong có thể hợp tác với bạn.

tyhon 28-04-2008 08:53 PM

Trích:

Sau khi tín hiệu analog được chuyển thành dạng digital, bạn lại đẩy nó từ PIC lên máy tính qua giao tiếp cổng COM.
Như vậy bạn cần biết 2 phần :
1. Sử dụng bộ ADC trong PIC như thế nào.
2. Giao tiếp PIC với máy tính như thê nào.
Bao nhiêu đó chắc là đủ xài rồi. Mình cũng đang học thôi, còn rất "cùi bắp". Rất mong có thể hợp tác với bạn.

Em giờ đã biết sử dụng sơ qua bộ ADC rồi (ví dụ như lập trình cho đầu vào tương tự còn đầu ra cho hiển thị Led .Khi thay đổi biến trở ở đầu vào thì các led cũng sáng tắt tương ứng)
Còn về phần giao tiếp với pic với máy tính thì em chưa biết mặc dù đã download các tài liệu của anh linhnc về đọc rồi
Nếu anh có tài liệu gì thêm thì có thể cho em tham khảo
Rất cảm ơn anh!

uydanh 28-04-2008 11:44 PM

Rồi vậy bạn và mình cùng học luôn nha ! Cứ xem mình học giao tiếp máy tính bằng cổng COM trước bạn vài ngày đi, bây giờ coi như trả bài vậy. hehehe
Đầu tiên, mình lập trình bằng Visual Basic. Bạn biết Visual basic không? Nếu biết thì tìm đọc 1 trong các cuốn sau :
1. Nếu ở Sài Gòn thì bạn mua cuốn Đo lường Điều Khiển máy tính của Thầy Nguyễn Đức Thành về đọc ( BKtpHCM). Cuốn này dạy rất nhiều giao tiếp : cổng COM, modem, card ISA, PCI.... Bạn đọc phần giao tiếp nối tiếp. Đọc để có hiểu biết sơ sơ về nó rồi bắt đầu làm cái mạch test thử viết chương trình truyền nhận. Mình nghĩ là đơn giản nhưng làm thực tế thì đủ chuyện xảy ra hết.
2. Nếu ở Hà Nội thì mua cuốn Đo Lường Điều khiển máy tính và cuốn Lập trình ghép nối máy tính trong Windows của thầy Ngô Diên Tập.
Nếu bạn chưa biết Visual Basic thì hơi căng. Bạn phải đọc về nó trước đã rồi mới tính tiếp.

Table 29-04-2008 12:55 AM

rs232
 
Trích:

Nguyên văn bởi tyhon (Post 15823)
Hiện giờ em đang làm về phần lập trình giao tiếp giữa Pic(16f877a) với Pc qua RS232 dùng phần mềm CCS
Anh nào đã làm về phần này thì rất cần sự giúp đỡ
mail của em là qvinh_bk86@yahoo.com.vn
Rất mong thư!


Trước tiên nhưng phần này đã được nói rất nhiều trong diễn đàn, bạn chịu khó đọc lại và kiếm ha.

Cũng có thể bạn ko phải là dân điện tử nên mới hỏi thế, nêu bạn cần kiến thưc để làm gấp thì có thể hẹn ở Bk để nói chuyện. mình sẽ hướng dẫn bạn nhưng bước cơ bản để làm trên vb6 và ở 877. Mình là dân Cơ khí, hay đi học ở C4, C5.

thân.

tyhon 29-04-2008 06:57 AM

Trích:

Nguyên văn bởi Table (Post 15870)
Trước tiên nhưng phần này đã được nói rất nhiều trong diễn đàn, bạn chịu khó đọc lại và kiếm ha.

Cũng có thể bạn ko phải là dân điện tử nên mới hỏi thế, nêu bạn cần kiến thưc để làm gấp thì có thể hẹn ở Bk để nói chuyện. mình sẽ hướng dẫn bạn nhưng bước cơ bản để làm trên vb6 và ở 877. Mình là dân Cơ khí, hay đi học ở C4, C5.

thân.



Thực sự mình đang rất gấp, ban có thể cho mình số điện thoại để mình liên lạc với bạn được không. Cảm ơn bạn nhiều
Rất mong thư!

tyhon 29-04-2008 07:11 AM

Xem giúp
 
[QUOTE=uydanh;15867]Rồi vậy bạn và mình cùng học luôn nha ! Cứ xem mình học giao tiếp máy tính bằng cổng COM trước bạn vài ngày đi, bây giờ coi như trả bài vậy.


Thực sự em chưa lập trình với VB mà thời gian lại đang rất gấp, em hỏi câu này hơi ngố nhưng có phải là lập trình bằng VB là để tạo giao diện cho ta biết quá trình truyền nhân giữa Pic và máy tính không anh. Em hơi lơ tơ mơ chỗ này anh có thể nói rõ hơn đi
Thời gian rất gấp mà anh bảo học lập trình VB thì đâu có dễ ạ

uydanh 02-05-2008 09:36 AM

Ngày nào cũng lên diễn đàn hết. hehehheh
Nhưng mình thấy bạn Table nói cũng đúng. Bạn học VB trước đi. Rồi tìm các tài liệu đọc là biết làm liền à. Tại vì mấy cái này trên diễn đàn có hết rồi. Bạn chịu khó tìm, đọc là biết làm liền.
Trong quá trình thực hiện, có gì không hiểu bạn cứ post lên đây, sẽ có các "cây đại thụ" giúp đỡ.
Chúc bạn thành công. Hihihi

tyhon 02-05-2008 04:48 PM

1 Attachment(s)
[QUOTE=uydanh;15921]Ngày nào cũng lên diễn đàn hết. hehehheh
Nhưng mình thấy bạn Table nói cũng đúng. Bạn học VB trước đi. Rồi tìm các tài liệu đọc là biết làm liền à.



Anh ơi, có phải để làm giao tiếp giữa Pic(16f877a) và máy tính thì mình phải có giao diện lập trình cho VB là chỉ để kiểm tra quá trình truyền nhận phải không ạ! Em có download trên mạng được giao diện VB như sau và nhờ anh nói qua chức năng của nó hộ em
Và nếu mà chỉ là để tạo giao diện để kiểm tra quá trình truyền nhận thì mình có thể dùng chương trình khác được không anh!

uydanh 02-05-2008 06:19 PM

Cái chương trình bạn gửi đúng là chỉ kiểm tra quá trình truyền nhận thôi. Tức là khi bạn truyền xuống cái gì thì nó nhận đúng cái đó là OK.
Nhưng giao tiếp máy tình ko phải chỉ để kiểm tra quá trình truyền nhận như bạn nói. Bạn tưởng tưởng như thế nào. Bạn làm cái mạch đo lường và điều khiển nhiệt độ. Nhiệt độ bạn cài đặt cũng như đo về có thể bạn sẽ cho hiển thị trên led 7 đoạn, trên LCD...... Thì giao tiếp máy tính bạn cho các thông số đó hiển thị trên máy tính. Khi bạn đặt trên máy tính là 100 độ C thì bạn phải làm sao cho con PIC của hiểu là bạn cần điều khiển nhiệt độ cái lò là 100 C.... Rồi cũng như vậy, bạn muốn vẽ quá độ của lò nhiệt, bạn hoàn toàn có thể nhiệt độ rồi truyền các giá trị nhiệt độ đó lên máy tính, sử dụng các lệnh vẽ để vẽ các đáp ứng ra cho bạn.
Như vậy đầu tiên bạn phải biết bạn muốn giap tiếp máy tính với bên ngoài qua cái gì ? Trên máy tính có các cổng ra/vào giao tiếp với bên ngoài như là COM, cổng máy in.....
Mới bắt đầu học mình thấy người ta thường học giao tiếp qua cổng COM nên mình cũng chọn nó luôn.
Trên máy tính, bạn phải sử dụng một ngôn ngữ lập trình nào đó mà nó hỗ trợ cho bạn việc tạo giao diện và đặc biệt hơn là nó hỗ trợ bạn việc truyền qua cổng COM như thế nào. Có nghĩ là, muốn truyền cái gì đó qua cổng COM, thì bạn chỉ viết một đoạn code nhỏ nhỏ , còn quá trình từ đoạn code nhỏ nhỏ đó làm sao mà nó truyền qua cổng COM được thì bạn ko cần quan tâm, bạn chỉ cần biết đầu vào và đầu ra, khúc chính giữa ra sao thì bạn tạm gác qua một bên.
Hiện nay có nhiều ngôn ngữ lập trình hỗ trợ việc đó : VB, VC, Delphi.... Mình thấy người mới học hay xài VB. Mình cũng là người mới học nên xài VB luôn.
Đến bây giờ chắc bạn đã hiểu được phần nào. Chúc bạn thành công.

tyhon 02-05-2008 08:20 PM

Hiện nay có nhiều ngôn ngữ lập trình hỗ trợ việc đó : VB, VC, Delphi.... Mình thấy người mới học hay xài VB. Mình cũng là người mới học nên xài VB luôn.
Đến bây giờ chắc bạn đã hiểu được phần nào. Chúc bạn thành công.[/QUOTE]


Cảm ơn anh nhiều
Vâng qua sự phân tích của anh thì h em cũng đã hiểu được phần nào về giao tiếp giữa pic và máy tính rồi.Tức là giao tiếp không chỉ là quá trình truyền nhận mà thông qua máy tính thì nó có thể điều khiển, vẽ đồ thị ...
Em đang dùng Labview để làm điều đó và giao tiếp qua cổng COM
Giờ em có tín hiệu tương tự(ví dụ như là nhiệt độ ở bên ngoài) em muốn truyền tín hiệu đó qua Pic(16f877a) rồi lên máy tính (ví dụ như là dùng Labview để vẽ đồ thị sau từng khoảng thời gian nhất định) .Nếu em dùng ngôn ngữ CCS để viết chương trình thì có phải là chuyển từ tín hiệu tương tự ấy sang số rồi mới truyền lên máy tính, sau đó thì cái Labview ấy mới vẽ đồ thị đúng không anh?
Nếu như vậy thì con Pic chỉ là lập trình cho nó truyền dữ liệu lên máy tính là được đúng không ạ?còn phần vẽ là ta phải làm trên Labview?
Nếu thế thì anh có thể giúp em viết chương trình trên CCS trong quá trình truyền lên máy tính, phần chuyển từ tương tự sang số thì em đã làm được rồi
Anh có ví dụ nào thì có thể cho em để em tham khảo!
Rất mong thư!

uydanh 02-05-2008 11:42 PM

Như đã nói trên, mình cũng đang học cái này. Về cơ bản, việc truyền từ PIC lên máy tính rất là dễ, chỉ cần bạn vào phần help CCS và gõ RS232 thì nó sẽ ra các lệnh cần thiết cho bạn. Chỉ có một vài lệnh thôi.
Tuy nhiên qua quá trình tự tìm hiểu, mình thấy có rất nhiều điều làm ra thực tế mới thấy phức tạp. Cũng sử dụng 1 lệnh đó mà có người truyền được ,có người truyền không được, điều đó hoàn toàn phụ thuộc vào kinh nghiệm thực tế của bạn. Ở mỗi ứng dụng khác nhau chúng ta có những "hiệu chỉnh" , "thêm ít mắm, ít muối" vào cho công việc của bạn thành công.
Bạn nên tự mình mày mò và tìm hiểu thì tốt hơn nhiều và phù hợp hơn cho quá trình học tập của bạn.

tyhon 03-05-2008 01:32 PM

Anh có thể gửi cho em ít code về nó được không ạ, chứ anh nói thế này thì chung chung quá!
Cảm ơn anh!

uydanh 03-05-2008 02:07 PM

Đ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.

mamie86 03-05-2008 09:36 PM

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?

uydanh 03-05-2008 11:54 PM

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.

namqn 04-05-2008 12:53 AM

Trích:

Nguyên văn bởi uydanh (Post 15941)
...
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,

uydanh 04-05-2008 02:04 AM

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.

tyhon 04-05-2008 09:48 AM

1 Attachment(s)
[/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!

uydanh 04-05-2008 12:06 PM

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 04-05-2008 12:09 PM

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.

tyhon 04-05-2008 09:24 PM

Trích:

Nguyên văn bởi uydanh (Post 15947)
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!

uydanh 04-05-2008 11:32 PM

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.

tyhon 05-05-2008 07:19 AM

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 05-05-2008 08:43 PM

Trích:

Nguyên văn bởi uydanh (Post 15935)
Đ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ư!

uydanh 06-05-2008 10:39 AM

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.

tyhon 06-05-2008 05:52 PM

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 07-05-2008 04:53 AM

1 Attachment(s)
Trích:

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

uydanh 07-05-2008 01:42 PM

1 Attachment(s)
Nói về cái mạch : mạch dùng ICMax232, các chân nguồn, chân nối tụ bạn nối giống y hết như trên. Hai chân RC6 và RC7 là 2 chân truyền nhận của PIC6f877a, bạn cứ vẽ layout nối vào 2 chân 9 10 của MAX232 giống như hình trên là được hoặc bạn nối jupm cũng OK.
Về layout : mình thường vẽ trực tiếp trên layout luôn chứ vẽ trên capture cis rồi chuyển qua nó hay báo lỗi do kiểu chân khai báo bên capture cis ko có bên layout. Nên mình vẽ trực tiếp bên layout luôn. Cần chân linh kiện nào thì lấy nó ra. Bạn đọc thêm các tài liệu hướng dẫn để vẽ layout.
Bạn tải file bên dưới về rồi add vào thư viện layout, nó có gần như đầy đủ các linh kiện thông dụng.
Chúc bạn thành công.

tyhon 08-05-2008 10:04 PM

1 Attachment(s)
Code:

Trích:

#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 t;
void main()
{
printf("danh vao ky tu de hien thi");
do
{
t=getc();
putc(t);
}while(1);
}.

Anh ơi , với code này nếu em nạp vào pic và sau đó em cho vào mạch tét như hôm trước anh gừi thì khi mình gõ ký tự từ bàn phím thì máy tính (chương trình giao tiếp) sẽ nhận và hiển thị đc ký tự mình gửi đúng không anh?
Nhưng khi em mô phỏng trên Protues thì nó hiển thị không giống như ký tự mình gửi anh ạ, anh xem dùm em
Cảm ơn anh!

tyhon 11-05-2008 02:42 AM

Anh ở đâu rồi, lâu không thấy anh lên diễn đàn
Anh cố xem hộ em đi ạ
Rất mong thư!

uydanh 11-05-2008 09:53 AM

Mình không có viết kiểu này. Mình dùng ngắt để nhận ký tự trên máy tính truyền xuống. Với đoạn code trên , nếu là mình thì sẽ viết như sau :
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 t;
#INT_RDA
void rda_isr()
{
t=getc()            ;
}
void main()
{
enable_interrupts(INT_RDA)      ;       
enabled_interrupts(GLOBALS)    ;
while(1)
{
putc(t)                                  ;
}
}

Khi trên máy tính truyền xuống hết 1 byte thì ngắt INT_RDA xảy ra. Chương trình ngắt được thực hiện, biến t sẽ nhận 1 byte truyền xuống đó. Sau đó nó thoát ra chương trình ngắt và lặp vòng trong lệnh while(1).
Bạn thử viết kiểu này được không.

tyhon 14-05-2008 07:58 AM

1 Attachment(s)
Anh ơi cho em hỏi
EM có đoạn code đơn giản sau và em test bằng chuơng trình của anh NHB đã gửi cho nhưng sao không đúng , em không biết do lổi gì nhờ anh xem hộ em
Rất mong thư!

uydanh 14-05-2008 02:53 PM

Cái này thì mình cũng pó tay thôi. Chương trình của bạn thiếu parity, bạn thêm vào thử có được không ? Một điều nữa : bạn xem lại thạch anh của bạn có đúng là 20Mhz như khai báo không ?
Bạn truyền thử 1 ký tự xem có OK không? Sau đó mới truyền chuổi.
Chúc thành công.

tungtot_vl 21-03-2009 04:54 PM

giao tiếp cổng Com bằng VB
 
1 Attachment(s)
bạn nào rành giao tiếp cổng com bảng VB thì giúp mình với.
mình tập viết chương trình VB giao tiếp với cổng com. chương trình truyền và nhận chuỗi kiểm string thì bình thường. nhưng khi gửi kiểu byte (0 -> 255) hay kiểm interger thì chương trình chỉ gửi mã dạng ASCII của số đó. ví dụ mình gửi số 1 xuống VDK thì nó phản hồi lại mã ASCII lã9 , gủi số 12 thì phản hồi lại 67, gủi 115 thì phản hồi lại 2 số là 50 và 51.
mình muốn chương trình gửi xuống số 1 thì phản hồi lên số 1, gửi 115 thì phản hồi lên 115
bạn nào biết giúp mình với nhé
thanh you!

npbaoduy 22-03-2009 07:31 PM

Trong VB, khi giao tiếp thì mặc định là gởi mã accii của ký tự, nếu bạn muốn gởi số như bạn nói, ví dụ bạn muốn gởi số 115(1 byte) bạn có thể viết như sau:
MSComm1.output=chr(115)

hàm chr() đổi 1 byte từ số sang ký tự có mã accii là số đó, như vậy, bạn sẽ gởi được số 115.
Nếu bạn giao tiếp với PIC, gởi 1 số lên lại máy tính, bạn có thể viết như sau (CCS):
printf('%u',115);

Chúc bạn thành công.

lequocbao 23-03-2009 12:35 PM

1 Attachment(s)
//Nếu bạn giao tiếp với PIC, gởi 1 số lên lại máy tính, bạn có thể viết như sau (CCS):
printf('%u',115);//



ủa chứ không phải là lệnh : putc(x); hả bạn?
nếu không phải thì sẳn bạn cho mình hỏi luôn là lệnh putc() dùng để làm gì?

Bác nào rành phần cứng thì xem giúp phần mạch bên dưới có đúng không ? sao mà mình chỉ truyền được dữ liệu từ máy tính xuống còn từ pic lên thì không được(không thấy sự kiện on_comm();).

các bác mod cho mình hỏi muốn post trực tiếp file hình lên thì làm như thế nào ? thank.

npbaoduy 24-03-2009 10:07 PM

1 Attachment(s)
Lệnh putc() theo mình hiểu là gởi ký tự.
Gởi bạn mạch mình đã làm và chạy thành công, mạch đơn giản lắm, bạn tham khảo nhé.


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam