اطلاعیه

Collapse
No announcement yet.

ds1307

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ds1307

    با سلام
    سال نو بر تمام دوستان مبارک
    دوستان من با میکرو pic18 یه برنامه نوشتم که از ds1307 میخونه و روی lcd زمان رو نمایش میده. ولی متاسفانه همیشه زمان رو صفر نشون میده.
    با برنامه های دیگه هم که روی اینترنت بود چک کردم اما به نتیجه نرسیدم. ممنون میشم کمک کنید. فرکانس میکرو با PLL به 40MHz میرسه.
    کامپایلر microC

    کد:
    // Lcd pinout settings
    sbit LCD_RS at RB3_bit;
    sbit LCD_EN at RB1_bit;
    sbit LCD_D7 at RB7_bit;
    sbit LCD_D6 at RB6_bit;
    sbit LCD_D5 at RB5_bit;
    sbit LCD_D4 at RB4_bit;
    
    // Pin direction
    sbit LCD_RS_Direction at TRISB3_bit;
    sbit LCD_EN_Direction at TRISB1_bit;
    sbit LCD_D7_Direction at TRISB7_bit;
    sbit LCD_D6_Direction at TRISB6_bit;
    sbit LCD_D5_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB4_bit;
    
    /////////
    char txt_1[4],txt_2[4],txt_3[4],txt_4[4];
    char i2c_txt[4];
    unsigned short tst[4];
    ////////
    unsigned char rtc_read(unsigned char address);
    void rtc_write(unsigned char address,unsigned char _data);
    void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out);
    void rtc_get_time(unsigned char *hur,unsigned char *min,unsigned char *sec);
    void rtc_set_time(unsigned char hur,unsigned char min,unsigned char sec);
    void rtc_get_date(unsigned char *date,unsigned char *month,unsigned char *year);
    void rtc_set_date(unsigned char date,unsigned char month,unsigned char year);
    
    
    ////
    void main() {
       PORTA=LATA=0x00;
       PORTB=LATB=0x00;
       PORTC=LATC=0x00;
       ADCON1=0x0f;
       TRISA=0xa7;
       TRISB=0x00;
       TRISC=0x87;
       Lcd_Init();
       Lcd_Cmd(_LCD_CLEAR);
       Lcd_Cmd(_LCD_CURSOR_OFF);
       ///
       I2C1_Init(100000);
    	 while (!I2C1_Is_Idle());
       rtc_init(0,0,0);
       hour=12;
       minute=1;
       seconde=1;
       rtc_set_time(hour,minute,seconde);
       while(1){
    		 Lcd_Chr(1, 1, (hour/10+48));
    		 Lcd_Chr(1, 2, (hour%10+48));
    		 Lcd_Out(1, 3, ":");
    		 Lcd_Chr(1, 4, (minute/10+48));
    		 Lcd_Chr(1, 5, (minute%10+48));
    		 Lcd_Out(1, 6, ":");
    		 Lcd_Chr(1, 7, (seconde/10+48));
    		 Lcd_Chr(1, 8, (seconde%10+48));
    
    		 rtc_get_time(&hour,&minute,&seconde);
    		 delay_ms(500);
       }
    }
    
    
    
    unsigned char rtc_read(unsigned char address)
    {
       unsigned char _data;
       i2c1_start();
       I2C1_Repeated_Start();
       i2c1_wr(0xd0);
       i2c1_wr(address);
       i2c1_start();
       i2c1_wr(0xd1);
       _data=I2C1_Rd(0);
       i2c1_stop();
       return _data;
    }
    //
    
    void rtc_write(unsigned char address,unsigned char _data)
    {
       i2c1_start();
       I2C1_Repeated_Start();
       i2c1_wr(0xd0);
       i2c1_wr(address);
       i2c1_wr(_data);
       i2c1_stop();
    }
    
    void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out)
    {
       rs&=3;
       if (sqwe) rs|=0x10;
       if (out) rs|=0x80;
       i2c1_start();
       i2c1_wr(0xd0);
       i2c1_wr(7);
       i2c1_wr(rs);
       i2c1_stop();
    }
    
    void rtc_get_time(unsigned char *hur,unsigned char *min,unsigned char *sec)
    {
       I2c1_start();
       I2c1_wr(0xd0);
       I2c1_wr(0);
       I2C1_Repeated_Start();
       I2c1_wr(0xd1);
       *sec=Bcd2Dec(I2C1_Rd(1));
       *min=Bcd2Dec(I2C1_Rd(1));
       *hur=Bcd2Dec(I2C1_Rd(0));
       while (!I2C1_Is_Idle());
       I2c1_stop();
    }
    
     void rtc_set_time(unsigned char hur,unsigned char min,unsigned char sec)
    {
       I2c1_start();
       I2C1_Repeated_Start();
       I2c1_wr(0xd0);
       I2c1_wr(0x00);
       I2c1_wr(sec);
       I2c1_wr(Dec2Bcd(min));
       I2c1_wr(Dec2Bcd(hur));
       while (!I2C1_Is_Idle());
       I2c1_stop();
    }
    
     void rtc_get_date(unsigned char *date,unsigned char *month,unsigned char *year)
    {
       i2c1_start();
       I2C1_Repeated_Start();
       i2c1_wr(0xd0);
       i2c1_wr(4);
       i2c1_start();
       i2c1_wr(0xd1);
       *date=Bcd2Dec(I2C1_Rd(1));
       *month=Bcd2Dec(I2C1_Rd(1));
       *year=Bcd2Dec(I2C1_Rd(0));
       i2c1_stop();
    }
    
    void rtc_set_date(unsigned char date,unsigned char month,unsigned char year)
    {
       i2c1_start();
       I2C1_Repeated_Start();
       i2c1_wr(0xd0);
       i2c1_wr(4);
       i2c1_wr(Bcd2Dec(date));
       i2c1_wr(Bcd2Dec(month));
       i2c1_wr(Bcd2Dec(year));
       i2c1_stop();
    }
    هر وقت خواستید کاری بکنید، چهل سال عقب و چهل سال جلو را در نظر بگیرید. "بابابزرگ"

    #2
    پاسخ : ds1307

    نوشته اصلی توسط abolfazlk873
    دوستان من با میکرو pic18 یه برنامه نوشتم که از ds1307 میخونه و روی lcd زمان رو نمایش میده. ولی متاسفانه همیشه زمان رو صفر نشون میده.
    سلام دوست عزیز من این رو با بیسیک کار کردم مال من هم اولش 0 نشون می داد تا زمانی که ثانیه شمار را یک واحد افزایش ندی این آیسی شروع به شمارش نمی کند بنابراین شما با استفاده از spi و یه کلید اون رو افزایش بده ببین کار میکنه یا نه اگه اتصالت درصت باشه هنگام افزایش و کاهش باید روی آیسی رایت بشه و تو ال سی دی نمایش بده ولی اگه اینطور نباشه همون صفر باقی می مونه
    ضمنا به نویز حساسه نزدیک این آی سی بین تغذیه و زمین یه 100 نانو بزار
    نباید سیم های ارتباطی هم بیشتر از 7 الی 8 سانتیمتر باشه
    برد جوجه کشی:
    مطالعه پست 1 (حتما مطالعه کنید)


    مطالعه پست 2 (برای مطلع شدن از تغییرات برنامه مطالعه کنید)

    دانلود

    توجه:
    این برد نیمه صنعتی و خانگی هست...
    برای صنعتی شدن حتما برد مخصوص خودتون رو بزنید...

    آی دی کانال تلگرامی مربوط به برد جوجه کشی : electr0o0nic@

    دیدگاه


      #3
      پاسخ : ds1307

      نوشته اصلی توسط abolfazlk873
      با سلام
      سال نو بر تمام دوستان مبارک
      دوستان من با میکرو pic18 یه برنامه نوشتم که از ds1307 میخونه و روی lcd زمان رو نمایش میده. ولی متاسفانه همیشه زمان رو صفر نشون میده.
      با برنامه های دیگه هم که روی اینترنت بود چک کردم اما به نتیجه نرسیدم. ممنون میشم کمک کنید. فرکانس میکرو با PLL به 40MHz میرسه.
      کامپایلر microC
      دوست عزیزم جناب آقای کامرانی

      با تبریک سال نو به جناب عالی و با آرزوی اینکه سالی خوب و پربار و موفق را شروع کرده باشید

      با احترام فراوان به خدمت تان عرض کنم که بنده PIC را با PICBASICPRO صرف می کنم . اما به جهت اینکه قبلا از مراتب لطف و انسانیت و راهنمایی شما بهره برده ام ، یک سورس کد ناقابل که در دسترس دارم و کار می کند ، را به حضورتان تقدیم می کنم. این سورس کد بر روی سری 16 پی آی سی تست شده و کار می کند.
      فقط این آی سی های دالاس برای ساخت زمان واقعی ، قدری به نویز حساس هستند. با این نکته حتما ملاحظات حذف نویز را مد نظر داشته باشید
      کد:
      include "MODEDEFS.BAS"
      DEFINE LCD_DREG PORTB
      DEFINE LCD_DBIT 4
      DEFINE LCD_RSREG PORTB
      DEFINE LCD_RSBIT 0
      DEFINE LCD_EREG PORTB
      DEFINE LCD_EBIT 1
      DEFINE LCD_BITS 4 
      DEFINE LCD_LINES 2
      DEFINE LCD_COMMANDUS 1500
      DEFINE LCD_DATAUS 44 
      define OSC 4
      
      
       ' ** Declare the Variables ** 
      
      
       B0 VAR BYTE
       B1 VAR BYTE
       B2 VAR BYTE
      
      
       RST var PORTC.3
       dq var PORTC.2
       clk var PORTC.1
      
      '------------------------- Read Commands For DS1302 -------------------------
      
      readsec con $81 ' Read seconds from DS1302
      readmin con $83 ' Read minutes from DS1302
      readhour con $85 ' Read hours from DS1302
      readdate con $87 ' Read date from DS1302
      readyear con $8D ' Read year from DS1302
      readmonth con $89 ' Read month from DS1302
      
      '------------------------------ Time Variables ------------------------------
      
      mem var byte ' Temporary data holder
      outbyte var byte ' Second byte to ds1302
      reg_adr var byte ' First byte to DS1302
      date var byte ' Date variable
      ss var byte ' Seconds variable
      mm var byte ' Minutes varibale
      hh var byte ' Hours variable
      mo var byte ' Month variable
      yr var byte ' Year variable
      
      '------------------------ Initial Settings For Ports ------------------------
      
      low rst ' Set reset pin low
      low clk ' Set clock pin low
      
      trisb = 0
      trisa = 0
      
      '----------------------- Set Initial Time Variables -------------------------
      
      
      start:
      reg_adr = readsec ' Read seconds
      gosub w_in
      ss = mem
      reg_adr = readmin ' Read minutes
      gosub w_in
      mm = mem
      reg_adr = readhour ' Read Hours
      gosub w_in
      hh = mem
      reg_adr = readyear ' Read Year
      gosub w_in
      yr = mem
      reg_adr = readdate ' Read Date
      gosub w_in
      date = mem
      reg_adr = readmonth ' Read Month
      gosub w_in
      mo = mem
      lcdout $fe,1,"TIME:",HEX2 hh,":",HEX2 mm,":",HEX2 ss
      pause 500
      goto start
      
      '----------------------- Time Commands Subroutines --------------------------
      
      w_in:
      mem = reg_adr ' Set mem variable to reg_adr contents
      high rst ' Activate the DS1302
      shiftout dq,clk,0, [mem] ' Send control byte
      shiftin dq,clk,1, [mem] ' Retrieve data in from the DS1302
      low rst ' Deactivate DS1302
      return
      
      w_out:
      mem = reg_adr ' Set mem variable to reg_adr contents
      high rst ' Activate the DS1302
      shiftout dq,clk,0, [mem] ' Send control byte
      mem = outbyte ' Set mem variable to outbyte contents
      shiftout dq,clk,0, [mem] ' Send data stored in mem variable to DS1302
      low rst ' Deactivate DS1302
      return
      والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

      هوشمندانه بپرسيد...

      دیدگاه


        #4
        پاسخ : ds1307

        با عرض سلام و تشکر از دوستان :nice:
        مشکل فقط از پروتئوس بود. برنامه درست کار میکرد.
        هر وقت خواستید کاری بکنید، چهل سال عقب و چهل سال جلو را در نظر بگیرید. "بابابزرگ"

        دیدگاه

        لطفا صبر کنید...
        X