![]() |
printf(); // là để gửi một chuỗi hay số lên PC
putc(c); // tức là khi máy tính gửi xuống 1 byte nào đó thì lệnh này sẽ phản hồi lại byte đó cho máy tính. lệnh printf(); có thể dùng ở bất cứ vị trí nào trong chương trình còn lệnh putc(c); chỉ dùng trong ngắt sau dòng lệnh c = getc(); |
các bác giúp em với, nghĩ mãi mà chưa làm được , chương trình của em nó chỉ nhận thôi, nhưng khi nhận xong thì PIC lại không thấy hiển thị, còn truyển ngược lại thì chưa đươc
code trong Pic: #include <16F877a.h> #include <DEFS_16F877A.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #use rs232(baud=9600,parity=n, xmit=PIN_C6, rcv=PIN_C7) unsigned char dulieu; #INT_RDA void data_receive(void) { dulieu = getc(); putc(dulieu); } void main() { set_tris_a(0); ENABLE_INTERRUPTS(GLOBAL); ENABLE_INTERRUPTS(INT_RDA); while(true) { output_a(dulieu); delay_ms(2000); } } code trong VB: Private Sub cmdClear_Click() Text1.Text = "" End Sub Private Sub cmdExit_Click() Unload Me End Sub Private Sub cmdSend_Click() MSComm1.Output = Text2.Text End Sub Private Sub Form_Load() cmdSend.Caption = "&Send" Text1.Text = "" Text2.Text = "" Text1.Enabled = False cmdExit.Caption = "&Exit" With MSComm1 .Settings = "9600,N,8,1" .CommPort = 4 .RThreshold = 1 .SThreshold = 0 .InputMode = comInputModeText .InputLen = 0 .Handshaking = comNone .InBufferSize = 1024 .OutBufferSize = 1024 If .PortOpen = False Then .PortOpen = True End If End With End Sub Private Sub MSComm1_OnComm() If MSComm1.CommEvent = comEvReceive Then Text1.Text = Text1.Text + Asc(MSComm1.Input) End If End Sub (em tìm mãi mà không thấy chỗ nào để viết code.) |
pic không hiển thị gì hết, vậy thì dựa vào đâu mà bạn biết là pic chỉ nhận thôi!
|
Trích:
|
bác nào có sơ đồ kết nối max232 voi Pic không , em thấy lúc nối 3 chân , lúc nối nhiều hơn
|
nếu bạn mô phỏng thì không cần max 232 đâu.
nối trực tiếp chân 2 , 3 với RC6 ,RC7 luôn |
hà hà.cùng hợp tác nha Nuyennam888
1 Attachment(s)
bạn đang mo phỏng thằng proteus phải ko ?
bạn xem file sau nha. proteus 7.4 (sp3) không cần max 232 |
pic
[QUOTE=nguyennam8888;24308]các bác giúp em với, nghĩ mãi mà chưa làm được , chương trình của em nó chỉ nhận thôi, nhưng khi nhận xong thì PIC lại không thấy hiển thị, còn void main()
{ set_tris_a(0); ENABLE_INTERRUPTS(GLOBAL); ENABLE_INTERRUPTS(INT_RDA); //////////////////////////// bạn chưa khởi tạo portc làm sao nó nhận hay gửi được set_tris_c(0x80); |
các bạn cho mình hỏi vấn đề này nhé.
nếu mình dùng 2 bộ cổng Tin1 và Tin2, Rout1 và Rout2 cung nối vào một cổng COM của PC. 2 bộ còn lại được nối vào 2 con PIC. khi tuyền từ PC xuống thì cả 2 PIC cùng nhận. vấn đề này có ảnh hưỡng gì đến data nhận không hả các bác (phương pháp này có thực hiện được không). bác nào đã từng làm rồi xin chỉ giúp |
Hình như bác đang nói tơi chân của con Max232. Vể lý thuyết thì không được phép làm như vậy vì RS232 chỉ cho phép truyền nhận giữa điểm và điểm. Tuy nhiên nếu như tốc độ truyền của bạn thấp thì mình nghĩ chắc nó cũng nhận được. Còn nếu muốn làm đúng chuẩn thì bạn có thể đưa nó sang chuẩn RS485 rồi nối với nhau thì không sao.
|
uh. mình đang nói đến Max232. mình hỏi xem bạn nào đã làm thực tế việc đó chưa. vì mình chỉ truyền cho 2 PIC nên nếu được thì tốt, ko cần phải tốn thêm Ma485. nếu bạn nào đã từng làm thì cho ý kiến thử nhé
|
Theo quy định về các chuẩn giao tiếp thì chắc chắn là không nối được theo cách này, nên nếu bạn đang làm đố án hoặc, bài tập thì không thể làm theo kiểu này được. Còn nếu để làm chơi thì cứ thử xem :D
|
em có câu hỏi muốn mọi người giúp đỡ":đó là code của em viết để truyền nhận dữ liệu nhung ma sao nó mời chỉ truyền từ máy tính xuống nhưng tù vi điều khiên thì chưa có truyền lên máy tính được..
code VB: Private Sub cmdexit_Click() If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End If Unload Me End Sub Private Sub Cmdsend_Click() MSComm1.Output = Text1.Text End Sub Private Sub Form_Load() Dim t As Integer Dim a As Integer Me.BackColor = RGB(255, 155, 255) 'Returns Red Label1.BackColor = RGB(255, 0, 0) 'Returns Red Cmdsend.BackColor = RGB(255, 255, 0) 'Returns Red MSComm1.CommPort = 1 MSComm1.Settings = "9600,o,8,1" MSComm1.PortOpen = True End Sub Private Sub MSComm1_OnComm() If MSComm1.CommEvent = comEvReceive Then text2.Text = MSComm1.Input End If End Sub CODE VI DIEU KHIỂN #include <16f877.h> #FUSES NOWDT, HS, NOPUT,NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #byte portb =0x06 #byte portc =0x07 #byte porta =0x05 #use rs232(baud=9600, parity=N, xmit=pin_C6, rcv=pin_C7, bits=8) char t; int8 i; #INT_RDA void rda_isr() { t=getc() ; if (t==103) { porta=0xff; delay_ms(300); porta=0x00; putc(T); } //putc(t); } void main() { set_tris_b(0); set_tris_c(0x80); set_tris_a(0); enable_interrupts(INT_RDA) ; enable_interrupts(GLOBAL) ; while(1) { portb=t; ; } } |
trong chương trình của phương gặp vấn đề đó là:
chương trình vdk của bạn không vấn đề gì cả .pic có nhận được ký tự mã ascii là 103 và gủi lại máy tình vấn đề khi nhận là trên chương trình vb của bạn . bạn nhận dữ liệu bằng ngắt on_comm Private Sub MSComm1_OnComm() If MSComm1.CommEvent = comEvReceive Then text2.Text = MSComm1.Input End If End Sub khi xẩy ra ngắt thì lấy dữ liệu ra hiển thị trên text2 nhưng khi nào thì xấy ra ngắt thì bạn chưa hiểu về nó .ở ct vb của bạn thì sẽ không bao giờ xẩy ra ngắt vì bạn chưa khai báo số byte nhận về ở bộ đệm để xẩy ra ngắt mscomm1.rthreshohld = x ( số byte xẩy ra ngắt) nếu bạn dặt x=1 thì cứ có 1 byte nhận đựoc thì sẽ xẩy ra ngắt... khi bạn lấy ra và sử dụng active comm hỗ trợ truyền thông của visual basic thì khi chưa khai báo thì mscomm.rthreshold mặc định =0 tức là không cho phép ngắt nhận nên ct của bạn o nhận được bạn nên thêm mscomm1.rthreshold =1 vào private form_load() có đúng hay không bạn kiểm tra sem! và lần sau bạn nên up cả file ct của bạn lên nhé để tiện kiểm tra! |
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 |
Bạn có thể cho mọi người xem code của bạn, sẽ dễ góp ý hơn.
Mình ko hiểu rõ ý bạn lắm, nhưng theo cách mình hay làm, nếu phải truyền 2 giá trị từ 2 cảm biến lên, thì ứng với mỗi cảm biến, cần có một ký tự đi trước để báo hiệu. Ví dụ thay vì truyền 1 byte của cảm biến 1, mình sẽ truyền 2 byte, byte đầu là '@' chẳng hạn, báo hiệu giá trị sắp nhận được là của cảm biến 1, sau đó truyền byte giá trị, với cảm biến 2 thì truyền '#' + giá trị, như vậy trên máy tính sẽ nhận biết dễ dàng giá trị nào của cảm biến nào thôi. |
Trích:
" Private Sub MSComm1_OnComm() Dim a As Variant If MSComm1.InBufferCount Then a = MSComm1.Input End If Text2.Text = a End Sub " Nhưng bây giờ bên VDK truyền byte bao hieu + byte gia tri thi ben VB em tách làm sao được chỉ lấy được byte gia tri thôi? |
Theo mình có 2 cách:
- Cách 1: Đặt bộ đệm Mscomm1.RThreshold = 2, có nghĩa là sau khi nhận được 2byte mới xảy ra ngắt oncomm, khi đó ta đọc 2 byte này, kiểm tra byte đầu, và giá trị là byte sau. Có thể đọc 2 byte bằng cách sau: Code:
Privat Sub MSComm1_onComm() |
nhờ các bác giải thích giùm đoạn lệnh này với.
Option Explicit Private Sub btnClear_Click(Index As Integer) Dim i As Integer Select Case Index Case 0: For i = 0 To 11 txtHEX(i) = "" Next i Case 1: txtTextOut = "" Case 2: txtResponse = "" End Select End Sub Private Sub btnSend_Click(Index As Integer) Dim i As Integer Dim j As Integer Dim Temp As Long Dim OutString As String OutString = "" Select Case Index Case 0 ' Send Hex character string For i = 0 To 11 Temp = 0 If (Len(txtHEX(i)) > 0) Then For j = 1 To Len(Left(txtHEX(i), 2)) Temp = Temp * 16 + HexChar(Mid(txtHEX(i), j, 1)) Next j OutString = OutString & Chr(Temp) End If Next i send (OutString) Case 1 ' Send ascii string send txtTextOut.Text End Select End Sub Sub send(txtin As String) If MSComm1.PortOpen = True Then MSComm1.Output = txtin End If End Sub Function HexChar(strData As String) As Integer Select Case strData Case "0" To "9" HexChar = Val(strData) - Val("0") Case "a", "A" HexChar = 10 Case "b", "B" HexChar = 11 Case "c", "C" HexChar = 12 Case "d", "D" HexChar = 13 Case "e", "E" HexChar = 14 Case "f", "F" HexChar = 15 Case Else HexChar = 0 End Select End Function Private Sub Form_Load() Dim i As Integer For i = 0 To 2 ' Clear all input/output fields btnClear_Click (i) Next i If Not ValidatePort Then MsgBox "There are no available comm ports on this computer.", , "Commx" End End If UpdateStatus End Sub Private Sub Form_Unload(Cancel As Integer) If (MSComm1.PortOpen) Then MSComm1.PortOpen = False End If End Sub Private Sub mnuCom_Click(Index As Integer) Dim i As Integer Dim OldPort As Long On Error Resume Next With MSComm1 OldPort = .CommPort If MSComm1.PortOpen Then .PortOpen = False .CommPort = Index .PortOpen = True If Err.Number <> 0 Then ' This should not happen... MsgBox "Com" & Index & " is not available." & _ vbCrLf & Err.Description Err.Clear .CommPort = OldPort Else For i = 1 To 4 mnuCom(i).Checked = False Next i mnuCom(Index).Checked = True End If Else .CommPort = Index For i = 1 To 4 mnuCom(i).Checked = False Next i mnuCom(Index).Checked = True End If End With UpdateStatus End Sub Private Sub mnuConnect_Click() On Error Resume Next With MSComm1 If .PortOpen = True Then .PortOpen = False Else .PortOpen = True If Err.Number <> 0 Then MsgBox "Com" & .CommPort & " is not available." & vbCrLf & _ Err.Description Err.Clear End If End If End With UpdateStatus End Sub Private Sub mnuDataBSel_Click(Index As Integer) Dim i As Integer Dim NewSettings As String For i = 4 To 8 If (i = Index) Then mnuDataBSel(i).Checked = True Select Case Index Case 4 ' 4 NewSettings = ",,4," Case 5 ' 5 NewSettings = ",,5," Case 6 ' 6 NewSettings = ",,6," Case 7 ' 7 NewSettings = ",,7," Case 8 ' 8 NewSettings = ",,8," End Select Else mnuDataBSel(i).Checked = False End If Next i SetPort (NewSettings) End Sub Private Sub mnuHelpSel_Click(Index As Integer) Select Case Index Case 0 ' Basic Help MsgBox "Basic Communications Program what you see is what you get." _ , vbInformation, "Help" Case 1 ' About MsgBox "Basic Communications Program Version 0.91", , "Help About" End Select End Sub Private Sub mnuParitySel_Click(Index As Integer) Dim i As Integer Dim NewSettings As String For i = 0 To 4 If (i = Index) Then mnuParitySel(i).Checked = True Select Case Index Case 0 ' E NewSettings = ",E,," Case 1 ' M NewSettings = ",M,," Case 2 ' N NewSettings = ",N,," Case 3 ' O NewSettings = ",O,," Case 4 ' S NewSettings = ",S,," End Select Else mnuParitySel(i).Checked = False End If Next i SetPort (NewSettings) End Sub Private Sub mnuSpeedSel_Click(Index As Integer) Dim i As Integer Dim CurPortOpen As Boolean Dim NewSettings As String For i = 0 To 12 If (i = Index) Then mnuSpeedSel(i).Checked = True Select Case Index Case 0 ' 110 NewSettings = "110,,," Case 1 ' 300 NewSettings = "300,,," Case 2 ' 600 NewSettings = "600,,," Case 3 ' 1200 NewSettings = "1200,,," Case 4 ' 2400 NewSettings = "2400,,," Case 5 ' 9600 NewSettings = "9600,,," Case 6 ' 14400 NewSettings = "14400,,," Case 7 ' 19200 NewSettings = "19200,,," Case 8 ' 28800 NewSettings = "28800,,," Case 9 ' 38400 NewSettings = "38400,,," Case 10 ' 56000 NewSettings = "56000,,," Case 11 ' 128000 NewSettings = "128000,,," Case 12 ' 256000 NewSettings = "256000,,," End Select Else mnuSpeedSel(i).Checked = False End If Next i SetPort (NewSettings) End Sub Private Sub mnuStopSel_Click(Index As Integer) Dim i As Integer Dim NewSettings As String For i = 0 To 2 If (i = Index) Then mnuStopSel(i).Checked = True Select Case Index Case 0 ' 1 NewSettings = ",,,1" Case 1 ' 1.5 NewSettings = ",,,1.5" Case 2 ' 2 NewSettings = ",,,2" End Select Else mnuStopSel(i).Checked = False End If Next i SetPort (NewSettings) End Sub Private Sub MSComm1_OnComm() Dim txtBuf As String Dim i As Integer Dim c As Integer With MSComm1 Select Case .CommEvent Case comEvReceive txtBuf = .Input For i = 1 To Len(txtBuf) c = Asc(Mid(txtBuf, i, 1)) If (c < 32 Or c > 126) Then txtResponse = txtResponse & "<" & Hex(c) & ">" Else txtResponse = txtResponse & Chr(c) End If Next i End Select End With txtResponse.SelStart = Len(txtResponse) End Sub Private Sub UpdateStatus() If MSComm1.PortOpen Then StatusBar1.Panels(1).Text = "Connected" mnuConnect.Caption = "Dis&connect" btnSend(0).Enabled = True btnSend(1).Enabled = True Else StatusBar1.Panels(1).Text = "Disconnected" mnuConnect.Caption = "&Connect" btnSend(0).Enabled = False btnSend(1).Enabled = False End If StatusBar1.Panels(2).Text = "COM" & MSComm1.CommPort StatusBar1.Panels(3).Text = MSComm1.Settings End Sub Private Function ValidatePort() As Boolean Dim i As Integer On Error Resume Next ValidatePort = False With MSComm1 For i = 4 To 1 Step -1 .CommPort = i Err.Clear .PortOpen = True If (Err.Number <> 0) Then mnuCom(i).Enabled = False Else ValidatePort = True .PortOpen = False End If Next i End With End Function Private Sub txtHEX_GotFocus(Index As Integer) txtHEX(Index).SelStart = 0 txtHEX(Index).SelLength = Len(txtHEX(Index)) End Sub Private Sub txtHEX_LostFocus(Index As Integer) Dim Temp As String Temp = txtHEX(Index) Select Case Len(txtHEX(Index)) Case 0 txtHEX(Index) = "" Case 1 txtHEX(Index) = "0" & LegalHex(Mid(txtHEX(Index), 1, 1)) Case Else txtHEX(Index) = LegalHex(Mid(txtHEX(Index), 1, 1)) & _ LegalHex(Mid(txtHEX(Index), 2, 1)) End Select If (Len(txtHEX(Index)) > 0) Then Do While (Len(txtHEX(Index)) < 2) txtHEX(Index) = "0" & txtHEX(Index) Loop End If End Sub Private Function LegalHex(c As String) As String c = UCase(c) Select Case c Case "0" To "9", "A" To "F" LegalHex = c Case Else LegalHex = "" End Select End Function Private Sub SetPort(NewSettings As String) Dim CurPortOpen As Boolean Dim OldIndex As Integer Dim OldLength As Integer Dim NewIndex As Integer Dim NewLength As Integer Dim i As Integer Dim Settings(0 To 3) As String Dim Temp As String With MSComm1 CurPortOpen = .PortOpen If .PortOpen Then .PortOpen = False End If OldIndex = 1 NewIndex = 1 For i = 0 To 3 NewLength = InStr(NewIndex, NewSettings, ",") If (NewLength = 0) Then NewLength = NewIndex + Len(Mid(NewSettings, NewIndex)) End If OldLength = InStr(OldIndex, .Settings, ",") If (OldLength = 0) Then OldLength = OldIndex + Len(Mid(.Settings, OldIndex)) End If If (NewLength = NewIndex) Then Settings(i) = Mid(.Settings, OldIndex, OldLength - OldIndex) Else Settings(i) = Mid(NewSettings, NewIndex, NewLength - NewIndex) End If OldIndex = OldLength + 1 NewIndex = NewLength + 1 Next i .Settings = Settings(0) & "," & Settings(1) & "," & _ Settings(2) & "," & Settings(3) If CurPortOpen Then .PortOpen = True End If End With UpdateStatus End Sub Private Sub txtTextOut_GotFocus() txtTextOut.SelStart = 0 txtTextOut.SelLength = Len(txtTextOut) End Sub |
có sư huynh nào có làm giao tiếp USB cho em xin,mạch quang báo giao tiếp USB.
|
Em đang làm về Đếm và phân loại SP trắng và đen Giao tiếp PIC 16F877A voi PC sử dụng VB. Em đã truyền được dữ liệu lên PC nhưng hiển thị không đúng ,xin mấy huynh chỉ em hướng giải quyết. Đây là file gồm Chương trình , mô phỏng bàng proteus và VB. http://www.mediafire.com/?195d8sza5tcjubg
Huynh nào rảnh xem và chỉ em hướng giải quyết Mail của em : vuhoan_vu@yahoo.com |
mọi người cho hỏi khi lấy tín hiệu từ ngoài qua bộ adc và mình mun lấy giá trị đó đẻ vẽ đồ thị, với giao tiếp máy tính thì phải làm làm sao, và có cách nào qua adc mà mình vẫn lấy dc giá trị âm, ví dụ như song sin
|
Trích:
|
cac pro oi cho minh hoi..mình giao tiếp qua cổng usb mà mình dùng ft232 thì làm có giống giao tiếp qua mx232 ko...:)
|
hi
Trích:
còn lấy giá trị lên đồ thị thì phải dùng matlab, labview lập trình giao diện và xử lý! |
-Em mới dùng Visual studio nên không hiểu rõ lắm. Em đã thiết kế xong dao diện và giao tiếp rs 232 hiển thị lên texbox xong rồi. nhưng em muốn tách 3 gia trị từ vi điều khiên lên 3 texbox khác nhau loay hoay mãi vẫn chưa dc. Bác nào viết cho em cái code phần này được ko ạ. Cảm ơn các bác rất nhiều.
-Và em có một thắc mắc nữa không làm sao em sử dụng hàm main() giống tron vi điều khiển được (hàm luôn được chạy mà không phải gọi) để em sử dùng while(true) em đọc code trên http://msdn.microsoft.com/en-us/libr....databits.aspx phai báo hàm main the mà cứ bị lỗi. |
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<--- |
Múi giờ GMT. Hiện tại là 04:48 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