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 23-12-2009, 12:44 AM   #1
thuong008
Nhập môn đệ tử
 
thuong008's Avatar
 
Tham gia ngày: Apr 2009
Bài gửi: 6
:
Question viet C voi DS12c887 (coi loi gium em)

em làm cái đồng hồ dung 16f877a + ds12c887+ LCD
viết bằng CCS nhưng tới phần ghi và đọc 1 giá trị vào thanh ghi thì gặp 1 lỗi không hiểu được. Đó là chỉ đọc đúng giá trị của thanh ghi vào lần lặp đầu tiên, những lần tiếp theo thì sai. Các bác coi gium em lỗi ở đâu với.
Đây là code em tự mò viết:

Code:
#include <16F877a.h>
#include <DEFS_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=20000000)
#define use_portb_lcd TRUE
#include <lcd.c>
#define DS  RE2
#define R_W RE1
#define AS RE0
#define RTC PORTD
int DCD,DCV,DLV,DCS,x,high,medum,low,digit;
//ham doc rtc
void docrtc(void) 
{
 set_tris_E(0);
 DS =1;
 R_W=1;
 AS =1;
 RTC=DCD;
 delay_ms(1);
 AS =0;
 DS =0;
 set_tris_D(0xff); 
 delay_ms(1);

}
 //Ham ghi vao rtc
void vietrtc(void)
{
 set_tris_E(0);
 AS = 1;
 DS = 1;
 R_W= 1;
 RTC= DCV;
 delay_ms(1);
 AS = 0;
 delay_ms(1);
 RTC= DLV;
 R_W= 0;
 delay_ms(1);
 AS = 1;
 delay_ms(1);
}
void main(void)
{
   delay_ms(100);          // tao tre 100ms cho LCD khoi dong
    set_tris_D(0);
    set_tris_E(0);
    DCV = 0;         //xoa dia chi ghi
    DLV = 0;         //xoa du lieu ghi
    delay_ms(1);
    DCV = 0x15;   //  dia chi thanh ghi 0x15
    DLV = 0x54;   // gia tri cap nhat
 while(1)
 {   
    DCS = 0;  //xoa dia chi luu
    DCD = 0; // xoa dia chi doc
    vietrtc();
    delay_ms(1);
    DCD = 0x15;   // doc gia tri thanh ghi 0x15
    docrtc();
    DCS = RTC;
    x = DCS;
    delay_ms(1);
    AS = 1;        
    lcd_init();
    lcd_gotoxy(7,1);        // vi tri (x,y)=(7,1)= hang 1, cot 7
    lcd_putc(x);
    delay_ms(1000);
 }  
 }
Một chương trình đơn giản ghi và đọc thanh ghi vậy mà giá trị đọc được chỉ đúng ở lần đầu những lần lặp sau giá trị đọc được thay đổi.

thay đổi nội dung bởi: namqn, 23-12-2009 lúc 07:57 AM. Lý do: định dạng code
thuong008 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-12-2009, 06:25 PM   #2
thuong008
Nhập môn đệ tử
 
thuong008's Avatar
 
Tham gia ngày: Apr 2009
Bài gửi: 6
:
bác namqn ghé qua mà sửa mỗi cái định dạng code sao không cho em chút lời khuyên với. Em bế tắc chỗ này quá!!!
thuong008 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-02-2010, 10:31 AM   #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 thuong008 View Post
em làm cái đồng hồ dung 16f877a + ds12c887+ LCD
viết bằng CCS nhưng tới phần ghi và đọc 1 giá trị vào thanh ghi thì gặp 1 lỗi không hiểu được. Đó là chỉ đọc đúng giá trị của thanh ghi vào lần lặp đầu tiên, những lần tiếp theo thì sai. Các bác coi gium em lỗi ở đâu với.
Đây là code em tự mò viết:

Code:
#include <16F877a.h>
#include <DEFS_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=20000000)
#define use_portb_lcd TRUE
#include <lcd.c>
#define DS  RE2
#define R_W RE1
#define AS RE0
#define RTC PORTD
int DCD,DCV,DLV,DCS,x,high,medum,low,digit;
//ham doc rtc
void docrtc(void) 
{
 set_tris_E(0);
 DS =1;
 R_W=1;
 AS =1;
 RTC=DCD;
 delay_ms(1);
 AS =0;
 DS =0;
 set_tris_D(0xff); 
 delay_ms(1);

}
 //Ham ghi vao rtc
void vietrtc(void)
{
 set_tris_E(0);
 AS = 1;
 DS = 1;
 R_W= 1;
 RTC= DCV;
 delay_ms(1);
 AS = 0;
 delay_ms(1);
 RTC= DLV;
 R_W= 0;
 delay_ms(1);
 AS = 1;
 delay_ms(1);
}
void main(void)
{
   delay_ms(100);          // tao tre 100ms cho LCD khoi dong
    set_tris_D(0);
    set_tris_E(0);
    DCV = 0;         //xoa dia chi ghi
    DLV = 0;         //xoa du lieu ghi
    delay_ms(1);
    DCV = 0x15;   //  dia chi thanh ghi 0x15
    DLV = 0x54;   // gia tri cap nhat
 while(1)
 {   
    DCS = 0;  //xoa dia chi luu
    DCD = 0; // xoa dia chi doc
    vietrtc();
    delay_ms(1);
    DCD = 0x15;   // doc gia tri thanh ghi 0x15
    docrtc();
    DCS = RTC;
    x = DCS;
    delay_ms(1);
    AS = 1;        
    lcd_init();
    lcd_gotoxy(7,1);        // vi tri (x,y)=(7,1)= hang 1, cot 7
    lcd_putc(x);
    delay_ms(1000);
 }  
 }
Một chương trình đơn giản ghi và đọc thanh ghi vậy mà giá trị đọc được chỉ đúng ở lần đầu những lần lặp sau giá trị đọc được thay đổi.
bạn đã thiết lập cho ds12c887 chưa(thanh ghi A,B)
đây là đoạn code đề đọcthanh ghi giâycode đã thử trên mạch thật)
#include <16F877A.h>
#include <def_877a.h>
#include <DEFS_16F877A.h>
#device *=16 //su dung het ram trong pic
# fuses NOWDT, XT, NOPROTECT, NOLVP, PUT
# use delay (clock = 4000000)
int DATA_W,ADDRESS_W,DATA_R ,ADDRESS_R ;
#define CS RC5
#define AS RC4
#define RW RC3
#define DS RC1
#define RE_SET RC0
#define DATAPORT PORTB
#define LEDPORT PORTD
void read_12C887(void);//khai bao chuong trinh con
void write_12C887(void);//khai bao chuong trinh con
void main()
{
TRISB=0;
TRISC=0x04;
TRISD=0;
TRISE=0;
ADCON1=0x06;
RE_SET=1;
CS =1;
delay_ms(1000);
DATA_W= 0x2F;//b'00101111'
//dua gia tri vao thanh ghi "register A"
//BIT 5=1 THOI GIAN THUC BIT 0...3=1 TAO F=2HZ TAI CHAN SQW
ADDRESS_W=10;//THANH GHI A
write_12C887();
DATA_W= 0x5E;//'01011110' ; dua gia tri vao thanh ghi "register B"
//BIT 3=1 CHO PHEP TAO SONG VUONG TAI CHAN SQW
// BIT 1=1 dang du lieu 24 gio
//BIT 2=1 dang du lieu Binary
ADDRESS_W=11;//THANH GHI B
write_12C887();
//DOC TRANG THAI CUA DS12C887 XEM DA SAN SANG DOC DU LIEU HAY CHUA
LAP:;
ADDRESS_R=10;//THANH GHI A
read_12C887();
while(DATA_R,7==1)//
{
ADDRESS_R=10;//THANH GHI A
read_12C887();
}
//DATA_R,7=0 DA CHO PHEP DOC DU LIEU
ADDRESS_R=00;//D/C THANH GHI giay
read_12C887();
LEDPORT=DATA_R;
GOTO LAP;
}//DAU KET THUC CHUONG TRINH CHINH

//**********write_12C887***************
//**********write_12C887***************
void write_12C887(void)
{
TRISB=0;
DATAPORT=ADDRESS_W;
AS=0;
DS=1;
RW=1;
#ASM;
nop;
#ENDASM;
AS=1;
CS=0;
#ASM;
nop;
#ENDASM;
AS=0;
#ASM;
nop;
#ENDASM;
DATAPORT=DATA_W;
RW=0;
#ASM;
nop;
#ENDASM;
AS=1;
RW=1;
CS=1;
}
void read_12C887(void)
{
TRISB=0;

DATAPORT=ADDRESS_R;
DS=1;
RW=1;
#ASM;
nop;
#ENDASM;
AS=1;
CS=0;
#ASM;
nop;
#ENDASM;
AS=0;
#ASM;
nop;
#ENDASM;
DS=0;
#ASM;
nop;
#ENDASM;
TRISB=0xFF;
DATA_R=DATAPORT;
AS=1;
CS=1;
}
__________________
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 10-05-2010, 12:14 AM   #4
s8dtvt
Nhập môn đệ tử
 
Tham gia ngày: Mar 2009
Bài gửi: 2
:
Em đã làm theo code của bác "tdm", Tuy nhiên khi chạy mô phỏng Trên proteus, với hàm hiển thị LCD như sau:
void hienthi(int so){
LCD_SetPosition(LINE_1);
printf(lcd_putchar,"second = %u",so);
}

hoặc thậm chí chỉ dùng hàm delay_ms(1) thì vẫn bị lỗi như "thuong008": Tức là chỉ hiện đúng giá trị đọc đầu tiên, sau đó em không thấy vi điều khiển truy cập vào Đồng hồ nữa, các giá trị trên các chân nối VDK với Đồng hồ vẫn không thay đổi. Song khi bỏ phần hiển thị trên LCD, rồi chạy mô phỏng nó lại tiếp tục truy cập đồng hồ như bình thường. Vậy lỗi là do chương trình mô phỏng hay do trễ khi sử dụng thêm các hàm khác thì chương trình chạy sai?
Mong các bro chỉ giáo giùm.

thay đổi nội dung bởi: s8dtvt, 10-05-2010 lúc 12:31 AM. Lý do: update
s8dtvt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-08-2010, 06:25 PM   #5
vmtruong
Nhập môn đệ tử
 
Tham gia ngày: Mar 2010
Bài gửi: 4
:
co so do nguyen ly ko cho minh voi
vmtruong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-11-2010, 09:15 PM   #6
badboy0001
Nhập môn đệ tử
 
Tham gia ngày: Apr 2010
Bài gửi: 5
:
Trích:
Nguyên văn bởi s8dtvt View Post
Em đã làm theo code của bác "tdm", Tuy nhiên khi chạy mô phỏng Trên proteus, với hàm hiển thị LCD như sau:
void hienthi(int so){
LCD_SetPosition(LINE_1);
printf(lcd_putchar,"second = %u",so);
}

hoặc thậm chí chỉ dùng hàm delay_ms(1) thì vẫn bị lỗi như "thuong008": Tức là chỉ hiện đúng giá trị đọc đầu tiên, sau đó em không thấy vi điều khiển truy cập vào Đồng hồ nữa, các giá trị trên các chân nối VDK với Đồng hồ vẫn không thay đổi. Song khi bỏ phần hiển thị trên LCD, rồi chạy mô phỏng nó lại tiếp tục truy cập đồng hồ như bình thường. Vậy lỗi là do chương trình mô phỏng hay do trễ khi sử dụng thêm các hàm khác thì chương trình chạy sai?
Mong các bro chỉ giáo giùm.
bác này có chém không đây ! em cài bản proteus 7.2 sp6 kiếm hoa 2 con mắt làm gì có con DS12c887 đâu ! hay bác cao thủ tự tạo hả ?
nếu mà bác tự tạo gủi cho em phát với.
còn cái chuyện của bạn thuong000 thì chắc tuần tới em giải quyết cho .
badboy0001 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-11-2010, 04:15 PM   #7
chairman_t
Đệ tử 2 túi
 
Tham gia ngày: Aug 2009
Bài gửi: 36
:
proteus 7.5 trở lên mới có con ds12c bạn à, cũng có 7.7 rồi bạn
chairman_t vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-11-2010, 04:21 PM   #8
chairman_t
Đệ tử 2 túi
 
Tham gia ngày: Aug 2009
Bài gửi: 36
:
nhờ các bác cao thủ nào rành chỉ giúp : tại sao khi quét trên led 7 đoạn , mình đã kiểm tra bit uip(bit 7) mà sao nó chẳng chịu update. Mỗi lần bấm lại start thì cập nhật lại số khác thì đúng???????????????????
chairman_t vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-12-2010, 10:50 PM   #9
badboy0001
Nhập môn đệ tử
 
Tham gia ngày: Apr 2010
Bài gửi: 5
:
Đây là mạch và code tôi đã làm xong ( chỉ mô phỏng thôi )
song tôi đang bị vấn đề khi nạp code vào vi điều khiển PIC
vấn đề như sau :
Khi nạp chương trình thì vẫn chạy tốt ( tức là programming completed )
thuy nhiên khi tôi bật nguồn cho chạy đễ test các chân đầu ra thì không thấy tín hiệu ra như trong code test của tôi . không biết chíp có hỏng không nữa.
Rất mong các bác ai có thiện chị chỉ giáo tôi với
Lâu nay quen AVR rồi chuyển sang con PIC theo ý thấy và bây giờ gặp khó khăn quá. Mong mọi người giúp đỡ !
File Kèm Theo
File Type: rar Realtime.rar (33.3 KB, 238 lần tải)
File Type: rar DS12C887.rar (24.3 KB, 200 lần tải)
badboy0001 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-12-2010, 10:55 PM   #10
badboy0001
Nhập môn đệ tử
 
Tham gia ngày: Apr 2010
Bài gửi: 5
:
có ai từng làm PIC chỉ giáo em với . Không hiểu sao vẫn nạp vào chíp bình thương nhưng không thấy các chân thay đổi tín hiệu như mình cài đặt. Đo thấy toàn mức điện áp 3.2 - 4.5 V mặc dù Output_high(); hay Output_low() cũng không thấy thay đôi gì
badboy0001 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-12-2010, 05:15 PM   #11
nguyen nam hung
Đệ tử 2 túi
 
Tham gia ngày: Jun 2008
Bài gửi: 26
:
Talking

Trích:
Nguyên văn bởi badboy0001 View Post
có ai từng làm pic chỉ giáo em với . Không hiểu sao vẫn nạp vào chíp bình thương nhưng không thấy các chân thay đổi tín hiệu như mình cài đặt. đo thấy toàn mức điện áp 3.2 - 4.5 v mặc dù output_high(); hay output_low() cũng không thấy thay đôi gì
con pic bạn dùng chết chân đó rồi. Bị hoài. Không biết là do chất lượng hay bị gì đó làm nó chết.
Mua một con mới về thử rồi sẽ thấy.
nguyen nam hung vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-12-2010, 05:44 PM   #12
badboy0001
Nhập môn đệ tử
 
Tham gia ngày: Apr 2010
Bài gửi: 5
:
Trích:
Nguyên văn bởi nguyen nam hung View Post
con pic bạn dùng chết chân đó rồi. Bị hoài. Không biết là do chất lượng hay bị gì đó làm nó chết.
Mua một con mới về thử rồi sẽ thấy.
tôi nghĩ là nó không thể chết toàn bộ chận đc ? vì tôi viết code để test thì tôi output_low toàn bộ chân nhưng mà đo đông hồ thấy điện áp ra là 3.2 - >2.89 v nên khó hiểu
có khi nào do thạch anh không nhỉ
tôi lập trình với code thạch anh là 8Mhz nhưng do mạch thực tế tôi không biết thạch anh là bao nhiêu ? không biết có phải do lỗi đấy k nhỉ ?
badboy0001 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:25 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