PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và 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

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 26-05-2008, 08:22 PM   #1
RaulBlanco
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 6
:
Giao Tiếp Máy Tính Với PIC6F877A

Chào các huynh.Đệ hiện đang làm Đồ án và có phần giao tiếp máy tính,dùng PIC6F877A.Đệ dùng chương trình VB gửi kí tự xuống cho VĐKPIC và cho xuất giá trị nhận được ra portd (portd Đệ nối với các LED đơn).Nhưng Đệ gửi các ký tự chữ xuống thì kết quả xuất như nhau,ký tự số thì kết quả như nhau.
-Khi Đệ gửi các kí hiệu chữ như a,b,m,h.... thì các chân D7(MSB),D6,D5,D4,D3 ở mức cao ,các chân còn lại ở mức thấp và giá trị trả về trên VB là ÿ
-Khi Đệ gửi các kí hiệu số 1,2,3,4.... thì chân D7 sáng,các chân còn lại ở mức thấp và giá trị trả về trên VB là þ
Như Đệ biết thì VB gửi xuống là gửi mã ASCII.Vậy thì mình gửi các ký tự khác nhau thì kết quả xuất LED phải khác nhau.Nếu Đệ gửi giá trị cần yêu cầu xuống,ví dụ Đệ gửi từ VB xuống giá trị 300 thì làm sao đểPIC cũng nhận được giá trị là 300 vậy các huynh?Đệ thực sự bị vướng ở chỗ này.Đệ up đoạn code chương trình VB và code CCS nhờ các huynh xem giúp và hướng giùm Đệ hướng giải quyết để Đệ có thể hoàn thành Đồ Án thật tốt.Đệ cám ơn các huynh nhiều.
Code CCS C:
Code:
#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=4800, xmit=PIN_C6, rcv=PIN_C7)
#include <def_877a.h>
unsigned char data;
#INT_RDA
void data_receive(void)
{
delay_us(10);
data = getc();
}
void main()
{
set_tris_d(0);
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_RDA);
while(true)
{
portd=data;
putc(data);
}
}
(Đệ ko bik cách chèn code như mấy huynh làm trong diễn đàn nên cứ up lên,mong MOD thông cảm)
File Kèm Theo
File Type: rar detai.rar (6.1 KB, 136 lần tải)

thay đổi nội dung bởi: namqn, 26-05-2008 lúc 10:25 PM.
RaulBlanco vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-05-2008, 10:39 PM   #2
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
Bạn chưa cho biết code trong VB ra sao, làm sao khẳng định là nó gửi theo kiểu ASCII hay kiểu khác.

Để định dạng code, bạn chọn đoạn code cần định dạng rồi nhấn nút thứ ba bên phải sang, ở hàng thứ hai trên thanh công cụ (có hình giống như ký tự #). Bạn cũng có thể cần phải chuyển sang khung lớn khi soạn thảo để có thể thấy thanh công cụ.

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 26-05-2008, 11:42 PM   #3
RaulBlanco
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 6
:
Anh Nam ơi,em chuyển sang khung lớn nhưng vẫn không thấy thanh công cụ đâu,còn lúc bài mới thì có thấy.
EM cám ơn anh góp ý nhưng code VB em có đưa kèm theo trong file rar đó anh.Để em đưa lên đây lun mấy anh coi cho tiện

Code:
Private Sub cmdExit_Click()
MSComm1.PortOpen = False
End
End Sub
Private Sub cmdSend_Click()
Dim out As String
out = txtTransmit.Text
MSComm1.Output = out
End Sub

Private Sub Form_Load()
MSComm1.CommPort = 3
MSComm1.Settings = "4800,n,8,1"
MSComm1.PortOpen = True

MSComm1.RThreshold = 1
End Sub

Private Sub MSComm1_OnComm()
If (MSComm1.CommEvent = comEvReceive) Then
txtReceive.Text = txtReceive.Text + MSComm1.Input
End If
End Sub
Mà anh nam ơi,đoạn Code CCS C em sửa lại như sau
Code:
#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=4800, xmit=PIN_C6, rcv=PIN_C7)
#include <def_877a.h>
#INT_RDA
void data_receive(void)
{
portd=getc();
}
void main()
{
set_tris_d(0);
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_RDA);
while(true)
{
putc(portd);
delay_ms(2000);
}
}
em gửi nhạn giá trị qua thẳng portd lun,ko wa biến data nữa thì thấy có khả wan hơn.em gửi xuống chữ a(mã ASCII 61H) thì kết quả theo led là 60H và nhận về "`",b(62H) kết quả vẫn là 60H và vẫn nhân về "`" nhưng chữ c(63H) thì kết quả led xuất đúng và nhận đúng chữ c,chữ d vẫn đúng.em thử gửi tiếp số thì số 1,2 kết quả xuất led và nhận sai.em nghi ngờ 2 chân D1 và Do nên lấy đồng hồ ra đo thì mức Vôn chỉ được 2 V,chính vì thế nên kết quả sai.Anh góp ý giùm đệ với được không?

thay đổi nội dung bởi: namqn, 27-05-2008 lúc 12:45 AM.
RaulBlanco vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-05-2008, 12:57 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
Bạn thử như sau xem sao:
Code:
#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=4800, xmit=PIN_C6, rcv=PIN_C7)
#include <def_877a.h>

unsigned char data;

#INT_RDA
void data_receive(void)
{
	data = getc();
}
void main()
{
	set_tris_d(0);
	ENABLE_INTERRUPTS(GLOBAL);
	ENABLE_INTERRUPTS(INT_RDA);
	while(true)
	{
		output_d(data);
		putc(data);
		delay_ms(2000);
	}
}
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 27-05-2008, 06:54 PM   #5
cuong86vt
Đệ tử 1 túi
 
Tham gia ngày: Jul 2007
Bài gửi: 22
:
Bạn còn một thiếu sót:
Ở đây khi bạn truyền 1 ký tự từ VB xuống VDK thì dữ liệu mà bạn truyền đi sẽ được đổi thành mã ASCII, tương tự như vậy từ VDK lên VB thì cũng được đổi thành mã ASCII luôn, nếu bạn dùng:
txtReceive.Text = txtReceive.Text + MSComm1.Input
thì chưa thể nhận về đúng kí tự mà bạn đã truyền đi, mà bạn phải đổi dữ liệu ASCII nhận về trong MSComm1.Input trở lại thành kí tự string thường bằng lệnh: Asc(MSComm1.Input)
cuong86vt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-05-2008, 07:01 PM   #6
cuong86vt
Đệ tử 1 túi
 
Tham gia ngày: Jul 2007
Bài gửi: 22
:
Bạn thử đổi Code VB của bạn một chút xem sao:
Dim dulieu as String
Private Sub MSComm1_OnComm()
If (MSComm1.CommEvent = comEvReceive) Then
dulieu = Asc(MSComm1.Input)
txtReceive.Text = txtReceive.Text + dulieu
End If
End Sub

hoac la:

Private Sub MSComm1_OnComm()
If (MSComm1.CommEvent = comEvReceive) Then
txtReceive.Text = txtReceive.Text + Asc(MSComm1.Input)
End If
End Sub
cuong86vt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-05-2008, 09:43 PM   #7
RaulBlanco
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 6
:
Em cám ơn các anh đã cho em ý kiến,em cũng thử như các anh hướng dẫn rồi nhưng không được.Cuối cùng em thử chương trình Terminal do anh bên dientuvietnam nói thì việc gửi nhận đã chính xác.Như vậy là chương trình VB của em có vấn đề thật,mà em cũng ko bik phải sửa sao đây.Anh Cuong86vt ơi,em thử làm như anh chỉ thì các giá trị em nhận được chỉ là các con số,ví dụ như chữ a thì nhận được là 0248,chữ b là 128.Nhờ anh giải thích giùm em với,em hiểu ý anh nói là việc chuyển đổi mã ASCII nhưng giá trị sao lại ra thế này.Nhờ các anh góp ý giúp em chỉnh sửa lại code VB để gửi nhạn chính xác như Terminal vì em sợ dùng chương trình này mà không có code đi kèm thì Thầy em không chấp nhận,với lại em cũng muốn hiểu nguyên do
RaulBlanco vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-05-2008, 12:48 AM   #8
scentoflove
Đệ tử 6 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 129
:
Nếu bạn gửi 1 ký tự xuống thi
dim out as char
mscomm1.output=chr(out)

và khi nhận thì chuyển ngược lại
in= asc(mscomm1.input)

Chương trình trên PIC chỉ cần thì bạn nên để putc ngay sau dòng getc đừng để trong while(1) vì như vậy sau 2s sẽ xuất data mặc dù bạn chưa send gì xuống cho pic.
scentoflove vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-05-2008, 01:03 AM   #9
RaulBlanco
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 6
:
Em thử gửi kí tự là để tét thử xem mạch Vb của em gửi nhận có được không.Còn cái chính của em là em muốn gửi một giá trị số xuống như 300,500,1000...(tốc độ động cơ yêu cầu) để từ đó hiệu chỉnh và xuất ra duty cho chính xác.Mong anh cho em vài ý
RaulBlanco vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-05-2008, 01:23 AM   #10
scentoflove
Đệ tử 6 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 129
:
Khi bạn xuất được 1 ký tự bạn có thề xuất được 1 chuỗi. Có 2 cách để thực hiện:
_ Xuất 1 chuỗi giá trị mscomm1.output="300" như vậy bạn phải lập trình pic để nhận được chuỗi này và chuyển lại thành số.
_ Chuyển giá trị cần gửi từ decimal sang hex như 300d = 0x12C như vậy bạn sẽ send lần lượt 2 byte 0x01 và 0x2C sau đó trên pic bạn nhận 2 giá trị này và kết hợp lại thành 300d.
Tùy theo độ phức tạp của thông tin gửi đi má bạn chon cách gửi nào ít byte truyền nhất để tiết kiệm thời gian.
scentoflove vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-02-2009, 12:54 PM   #11
xuanhiendk2
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 52
:
Các bạn cho mình hỏi trong CCS muốn viết tiếng Việt thì viết như thế nào? Và nó sẽ được mã hóa sang mã ASCII ra sao?
xuanhiendk2 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-03-2009, 11:45 AM   #12
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
Trích:
Nguyên văn bởi xuanhiendk2 View Post
Các bạn cho mình hỏi trong CCS muốn viết tiếng Việt thì viết như thế nào? Và nó sẽ được mã hóa sang mã ASCII ra sao?
Hình như mã ASCII để mã hóa kí tự tiếng Anh mà bạn
phandinh 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à 06:23 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