PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và 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

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 13-05-2008, 05:41 PM   #1
nguyendungdt12
Đệ tử 1 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 11
:
Angry Hỏi về DS1307

Em đang làm cái bài tập lớn trongddos cần 1 phần hiển thị thời gian, em dùng CCS, có bác nào biết cách khởi tao giá trị thời gian ban đầu cho DS1307 không ạ, cho em kinh nghiệm với, em định gán nó vào biến rồi i2c_write vào mà không đc, cho ra led đồng hồ không chạy.Giúp em với nhé các bác
nguyendungdt12 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-05-2008, 05:51 PM   #2
nguyendungdt12
Đệ tử 1 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 11
:
cho em đoạn code lúc ví dụ mnhf thiết lập cho đồng hồ bây giwof là 16h ngày 13-05-08 ấy nha các bác.
Chờ hồi âm...
nguyendungdt12 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-05-2008, 03:32 PM   #3
nguyendungdt12
Đệ tử 1 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 11
:
chán quá không ai giúp em được ah, chắc tịa ulongf này nhiều chú ý quá :
nguyendungdt12 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-05-2008, 04:46 PM   #4
ltrkhanh
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 5
:
Thuật toán ghi DS1307: start i2c
ghi 0xD0
ghi địa chỉ
start
ghi 0xD0
ghi giây, phút, giờ, ngày...
stop i2c
Đấy là VDK của bạn hỗ trợ giao tiếp I2C, nếu không thì bạn phải xây dựng chương trình riêng.
Chúc thành công
ltrkhanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-05-2008, 08:21 PM   #5
HTAluvBeBeo
Đệ tử 2 túi
 
Tham gia ngày: Dec 2006
Nơi Cư Ngụ: HN
Bài gửi: 39
:
có sẵn thư viện cho CCS C cho bạn đây.
Have fun

thay đổi nội dung bởi: HTAluvBeBeo, 18-05-2008 lúc 08:04 PM.
HTAluvBeBeo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-05-2008, 10:26 PM   #6
nguyendungdt12
Đệ tử 1 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 11
:
bạn ơi nhầm link rồi
nguyendungdt12 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-05-2008, 10:35 PM   #7
nguyendungdt12
Đệ tử 1 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 11
:
Trích:
Nguyên văn bởi ltrkhanh View Post
Thuật toán ghi DS1307: start i2c
ghi 0xD0
ghi địa chỉ
start
ghi 0xD0
ghi giây, phút, giờ, ngày...
stop i2c
Đấy là VDK của bạn hỗ trợ giao tiếp I2C, nếu không thì bạn phải xây dựng chương trình riêng.
Chúc thành công
mình làm y như bạn mà nó không chạy, hic hic
nguyendungdt12 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-05-2008, 10:10 AM   #8
ltrkhanh
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 5
:
Bạn đưa code lên tôi mới biết được bạn sai ở chỗ nào chứ?
ltrkhanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-05-2008, 08:04 PM   #9
HTAluvBeBeo
Đệ tử 2 túi
 
Tham gia ngày: Dec 2006
Nơi Cư Ngụ: HN
Bài gửi: 39
:
sory
gửii lại link đây:d
http://dientuvietnam.net/forums/show...9&postcount=71
HTAluvBeBeo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-05-2008, 01:28 AM   #10
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Trích:
Nguyên văn bởi ltrkhanh View Post
Thuật toán ghi DS1307: start i2c
ghi 0xD0
ghi địa chỉ
start
ghi 0xD0
ghi giây, phút, giờ, ngày...
stop i2c
tui cũng đang làm với con 1307 này , đọc giản đồ data-slave Receive write mode , tui thấy trình tự nó là
- Start_i2c();
- ghi 0xD0 // Write
- ACK rùi mới ghi đia chỉ
- tiếp ACK , rùi ghi tiếp giá trị
- stop_i2c();
trình tự của u : sau khi ghi điạ chỉ xong , start lại . Vậy start chỗ này có ý nghĩa gì ?Tui ko bit các hàm start_i2c(0, stop_i2c() của CCS nằm ở đâu cả , nên ko hỉu trong 2 hàm đó ng ta viết cái gì ?
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-05-2008, 11:10 AM   #11
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
có ai bit 2 hàm start_i2c() stop_i2c() viết gì ko ? nó ko chỉ đơn thuần là khởi động & kết thúc gửi nhận data phải ko ? để bit chi tiết 2 hàm này , vào đâu để xem chúng ?
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-06-2008, 04:10 PM   #12
nguyendungdt12
Đệ tử 1 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 11
:
làm mãi mà vẫn khong thiết lập được chán ghê, có bác nào giúp cho tiểu đệ 1 đoạn code để khởi taịo cho ds1307 giá trị đầu và nó chạy luôn mà không cần nút chỉnh bên ngoài không nhỉ? Em dung pic 16F877a và CCS
nguyendungdt12 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-06-2008, 12:02 PM   #13
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Trích:
Nguyên văn bởi nguyendungdt12 View Post
làm mãi mà vẫn khong thiết lập được chán ghê, có bác nào giúp cho tiểu đệ 1 đoạn code để khởi taịo cho ds1307 giá trị đầu và nó chạy luôn mà không cần nút chỉnh bên ngoài không nhỉ? Em dung pic 16F877a và CCS
nè u ! làm gì mà than vãn ghê z thế
Code:
#include    <16F877A.h>
#fuses      NOPROTECT,HS,NOWDT,NOLVP,NODEBUG,NOPUT
#use        delay(clock =20000000)
#use        i2c(master,fast,sda=PIN_C4,scl=PIN_C3)

#define mode   RE0 
#define change RE1
#define IR     RE2
//                                0     1    2    3    4   5    6    7    8    9
unsigned char const maled[10] = {0x01,0xCF,0x92,0x86,0xCC,0xA4,0xA0,0x8F,0x80,0x04};
unsigned char sec,min,hour,dow,date,month,year; // bien data trong RTC
unsigned char day1,day2,month1,month2,year1,year2,hour1,hour2,min1,min2,sec1,sec2; // bien xuat data
unsigned char hour_wait1,hour_wait2,min_wait1,min_wait2;
unsigned char i=0;
unsigned int  var_IR=0;

//------------ham thu tin hieu Sony------------------------
void scan_IR()
{ if (!IR) { delay_ms(1);
             if(!IR){ RB1= RB2 = 1 ; // tat 2 led
                      while(!IR) continue ; // trong khi IR van muc 0 thi wait de doi sang muc 1
                      while(IR) continue ;  // neu IR chuyen sang muc 1 thi wait tiep
                      delay_us(750);
                      for(i=1;i<=12;i++)
                             { //if(IR==0){ bit_set(var_IR,i)  ; };
                               //if(IR!=0){ bit_clear(var_IR,i); };
                               if(IR==0){ (var_IR ||0x01)<<i; };
                               if(IR!=0){ (var_IR ||0x01)<<i; };
                               while(!IR) continue ; 
                               while(IR) continue ;  
                               delay_us(750);
                             };
                    };
           };
}  


void test_IR()  
{  for(i=0;i<=12;i++)
        {
          if(bit_test(var_IR,i)==1) 
               {RB1 = 0 ;delay_ms(1000); // bat led day1
                RB1 = 1 ;delay_ms(1000);
               };
          if(bit_test(var_IR,i)==0) 
               {RB2 = 0;delay_ms(1000); // bat led day2
                RB2 = 1;delay_ms(1000); 
               };
        };
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++  


//------------ cac ham lien quan den RTC--------------------
void init_time()
{ I2C_start();       // gui bit start
  I2C_write(0xD0);   // gui lenh write
  I2C_write(0x07);   // den dia chi 07H de
  I2C_write(0x10);   // cau hinh cho thanh ghi 07H
  I2C_stop();
  
  I2C_start();
  I2C_write(0xD0);
  I2C_write(0x00);   // dia chi 00h
  I2C_write(0x00);   // nap gia tri cho thanh ghi giay = 0 , dong thoi xoa bit CH
  I2C_write(0x01);   // cho thanh ghi phut = 1
  I2C_write(0x11);   // chon mode 24h cho thanh ghi gio & nap gia tri la 11h
  I2C_write(0x02);   // thu 2
  I2C_write(0x15);   // ngay 15
  I2C_write(0x06);   // thang 6
  I2C_write(0x08);   // nam 2008 , nhap gia tri 2 so cuoi cua nam
  i2c_read(0);
  I2C_stop();
}
void up_date1307()
{ 
}

void update_time()
{I2C_start();
 I2C_write(0xD0); // gui lenh ghi
 I2C_write(0x00); // dia chi bat dau
 I2C_start();
 I2C_write(0xD1); // gui lenh doc
 sec=i2c_read(1);
 min=i2c_read(2);
 hour=i2c_read(3);
 dow =i2c_read(4);
 date=i2c_read(5);
 month=i2c_read(6);
 year=i2c_read(7);
 i2c_read(0);
 i2c_stop();

 sec1  = sec & 0x0F;
 sec2  = (sec & 0xF0)>>4;
 min1  = min & 0x0F;
 min2  = (min & 0xF0)>>4;
 hour1 = hour & 0x0F;
 hour2 = (hour & 0xF0)>>4;
 day1  = date & 0x0F ; 
 day2  = (date & 0xF0)>>4;
 month1= month & 0x0F ; 
 month2= (month & 0xF0)>>4;
 year1 = year & 0x0F ; 
 year2 = (year & 0xF0)>>4;
}


#int_ext
void read_time()
{ I2C_start();
  I2C_write(0xD0);
  I2C_write(0x00);   // xoa bit CH
  I2C_start();
  I2C_write(0xD1);
  sec = I2C_read(0x00);
  I2C_stop();
  if(sec==0) update_time();
  sec1 = sec & 0x0F;// lay 4 bit thap
  sec2 = (sec & 0xF0) >> 4 ;
}


void display()
{ PORTD = maled[sec1] ;RC6=0 ; delay_us(50); RC6=1 ;
  PORTD = maled[sec2] ;RC5=0 ; delay_us(50); RC5=1 ; 
  PORTD = maled[min1] ;RC2=0 ; delay_us(50); RC2=1 ; 
  PORTD = maled[min2] ;RC1=0 ; delay_us(50); RC1=1 ; 
  PORTD = maled[hour1];RB7=0 ; delay_us(50); RB7=1 ; 
  PORTD = maled[hour2];RC0=0 ; delay_us(50); RC0=1 ; 
  PORTD = maled[day1]; RB2=0 ; delay_us(50); RB2=1 ; 
  PORTD = maled[day2]; RB1=0 ; delay_us(50); RB1=1 ; 
  PORTD = maled[month1];RB4=0; delay_us(50); RB4=1 ; 
  PORTD = maled[month2];RB3=0; delay_us(50); RB3=1 ; 
  PORTD = maled[year1];RB6=0 ; delay_us(50); RB6=1 ; 
  PORTD = maled[year2];RB5=0 ; delay_us(50); RB5=1 ; 
}

main()
{ set_tris_A(0b0000000);  PORTA = 0b00001111;
  set_tris_B(0b00000001); PORTB = 0b11111111; // tat led 1-9
  set_tris_C(0b00011000); PORTC = 0b11100111;
  set_tris_D(0x00); PORTD = 0xFF;
  set_tris_E(0xFF); PORTE = 0xFF;
  
  delay_ms(500);
  init_time();
  
  GIE = 1; // cho phep ngat xay ra
  enable_interrupts(int_ext);
  ext_int_edge(H_to_L);

  while(1)
  {display();
  };
}
code chạy rùi đóa , nhưng ko hỉu sao khi giây về 00 thì tất cả các led đều nháy nháy ( khó chịu chỗ này lám , giống như ta quét led với tốc độ chậm í) wa 3s thì nó mới quét lại đúng thời gian 50ms . Tui cũng ko hỉu làm sao nữa . Nhưng nói chung thỏa mãn kì vọng khởi tạo DS1307 rùi đóa

thay đổi nội dung bởi: Mr.Bi, 15-06-2008 lúc 12:07 PM.
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-06-2008, 11:49 PM   #14
cuong86vt
Đệ tử 1 túi
 
Tham gia ngày: Jul 2007
Bài gửi: 22
:
Trong void init_time() bạn viết là:
Code:
I2C_write(0x15);
, viết như vậy là thành ngày 21 mất rồi.
Nếu muốn ghi khởi tạo là ngày 15 thì phải viết là
Code:
I2C_write(15);
hoặc là
Code:
I2C_write(0x0F);
mới đúng chứ, phải không nhỉ ?...
cuong86vt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-06-2008, 11:52 PM   #15
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi cuong86vt View Post
Trong void init_time() bạn viết là:
Code:
I2C_write(0x15);
, viết như vậy là thành ngày 21 mất rồi.
Nếu muốn ghi khởi tạo là ngày 15 thì phải viết là
Code:
I2C_write(15);
hoặc là
Code:
I2C_write(0x0F);
mới đúng chứ, phải không nhỉ ?...
DS1307 dùng số BCD (binary-coded decimal) chứ không phải số nhị phân. Do đó, ngày 15 cần mã hóa thành 0x15.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn 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:13 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