اطلاعیه

Collapse
No announcement yet.

بدست آوردن زمان دقیق 1 ثانیه

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

    بدست آوردن زمان دقیق 1 ثانیه

    سلام
    من میخوام زمان دقیق 1 ثانیه رو با استفاده از کریستال 32768 و میکرو کنترلر 16f877A در بیارم ..
    تو AVR و مگا 32 میشه با اتصال کریستال 32768 به پایه های مشخص شده و استفاده از تایمر کانتر 2 زمان دقیق 1 ثانیه رو بدست آورد ..
    تو PIC با کامپایلر CCS چطور این کار انجام میشه ؟؟
    اگه سوالم خیلی ابتدایی هست به بزرگی خودتون ببخشید و بذارین به حساب تازه کاریم تو PIC ...
    مرسی.
    یه نمونه برنامه میخواستم که با وقفه هر بار مثلا یک واحد به یه متغییر اضافه کنه ..
    اینم برنامه و شبیه ساز پروتیوس خودمه ولی متاسفانه جواب نمیده .. انگار وقفه اصلا تعریف نشده .. :
    http://s5.picofile.com/file/81172239...chive.zip.html
    تیم کاوش در مسابقات بین المللی ایران اپن 2016.نمایشی.مین یاب.
    علم را باید در آزمایشگاه یاد گرفت نه در دانشگاه!

    #2
    پاسخ : بدست آوردن زمان دقیق 1 ثانیه

    یه متغیر محلی توی تابع main تعریف کردین در صورتی که متغیر global داره توی وقفه زیاد میشه. متغیر a که توی main تعریف کردین رو پاک کنید
    AYRIC

    دیدگاه


      #3
      پاسخ : بدست آوردن زمان دقیق 1 ثانیه

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

      دیدگاه


        #4
        پاسخ : بدست آوردن زمان دقیق 1 ثانیه

        نوشته اصلی توسط sinaitg
        سلام
        من میخوام زمان دقیق 1 ثانیه رو با استفاده از کریستال 32768 و میکرو کنترلر 16f877A در بیارم ..
        تو AVR و مگا 32 میشه با اتصال کریستال 32768 به پایه های مشخص شده و استفاده از تایمر کانتر 2 زمان دقیق 1 ثانیه رو بدست آورد ..
        تو PIC با کامپایلر CCS چطور این کار انجام میشه ؟؟
        در میکروکنترلر های 8بیتی PIC چنانچه بخواهید از RTC و کریستال 32khz استفاده کنید نمیتونید زمان دقیق یک ثانیه رو بدست بیارید. با توجه به ضریب پیش تقسیم کننده در تایمر 1 شما میتونید زمان 2 ثانیه رو داشته باشید. یک راه برای ایجاد زمان یک ثانیه اینه که از وقفه استفاده کنید و در زمان وقفه سرریز تایمر بیت 15 تایمر 1 رو ست کنید. که البته با توجه اینکه در اثر این کار شمارنده مربوط به واحد پیش تقسیم کننده ریست خواهد شد مقداری خطا ایجاد خواهید داشت.
        ضمنا در قسمتی از برنامتون تایمر 1 رو به صورت زیر پیکره بندی کردید:
        کد:
        setup_timer_1(t1_internal|t1_div_by_4);
        بنده با CCS کار نمیکنم و به دستوراتش خیلی وارد نیستم ، ولی ظاهرا کلاک تایمر از کلاک CPU تامین میشه. باید کلاک رو روی اسیلاتور 32K تنظیم کنید. همچنین با تقسیم کلاک بر 4 و با فرض استفاده از اسیلاتور 32Khz مقدار زمان شما 8 ثانیه خواهد بود نه 1 ثانیه.

        دیدگاه


          #5
          پاسخ : بدست آوردن زمان دقیق 1 ثانیه

          نوشته اصلی توسط sinaitg
          سلام
          از اساتید اگه کسی برنامه نمونه واسم بذاره دعاشون میکنم ..
          ممنون :angry: :angry: :angry: :angry:
          با هر کریستالی ..با هر تایمری ..
          فقط کمکم کنین
          همونطور که گفتن نمیشه زمان دقیق 1 ثانیه رو با خود میکرو بدست آورد
          اما من همون کاری رو که گفتم کردم و درست شد
          AYRIC

          دیدگاه


            #6
            پاسخ : بدست آوردن زمان دقیق 1 ثانیه

            سلام .

            برنامه ی زیر رو نوشتم. تست کنید زمان 1ثانیه رو میده. باید ببخشید من فرصت نکردم که تست کنم ولی سعی میکنم که خودم هم تست کنم.
            اگر جاییوشو متوجه نشدید توضیح میدم.
            کد:
            /* 
             * File:  TIMER1_RTC.c
             * Author: SAEED RAZAZZADEH
             *
             * Created on June 21, 2014, 6:19 PM
             */
            
            #define _XTAL_FREQ 8000000
            #include<pic16f877a.h>
            #include<xc.h>
            
            //================================
            // CONFIG
            #pragma config FOSC = HS    // Oscillator Selection bits (HS oscillator)
            #pragma config WDTE = OFF    // Watchdog Timer Enable bit (WDT disabled)
            #pragma config PWRTE = OFF   // Power-up Timer Enable bit (PWRT disabled)
            #pragma config BOREN = OFF   // Brown-out Reset Enable bit (BOR disabled)
            #pragma config LVP = OFF    // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
            #pragma config CPD = OFF    // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
            #pragma config WRT = OFF    // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
            #pragma config CP = OFF     // Flash Program Memory Code Protection bit (Code protection off)
            
            
            //================================
            void pic_init(void);
            void interrupt tmr1(void);
            //=================================
            void main(void) {
            
              pic_init();
              
              while(1){
              }
            
            
            }
            
            void pic_init(void){
            
              TRISBbits.TRISB5=0;//set out put
            
              INTCONbits.PEIE=1;
              INTCONbits.GIE=1;
            
              T1CONbits.T1CKPS1=0;
              T1CONbits.T1CKPS0=0;//prescaler 1:1
            
              T1CONbits.T1OSCEN=1;//enable osc timer1
              T1CONbits.T1SYNC=1;//Do not synchronize external clock input
              T1CONbits.TMR1CS=1;//select external clcok for timer1
            
              PIR1bits.TMR1IF=0;
              PIE1bits.TMR1IE=1;//enable timer1 intterupt
              TMR1=32767;//655535-32768
            
              T1CONbits.TMR1ON=1;//start timer1
            
            
            }
            //=============================================
            
            void interrupt tmr1(void){
            
              PORTBbits.RB5=~PORTBbits.RB5;
              PIR1bits.TMR1IF=0;
              TMR1=32767;//655535-32768
            }
            در زندگيت به کسي اعتــــماد کن که به او ايمــــان داري نه احســاس . . .

            چه بسيار انسان ها ديدم تنشان لباس نبود؛و چه بسيار لباس ها ديدم که انساني درونش نبود ...!

            دیدگاه


              #7
              پاسخ : بدست آوردن زمان دقیق 1 ثانیه

              سلام
              مرسی بابت همکاریتون
              این با چه کامپایلری نوشته شده ؟؟
              تیم کاوش در مسابقات بین المللی ایران اپن 2016.نمایشی.مین یاب.
              علم را باید در آزمایشگاه یاد گرفت نه در دانشگاه!

              دیدگاه


                #8
                پاسخ : بدست آوردن زمان دقیق 1 ثانیه

                دوستان راهنمایی های خوبی کردن. من هم دوتا نکته بگم.

                به جای T1_INTERNAL از T1_EXTERNAL استفاده کنید.
                ظاهراً توی پروتیوس کریستال درست شبیه سازی نمیشه. بجاش از منبع پالس استفاده کردم و جواب داد. زمان 2 ثانیه. البته با T1_DIV_BY_1.
                به جای Float از int8 و int16 استفاده کنید. اینجوری سریعتره.
                کد:
                #include <16f877A.h>
                #use delay(clock=20000000)
                #fuses hs
                #define LCD_ENABLE_PIN PIN_D1
                #define LCD_RS_PIN PIN_D2
                #define LCD_RW_PIN PIN_D3
                #define LCD_DATA4 PIN_D4
                #define LCD_DATA5 PIN_D5
                #define LCD_DATA6 PIN_D6
                #define LCD_DATA7 PIN_D7
                int8 a=0;
                int16 d=0;
                #include <lcd.c>
                #int_timer1
                void timer1_isr(void){
                a++;
                }
                
                void main()
                {
                enable_interrupts(int_timer1);
                enable_interrupts(global);
                setup_timer_1(T1_EXTERNAL|t1_div_by_1);   //T1_EXTERNAL_SYNC
                lcd_init();
                
                while(TRUE)
                {
                 d=get_timer1();
                 lcd_gotoxy(1,1);
                 printf(lcd_putc,"%u",a);
                 lcd_gotoxy(1,2);
                 printf(lcd_putc,"%lu",d);
                }
                }

                دیدگاه


                  #9
                  پاسخ : بدست آوردن زمان دقیق 1 ثانیه

                  سلام
                  ببخشید من با منبع پالس تست کردم .. شمردن تایمر جواب میده ولی وقفه سرریزش عمل نمیکنه..
                  میشه شبیه ساز پروتیوسش رو هم بذارین؟؟
                  ممنون میشم..
                  تیم کاوش در مسابقات بین المللی ایران اپن 2016.نمایشی.مین یاب.
                  علم را باید در آزمایشگاه یاد گرفت نه در دانشگاه!

                  دیدگاه


                    #10
                    پاسخ : بدست آوردن زمان دقیق 1 ثانیه

                    سلام. با کامپایلر xc8 نوشته شده.
                    در زندگيت به کسي اعتــــماد کن که به او ايمــــان داري نه احســاس . . .

                    چه بسيار انسان ها ديدم تنشان لباس نبود؛و چه بسيار لباس ها ديدم که انساني درونش نبود ...!

                    دیدگاه


                      #11
                      پاسخ : بدست آوردن زمان دقیق 1 ثانیه

                      برنامه تست شد وبه طور کامل جواب داد فقط خازن های 33p روی کریستال 32.768 رو یادتون نره.
                      در زندگيت به کسي اعتــــماد کن که به او ايمــــان داري نه احســاس . . .

                      چه بسيار انسان ها ديدم تنشان لباس نبود؛و چه بسيار لباس ها ديدم که انساني درونش نبود ...!

                      دیدگاه

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