PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 15-10-2011, 03:31 PM   #1
ncthien09
Nhập môn đệ tử
 
Tham gia ngày: Feb 2011
Bài gửi: 5
:
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 !

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.
Hình Kèm Theo
File Type: jpg Picture019.jpg (71.1 KB, 3 lần tải)
File Kèm Theo
File Type: rar QUANG BAO SPI PHAN CUNG 18F4431.rar (21.6 KB, 29 lần tải)
ncthien09 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2011, 08:25 PM   #2
rocket42
Đệ tử 4 túi
 
rocket42's Avatar
 
Tham gia ngày: Jun 2010
Nơi Cư Ngụ: Tọa Thiên
Bài gửi: 72
:
Send a message via Yahoo to rocket42
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
rocket42 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2011, 10:08 PM   #3
ncthien09
Nhập môn đệ tử
 
Tham gia ngày: Feb 2011
Bài gửi: 5
:
Trích:
Nguyên văn bởi rocket42 View Post
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é !
File Kèm Theo
File Type: rar def_4431.rar (1.9 KB, 31 lần tải)
ncthien09 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2011, 08:50 PM   #4
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi ncthien09 View Post
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Ả.
}
     }
__________________
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 15-10-2011, 10:09 PM   #5
ncthien09
Nhập môn đệ tử
 
Tham gia ngày: Feb 2011
Bài gửi: 5
:
Trích:
Nguyên văn bởi tdm View Post
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 ạ !
ncthien09 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2011, 11:42 PM   #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 ncthien09 View Post
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?.
}
}
Hình Kèm Theo
File Type: jpg hien_thi.jpg (193.3 KB, 4 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 15-10-2011, 11:41 PM   #7
rocket42
Đệ tử 4 túi
 
rocket42's Avatar
 
Tham gia ngày: Jun 2010
Nơi Cư Ngụ: Tọa Thiên
Bài gửi: 72
:
Send a message via Yahoo to rocket42
Arrow

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!!!
File Kèm Theo
File Type: rar OK.rar (2.4 KB, 13 lần tải)
rocket42 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2011, 11:51 PM   #8
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi rocket42 View Post
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.
__________________
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 16-10-2011, 12:09 AM   #9
ncthien09
Nhập môn đệ tử
 
Tham gia ngày: Feb 2011
Bài gửi: 5
:
Trích:
Nguyên văn bởi tdm View Post
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 !
ncthien09 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-10-2011, 12:07 AM   #10
ncthien09
Nhập môn đệ tử
 
Tham gia ngày: Feb 2011
Bài gửi: 5
:
Trích:
Nguyên văn bởi rocket42 View Post
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-10-2011, 12:29 AM   #11
rocket42
Đệ tử 4 túi
 
rocket42's Avatar
 
Tham gia ngày: Jun 2010
Nơi Cư Ngụ: Tọa Thiên
Bài gửi: 72
:
Send a message via Yahoo to rocket42
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 đó
rocket42 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à 04:01 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