اطلاعیه

Collapse
No announcement yet.

راه اتندازی ds1307 و نمایش روی 7seg

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

    راه اتندازی ds1307 و نمایش روی 7seg

    ا سلام خدمت دوستان و اساتید محترم.
    من یه تازه کار هستم که با ccs شروع به کار کردم. با استفاده ازi2c تونستم ایسی ds1307 و خونده و اطلاعات روی ال سی دی نمایش بدم. حالا میخواستم ساعت رو روی سون سگمنت پیاده سازی کنم. برای این کار نیاز بود که عدد مربوط به ساعت تقسیم بر 10 کنم که باقیمانده و تقسیم رو به صورت جدا به من بده با استفاده از دستور زیر:
    a=sec/10; , b=sec%10
    اما مقادیری که به دست میاد درست نیستو این مقادیر را روی ال سی دی برای خودم نمایش دادم اما همیشه مقادیر رو اشتباه بهم میده. کسی میتونه کمک کنه
    با تشکر

    #2
    پاسخ : راه اتندازی ds1307 و نمایش روی 7seg

    کدتونو بزارید.

    دیدگاه


      #3
      پاسخ : راه اتندازی ds1307 و نمایش روی 7seg

      کدو اینقد تغییر دادم چیزی ازش نمونده :icon_razz:
      [code=c]
      #include <16F877a.h>
      #include <math.h>
      #use delay(clock=20mhz)
      #use i2c(Master,sda=PIN_C4,scl=PIN_C3)

      int seg1_m,seg2_m,seg1_h,seg2_h,s,m,h;
      #define LCD_DATA_PORT 6
      #define LCD_TYPE 2
      #include <lcd.c>
      //void set(){


      void display(){
      lcd_init();
      seg1_m=m%10;
      seg2_m=m/10;
      seg1_h=h%10;
      seg2_h=h/10;
      lcd_gotoxy(1,1);
      printf(lcd_putc,"%x:%x:%x",h,m,s);
      printf(lcd_putc,"\n%x:%x:%x:%x",seg2_h,s eg1_h,seg2_m,seg1_m);
      delay_ms(100);
      }
      void main (){
      while(true){
      i2c_start();
      i2c_write(0xd0);
      i2c_write(0);
      i2c_start();
      i2c_write(0xd1);
      s=i2c_read(1);
      m=i2c_read(1);
      h=i2c_read(0);
      i2c_stop();
      display();
      }}
      [/code]

      دیدگاه


        #4
        پاسخ : راه اتندازی ds1307 و نمایش روی 7seg

        کد مربوط به سون سگمنت توش نیست، مشکل من در قسمت تقسیم و باقیمانده این کد هستش اگه ممکنه راهنمایی کنید:
        seg1_m=m%10;
        seg2_m=m/10;
        seg1_h=h%10;
        seg2_h=h/10;
        اینا هیچ کدوم عدد درست رو به دست نمیاره

        دیدگاه


          #5
          پاسخ : راه اتندازی ds1307 و نمایش روی 7seg

          به نظر درست میاد. من الان نمیتونم تست کنم. برای مقادیر زیر چی میده؟
          01:05
          11:45
          23:58


          چرا x% نوشتی؟ باید u% باشه. هرچند، عدد زیر 10 هست و فرقی نمیکنه ولی درستش اونه.

          دیدگاه


            #6
            پاسخ : راه اتندازی ds1307 و نمایش روی 7seg

            با u هم نوشتم اما جواب نداد با سون سگمنتم تست کردم نشد. مثلا واسه 19 تقسیم رو میده 2 باقیمانده هم میده 2

            اضافه شده در تاریخ :
            الان تست کردم برای 18:40 داد:
            2:4:6:5
            یعنی 18 رو داده 2،4 و 40 رو داده 6،5

            دیدگاه


              #7
              پاسخ : راه اتندازی ds1307 و نمایش روی 7seg

              من اینو تو پروتیوس تست کردم درست کار میکرد. مشکل شما احتمالاً از چیز دیگست.

              [code=c]#include <16F877a.h>
              #include <math.h>
              #use delay(clock=20000000)
              #use i2c(Master,sda=PIN_C4,scl=PIN_C3)

              int seg1_m,seg2_m,seg1_h,seg2_h,s,m,h;
              #define LCD_DATA_PORT 6
              #define LCD_TYPE 2
              #include <lcd.c>
              //void set(){


              void display(){
              lcd_init();
              seg1_m=m%10;
              seg2_m=m/10;
              seg1_h=h%10;
              seg2_h=h/10;
              lcd_gotoxy(1,1);
              printf(lcd_putc,"%u:%u:%u",h,m,s);
              printf(lcd_putc,"\n%u,%u,%u,%u",seg2_h,s eg1_h,seg2_m,seg1_m);
              delay_ms(100);
              }
              void main (){
              while(true){
              h=18;
              m=40; //gives 1,8,4,0
              s=58;
              display();
              }}
              [/code]

              دیدگاه


                #8
                پاسخ : راه اتندازی ds1307 و نمایش روی 7seg

                اگه لطف کنید همون کدی که من نوشتم را تست کنید ممنون میشم. وقتی به صورت دستی عدد میدم " همون روش شما" درست کار میکنه اما وقتی از طریق i2c اطلاعات ds1307 رو میخونم و عملیات رو انجام میدم جواب نمیده :angry:

                اضافه شده در تاریخ :
                بعد از بررسی بیشتر متوجه شدم که عددی که ds1307 به ما میده به صورت هگزه و ما باید اونو به دسیمال تبدیل کنیم :applause: حالا اگه با ال سی دی نمایش بیم به راحتی با استفاده از %x در دستور printf عدد بصورت دسیمال نمایش داده میشه. :biggrin: اما برای نمایش روی سون سگمنت ابتدا باید عدد رو به دسیمال تبدیل کنیم.
                حال آیا دستوری تو ccs برای تبدیل هگز به دسیمال هست یا باید کدشو خودم بنویسم؟ oo:

                اضافه شده در تاریخ :
                بالاخره نوشتمش:
                کد c:
                [code=c]
                #include <16F877a.h>
                #include <math.h>
                #use delay(clock=20000000)
                #use i2c(Master,sda=PIN_C4,scl=PIN_C3)
                int seg1_m,seg2_m,seg1_h,seg2_h;
                int s,m,h,a,b,sec,min,hour;
                int seven[10]={0x01,0x4f,0x12,0x06,0x4c,0x24,0x20,0x0f,0x00,0x0 4};

                void display(){
                seg1_m=sec%10;
                seg2_m=sec/10;
                seg1_h=min%10;
                seg2_h=min/10;

                //saat
                output_d(0b0001);
                output_b(seven[seg2_h]);
                delay_ms(10);
                output_d(0b0010);
                output_b(seven[seg1_h]);
                delay_ms(10);
                // minute
                output_d(0b0100);
                output_b(seven[seg2_m]);
                delay_ms(10);
                output_d(0b1000);
                output_b(seven[seg1_m]);
                delay_ms(10);
                }
                int convert (int value){
                a=value%16;
                b=value/16;
                value=b*10+a;
                return value;
                }

                void main (){
                set_tris_b(0x00);
                set_tris_d(0x00);
                set_tris_c(0x01);
                output_high(pin_b4);
                delay_ms(100);
                while(true){
                i2c_start();
                i2c_write(0xd0);
                i2c_write(0);
                i2c_start();
                i2c_write(0xd1);
                s=i2c_read(1);
                sec=convert(s);
                m=i2c_read(1);
                min=convert(m);
                h=i2c_read(0);
                hour=convert(h);
                i2c_stop();
                display();
                }}
                [/code]

                دیدگاه

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