PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp cổng COM và LPT (http://www.picvietnam.com/forum/forumdisplay.php?f=44)
-   -   PC kết nối RS232 với 16F877A, truyền giá trị cho 595 rất mong các bạn thảo luận và gi (http://www.picvietnam.com/forum/showthread.php?t=11202)

sges 16-09-2011 09:26 PM

PC kết nối RS232 với 16F877A, truyền giá trị cho 595 rất mong các bạn thảo luận và gi
 
- Mình có một bảng điều khiển như sau viết bằng VB.
http://lab3i.com/Qupload/img/lab3i.com-2_1.png
Tất cả có 8 con LED 3 màu <=> 24 trạng thái. Ở mỗi vị trí 1 LED có 3 check. Nếu check màu xanh nhấn thì có màu xanh, vàng nhấn có màu vàng, đỏ nhấn thì LED có màu đỏ. Sau khi đã thiết lập xong thì nhấn nút CONECT giá trị cần truyền được lấy từ trạng thái các check được đưa xuống 16F877A.
- Sơ đồ mô phỏng được vẽ trên ISIS
http://lab3i.com/Qupload/img/lab3i.c...3i.com-1-1.png
24 trạng thái được thể hiện bằng 24 con LED, cứ 3 LED liền nhau thể hiện cho một LED 3 màu. Vì số lượng LED sau này điều khiển có thể lớn hơn nên mình sử dụng 74HC595 để đưa giá trị nhận được từ Rs232 nối tiếp xuất ra các LED.
- Đây là lệnh trên VB6
Code:

Private Sub Cmd_CONECT_Click()
If MSComm2.PortOpen = False Then
MSComm2.PortOpen = True
End If
MSComm2.Output = Chr(FF)
End Sub
Private Sub Form_Load()
With MSComm2
    .CommPort = 2                    'cong COM 2
    .Settings = "9600,N,8,1"          'Baudrate=9600,Ko KT chan le,frame 8 bit,1 bit stop
    .InBufferSize = 1024              'Bo dem 1024 byte thi day
    .InputLen = 0                    'Doc toan bo gia tri bo dem
    .RThreshold = 1                  'Cho phep ngat khi su kien Receiver o MSCOMM
    .SThreshold = 0                  'Ko cho phep ngat khi su kien Send o MMSCOMM
    .OutBufferSize = 512
    .InputMode = comInputModeText
    .PortOpen = True                  'Mo cong COM
End With
End Sub

- Còn đây là lệnh CCS cho PIC
Code:

#include <16f877a.h>
#include <def_877a.h>
#device 16f877a*16ADC=10
#fuses nowdt,nolvp,noprotect,xt,put
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#define Clk ra0
#define Data ra1
#define Rck ra2
#define sclk ra3
//================Cac bien ============================================//
int i;
char a[3];
//================= Cac ham con===========================================//
void dich_595(char num);
void ngat_rda();
//-------------------------------------------------------------------------
void main(void)

  enable_interrupts(global);
  enable_interrupts(int_RDA);
  set_tris_d(0x00); //portd is output
  set_tris_a(0x00);
  portd=0x00;
  porta=0x00;
  while(true)
  {         
  }
}
void dich_595(char num)
{
int j;
int8 value;
value = (int8)num;
for(j = 0;j<8;j++)
{
if(value&0x80)//truyen bit co trong so cao truoc
Data = 1;
else
Data = 0;
Clk = 1; //xung nhip
Clk =0;
value =value<<1; //dich tra 1 bit
}
}
#int_RDA
void ngat_rda()

  a[0]=getc();
  a[1]=0xAA;
  a[2]= 0xFF;
  sclk=0;
  sclk=1;
  for(i=0;i<3;i++)
      {
      dich_595(a[i]);
      }
  Rck = 1; //chot du lieu
  Rck = 0; 
}

Ban đầu mình chỉ TEST bằng cách nhấn nút CONECT để truyền thẳng giá trị xuống cho a[0], còn a[1] và a[2] nhập giá trị trực tiếp, chưa liên quan gì đến các check của VB6 cả nhưng nhận không tài nào đúng giá trị.
Rất mong các bạn có kinh nghiệm và đã làm nhiều về RS232 cho mình ý kiến về cách tổ chức biến của VB6 và CCS sao cho hợp lý. Xin cảm ơn các bạn.

bien_van_khat 17-09-2011 09:47 AM

MSComm2.Output = Chr(FF)

hexa literal trong VB phải có &H

MSComm2.Output = chr(&hFF)

sges 18-09-2011 05:08 PM

http://lab3i.com/Qupload/img/lab3i.com-2_2.png
Nếu mình dùng lệnh MSComm2.Output = chr(&hFF) thì chỉ có 4 con LED ở cuối sáng như hình vẽ. a[1], a[2] vẫn hiển thị đúng giá trị. Ngoài ra khi dùng với các giá trị khác không phải &HFF thì kết quả chỉ thu được 2 trường hợp là không LED nào sáng hoặc 4 LED cuối sáng. Bạn nào có thể giúp mình giải thích rõ chỗ này không?


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