PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   Các a xem dùm e đoạn code ccs này bị lỗi gì với, em muốn điên rồi ! (http://www.picvietnam.com/forum/showthread.php?t=11455)

ncthien09 15-10-2011 03:31 PM

Các a xem dùm e đoạn code ccs này bị lỗi gì với, em muốn điên rồi !
 
2 Attachment(s)
E ĐANG LÀM ĐỀ TÀI QUANG BÁO, THỬ VIẾT HÀM GỬI DỮ LIỆU CHO 74595, HÀM THÌ CHẠY TỐT RỒI, NHƯNG EM LỒNG VÔ HÀM FOR THÌ NÓ CỨ BỊ LỖI, KHÔNG HIỆN GÌ LÊN LED MA TRẬN HẾT. EM DÙNG 74138 QUÉT HÀNG. 74595 3 CON NỐI TIẾP ĐƯA DỮ LIỆU RA CỘT. CODE E BỊ LỖI PHẦN 74138 MÔ PHỎNG KHÔNG CÓ TÍN HIỆU GÌ HẾT, CHỖ LỆNH PORTC=J+8 ẤY. CÁC A GIÚP DÙM E PHÁT VỚI, MẤY NGÀY NAY MÒ HOÀI MÀ KHÔNG BIẾT BỊ GÌ, MUỐN ĐIÊN RỒI. HIC. EM CHÂN THÀNH CẢM ƠN RẤT NHIỀU !

ĐÂY LÀ CODE CỦA E, E CÓ GỬI LUÔN FILE MÔ PHỎNG PROTUES CHO CÁC A XEM GIÚP.

#include<18f4431.h>
#include<def_4431.h>
#fuses hs,nowdt,nolvp
#use delay(clock=12M)


#define DATA RB1
#define CLOCK RB2
#define LATCH RB4
int8 send,i,j;


void send_595(int8 send){ // HÀM GỬI DỮ LIỆU RA 74595

for(i=0;i<=7;i++)
{
if(bit_test(send,7))
DATA=1;
else
DATA=0;
CLOCK=0; // TAO XUNG CLOCK DICH DATA VAO 74595
CLOCK=1;
send=send<<1;
}
LATCH=0; // CHOT DU LIEU RA 74595
LATCH=1;
}
void main(void) {
TRISB=0x00;
TRISC=0x00;
CLOCK = 1;
LATCH = 1;
WHILE(1){
for (j=0;j<=7;j++)
{
if (j&1) {
send_595(0x55);
send_595(0x55);
send_595(0x55);
}
else{
send_595(0xAA);
send_595(0xAA);
send_595(0xAA);}
}
PORTC=j+8; // BỊ LỖI CHỖ NÀY, ĐÁNG LẼ PHẢI ĐƯA DỮ LIỆU RA PORT C MÀ NÓ KHÔNG ĐƯA GÌ RA CẢ.
}
}
MỤC ĐÍCH EM MUỐN NÓ HIỆN NHƯ HÌNH BÊN DƯỚI, NHƯNG KHÔNG DÙNG HÀM FOR THÌ LÀM ĐƯỢC, CÒN LỒNG VÔ LÀM FOR THÌ NÓ KHÔNG ĐƯA DỮ LIỆU RA 74138.

rocket42 15-10-2011 08:25 PM

bạn gửi lại kèm theo cả file def_4431.h nhé. Ai lại bắt mọi người viết lại cái file này nữa.
Tốt nhất là bạn gửi là file ccs bạn viết ấy

tdm 15-10-2011 08:50 PM

Trích:

Nguyên văn bởi ncthien09 (Post 50652)
E ĐANG LÀM ĐỀ TÀI QUANG BÁO, THỬ VIẾT HÀM GỬI DỮ LIỆU CHO 74595, HÀM THÌ CHẠY TỐT RỒI, NHƯNG EM LỒNG VÔ HÀM FOR THÌ NÓ CỨ BỊ LỖI, KHÔNG HIỆN GÌ LÊN LED MA TRẬN HẾT. EM DÙNG 74138 QUÉT HÀNG. 74595 3 CON NỐI TIẾP ĐƯA DỮ LIỆU RA CỘT. CODE E BỊ LỖI PHẦN 74138 MÔ PHỎNG KHÔNG CÓ TÍN HIỆU GÌ HẾT, CHỖ LỆNH PORTC=J+8 ẤY. CÁC A GIÚP DÙM E PHÁT VỚI, MẤY NGÀY NAY MÒ HOÀI MÀ KHÔNG BIẾT BỊ GÌ, MUỐN ĐIÊN RỒI. HIC. EM CHÂN THÀNH CẢM ƠN RẤT NHIỀU !

ĐÂY LÀ CODE CỦA E, E CÓ GỬI LUÔN FILE MÔ PHỎNG PROTUES CHO CÁC A XEM GIÚP.

#include<18f4431.h>
#include<def_4431.h>
#fuses hs,nowdt,nolvp
#use delay(clock=12M)


#define DATA RB1
#define CLOCK RB2
#define LATCH RB4
int8 send,i,j;


void send_595(int8 send){ // HÀM GỬI DỮ LIỆU RA 74595

for(i=0;i<=7;i++)
{
if(bit_test(send,7))
DATA=1;
else
DATA=0;
CLOCK=0; // TAO XUNG CLOCK DICH DATA VAO 74595
CLOCK=1;
send=send<<1;
}
LATCH=0; // CHOT DU LIEU RA 74595
LATCH=1;
}
void main(void) {
TRISB=0x00;
TRISC=0x00;
CLOCK = 1;
LATCH = 1;
WHILE(1){
for (j=0;j<=7;j++)
{
if (j&1) {
send_595(0x55);
send_595(0x55);
send_595(0x55);
}
else{
send_595(0xAA);
send_595(0xAA);
send_595(0xAA);}
}
PORTC=j+8; // BỊ LỖI CHỖ NÀY, ĐÁNG LẼ PHẢI ĐƯA DỮ LIỆU RA PORT C MÀ NÓ KHÔNG ĐƯA GÌ RA CẢ.
}
}
MỤC ĐÍCH EM MUỐN NÓ HIỆN NHƯ HÌNH BÊN DƯỚI, NHƯNG KHÔNG DÙNG HÀM FOR THÌ LÀM ĐƯỢC, CÒN LỒNG VÔ LÀM FOR THÌ NÓ KHÔNG ĐƯA DỮ LIỆU RA 74138.

PORTC=j+8; bạn đặt nó ngoài vào lặp For thì làm sao mà đúng được.
Code:

#include<18f4431.h>
#include<def_4431.h>
#fuses hs,nowdt,nolvp
#use delay(clock=12M)


#define DATA  RB1
#define CLOCK  RB2
#define LATCH  RB4
int8 send,i,j;


void send_595(int8 send){      // HÀM GỬI DỮ LIỆU RA 74595

for(i=0;i<=7;i++)
{
if(bit_test(send,7))
DATA=1;
else
DATA=0;
CLOCK=0;      // TAO XUNG CLOCK DICH DATA VAO 74595
CLOCK=1;
send=send<<1;
}
LATCH=0;      // CHOT DU LIEU RA 74595
LATCH=1;
}
void main(void) {
TRISB=0x00;
TRISC=0x00;
CLOCK = 1;
LATCH = 1;
WHILE(1){
    for (j=0;j<=7;j++)
{
    if (j&1) {
    send_595(0x55);
    send_595(0x55);
    send_595(0x55);   
    }
    else{
    send_595(0xAA);
    send_595(0xAA);
    send_595(0xAA);}
PORTC=j+8;
}
      // BỊ LỖI CHỖ NÀY, ĐÁNG LẼ PHẢI ĐƯA DỮ LIỆU RA PORT C MÀ NÓ KHÔNG ĐƯA GÌ RA CẢ.
}
    }


ncthien09 15-10-2011 10:08 PM

1 Attachment(s)
Trích:

Nguyên văn bởi rocket42 (Post 50659)
bạn gửi lại kèm theo cả file def_4431.h nhé. Ai lại bắt mọi người viết lại cái file này nữa.
Tốt nhất là bạn gửi là file ccs bạn viết ấy

thanks bạn đã quan tâm ! mình gửi file luôn đây bạn xem lại dùm mình nhé !

ncthien09 15-10-2011 10:09 PM

Trích:

Nguyên văn bởi tdm (Post 50661)
PORTC=j+8; bạn đặt nó ngoài vào lặp For thì làm sao mà đúng được.
Code:

#include<18f4431.h>
#include<def_4431.h>
#fuses hs,nowdt,nolvp
#use delay(clock=12M)


#define DATA  RB1
#define CLOCK  RB2
#define LATCH  RB4
int8 send,i,j;


void send_595(int8 send){      // HÀM GỬI DỮ LIỆU RA 74595

for(i=0;i<=7;i++)
{
if(bit_test(send,7))
DATA=1;
else
DATA=0;
CLOCK=0;      // TAO XUNG CLOCK DICH DATA VAO 74595
CLOCK=1;
send=send<<1;
}
LATCH=0;      // CHOT DU LIEU RA 74595
LATCH=1;
}
void main(void) {
TRISB=0x00;
TRISC=0x00;
CLOCK = 1;
LATCH = 1;
WHILE(1){
    for (j=0;j<=7;j++)
{
    if (j&1) {
    send_595(0x55);
    send_595(0x55);
    send_595(0x55);   
    }
    else{
    send_595(0xAA);
    send_595(0xAA);
    send_595(0xAA);}
PORTC=j+8;
}
      // BỊ LỖI CHỖ NÀY, ĐÁNG LẼ PHẢI ĐƯA DỮ LIỆU RA PORT C MÀ NÓ KHÔNG ĐƯA GÌ RA CẢ.
}
    }


bạn xem lại dùm mình nhé, cho dù mình có đưa PORTC=j+8 vô vòng lặp for thì nó cũng đứng trơ trơ thôi, bực lắm rồi bạn ạ !

rocket42 15-10-2011 11:41 PM

1 Attachment(s)
OK!
bạn nhìn chương trình của bạn nhé.
Vòng lặp for (j=0;j<=7;j++) nó sẽ chạy xong mới tới lệnh PortC. Điều đó có nghĩa là nếu bạn để lệnh PORTC=j+8; ở ngoài vòng lặp for thì hiển nhiên luôn luôn PORTC=15 (vì kết thúc vòng lặp for thì j luôn bằng 7). và vì thế cho nên bạn sẽ ko thấy nó quét ở PortC nữa vì quá trình lặp lại là mãi mãi.
Chính vì thế để quét được thì bạn phải để lệnh PORTC=j+8 ở trong vòng lặp for. Nhưng thêm vào đó là đi kèm với lệnh delay. Thời gian delay là tùy ở bạn xem mạch của mình như thế nào để mắt ta có thể nhìn được ma trận led của bạn ko bị nhấp nháy. Với mô phỏng Proteus của bạn vẽ R cho là 1ms thì nhìn được. Nhưng có khi bạn làm mạch thật thì có thể lại ko được vì do linh kiện nữa. nên bạn linh động điều chỉnh sao cho hợp lí
Chương trình của bạn sửa lại như sau:
WHILE(1){
for (j=0;j<=7;j++)
{
if (j&1){
send_595(0x55);
// send_595(0x55);
// send_595(0x55);
}
else{
// send_595(0xAA);
// send_595(0xAA);
send_595(0xAA);}
PORTC=j+8;
delay_ms(1);
}
}

Thêm nữa là cùng 1 chức năng dịch dữ liệu ra led ma trận sao lại phải 3 lệnh send_595(0x55); đi kèm. Điều đó ko cần thiết và chằng logic tí nào
R gửi kèm cả file đã sửa đầy đủ. bạn download về dịch lại rồi nạp vào Proteus là OK
chúc vui!!!

tdm 15-10-2011 11:42 PM

1 Attachment(s)
Trích:

Nguyên văn bởi ncthien09 (Post 50665)
bạn xem lại dùm mình nhé, cho dù mình có đưa PORTC=j+8 vô vòng lặp for thì nó cũng đứng trơ trơ thôi, bực lắm rồi bạn ạ !

chèn thêm delay_ms(1) ; xem trong code:
Code:

#include<18f4431.h>
#include<def_4431.h>
#fuses hs,nowdt,nolvp
#use delay(clock=12M)


#define DATA RB1
#define CLOCK RB2
#define LATCH RB4
int8 send,i,j;


void send_595(int8 send){ // HÀM GU+?I DU+~ LIE^.U RA 74595

for(i=0;i<=7;i++)
{
if(bit_test(send,7))
DATA=1;
else
DATA=0;
CLOCK=0; // TAO XUNG CLOCK DICH DATA VAO 74595
CLOCK=1;
send=send<<1;
}
LATCH=0; // CHOT DU LIEU RA 74595
LATCH=1;
}
void main(void) {
TRISB=0x00;
SET_TRIS_C(0x00);
CLOCK = 1;
LATCH = 1;
WHILE(1){
for (j=0;j<=7;j++)
{
if (j&1) {
send_595(0x55);
send_595(0x55);
send_595(0x55);
}
else{
send_595(0xAA);
send_595(0xAA);
send_595(0xAA);
}
OUTPUT_C(j+8);
DELAY_MS(1);thêm vào
}
 // BI. LO^~I CHO^~ NÀY, ?ÁNG LE~ PHA?I ?U+A DU+~ LIE^.U RA PORT C MÀ NÓ KHÔNG ?U+A GÌ RA CA?.
}
}


tdm 15-10-2011 11:51 PM

Trích:

Nguyên văn bởi rocket42 (Post 50667)
OK!
bạn nhìn chương trình của bạn nhé.
Vòng lặp for (j=0;j<=7;j++) nó sẽ chạy xong mới tới lệnh PortC. Điều đó có nghĩa là nếu bạn để lệnh PORTC=j+8; ở ngoài vòng lặp for thì hiển nhiên luôn luôn PORTC=15 (vì kết thúc vòng lặp for thì j luôn bằng 7). và vì thế cho nên bạn sẽ ko thấy nó quét ở PortC nữa vì quá trình lặp lại là mãi mãi.
Chính vì thế để quét được thì bạn phải để lệnh PORTC=j+8 ở trong vòng lặp for. Nhưng thêm vào đó là đi kèm với lệnh delay. Thời gian delay là tùy ở bạn xem mạch của mình như thế nào để mắt ta có thể nhìn được ma trận led của bạn ko bị nhấp nháy. Với mô phỏng Proteus của bạn vẽ R cho là 1ms thì nhìn được. Nhưng có khi bạn làm mạch thật thì có thể lại ko được vì do linh kiện nữa. nên bạn linh động điều chỉnh sao cho hợp lí
Chương trình của bạn sửa lại như sau:
WHILE(1){
for (j=0;j<=7;j++)
{
if (j&1){
send_595(0x55);
// send_595(0x55);
// send_595(0x55);
}
else{
// send_595(0xAA);
// send_595(0xAA);
send_595(0xAA);}
PORTC=j+8;
delay_ms(1);
}
}

Thêm nữa là cùng 1 chức năng dịch dữ liệu ra led ma trận sao lại phải 3 lệnh send_595(0x55); đi kèm. Điều đó ko cần thiết và chằng logic tí nào
R gửi kèm cả file đã sửa đầy đủ. bạn download về dịch lại rồi nạp vào Proteus là OK
chúc vui!!!

matrix này quét hàng nên phải send_595() 3 lần là đúng.

ncthien09 16-10-2011 12:07 AM

Trích:

Nguyên văn bởi rocket42 (Post 50667)
OK!
bạn nhìn chương trình của bạn nhé.
Vòng lặp for (j=0;j<=7;j++) nó sẽ chạy xong mới tới lệnh PortC. Điều đó có nghĩa là nếu bạn để lệnh PORTC=j+8; ở ngoài vòng lặp for thì hiển nhiên luôn luôn PORTC=15 (vì kết thúc vòng lặp for thì j luôn bằng 7). và vì thế cho nên bạn sẽ ko thấy nó quét ở PortC nữa vì quá trình lặp lại là mãi mãi.
Chính vì thế để quét được thì bạn phải để lệnh PORTC=j+8 ở trong vòng lặp for. Nhưng thêm vào đó là đi kèm với lệnh delay. Thời gian delay là tùy ở bạn xem mạch của mình như thế nào để mắt ta có thể nhìn được ma trận led của bạn ko bị nhấp nháy. Với mô phỏng Proteus của bạn vẽ R cho là 1ms thì nhìn được. Nhưng có khi bạn làm mạch thật thì có thể lại ko được vì do linh kiện nữa. nên bạn linh động điều chỉnh sao cho hợp lí
Chương trình của bạn sửa lại như sau:
WHILE(1){
for (j=0;j<=7;j++)
{
if (j&1){
send_595(0x55);
// send_595(0x55);
// send_595(0x55);
}
else{
// send_595(0xAA);
// send_595(0xAA);
send_595(0xAA);}
PORTC=j+8;
delay_ms(1);
}
}

Thêm nữa là cùng 1 chức năng dịch dữ liệu ra led ma trận sao lại phải 3 lệnh send_595(0x55); đi kèm. Điều đó ko cần thiết và chằng logic tí nào
R gửi kèm cả file đã sửa đầy đủ. bạn download về dịch lại rồi nạp vào Proteus là OK
chúc vui!!!

trước hết mình xin cảm ơn bạn đã nhiệt tình giúp mình, thật ra vấn đề tại sao mình gửi 3 byte send_595 là vì module mình 3 led matrix mình đưa data đủ 3 byte rồi mới cho hiện thị hàng đó bằng lệnh PortC, còn bạn thì cho gửi 1 byte rồi out quét hàng luôn nên sẽ chỉ thấy 1 ma trận hiện đúng với hình ảnh của mình. thanks bạn rất nhìu!

ncthien09 16-10-2011 12:09 AM

Trích:

Nguyên văn bởi tdm (Post 50669)
matrix này quét hàng nên phải send_595() 3 lần là đúng.


thanks bạn ! bạn hiểu ý của mình, mong được bạn giúp đỡ tiếp tục nhe! hihi !

rocket42 16-10-2011 12:29 AM

hj.OK!
Nếu bạn muốn 3 ma trận của mình hiện cùng 1 hình ảnh như nhau thì ko hiển nhiên là ko cần phải 3 lệnh. Bạn thử bỏ 2 lệnh đi xem chương trình có chạy ko nhé. file mình gửi mình bỏ cả 2 lệnh đi vẫn chạy đó thôi
còn về ý tưởng 3 ma trận hiện được 3 dữ liệu khác nhau thì chương trình của bạn cần thêm 1 chân chọn chip 74HC595 nữa. Và chương trình ghi dịch bạn phải viết lại.
tóm lại sơ đồ nối của bạn và cả chương trình CCS ko đáp ứng được yêu cầu về ý tưởng đó


Múi giờ GMT. Hiện tại là 12:03 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam