View Full Version : viet C voi DS12c887 (coi loi gium em)
thuong008
23-12-2009, 12:44 AM
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:
#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.
thuong008
23-12-2009, 06:25 PM
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á!!!
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:
#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ây:(code đã 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;
}
s8dtvt
10-05-2010, 12:14 AM
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.
vmtruong
05-08-2010, 06:25 PM
co so do nguyen ly ko cho minh voi
badboy0001
18-11-2010, 09:15 PM
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 .
chairman_t
19-11-2010, 04:15 PM
proteus 7.5 trở lên mới có con ds12c bạn à, cũng có 7.7 rồi bạn
chairman_t
19-11-2010, 04:21 PM
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???????????????????
badboy0001
05-12-2010, 10:50 PM
Đâ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 đỡ !
badboy0001
05-12-2010, 10:55 PM
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ì
nguyen nam hung
07-12-2010, 05:15 PM
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.
badboy0001
07-12-2010, 05:44 PM
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ỉ ?
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.