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 04-04-2009, 11:53 AM   #1
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
xử lí da ta từ pc truyền xuống

mình đang làm giao tiếp pc <--> pic dùng vb6
đoạn code sau đơn giản chỉ khi nào nhận được data thì đảo trang thái portB.
việc nhận có xảy ra , nhưng nó lai ko thoát ngắt được (cứ đảo portB). mong mọi người giúp
///////////////////////////////////////////////////////////////
#include <16F877.h>
#device *= 16 ADC = 10 // su dung ADC 10 bit , ADC tu 0-1024
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=4000000,RESTART_WDT)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)//,stream=PC,errors)
#use fast_io(b)
#byte portb = 0x06
// có xảy ra ngắt nhưng cứ đảo port B//
int16 val_adc;
#INT_rda
void ngat_rs232()
{
portb = ~ portb; /// neu xay ra ngat rs_232 thi dao portb

}
//////////////////////////////////
void main()
{
set_tris_a ( 1 ) ;
set_tris_b ( 0x00 ) ;
portb = 255;
enable_interrupts ( INT_rda ) ; // data nhan tu rs 232 da san sang
enable_interrupts ( GLOBAL ) ; // cho phep ngat toan cuc
////// cho phep bien doi ad chan RA0 ///////////////
setup_adc(adc_clock_internal);
setup_adc_ports(AN0);
set_adc_channel(0);
delay_ms(10);

while(1)
{

Delay_ms(500);
val_adc = read_adc();
val_adc = (val_adc >> 2) ;
/// putc('a');// kenh 0
putc(val_adc);

}
}

thay đổi nội dung bởi: phandinh, 04-04-2009 lúc 12:39 PM.
phandinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-04-2009, 09:54 AM   #2
hanhluckyly
Đệ tử 4 túi
 
hanhluckyly's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 83
:
Chắc là do trong chương trình VB bạn truyền liên tục xuống
hanhluckyly vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-04-2009, 11:45 AM   #3
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
như vậy co nghĩa là trên Vb mình truyền xuống bao nhiêu kí tự thì PIC sẽ ngắt bấy nhiêu lần hả bạn ?.cho mình hỏi thêm nữa đó là ở VB mình có Bufer, mình có thể thiết lập nó nhận bao nhiêu byte thì ngắt. Vậy ở PIC, bộ đệm nhận tối đa là bao nhiêu byte thì xảy ra ngắt ?. hay là mặc định chỉ có 1 byte thôi.
phandinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-04-2009, 04:56 PM   #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
Trích:
Nguyên văn bởi phandinh View Post
như vậy co nghĩa là trên Vb mình truyền xuống bao nhiêu kí tự thì PIC sẽ ngắt bấy nhiêu lần hả bạn ?.cho mình hỏi thêm nữa đó là ở VB mình có Bufer, mình có thể thiết lập nó nhận bao nhiêu byte thì ngắt. Vậy ở PIC, bộ đệm nhận tối đa là bao nhiêu byte thì xảy ra ngắt ?. hay là mặc định chỉ có 1 byte thôi.
Các PIC 8-bit chỉ có 1 thanh ghi đệm khi nhận dữ liệu từ module USART, tức là bộ đệm chỉ có 1 byte.

Các PIC24/dsPIC và PIC32 có bộ đệm 4 byte cho module UART.

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 05-04-2009, 05:34 PM   #5
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
đây là code VB của mình . khi nào nhấn nút thì mới gửi xuống

Private Sub Command1_Click()
Dim data_send As Variant
If Text1.Text = "" Then
Exit Sub
End If
data_send = Text1.Text
MSComm1.Output = " @ " & Chr(2) & Chr(8) & data_send & Chr(255)
Text1.Text = ""
End Sub

Private Sub Command2_Click()
Text2.Text = ""
End Sub

Private Sub Form_Load()
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If 'dong serial port neu no mo
' cau hinh lai cho serial port
MSComm1.CommPort = 5 ' dung port 5
MSComm1.Settings = " 9600 , n , 8 , 1" 'baud = 9600, 8 bit
MSComm1.InputLen = 0 ' doc buffer
MSComm1.RThreshold = 1 ' neu nhan 1 ki tu don se phat sinh su kien commevents
MSComm1.PortOpen = True
End Sub
Private Sub MSComm1_OnComm()

If (MSComm1.CommEvent = comEvReceive) Then
Text2.Text = Text2.Text + MSComm1.Input
End If


End Sub
phandinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-04-2009, 06:41 PM   #6
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
Talking em làm được rồi .thanks mọi người nhiều

Đúng là bị chỗ ngắt như bác namqn nói
bài này em chỉ test truyền nhận qua mô phỏng thôi. chưa xử lí dữ liệu.
có 1 chú ý nhỏ : nếu trên VB gửi 2 kí tự thì portB đảo trạng thái 2 lần quá nhanh khiến ta không thấy sự thay đổi portB. Em dùng biến COUNT để đém số lần ngắt này.
/////////////////////////////////////////////////////////////////////////////
#include <16F877.h>
#device *= 16 ADC = 10 // su dung ADC 10 bit , ADC tu 0-1024
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=4000000,RESTART_WDT)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)//,stream=PC,errors)
#use fast_io(b)
#byte portb = 0x06
#byte portd = 0x08
////////////////////////
int16 val_adc;
int nhan_val;
int count ; // biến đếm số lần ngắt xảy ra
#INT_rda
void ngat_rs232()
{
portb = ~ portb; /// neu xay ra ngat rs_232 thi dao portb
nhan_val = getc();
count++;
}
//////////////////////////////////////////////////
void main()
{
set_tris_a ( 0xff ) ;
set_tris_b ( 0x00 ) ;
set_tris_d (0);
enable_interrupts ( INT_rda ) ; // data nhan tu rs 232 da san sang
enable_interrupts ( GLOBAL ) ; // cho phep ngat toan cuc
////// cho phep bien doi ad chan RA2 //////////////
setup_adc(adc_clock_internal);
setup_adc_ports(all_analog);
set_adc_channel(2);
delay_ms(10);
portb = 0;
portd = 0;
///////////////////////////////////////////////////
while(1)
{
Delay_ms(500);
val_adc = read_adc();
val_adc = (val_adc >> 2) ;
putc(val_adc);
putc(nhan_val);
portd = count; // số lần ngắt
}
}
////////////////////////////////////////////////////////////////////////////
đây là code VB
////////////////////////////////////////////////////////////////////////////
Private Sub Command1_Click()
Dim data_send As Variant
If Text1.Text = "" Then
Exit Sub
End If
data_send = Text1.Text
MSComm1.Output = data_send
Text1.Text = ""
End Sub

Private Sub Command2_Click()
Text2.Text = ""
End Sub

Private Sub Form_Load()
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If 'dong serial port neu no mo
' cau hinh lai cho serial port
MSComm1.CommPort = 5 ' dung port 5
MSComm1.Settings = " 9600 , n , 8 , 1" 'baud = 9600, 8 bit
MSComm1.InputLen = 0 ' doc buffer
MSComm1.RThreshold = 1 ' neu nhan 1 ki tu don se phat sinh su kien commevents
MSComm1.PortOpen = True
End Sub
Private Sub MSComm1_OnComm()

If (MSComm1.CommEvent = comEvReceive) Then
Text2.Text = Text2.Text + MSComm1.Input
End If


End Sub
phandinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-04-2009, 11:16 PM   #7
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
từ mô phỏng đến mạch thật sao khó quá, em bí gần tuần nay, mong các anh giúp

bài này hôm trước đã mô phỏng được nhưng làm mạch thực thì chỉ đuọc 1 chiều từ PIC ==> PC còn chiều ngược lại không đươc.
Mình làm theo các bước sau:
1.test truyền nhận VB 2 cách
c1: nối chân 2 & 3 lại với nhau -->truyền nhận OK
c2 : làm mạch thực max 232 ( chưa nối đến PIC) , nối 2 chân 7 & 8 của max 232 --> truyền nhận OK.
===> kết luận : truyền nhận VB ok.
đây là code VB cho 2 cách trên :
////////////////////////////////////////////////////////////////////////////
Private Sub Command1_Click()
Dim data_send As Variant
If Text1.Text = "" Then
Exit Sub
End If
data_send = Text1.Text
MSComm1.Output = data_send
Text1.Text = ""
End Sub

Private Sub Command2_Click()
Text2.Text = ""
End Sub

Private Sub Form_Load()
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If 'dong serial port neu no mo
' cau hinh lai cho serial port
MSComm1.CommPort = 5 ' dung port 5
MSComm1.Settings = " 9600 , n , 8 , 1" 'baud = 9600, 8 bit
MSComm1.InputLen = 0 ' doc buffer
MSComm1.RThreshold = 1 ' neu nhan 1 ki tu don se phat sinh su kien commevents
MSComm1.PortOpen = True
End Sub
Private Sub MSComm1_OnComm()

If (MSComm1.CommEvent = comEvReceive) Then
Text2.Text = Text2.Text + MSComm1.Input
End If
End Sub
2. test truyền nhận VB <==> PIC có các bước sau :
b1 : mô phỏng proteus( dùng Virtual Verminal để giả lập cổng com)
kết quả : truyền nhận VB <==> PIC ok.
b2: mạch thực
kết quả : .từ PIC lên VB thì được ,nhưng từ VB truyền xuống ko dc
.xảy ra ngắt liên tục, biến count (biến đếm số lần ngắt xảy ra) cứ tăng lên dù VB chưa truyền xuống.
code VB như trên
đây là code CCS:
#include <16F877.h>
#device *= 16 ADC = 10 // su dung ADC 10 bit , ADC tu 0-1024

#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=4000000,RESTART_WDT)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)//,stream=PC,errors)
#use fast_io(b)
#byte portb = 0x06
#byte portd = 0x08
////////////////////////
int16 val_adc;
int nhan_val;
int count ; // biến đếm số lần ngắt xảy ra
#INT_rda
void ngat_rs232()
{
portb = ~ portb; /// neu xay ra ngat rs_232 thi dao portb
nhan_val = getc();
count++;
}
//////////////////////////////////////////////////
void main()
{
set_tris_a ( 0xff ) ;
set_tris_b ( 0x00 ) ;
set_tris_d (0);
enable_interrupts ( INT_rda ) ; // data nhan tu rs 232 da san sang
enable_interrupts ( GLOBAL ) ; // cho phep ngat toan cuc
////// cho phep bien doi ad chan RA2 //////////////
setup_adc(adc_clock_internal);
setup_adc_ports(all_analog);
set_adc_channel(2);
delay_ms(10);
portb = 0;
portd = 0;
///////////////////////////////////////////////////
while(1)
{
Delay_ms(500);
val_adc = read_adc();
val_adc = (val_adc >> 2) ;
putc(val_adc);
putc(nhan_val);
portd = count; // số lần ngắt
}
}
Nhận xét : .code VB ok , phần cứng OK , đã mô phỏng được , nhưng mạch thực bị như trên
Mình đã bí chỗ này gần tuần nay, vì vậy không thể thực hiện các bước tiếp theo
Rất mong mọi người nghiên cứu dùm rồi chỉ hướng xử lí cho mình
Thanks a lot
phandinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-04-2009, 05:40 PM   #8
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 phandinh View Post
mình đang làm giao tiếp pc <--> pic dùng vb6
đoạn code sau đơn giản chỉ khi nào nhận được data thì đảo trang thái portB.
việc nhận có xảy ra , nhưng nó lai ko thoát ngắt được (cứ đảo portB). mong mọi người giúp
///////////////////////////////////////////////////////////////
...
#INT_rda
void ngat_rs232()
{
portb = ~ portb; /// neu xay ra ngat rs_232 thi dao portb

}
...
Tôi cho là vấn đề nằm ở phần code xử lý ngắt của bạn. Về nguyên tắc, trong code xử lý ngắt nhận của module USART, bạn phải đọc thanh ghi đệm RCREG để xóa cờ ngắt RCIF (đây là cách duy nhất để xóa cờ này). Code của bạn chưa thực hiện việc đọc dữ liệu từ thanh ghi RCREG, do đó cờ ngắt RCIF không được xóa sau khi bạn thoát khỏi chương trình xử lý ngắt, dẫn đến ngắt xuất hiện một cách liên tụ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 05-04-2009, 05:50 PM   #9
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
có 1 điều kì lạ nữa đó là mình ko dùng ngắt để nhận , mà dùng hàm getc(),
như ví dụ sau mình sẽ gửi kí tự ' C ' lên PC , rồi gửi data nhận được, quá trình lặp lại.
Nhưng có 1 điều lạ là PIC chỉ gửi 1 kí tự ' C ' duy nhất.
Mình ko biết khi sử dụng lệnh getc() thì có khai báo gì đặc biệt không ?
//////////////////////////////////////////////////////////////////////////////////////
Code:
#include <16F877.h> 
#device *= 16  ADC = 10    // su dung ADC 10 bit ,  ADC  tu 0-1024
#FUSES  NOWDT,  HS,  NOPUT,  NOPROTECT,  NODEBUG,  NOBROWNOUT,NOLVP, NOCPD, NOWRT 
#use delay(clock=4000000,RESTART_WDT)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)//,stream=PC,errors)
#use fast_io(b)
#byte portb = 0x06

void main() 
{ set_tris_b(0);
   
while(1) 
      {    
          delay_ms(100);
          putc('c');
          putc(getc());
   
     }
}

thay đổi nội dung bởi: namqn, 05-04-2009 lúc 06:03 PM.
phandinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-04-2009, 06:06 PM   #10
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 phandinh View Post
có 1 điều kì lạ nữa đó là mình ko dùng ngắt để nhận , mà dùng hàm getc(),
như ví dụ sau mình sẽ gửi kí tự ' C ' lên PC , rồi gửi data nhận được, quá trình lặp lại.
Nhưng có 1 điều lạ là PIC chỉ gửi 1 kí tự ' C ' duy nhất.
Mình ko biết khi sử dụng lệnh getc() thì có khai báo gì đặc biệt không ?
//////////////////////////////////////////////////////////////////////////////////////
Code:
#include <16F877.h> 
#device *= 16  ADC = 10    // su dung ADC 10 bit ,  ADC  tu 0-1024
#FUSES  NOWDT,  HS,  NOPUT,  NOPROTECT,  NODEBUG,  NOBROWNOUT,NOLVP, NOCPD, NOWRT 
#use delay(clock=4000000,RESTART_WDT)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)//,stream=PC,errors)
#use fast_io(b)
#byte portb = 0x06

void main() 
{ set_tris_b(0);
   
while(1) 
      {    
          delay_ms(100);
          putc('c');
          putc(getc());
   
     }
}
Tôi cho là bạn chưa hiểu rõ về hàm getc(). Khi bạn gọi hàm getc(), chương trình của bạn sẽ dừng ở điểm đó cho đến khi PIC nhận được một ký tự.

Như vậy, với đoạn code trên, PIC sẽ xuất ký tự 'c', rồi chờ đến khi nhận được một ký tự (qua ngõ vào của hàm getc()), sau đó mới xuất ký tự vừa nhận được đó, và quay trở lại đầu vòng lặp vô tận.

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
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:40 PM.


Đượ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