اطلاعیه

Collapse
No announcement yet.

کرنومتر دقیق با سون سگمنت و میکرو مگا 8

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

    کرنومتر دقیق با سون سگمنت و میکرو مگا 8

    با سلام من خودم چند وقتی دنبال این مدار میگشتم
    ولی واقعا هیچ جا چیزی پیدا نکردم
    تصمیم گرفتم خودم تایمر ای وی آر رو یاد بگیرم اگرچه خیلی سخت بود
    یه فایل زیپ هست که نقشه توضیحات و فایل هگز هم توشه
    مدار رو راش بندازید وقتی تمومش کردین مارو هم دعا کنین :biggrin:
    نوشتن برنامش یکم سخت بود
    این پستم هم اولین پستم تو این فروم هست به امید پستای بیشتر :biggrin:
    دانشجوی ترم دوم برق-الکترونیک هم هستم
    اینم لینک http://www.2shared.com/file/6244334/5114b302/Chronometer.html
    با تشکر

    #2
    پاسخ : کرنومتر دقیق با سون سگمنت و میکرو مگا 8

    دوستان عزیز اگه مدار رو بستین بگین چجور بوده که منم امیدوار بشیم بتونیم اگه در توانم بود مدارای بیشتری اینجا بذاریم :redface:

    دیدگاه


      #3
      پاسخ : کرنومتر دقیق با سون سگمنت و میکرو مگا 8

      امروز تصمیم گرفتم که طرز کار تایمر که میتونه خیلی جاها به کمکتون بیاد رو به زبان C تشریح کنم
      در یک میکرو کنترلر مثل ATMEGA 16 سه تا تایمر داریم که میتونن به طور مجزا کار کنن تنها مشکل این تایمرها اینه که اگه توی یک حلقه while بیفتن دیگه Main برنامتون کار نخواهد کرد
      اما خب حسنشون اینه که کاملا مستقل از Main کار میکنن و هیچ اختلالی تو اون ایجاد نمیکنن
      برای شروع:
      اگر از Codevision استفاده میکنید در قسمت تنظیمات مربوط به میکرو Tab تایمر رو انتخاب کنین و برای تایمر اول از قسمت Clock source یک فرکانس رو برای تایمر انتخاب کنین خیلی فرقی نمیکنه چی باشه ولی ترجیحا عدد رندتر رو انتخاب کنین که محاسباتمون راحت تر شه
      در این برنامه با توجه به فرکانس کاری 8 مگاهزتز میکرو فرکانس تایمر 125 رو کیلوهرتز انتخاب کردم و تیک Overflow Interrupt رو زدم تا برامون یک تابعی جدا از تابع Main باز کنه
      اما برای اینکه محاسباتمون دقیقتر بشه تایمر دوم هم به کار گرفتم و تنظیماتش مثل تایمر اول هست علتش هم عرض خواهم کرد
      بعد از اینکارا و تنظیم پورتها برنامه رو Save کنین و بیاین تو محیط کدنویسی کدویژن!!!
      این سورس کد برنامه هستش:
      کد:
      This program was produced by the
      CodeWizardAVR V1.25.3 Standard
      Automatic Program Generator
      © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
      http://www.hpinfotech.com
      
      Project : 
      Version : 
      Date  : 5/30/2009
      Author : F4CG              
      Company : F4CG              
      Comments: 
      
      
      Chip type      : ATmega8
      Program type    : Application
      Clock frequency   : 8.000000 MHz
      Memory model    : Small
      External SRAM size : 0
      Data Stack size   : 256
      *****************************************************/
      
      #include <mega8.h>
      #include <delay.h>
      int a,b,q=0,m=0;
      int i,j,k,z;
      int t,y,u,o;
      int g,h,l=0;
      
      [color=red]// Timer 0 overflow interrupt service routine
      interrupt [TIM0_OVF] void timer0_ovf_isr(void)
      {
       a++;
       TCNT0=131;
      
      
      }[/color]
      [color=red]
      // Timer 2 overflow interrupt service routine
      interrupt [TIM2_OVF] void timer2_ovf_isr(void)
      {
      if(a>=1000){b++; a=0;}
      if(b>=100) {b=0; TCNT0=131;}
      if(PINC.1==0&&q==1){m=1; t=i; y=j; u=k; o=z; g=a; h=b; }
      if(m==1&&PINC.0==0){a=g; b=h; m=0; TCNT0=131; l=1;}
      }
      [/color]
      // Declare your global variables here
      
      void main(void)
      {
      // Declare your local variables here
      
      // Input/Output Ports initialization
      // Port B initialization
      // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
      // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
      PORTB=0x00;
      DDRB=0xFF;
      
      // Port C initialization
      // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
      // State6=T State5=T State4=T State3=T State2=P State1=P State0=P 
      PORTC=0x07;
      DDRC=0x00;
      
      // Port D initialization
      // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
      // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
      PORTD=0x00;
      DDRD=0xFF;
      
      // Timer/Counter 0 initialization
      // Clock source: System Clock
      // Clock value: 125.000 kHz
      TCCR0=0x03;
      TCNT0=130;
      
      // Timer/Counter 1 initialization
      // Clock source: System Clock
      // Clock value: Timer 1 Stopped
      // Mode: Normal top=FFFFh
      // OC1A output: Discon.
      // OC1B output: Discon.
      // Noise Canceler: Off
      // Input Capture on Falling Edge
      // Timer 1 Overflow Interrupt: Off
      // Input Capture Interrupt: Off
      // Compare A Match Interrupt: Off
      // Compare B Match Interrupt: Off
      TCCR1A=0x00;
      TCCR1B=0x00;
      TCNT1H=0x00;
      TCNT1L=0x00;
      ICR1H=0x00;
      ICR1L=0x00;
      OCR1AH=0x00;
      OCR1AL=0x00;
      OCR1BH=0x00;
      OCR1BL=0x00;
      
      // Timer/Counter 2 initialization
      // Clock source: System Clock
      // Clock value: 8000.000 kHz
      // Mode: Normal top=FFh
      // OC2 output: Disconnected
      ASSR=0x00;
      TCCR2=0x01;
      TCNT2=0x00;
      OCR2=0x00;
      
      // External Interrupt(s) initialization
      // INT0: Off
      // INT1: Off
      MCUCR=0x00;
      
      // Timer(s)/Counter(s) Interrupt(s) initialization
      TIMSK=0x41;
      
      // Analog Comparator initialization
      // Analog Comparator: Off
      // Analog Comparator Input Capture by Timer/Counter 1: Off
      ACSR=0x80;
      SFIOR=0x00;
      
      // Global enable interrupts
      #asm("sei")
      PORTD=0b00111111; 
      PORTB=0xff; 
      delay_ms(200); PORTB=0x00;
      delay_ms(200); PORTB=0xff;
      delay_ms(200); PORTB=0x00;
      delay_ms(200); PORTB=0xff; 
      while (1){ 
       while(PINC.0==1&&q==0){}
       if(l==0){a=0; b=0; TCNT0=131; q=1;}
       l=1;
       i=(a/100);  j=(a/10)-(i*10);  k=b/10;   z=b-(k*10);  
       if(k==0){PORTD=0b00111111; PORTB.3=1; delay_ms(1); PORTB.3=0;} 
       if(k==1){PORTD=0b00001001; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(k==2){PORTD=0b01011110; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(k==3){PORTD=0b01011011; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(k==4){PORTD=0b01101001; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(k==5){PORTD=0b01110011; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(k==6){PORTD=0b01110111; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(k==7){PORTD=0b00011001; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(k==8){PORTD=0b01111111; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(k==9){PORTD=0b01111011; PORTB.3=1; delay_ms(1); PORTB.3=0;}
      
       if(z==0){PORTD=0b10111111; PORTB.0=1; delay_ms(1); PORTB.0=0;} 
       if(z==1){PORTD=0b10001001; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(z==2){PORTD=0b11011110; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(z==3){PORTD=0b11011011; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(z==4){PORTD=0b11101001; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(z==5){PORTD=0b11110011; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(z==6){PORTD=0b11110111; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(z==7){PORTD=0b10011001; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(z==8){PORTD=0b11111111; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(z==9){PORTD=0b11111011; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       
       if(i==0){PORTD=0b00111111; PORTB.1=1; delay_ms(1); PORTB.1=0;} 
       if(i==1){PORTD=0b1001;   PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(i==2){PORTD=0b01011110; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(i==3){PORTD=0b01011011; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(i==4){PORTD=0b01101001; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(i==5){PORTD=0b01110011; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(i==6){PORTD=0b01110111; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(i==7){PORTD=0b00011001; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(i==8){PORTD=0b01111111; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(i==9){PORTD=0b01111011; PORTB.1=1; delay_ms(1); PORTB.1=0;} 
       
       if(j==0){PORTD=0b00111111; PORTB.2=1; delay_ms(1); PORTB.2=0;} 
       if(j==1){PORTD=0b1001;   PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(j==2){PORTD=0b01011110; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(j==3){PORTD=0b01011011; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(j==4){PORTD=0b01101001; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(j==5){PORTD=0b01110011; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(j==6){PORTD=0b01110111; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(j==7){PORTD=0b00011001; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(j==8){PORTD=0b01111111; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(j==9){PORTD=0b01111011; PORTB.2=1; delay_ms(1); PORTB.2=0;}                                  
      
       while(m==1)
       {
       if(u==0){PORTD=0b00111111; PORTB.3=1; delay_ms(1); PORTB.3=0;} 
       if(u==1){PORTD=0b00001001; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(u==2){PORTD=0b01011110; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(u==3){PORTD=0b01011011; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(u==4){PORTD=0b01101001; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(u==5){PORTD=0b01110011; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(u==6){PORTD=0b01110111; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(u==7){PORTD=0b00011001; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(u==8){PORTD=0b01111111; PORTB.3=1; delay_ms(1); PORTB.3=0;}
       if(u==9){PORTD=0b01111011; PORTB.3=1; delay_ms(1); PORTB.3=0;}
      
       if(o==0){PORTD=0b10111111; PORTB.0=1; delay_ms(1); PORTB.0=0;} 
       if(o==1){PORTD=0b10001001; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(o==2){PORTD=0b11011110; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(o==3){PORTD=0b11011011; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(o==4){PORTD=0b11101001; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(o==5){PORTD=0b11110011; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(o==6){PORTD=0b11110111; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(o==7){PORTD=0b10011001; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(o==8){PORTD=0b11111111; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       if(o==9){PORTD=0b11111011; PORTB.0=1; delay_ms(1); PORTB.0=0;}
       
       if(t==0){PORTD=0b00111111; PORTB.1=1; delay_ms(1); PORTB.1=0;} 
       if(t==1){PORTD=0b1001;   PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(t==2){PORTD=0b01011110; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(t==3){PORTD=0b01011011; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(t==4){PORTD=0b01101001; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(t==5){PORTD=0b01110011; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(t==6){PORTD=0b01110111; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(t==7){PORTD=0b00011001; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(t==8){PORTD=0b01111111; PORTB.1=1; delay_ms(1); PORTB.1=0;}
       if(t==9){PORTD=0b01111011; PORTB.1=1; delay_ms(1); PORTB.1=0;} 
       
       if(y==0){PORTD=0b00111111; PORTB.2=1; delay_ms(1); PORTB.2=0;} 
       if(y==1){PORTD=0b1001;   PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(y==2){PORTD=0b01011110; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(y==3){PORTD=0b01011011; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(y==4){PORTD=0b01101001; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(y==5){PORTD=0b01110011; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(y==6){PORTD=0b01110111; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(y==7){PORTD=0b00011001; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(y==8){PORTD=0b01111111; PORTB.2=1; delay_ms(1); PORTB.2=0;}
       if(y==9){PORTD=0b01111011; PORTB.2=1; delay_ms(1); PORTB.2=0;}   }
         
          };
      }
      به دو قسمتی که با رنگ قرمز نوشته شده خوب توجه کنین گرچه یکم پیچیدس ولی ما با هم قسمتاش کار نداریم
      این دو قسمت interrupt تایمرمون یا همون تابعی هست که در اثر زدن تیک Overflow Interrupt واسمون باز کرده و تمام دقت کرنومتر ما به همین دو تابع مربوط میشه
      اما طرز کار تایمر:
      وقتی ما به تایمر فرکانس 8 مگاهرتز میدیم معنیش اینه که 8 میلیون بار تایمر یک دستور رو اجرا میکنه در مدت 1 ثانیه که سرعت فوق العاده بالاییه
      اما قراره چی کارا بکنه!!!
      تایمر وقتی شروع به کار میکنه یک عدد واسه خودش تعریف میکنه که در لحظه شروع این عدد صفر هست تا اینجارو داشته باشین ادامش میدم

      نکته مهم دیگه اینه که اگه تو ثانیه 8 میلیون بار بتونه یک دستور رو اجرا کنه پس هر دستور چه قدر زمان میبره؟؟دقیقا میشه 1/8000000 یا همون 1 هشت میلیونیوم ثانیه و به عبارت ساده تر میشه گفت اجرای هر دستور (یک تقسیم بر فرکانس تایمر) زمان میبره

      ادامه بحث قبل:تایمر هر 1/8000000 ثانیه یک واحد به عددی که واسه خودش تعریف کرده اضافه میکنه و این عمل ادامه داره تا این عدد به 255 برسه به 255 که رسید میره داخل تابع تایمر و هر دستوری باشه اجرا میکنه به انتهای تابع که رسید دوباره عدد رو صفر میکنه و شروع میکنه شمردن تا برسه به 255 و دوباره میاد تابع رو میخونه..................
      حالا فکر میکنین که تایمر تو ثانیه چند بار فرصت میکنه که تابع تایمر رو بخونه؟؟؟ به عبارتی 8000000/256=31250 این تعداد بار فرصت میکنه داخل تابع رو به شرطی که هیچ دستوی توش نباشه بخونه و به تناسب اینکه چند تا دستور توی تابع باشه این عدد کمتر میشه چون اگه یادتون باشه به ازای هم دستور 1/8000000 زمان از تایمر گرفته میشه
      پس اگه یک دستوی مثل دستور اضافه کردن یک واحد به یک عدد باشه عدد 31250 به 80000000/257=31128 تغییر پیدا میکنه و اگه دوتا از این دستورا داشته باشیم باید فرکانس رو تقسیم بر 258 بکنیم و .........
      اما من فرکانس تایمری که قراره هر یک میلی ثانیه به عددی یک واحد اضافه کنه و به واسطه ی اون بتونم 1صدم ثانیه رو نمایش بدوم رو 125000 هرتز گرفتم چرا؟
      125000/256=488 با این فرکانس تایمر من میتونم هر ثانیه 488 بار به عدد هزارم ثانیه اضافه کنم ولی خب این فرکانس به درد من نمیخوره پس چی کنم؟؟
      یک ترفندی وجود داره اونم اینه که بجای اینکه تایمر از صفر شروع کنه تا 255 از 126 شروع میکنه تا 255 خب حالا مزیتش چیه؟؟
      اگه دقت کنین از 255 تا 131 تعداد 125 عدد موجوده(با احتساب دو عدد اول و آخر) پس بجای اینکه فرکانس رو تقسیم بر 256 بکنم تا تعداد دفعاتی که تابع اجرا میشه رو بدست بیارم الان چون تایمر از 131 تا 255 میشمره فرکانس رو تقسیم بر 125 میکنم تا تعداد دفعات بدست بیاد پس میشه 125000/125=1000
      با این حساب تابع در هر یک میلی ثانیه یک بار اجرا میشه وبه عدد هزارم ثانیم یک واحد اضافه میکنه
      اما تابع اول تایمر:در هر میلی تانیه یک واحد به a اضافه میکنه و در آخر عدد تعریف شده برای تایمر رو تعیین میکنه که از 131 شروع کنه بجای صفر
      این دستور هم برای عدد دادن به تایمره:
      ;TCNT0=131
      عدد صفر هم مشخص کننده تایمر صفر یک یا دو هست یا مثلا TCNT1=131;
      وظیفه مربوط به اضافه کردن به عدد مربوط به ثانیه و ..... بر عهده تایمر دوم است تا سرعت تایمر اول کند نشه
      خیلی سعی کردم آسون بگم ولی کلا تایمر نیاز به کارکردن داره تا مفهومش جا بیفته
      دوستان سوالی هم دارم میتونن همینجا مطرح کنن

      دیدگاه


        #4
        پاسخ : کرنومتر دقیق با سون سگمنت و میکرو مگا 8

        سلام دوست خوب
        نمی شه یکم واضح تر بگی آخه من تازه شروع کردم :read:

        دیدگاه


          #5
          پاسخ : کرنومتر دقیق با سون سگمنت و میکرو مگا 8


          سلام
          ممنون از مطلبی که گذاشتی. لینک دانلودی که گذاشتی خرابه میشه. دوباره پلودش کنی و یا حداقل عکسی از مدار بگذاری.
          با تشکر

          دیدگاه


            #6
            پاسخ : کرنومتر دقیق با سون سگمنت و میکرو مگا 8

            دستت درد نکنه.البته کدهایی که نوشتی رو میشه خیلی خلاصه تر کرد.

            دیدگاه


              #7
              پاسخ : کرنومتر دقیق با سون سگمنت و میکرو مگا 8

              این کدو من تازه AVR یاد گرفته بودم نوشتم
              الان که نگاه میکنم میبینم خیلی ساده تر میشه نوشت :nerd:
              در هر صورت اگر کسی مشکلی تو درکش داره همینجا مطرح کنه جواب میدم

              دیدگاه


                #8
                پاسخ : کرنومتر دقیق با سون سگمنت و میکرو مگا 8

                سلام! من هیچی از برنامه نویسی بلد نیستم لطفا اگه میشه این مدار کرنومتر را برام تو پروتءوس بزارین تا دانلود کنم.مخلص همه شما

                دیدگاه


                  #9
                  پاسخ : کرنومتر دقیق با سون سگمنت و میکرو مگا 8

                  با زبان برنامه نویسی بیسیک این هزار و چند خط برنامه که نوشتی میشه 15 خط یا حتی کمتر !!!!!!!!!!!!!!!!

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

                  دیدگاه


                    #10
                    پاسخ : کرنومتر دقیق با سون سگمنت و میکرو مگا 8

                    :nerd:
                    یه آموزش کار با سون سگمنت گذاشته بودم دوست داشتم تا علاقمندان ازش استفاده کنند!
                    ما را نیز دعا کنید!
                    http://www.eca.ir/forum2/index.php?topic=82242.msg501926#msg501926
                    :read:
                    آنچه که باعث موفقیت انسان ها می شود سخت کوشی است و نه نخبه بودن! Porsche 911 Turbo S 181.000 $ USD
                    جناب سعدی فرموده بودند: "بر احوال ان مرد باید گریست _ که دخلش بود نوزده، خرجش بیست!"
                    که اگه الان بود باید میگفت: "بود حال و احوال آن مرد زار _ که دخلش ریال است ، خرجش دلار :|"
                    http://www.eca.ir/forum2/index.php?topic=80472.msg489565#msg489565
                    http://www.eca.ir/forum2/index.php?topic=82242.msg501926#msg501926

                    دیدگاه

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