PDA

View Full Version : Hướng dẫn giúp em


mrsin
23-04-2012, 06:24 PM
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
24-04-2012, 05:57 PM
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

tdm
24-04-2012, 09:32 PM
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.

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.
3:phầ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.

mrsin
25-04-2012, 12:01 AM
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.
3:phầ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 đỡ

mrsin
25-04-2012, 12:36 AM
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

tdm
25-04-2012, 10:45 AM
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 :

#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,bi ts=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,0x9 0};//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)
{
}
}

mrsin
25-04-2012, 01:06 PM
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

tdm
25-04-2012, 01:15 PM
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
đoạn code đó chỉ để kiểm tra xem dữ liệu nhận về có đúng hay k? mọi thứ OK thì bỏ nó đi.

mrsin
25-04-2012, 01:44 PM
đoạn code đó chỉ để kiểm tra xem dữ liệu nhận về có đúng hay k? mọi thứ OK thì bỏ nó đi.

vâng, em đã sử dụng cổng com ảo mô phỏng giữa VB và protues thì ok, khi ấn nút sent trong VB >>> thì đã sent ok 16 ký tự và bên code Pic cũng đã nhận thành công 16 ký tự

Và bây giờ làm sao đưa 16 ký tự đó ra IC giải mã 74HC595 vậy anh :(

tdm
25-04-2012, 02:15 PM
vâng, em đã sử dụng cổng com ảo mô phỏng giữa VB và protues thì ok, khi ấn nút sent trong VB >>> thì đã sent ok 16 ký tự và bên code Pic cũng đã nhận thành công 16 ký tự

Và bây giờ làm sao đưa 16 ký tự đó ra IC giải mã 74HC595 vậy anh :(
vậy là phần truyền đã OK.
PHẦN HIỂN THỊ:
hãy viết một ct khác để test thử phần giao tiếp 74HC595 với 16 led 7 đoạn xem OK hay chưa ? rồi anh hướng dẫn tiếp.

mrsin
25-04-2012, 04:04 PM
vậy là phần truyền đã OK.
PHẦN HIỂN THỊ:
hãy viết một ct khác để test thử phần giao tiếp 74HC595 với 16 led 7 đoạn xem OK hay chưa ? rồi anh hướng dẫn tiếp.

Vâng, cám ơn anh tdm nhiều, bây giờ em viết tiếp phần code hiển thị lên led 7 đoạn

mrsin
26-04-2012, 10:11 AM
vậy là phần truyền đã OK.
PHẦN HIỂN THỊ:
hãy viết một ct khác để test thử phần giao tiếp 74HC595 với 16 led 7 đoạn xem OK hay chưa ? rồi anh hướng dẫn tiếp.

Chết rồi anh tdm ơi em bị rối tung rối mù lên rồi tự nhiên lai không biết bắt đầu như thế nào, anh hướng dẫn một chút giúp em được không :(

tdm
26-04-2012, 11:18 AM
Chết rồi anh tdm ơi em bị rối tung rối mù lên rồi tự nhiên lai không biết bắt đầu như thế nào, anh hướng dẫn một chút giúp em được không :(

unsigned int Zz[16]={0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5};//
int8 bien;
for(bien=0;bien<16;bien++)
{
quet(ma[bien]);
}
chot();code trên xuất 16 byte ra 595 để kiểm tra phần cứng xem đúng hay chưa.
nếu phần cứng chưa đúng thì sửa lại.
à mà phần code trên do em viết hay là em tham khảo trên mạng.

mrsin
26-04-2012, 01:50 PM
unsigned int Zz[16]={0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5};//
int8 bien;
for(bien=0;bien<16;bien++)
{
quet(ma[bien]);
}
chot();code trên xuất 16 byte ra 595 để kiểm tra phần cứng xem đúng hay chưa.
nếu phần cứng chưa đúng thì sửa lại.
à mà phần code trên do em viết hay là em tham khảo trên mạng.



Vâng để em theo ý anh viết thử, Phần code trên em viết 1 phần còn phần IC74HC595 là anh hướng dẫn em hbữa đó

mrsin
26-04-2012, 02:44 PM
Em dùng mạch Max232 này không biết có đúng không anh tdm
http://i1057.photobucket.com/albums/t393/nguyenminh180/Untitled-1.png

mrsin
27-04-2012, 09:22 AM
Anh tdm ơi, khi dữ liệu được truyền từ vb xuống & lưu vao eeprom của PIC--> khi đó trong phần main mình chỉ cần read_eeprom ra thôi và xuất ra led 7 đoạn đúng không. Nếu vậy thì em viết như thế này có gì sai không sao nó không chịu chạy vậy anh.

unsigned int Zz[16]={0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5};//
void main()
{
int8 i,mode;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(true)
{
for(i=0;i<16;i++)
{
Mrs232[i] = READ_EEPROM(i);
mode=Mrs232[i]-48;
Zz[i]=ma[mode];
quet(ma[mode]);
chot();
}
}
}

tdm
28-04-2012, 10:16 PM
Anh tdm ơi, khi dữ liệu được truyền từ vb xuống & lưu vao eeprom của PIC--> khi đó trong phần main mình chỉ cần read_eeprom ra thôi và xuất ra led 7 đoạn đúng không. Nếu vậy thì em viết như thế này có gì sai không sao nó không chịu chạy vậy anh.

unsigned int Zz[16]={0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5};//
void main()
{
int8 i,mode;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(true)
{
for(i=0;i<16;i++)
{
Mrs232[i] = READ_EEPROM(i);
mode=Mrs232[i]-48;
Zz[i]=ma[mode];
quet(ma[mode]);
chot();
}
}
}
code em viết thiếu lệnh này:
set_tris_d(0x00)//

mrsin
29-04-2012, 12:53 AM
code em viết thiếu lệnh này:
set_tris_d(0x00)//

Em có thêm vào rồi nhưng cũng ko chạy, hay là dữ liệu lưu trực tiếp vào eeprom của con pic ko được hay là phải mua 1 con rom khác gắn thêm vô mạch vậy anh

tdm
30-04-2012, 01:40 PM
Em có thêm vào rồi nhưng cũng ko chạy, hay là dữ liệu lưu trực tiếp vào eeprom của con pic ko được hay là phải mua 1 con rom khác gắn thêm vô mạch vậy anh
sao em biết nó không chạy?
led 7 đoạn hiển thị cái gì (chụp hình đưa lên đây).
eeprom của pic vẫn dùng bình thường.