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)

phandinh 04-04-2009 12:21 PM

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

phandinh 04-04-2009 12:28 PM

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

tungtot_vl 06-04-2009 11:12 AM

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);

tungtot_vl 22-04-2009 12:18 PM

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

mtuankct 22-04-2009 02:18 PM

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.

tungtot_vl 22-04-2009 03:33 PM

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é

mtuankct 22-04-2009 06:32 PM

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

phuong_dtk4s 26-11-2009 09:57 AM

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;
;
}
}

dung h 26-11-2009 10:52 AM

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!

mua_sao_bang 17-12-2009 12:26 AM

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

npbaoduy 17-12-2009 11:16 AM

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.

mua_sao_bang 18-12-2009 12:07 AM

Trích:

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

em cũng nghĩ như vậy, nhưng mà bên phía VB em không biết xử lý như thế nào.bình thường em nhận dữ liệu từ VDk bằng doan code:
"
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?

npbaoduy 18-12-2009 01:44 PM

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()
Dim buffer            'kiểu varriant
Dim Arr() as byte    ' mảng động
If MSComm1.CommEvent = comEvReiceive then
    buffer=MSComm1.Input
    Arr = buffer
    If (Arr(0)="@")then
....................
End Sub

- Cách 2: để bộ đệm 1 byte bình thường, khi ngắt oncomm nếu đó là byte báo hiệu thì đặt giá trị cho một biến toàn cục nào đó, lần ngắt oncomm sau kiểm tra biến này rồi xử lý, cách này khá dở :D, nhưng trong tình huống nào đó mà cách 1 ko thể sử dụng (ví dụ như vi xử lý truyền lên nhiều thứ chứ ko phải chỉ 2byte) thì sẽ rất hữu ích.

hongson06d61132 10-09-2010 08:20 PM

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

lemtim 23-11-2010 02:15 PM

có sư huynh nào có làm giao tiếp USB cho em xin,mạch quang báo giao tiếp USB.


Múi giờ GMT. Hiện tại là 05:25 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