اطلاعیه

Collapse
No announcement yet.

سوال در مورد کدوژن

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

    #16
    پاسخ : سوال در مورد کدوژن

    تایمر2:

    ببخشید بیکار بودم گفتم جای حسام جان جواب بدم.

    در این حالت تایمر به عنوان یک شمارنده 8 بیتی بکار می رود. تایمر با یک عدد اولیه در ریجیستر TCNT2 بارگذاری می شود و با هر کلاک یک واحد به مقدار آن اضافه می شود تا اینکه به مقدار نهایی خود یعنی 255 برسد و با یک کلاک دیگر تایمر سرریز می کند. پس از سرریز شدن، پرچمTOVO یک می شود. با فعال کردن گزینه Overflow interrupt یک روال سرویس وقفه به نام timer0_ovf_isr به برنامه اضافه می شود که با هر بار سرریز شدن تایمر صفر کدهای داخل این قسمت اجرا خواهند شد.

    مثال) برنامه ای بنویسید که با استفاده از تایمر صفر در هر ثانیه یک واحدبه متغیر a افزوده شود.
    کریستال 16M

    #include <mega16.h>
    long int a,b;
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    }
    //Reinitialize Timer 0 value
    TCNT0=0x37;
    b++;
    if(b==80000){
    a++;
    b=0;
    }
    }
    void main(void)
    {
    //Timer/Counter 0 initialization
    //Clock source: System Clock
    //Clock value: 16000.000 kHz
    //Mode: Normal top=FFh
    TCCR0=0x01;
    TCNT0=0x37;
    OCR0=0x00;
    //Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01;
    #asm("sei&quot
    while (1);
    }
    // end


    در برنامه بالا در هر 12.5us یکبار کدهای داخل وقفه تایمر صفر اجرا می شود. در هر 12.5 میکروثانیه یک واحد به متغیر b افزوده می شود و به عبارتی یک ثانیه زمان لازم است تا متغیر b به عدد 80000 برسد و اگر این متغیر به عدد 80000 رسید با دستورif(b==80000) یک واحد به متغیر a اضافه می شود. دقت داشته باشید که زمان 12.5 میکروثانیه از رابطه زیر بدست آمده است.


    دیدگاه


      #17
      پاسخ : سوال در مورد کدوژن

      واقعا ممنون حمید جان لطف شما همیشه شامل حال من وتمام بچه انجمن بوده چند تا سوال دارم
      عبارت interrupt [TIM0_OVF] void timer0_ovf_isr(void) همیشه باید نوشته بشه ؟ نشان دهنده زیر برنامه وقفه است ؟

      اینارو از برنامه فهمیدم ، مقدار prescale رو هم 1 در نظر گرفتی و مقدار اولیه ای که واسه تایمر هم تعریف کردی 55 ، برای رخ دادن .قفه تایمر هم باید رجیستر TIMSK بصورت TIMSK=0x01 تعریف یشه


      اینو نفهمیدم واسه چی نوشتی #asm("sei&quot
      بازم ممنون از لطفت
      به برنامه ساده به عنوان تمرین بده ببینم چی بادگرفتم :mrgreen:
      کمتر به سایت میام .....

      دیدگاه


        #18
        پاسخ : سوال در مورد کدوژن

        عبارت interrupt [TIM0_OVF] void timer0_ovf_isr(void) همیشه باید نوشته بشه ؟ نشان دهنده زیر برنامه وقفه است ؟

        اینطوری نیست که ما همیشه روتین تایمر رو بنویسیم. در صورت نیاز که بیشتر تو مد نرمال ازش استفاده میشه ما از روتین استفاده میکنیم( تو سایر مدها هم کاربرد داره ها).


        اینارو از برنامه فهمیدم ، مقدار prescale رو هم 1 در نظر گرفتی و مقدار اولیه ای که واسه تایمر هم تعریف کردی 55 ، برای رخ دادن .قفه تایمر هم باید رجیستر TIMSK بصورت TIMSK=0x01 تعریف یشه
        :applause: :agree:


        #asm("sei" //// Global enable interrupts
        برای فعالسازی کلیه وقفه ها استفاده میشه که اگه ننویسیمش وقفه ها غیر فعال میمونن.


        #asm("cli" //// Global disable interrupts
        برای غیرفعال کردن کلیه وقفه ها استفاده میشه که اگه بنویسیمش وقفه ها غیر فعال میشن.

        دیدگاه


          #19
          پاسخ : سوال در مورد کدوژن

          یازم با سوال اومدم ... در نهایت من میخوام که مقدار دما رو از سنسور بخونم و از طریق پورت سربال به PC بفرستم کتاب ره افروز زو که خوندم بیشتر رجیستر ها رو توضیح داده این برنامه هم مال جزوه اقای سپاس یار

          اگه ممکنه یه توضیحی در موردش بدین
          پیشاپیش ممنون

          #include<mega16.h>

          #include<delay.h>
          #include<stdio.h>
          #define xtal 8000000



          flash char string1[7]="kavosh:;
          char string2[7]="avr";

          void main (void)
          {


          UCSRA=0x00;

          UCSRB=0x08; // USART Transmitter: On

          UCSRC=0x86; //8 Data, 1 Stop, No Parity

          UBRRH=0x00;

          UBRRL=0x33; // USART Baud rate: 9600


          putsf(string1);
          puts(string2);
          while (1);
          کمتر به سایت میام .....

          دیدگاه


            #20
            پاسخ : سوال در مورد کدوژن

            الحاق کتابخانه های تاخیر چیپ ورودی خروجی(برای ارتباط سریال باید این تابع اضافه شود) و تعیین مقدار کریستال.

            include<mega16.h>

            #include<delay.h>
            #include<stdio.h>
            #define xtal 8000000

            اعلان دو متغیر از جنش رشته با مقدار دهی اولیه:

            flash char string1[7]="kavosh";
            char string2[7]="avr";



            پیکره بندی رابط usart

            نحوه ارسال:
            Communication Parameters: 8 Data, 1 Stop, No Parity
            وضعیت فرستنده و گیرنده:
            USART Receiver: Off
            USART Transmitter: On
            مد ارسال : آسنکرون
            نرخ ارسال داده در هر ثانیه: 9600
            UCSRA=0x00;
            UCSRB=0x08;
            UCSRC=0x86;
            UBRRH=0x00;
            UBRRL=0x33;

            این دو تابع هم رشته های string1 , string2 را از طریق رابط سریال ارسال میکنند.
            putsf(string1);
            puts(string2);


            تابع puts جزء توابع کتابخانه stdio است که این تابع با استفاده از تابع putchar رشته کاراکتری را که در داخل حافظه SRAM قرار دارد را به خروجی انتقال می دهد.

            دیدگاه

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