PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp cổng COM và LPT

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

Giao tiếp cổng COM và LPT RS232, RS485 và LPT là những giao tiếp cơ bản và kinh điển khi mới học về vi điều khiển...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 23-04-2012, 06:24 PM   #1
mrsin
Đệ tử 2 túi
 
Tham gia ngày: Mar 2012
Bài gửi: 34
:
Post Hướng dẫn giúp em

Chào tất cả anh em trong diễn đàn

Em đang có 1 vấn đề cần mọi người giúp đỡ: >.<

+ Làm sao nhận được 16 ký tự số từ VB xuống (note:lưu 16 ký tự số đó vào eeprom của con pic16f877a được ko)
+ Em muốn hiển thị 16 số đó lên led 7 đoạn >>sử dụng IC74HC595(---> đọc giá trị từ eeprom và hiển thị lên led 7 đoạn)
>< còn code VB6.0 em đã làm chạy ok nếu cần em sẽ post lên sau
>< Em đang bị bí cái vấn đề vừa nêu trên mong mọi người giúp em
Dưới đây là code PIC em đã viết rồi nhưng chưa chạy anh chị kiểm tra giúp em nha...
xin cám ơn.


#include <16F877A.h>
#include <def_877a.h>
#include <DS1307.C>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
//#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bi ts=9) //Baud_min=4800 Baud_max=115200
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=9)
#define SCL RD5
#define DATA RD6
#define SCK RD7
//#byte TRISD =0x88
void quet(unsigned char x);
void layma();
//void luudata(char a);
void chot();


unsigned int Mrs232[]={};//mang nhan gia tri tu rs232
int8 Y;
unsigned int Z[]={};//mang chua cac gia tri led7
//unsigned int count;
unsigned char ma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};//ma led 7
char traloi;

#INT_RDA
Receive_isr()
{
traloi=getch();
Mrs232[Y]=traloi;
WRITE_EEPROM(Y,Mrs232[Y]);
Y++;
}
void quet(unsigned char x)
{
int i,temp1;
for(i=0;i<8;i++)
{
temp1=x;//gan bien
temp1=temp1&0x80;//lay ra bit dau tien (bit 7)
if(temp1==0x80)//so sanh bit
DATA=1; //bang 1 thi xuat vao chip =1
else
DATA=0; //nguoc lai bang 0
x*=2; //dich bit lay bit trong so thap
SCK=0; //tao xung tren chan 11
SCK=1; //1 xung dua vào 1 bít
}
}
void chot()
{
SCL=0; //xuat du lieu ra output
SCL=1;
}
void main()
{
int i,j;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
trisd=0x00;
trisc=0x40;
while(true)
{
for(i=0;i<16;i++)
{
Mrs232[i] = READ_EEPROM(i);
j=Mrs232[i]-48;
Z[i]=ma[j];
quet(ma[j]);
chot();
delay_ms(500);
}
}

}
mrsin vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-04-2012, 05:57 PM   #2
mrsin
Đệ tử 2 túi
 
Tham gia ngày: Mar 2012
Bài gửi: 34
:
Angry

các anh chị pro ơi giúp em với em đang cần lắm làm ơn giúp em với
mrsin vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-04-2012, 09:32 PM   #3
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi mrsin View Post
các anh chị pro ơi giúp em với em đang cần lắm làm ơn giúp em với
xem qua code của em anh có vài góp ý như sau:
1:bên truyền lên truyền thêm " kí tự" kết thúc một chuỗi truyền.
Trích:
traloi=getch();
Mrs232[Y]=traloi;
WRITE_EEPROM(Y,Mrs232[Y]);//hàm này mất 5ms
Y++;
2:em viết như này thì dữ liệu có nhận được cũng không đầy đủ.
(khắc phục mất dữ liệu làm như sau:dữ liệu nhận được ghi vào mảng Mrs232 chỉ khi nào nhận được "kí tự kết thúc chuỗi" mới lấy mảngMrs232 ghi vào EEPROM.
3hần khai báo mảng lên cho nó con số rõ ràng.
vd:unsigned int Mrs232[16]={};
4:tách từng phần một mà kiểm tra rồi hãy gộp code lại thì sẽ dễ ràng hơn.
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-04-2012, 12:01 AM   #4
mrsin
Đệ tử 2 túi
 
Tham gia ngày: Mar 2012
Bài gửi: 34
:
Trích:
Nguyên văn bởi tdm View Post
xem qua code của em anh có vài góp ý như sau:
1:bên truyền lên truyền thêm " kí tự" kết thúc một chuỗi truyền.

2:em viết như này thì dữ liệu có nhận được cũng không đầy đủ.
(khắc phục mất dữ liệu làm như sau:dữ liệu nhận được ghi vào mảng Mrs232 chỉ khi nào nhận được "kí tự kết thúc chuỗi" mới lấy mảngMrs232 ghi vào EEPROM.
3hần khai báo mảng lên cho nó con số rõ ràng.
vd:unsigned int Mrs232[16]={};
4:tách từng phần một mà kiểm tra rồi hãy gộp code lại thì sẽ dễ ràng hơn.
Vậy anh xem em viết như thế này được không nha>.<


#INT_RDA
Receive_isr()
{
traloi=getch();
for(Y=0;Y<16;Y++)
{
Mrs232[Y]=traloi;
WRITE_EEPROM(Y,Mrs232[Y]);
delay_ms(5);
if (Y==15) goto thoat;
}
thoat:
;
}

Nếu ok anh xem giúp em cái phần main--> em thấy nó không ỗn nhưng không biết phải chỉnh như thế nào mong anh giúp đỡ

thay đổi nội dung bởi: mrsin, 25-04-2012 lúc 12:03 AM. Lý do: bổ xung ý
mrsin vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-04-2012, 12:36 AM   #5
mrsin
Đệ tử 2 túi
 
Tham gia ngày: Mar 2012
Bài gửi: 34
:
Cho dễ hình dung em xin post code VB+ mô phỏng = protues 7.7

anh tdm nói: "WRITE_EEPROM(Y,Mrs232[Y]);//hàm này mất 5ms">>> nhưng trong VB em có dùng timer delay nên trong code Pic có cần sửa lại không nếu có sửa thì e sửa như trên được chưa anh
File Kèm Theo
File Type: rar VB_Mophong.rar (23.0 KB, 25 lần tải)
mrsin vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-04-2012, 10:45 AM   #6
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi mrsin View Post
Vậy anh xem em viết như thế này được không nha>.<


#INT_RDA
Receive_isr()
{
traloi=getch();
for(Y=0;Y<16;Y++)
{
Mrs232[Y]=traloi;
WRITE_EEPROM(Y,Mrs232[Y]);
delay_ms(5);
if (Y==15) goto thoat;
}
thoat:
;
}

Nếu ok anh xem giúp em cái phần main--> em thấy nó không ỗn nhưng không biết phải chỉnh như thế nào mong anh giúp đỡ
em hiểu sai ý anh rồi.
code tham khảo :
Code:
#include <16F877A.h>
//#include <def_877a.h>
//#include <DEFS_16F877A.h>
//#include <DS1307.C>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
//#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bi ts=9) //Baud_min=4800 Baud_max=115200
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
//#define SCL RD5
//#define DATA RD6
//#define SCK RD7
int8 Mrs232[20];//mang nhan gia tri tu rs232
int8 y=0;
unsigned int Zz[20];//mang chua cac gia tri led7
//unsigned int count;
unsigned char ma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//ma led 7
int traloi;

#INT_RDA
Receive_isr()
{
traloi=getc();
Mrs232[y]=traloi;
y++;
if(y>=16)//nhận hết dữ liệu mới ghi vào EEPROM
{
 for(y=0;y<16;y++)
  {
  WRITE_EEPROM(y,Mrs232[y]);
  }
   for(y=0;y<16;y++)
   {
   putc((read_EEPROM (y)));//doc du lieu kiem tra
   }
   y=0;//cái này quan trọng để lấy dữ liệu lần sau
   printf("\n\r");//:xuong dau dong
   
}
  else
  {
  }
  
}
void main()
{
int i,j;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(true)
{
}
}
File Kèm Theo
File Type: rar COM_AO.rar (14.0 KB, 14 lần tải)
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-04-2012, 01:06 PM   #7
mrsin
Đệ tử 2 túi
 
Tham gia ngày: Mar 2012
Bài gửi: 34
:
for(y=0;y<16;y++)
{
putc((read_EEPROM (y)));//doc du lieu kiem tra
}

Đoạn code này em không hiểu cho lắm >>> tác dụng và mục đích của nó em thấy nó không rõ cho lắm, theo em nghĩ nếu bỏ đoạn code này thì vẫn ok
mrsin 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:10 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