اطلاعیه

Collapse
No announcement yet.

توضیح چند خط کد به زبان بیسیک

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

    توضیح چند خط کد به زبان بیسیک

    با سلام خدمت همه ی دوستان و اساتید محترم.
    دوستان بنده یه برنامه ای رو با زبان بیسیک در اختیار دارم که یکی از اساتید زحمتشو کشیدن، منتها سواد ناقص من قد نمیده که بتونم منطقش رو بفهمم و متاسفانه با توجه به نیاز مبرمی که به دونستن اون دارم اما هر چقدر تلاش کردم نتونستم بفهمم هر کدوم از دستورات و کدهای زیر چه عملکردی دارن!!

    کلیاتشو میدونم که از تایمر1 استفاده شده و از وقفه واحد ccp ، و تو روتین وقفه هم از تایمر0 استفاده شده، ولی همونطور که عرض کردم نمیتونم بفهمم چرا تو چند خط کد اول برنامه اونجایی که تنظیمات مربوط به تایمر1 و وقفه رو انجام دادن، از تایمر0 خبری نیست؟

    من گیج زدنم تو چند خط کد اول برنامه و برنامه ی وقفه است که در ادامه میذارم و تمنا دارم از دوستان که لطف کنن و توضیحات مربوط به این چند خط رو در اختیار بنده قرار بدن تا بتونم از گیر این مرحله بگذرم.

    این چند خط بعد از تعاریف ثابتها و قبل از لوپ اصلی برنامه آورده شدن:

    ON INTERRUPT GOTO lable



    TRISD=$00
    PORTD=$00


    TMR1L=0
    TMR1H=0

    CCP1CON=$0b

    CCPR1H=$9c
    CCPR1L=$40

    PIR1.2=0
    PIE1.2=1

    T1CON=$01

    INTCON.6=1
    INTCON.7=1


    و بعد از لوپ اصلی تو برنامه ی مربوط به وقفه این رو داریم:

    lable
    DISABLE INTERRUPT
    if PIR1.2=1 then

    PORTD = $01
    PAUSEUS 990
    INTCON.2=0
    TMR0 = 255-x
    OPTION_REG = OPTION_REG & $c0
    OPTION_REG = OPTION_REG | $02
    while INTCON.2=0
    wend

    امیدوارم دوستان مثل همیشه نظر لطفشون رو شامل حال بنده کنن. :smile:

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

    #2
    پاسخ : توضیح چند خط کد به زبان بیسیک

    سلام.
    برای دریافت بخشی از پاسخ سوالاتون به آدرس زیر مراجعه کنید.
    http://www.eca.ir/forum2/index.php?t...5312#msg285312

    در این برنامه از ماژول CCP1 در مد Compare همراه با ریست تایمر یک در زمان برابری مقایسه استفاده شده. که این تنظیمات توسط رجیستر CCP1CON انجام شده.
    تایمر صفر هم فقط در روتین وقفه پیکره بندی و استفاده شده.
    برای درک بهتر حتماً به دیتاشیت میکروکنترلر مراجعه کنید.

    در روتین وقفه برای عدم مزاحمت منابع وقفه دیگه ، اونها رو غیر فعال کردیم( DISABLE INTERRUPT) .
    سپس با یک شرط چک میکنیم که آیا وقفه توسط پرچم وقفه ماژول CCP1 ایجاد شده یا خیر؟(if PIR1.2=1 then ).
    اگر جواب مثبت بود مراحل بعدی رو انجام میدیم. چون برای کنترل سروو موتور یک دوره تناوب 20ms نیاز است که این دوره تناوب توسط ماژول CCP1 ایجاد میشه. باتوجه به اینکه از کریستال 8Mhz استفاده کردید کلاک داخی برابر 2mhz میشه و برای تولید 20 میلی ثانیه تایمر 1 رو با همون کلاک 2Mhz راه اندازی کردیم. رجیستر های مقایسه واحد Compare (یعنی دو رجیستر CCPR1H و CCPR1L) مقدار تایمر رو با عدد 40000 مقایسه میکنند و در صورت برابری برنامه وارد وقفه میشه. همچنین برای کنترل سروو مدت یک بودن پالس در این دوره 20ms فقط بین 1 الی 2 میلی ثانیه میتونه باشه .بنابراین ما این تایم رو داخل سرویس وقفه ایجاد میکنیم به این ترتیب که اون رو به دو بخش تقسیم کردیم. بخش اول که یک زمان ثابت حدود 1 میلی ثانیه است که توسط دستور PAUSEUS 990 تولید شده و زمان بین 1ms تا 2ms توسط تایمر صفر به صورت تقریبی تولید میشه. علت اینکه بخش ثابت رو دقیق 1 میلی ثانیه انتخاب نکردیم تاخیر هایی هست که اجرای دستورات بعدی برای راه اندازی تایمر و غیره ایجاد میکنند.
    تایمر صفر هم توسط مقدار دهی به رجیستر OPTION_REG راه اندازی میشه که برای درک اون به دیتاشیت یا لینک معرفی شده باید مراجعه کنید.

    دیدگاه


      #3
      پاسخ : توضیح چند خط کد به زبان بیسیک

      از بنده هم عرض سلام و تشکر فراوان جناب perfect ، همونطور که تو نوشتن برنامه ی اخیر که تو پست قبلی عرض کردم، حوصله و دقت به خرج داده بودید، و لطف کرده و برنامه ی کنترل سرووها رو نوشتید، این بار هم بنده رو شرمنده ی الطاف خودتون فرمودید :redface: امیدوارم از پس جبرانش بر بیام.
      و امیدوارم سوال بنده رو خدای نکرده حمل بر جسارت، نگذارید و همه رو به پای کم سوادیم قرار بدید.

      نوشته اصلی توسط Perfect
      برای دریافت بخشی از پاسخ سوالاتون به آدرس زیر مراجعه کنید.
      http://www.eca.ir/forum2/index.php?t...5312#msg285312
      تایپیک بسیار مفیدی بود البته بنده قبلا تا جاهاییش رو پیگیر بودم اما متاسفانه پستهای جدیدش رو ندیده بودم.

      نوشته اصلی توسط Perfect
      در این برنامه از ماژول CCP1 در مد Compare همراه با ریست تایمر یک در زمان برابری مقایسه استفاده شده. که این تنظیمات توسط رجیستر CCP1CON انجام شده.
      تایمر صفر هم فقط در روتین وقفه پیکره بندی و استفاده شده.
      برای درک بهتر حتماً به دیتاشیت میکروکنترلر مراجعه کنید.

      در روتین وقفه برای عدم مزاحمت منابع وقفه دیگه ، اونها رو غیر فعال کردیم( DISABLE INTERRUPT) .
      سپس با یک شرط چک میکنیم که آیا وقفه توسط پرچم وقفه ماژول CCP1 ایجاد شده یا خیر؟(if PIR1.2=1 then ).
      اگر جواب مثبت بود مراحل بعدی رو انجام میدیم. چون برای کنترل سروو موتور یک دوره تناوب 20ms نیاز است که این دوره تناوب توسط ماژول CCP1 ایجاد میشه. باتوجه به اینکه از کریستال 8Mhz استفاده کردید کلاک داخی برابر 2mhz میشه و برای تولید 20 میلی ثانیه تایمر 1 رو با همون کلاک 2Mhz راه اندازی کردیم. رجیستر های مقایسه واحد Compare (یعنی دو رجیستر CCPR1H و CCPR1L) مقدار تایمر رو با عدد 40000 مقایسه میکنند و در صورت برابری برنامه وارد وقفه میشه. همچنین برای کنترل سروو مدت یک بودن پالس در این دوره 20ms فقط بین 1 الی 2 میلی ثانیه میتونه باشه .بنابراین ما این تایم رو داخل سرویس وقفه ایجاد میکنیم به این ترتیب که اون رو به دو بخش تقسیم کردیم. بخش اول که یک زمان ثابت حدود 1 میلی ثانیه است که توسط دستور PAUSEUS 990 تولید شده و زمان بین 1ms تا 2ms توسط تایمر صفر به صورت تقریبی تولید میشه. علت اینکه بخش ثابت رو دقیق 1 میلی ثانیه انتخاب نکردیم تاخیر هایی هست که اجرای دستورات بعدی برای راه اندازی تایمر و غیره ایجاد میکنند.
      تایمر صفر هم توسط مقدار دهی به رجیستر OPTION_REG راه اندازی میشه که برای درک اون به دیتاشیت یا لینک معرفی شده باید مراجعه کنید.
      ok، بسیار ممنون مهندس، خیلی چیزا برام روشن شد.
      فقط یه نکته باقی میمونه اونم این که اگر بزرگواری کنید و معادل باینری مقادیر 0b$, $9c, $40 و 01$ رو لطف بفرمائید، یک دنیا سپاسگذار میشم ازتون.
      زندگی برگ بودن در مسیر باد نیست
      امتحان ریشه هاست
      ریشه هم هرگز اسیر باد نیست
      زندگی چون پیچک است
      انتهایش میرسد پیش خدا!

      دیدگاه


        #4
        پاسخ : توضیح چند خط کد به زبان بیسیک

        نوشته اصلی توسط pama
        فقط یه نکته باقی میمونه اونم این که اگر بزرگواری کنید و معادل باینری مقادیر 0b$, $9c, $40 و 01$ رو لطف بفرمائید، یک دنیا سپاسگذار میشم ازتون.
        اینها مقادیر hex هستند که در زبان بیسیک به این صورت نوشته میشن. معادل باینری اونها :
        $40=%01000000
        $9c=%10011100
        $0b=%00001011
        $01=%00000001

        دیدگاه


          #5
          پاسخ : توضیح چند خط کد به زبان بیسیک

          نوشته اصلی توسط Perfect
          اینها مقادیر hex هستند که در زبان بیسیک به این صورت نوشته میشن. معادل باینری اونها :
          $40=%01000000
          $9c=%10011100
          $0b=%00001011
          $01=%00000001
          آقا بسیار ممنون، چیزی نمیتونم بگم جز اینکه یک دنیا سپاسگذارم. :smile:
          زندگی برگ بودن در مسیر باد نیست
          امتحان ریشه هاست
          ریشه هم هرگز اسیر باد نیست
          زندگی چون پیچک است
          انتهایش میرسد پیش خدا!

          دیدگاه


            #6
            راهنمائی در مورد برنامه ای برای خوندن فرکانس

            با سلام خدمت همه ی دوستان و اساتید محترم.
            دوستان بنده با استفاده از وقفه ی خارجی میکرو pic16f877a و pic basic pro و راهنمائی یکی از دوستان، برنامه ای رو برای خوندن فرکانس، که مربوط به خروجی یک سنسور هست رو نوشتم، منتها وقتی یه lcd رو بهش میزنم برای اینکه بتونم خروجی رو ببینم، به جای رنج فرکانسم که از 4 تا 130 هرتز هست، فقط عدد 0 و 1 رو میبینم، از سخت افزارم مطمئنم و میدونم مشکل از برنامه هست اما کجاش نمیدونم!!
            از دوستان محترم خواهشمندم، لطفا راهنمائیم بفرمایند.
            اینم برنامه:

            define osc 8
            @ DEVICE PIC16F877A ,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_ON ,HS_OSC ,BOD_OFF
            f_temp var word
            f var word

            define DEBUG_MODE 1
            DEFINE DEBUG_BAUD 9600
            define lcd_dreg portd
            define lcd_dbit 4
            define lcd_rsreg portd
            define lcd_rsbit 2
            define lcd_ereg portd
            define lcd_ebit 3
            define lcd_bits 4
            define lcd_lines 2

            trisb.0 = 1


            on interrupt goto lable
            intcon = $90

            main:
            f_temp = 0
            pause 250
            f = f_temp

            lcdout $fe, 1
            lcdout "fr="
            lcdout $fe, $14
            lcdout #f

            goto main

            disable
            lable:
            f_temp = f_temp + 1
            intcon.1 = 0
            resume
            enable

            end

            نکته ای که وجود داره اینه که مهمه که همونطور که تو برنامه رعایت شده حتما فرکانس تو 250 میلی ثانیه خونده بشه.
            زندگی برگ بودن در مسیر باد نیست
            امتحان ریشه هاست
            ریشه هم هرگز اسیر باد نیست
            زندگی چون پیچک است
            انتهایش میرسد پیش خدا!

            دیدگاه

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