View Single Post
Old 18-04-2007, 07:43 PM   #12
Nguoi hieu hoc
Nhập môn đệ tử
 
Tham gia ngày: Aug 2006
Bài gửi: 4
:
Thắc mắc

Anh Bắc cho em hỏi tí:
Sao em viết chương trình giao tiếp cổng Com giữa Pic 16f877A với máy tính bằng chương trình Matlab của anh đó.
Chương trình trên Pic như sau:
Code:
Code:
#include <16F877a.h>
#include <stdlib.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#use delay(clock=20000000)
#use rs232(BAUD=9600,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
#use fast_io(B)
#byte PORTA=0x05
#byte PORTB=0x06
#byte PORTC=0x07
#byte PORTD=0x08
int m,d,a,i;
char h;
void main()
{
      a=0;
      i=0;
       h=getc();
      if (h='3')
      {
         for (d=1;d<3;d++)
         {
            for (i=48;i<56;i++)
            {
               putc(i);
// ở đây nếu em có delay_ms(100) thì kết quả cũng như ở phía dưới 
             }
         }
      }
      if (h>null)
      {
         putc('r');
      }
}
Khi em đánh vào chỗ text phần Transmit đó anh , em không thấy tín hiệu trả về ở phần text của receive?

Nếu em tự viết bằng các dòng lệnh trên Command Window đó anh:
Code:
Code:
 s = serial('COM1','BaudRate',9600);
>> fopen(s)
>> fprintf(s,'3')
>> fscanf(s)
Warning: A timeout occurred before the Terminator was reached.

ans =

012345670123456
nó hiện ra thông báo như thế đó anh ? em không hiểu timeout ở đây có ảnh hưởng gì không nữa?
Theo như em hiểu thì timeout là khoảng thời gian tối đa cho việc đọc và ghi dữ liệu qua cổng Com phải ko anh? Mặc định của nó là 10s
10 s này là cho việc truyền mỗi ký tự hay sao vậy anh ? em đã thử khai báo thay đổi timeout như sau
Code:
Code:
>> s.timeout=0.1  % tức là 100 ms

hay cho nó lớn hơn 
>> s.timeout=50 % tức là 50s

nhưng sao nó vẫn hiện thông báo :Warning: A timeout occurred before the Terminator was reached
anh chỉ dùm em với.

À ở đây em muốn hỏi thêm về anh là em định dùng chương trình này để mở rộng cho điều khiển động cơ bằng PID. Em sẽ dùng Matlab nhập 3 thông số xuống , sau đó em đọc tín hiệu hồi tiếp từ encoder vể qua Com và vẽ lên đồ thị. Như vậy thì em phải có 1 biến thời gian phải không anh?
Giả sử em cho cứ sau 100 ms ( có lớn quá không anh?) PIC xuất tín hiệu số encoder đọc được qua cổng Com , rồi em theo đoạn code của anh thêm vào:
Code:
Code:
function BytesAvailable_Callback(obj,event)
    global hand;
    ind = fscanf(obj);  
    % Edit code here - Ngo Hai Bac    
    set(handles.edit_RX,'String',ind);  
     set(handles.dulieu,'string','co du lieu');  
    % em viết thêm:
                              y =str2double(ind);
                              axes(handles.dothi);
                              x = 0:.1:100;
                              plot(x,y,'k','LineWidth',2);grid
em lấy biến y là tín hiệu đọc từ cổng Com ( đổi ind từ string ra double)
rồi em vẽ đồ thị trên GUI.Nhưng mà em nghĩ biến x ở đây phải là 1 biến theo thời gian thực phải không anh? Vậy em làm sao khai báo biến x theo thời gian thực vậy anh?

Ạnh chỉ em với (^_^)
Nguoi hieu hoc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn