اطلاعیه

Collapse
No announcement yet.

جدا کردن عدد از کارکتر در بسکام

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

    #16
    نوشته اصلی توسط evergreen نمایش پست ها

    با سلام و احترام
    کد:
    Dim N As Word
    Dim D1 As Byte
    Dim D2 As Byte
    Dim D3 As Byte
    Dim D4 As Byte
    Dim D5 As Byte
    
    N = 50080
    
    D1 = N / 10000
    D2 = (N Mod 10000) / 1000
    D3 = (N Mod 1000) / 100
    D4 = (N Mod 100) / 10
    D5 = N Mod 10​
    داداش اینو اصلا بیسکام ارور میگیره
    { خلاف قوانین - پاک شد }

    دیدگاه


      #17
      نوشته اصلی توسط r-el نمایش پست ها
      و اینکه یه مشکل دیگه هم دارم داخل این برنامه به نظر شما ایراد کجای کاره که هرچی هم پالس میدم وارد وقفهt1 نمیشه؟


      الان باید مقدار 253 رو نشون بده ، داخل حلقه لوپ نشون میده داخل لیبل t1 نشون نمیده
      با سلام
      برای استفاده از وقفه ها باید ابتدا با مفاهیم و اصول آن آشنا شوید.
      چون توضیح آن بطوریکه مفهوم را کاملا برساند با چند خط نوشتن ممکن نیست میتوانید ابتدا از فیلمهای آموزشی موجود در آپارات و یا سایر سایتها استفاده کنید.
      حتما هم لازم نیست مربوط به بسکام باشه چون اصول و ساختار وقفه تقریبا مشترکه.
      اینکه در روتین وقفه از do...loop و یا gosub استفاده نموده اید نشان میده که بهتره ابتدا وقت بیشتری برای مطالعه و بررسی فلسفه استفاده و اصول و قواعد آن بگذارید.
      موفق باشید.

      دیدگاه


        #18
        داداش من حلقه روهم حذف کردم مشکل اینجاست که اصلا داخل t1 وارد نمیشه این دو و لوپ هم مال تست خودم بود اینجا پاکش نکردم
        دقت کنید مقدار دستی دادم که فقط با اولین پالس وارد لیبل بشه و عدد رو نشون بده
        کل وقفه رو داخلشو پاک کردم فقط یه متغیر گذاشم با اولین پالس یکی اضافه کنه ، تایمر و کانتر هم استپ شدن و عدد رو نمایش دادم باز فرقی نمیکنه
        ضمنا همین برنامه رو با کانتر0 اجرا کردم درسته و مشکلی هم نداره مشکل اینه که با کانتر 1 کار نمیکنه جای تایمر و کانتر 0 و 1 رو جابجا میکنم هیچ مشکلی نیست با همین do و loop
        جدیدترین ویرایش توسط r-el; ۱۸:۳۲ ۱۴۰۵/۰۶/۲۱.
        { خلاف قوانین - پاک شد }

        دیدگاه


          #19
          نوشته اصلی توسط r-el نمایش پست ها
          داداش من حلقه روهم حذف کردم مشکل اینجاست که اصلا داخل t1 وارد نمیشه این دو و لوپ هم مال تست خودم بود اینجا پاکش نکردم
          دقت کنید مقدار دستی دادم که فقط با اولین پالس وارد لیبل بشه و عدد رو نشون بده
          کل وقفه رو داخلشو پاک کردم فقط یه متغیر گذاشم با اولین پالس یکی اضافه کنه ، تایمر و کانتر هم استپ شدن و عدد رو نمایش دادم باز فرقی نمیکنه
          ضمنا همین برنامه رو با کانتر0 اجرا کردم درسته و مشکلی هم نداره مشکل اینه که با کانتر 1 کار نمیکنه جای تایمر و کانتر 0 و 1 رو جابجا میکنم هیچ مشکلی نیست با همین do و loop
          با سلام و احترام

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

          کد:
          Config Timer1 = Counter , Edge = Falling
          On Ovf1 t1​
          لطفا دلیل استفاده از این دو خط را توضیح دهید تا بتوانیم قدم به قدم با هم مشکل را حل کنیم.

          موفق باشید.

          دیدگاه


            #20
            داداش اینا رو حذف کردم . ببین من در حال تست برنامه ام مدام اینو حذف میکنم یچیز دیگه مینویسم بعد کنترلz میزنم و...اینجوریه که برنامه قاطی شده من برنامه رو همینجا که کپی کردم قبل ارسال باز یسری چیزارو حذف کردم اینو نکردم
            تو برنامه اصلی من با وقفه 0 کار میکنم با پالس وارد وقفه میشه وقتی تغییر میدم به وقفه 1 دیگه با پالس وارد نمیشه که دیچه بیخیالش شدم چون فکرکنم پایه میکرو خرابه.دقیقا همون برنامه رو از 0 به 1 تغییر میدم کار نمیکنه دوباره صفرش میکنم کار میکنه
            { خلاف قوانین - پاک شد }

            دیدگاه


              #21
              نوشته اصلی توسط r-el نمایش پست ها
              داداش اینا رو حذف کردم . ببین من در حال تست برنامه ام مدام اینو حذف میکنم یچیز دیگه مینویسم بعد کنترلz میزنم و...اینجوریه که برنامه قاطی شده من برنامه رو همینجا که کپی کردم قبل ارسال باز یسری چیزارو حذف کردم اینو نکردم
              تو برنامه اصلی من با وقفه 0 کار میکنم با پالس وارد وقفه میشه وقتی تغییر میدم به وقفه 1 دیگه با پالس وارد نمیشه که دیچه بیخیالش شدم چون فکرکنم پایه میکرو خرابه.دقیقا همون برنامه رو از 0 به 1 تغییر میدم کار نمیکنه دوباره صفرش میکنم کار میکنه
              دوست عزیز، من اگه توصیه کردم قبل نوشتن کد، فلسفه و کارکرد وقفه را مطالعه کنید برای اینه که وقفه مبحثی است که اگر بخواهید با آزمون و خطا برید جلو معمولا جواب نمیده و شما رو خسته میکنه چون خودش انواع مختلفی داره و باید بدونید که هر وقفه چه زمانی فعال میشه و چه پارامترهایی را لازمه از قبل برایش تنظیم کنید.
              تنها بخشی از برنامه نویسی نوشتن کد و تست اون میباشد، قدم اصلی در موفقیت اینه که ابتدا ساختار داخلی میکروکنترلی که میخواهید برایش برنامه بنویسید را تا حد خوبی بشناسید، با اصول کلی سخت افزار مثل رجیسترها، ورودی-خروجیها، ADC، تایمرها، کانترها، PWM, وقفه ها و .... آشنا شوید.
              در مورد سوال آخر و اون دو خط کد هم نخواستم بگم نوشتن اونها غلطه، فقط خواستم متوجه بشم که آیا شما دقیقا میدونید که آن دو خط کد چه کاری انجام میده یا نه؟ اتفاقا دلیل اینکه میگید "با وقفه صفر کار میکنم و جواب نمیده و بیخیالش شدم چون فکر میکنم پایه خرابه" در همین دو خط کد میباشد.
              مطالب بالا را به عنوان تجربه با شما درمیان گذاشتم، امیدوارم برایتان مفید باشد.

              دیدگاه


                #22
                نوشته اصلی توسط r-el نمایش پست ها
                داداش اینا رو حذف کردم . ببین من در حال تست برنامه ام مدام اینو حذف میکنم یچیز دیگه مینویسم بعد کنترلz میزنم و...اینجوریه که برنامه قاطی شده من برنامه رو همینجا که کپی کردم قبل ارسال باز یسری چیزارو حذف کردم اینو نکردم
                تو برنامه اصلی من با وقفه 0 کار میکنم با پالس وارد وقفه میشه وقتی تغییر میدم به وقفه 1 دیگه با پالس وارد نمیشه که دیچه بیخیالش شدم چون فکرکنم پایه میکرو خرابه.دقیقا همون برنامه رو از 0 به 1 تغییر میدم کار نمیکنه دوباره صفرش میکنم کار میکنه
                در پست قبل نصیحت ها تموم شد
                بریم سراغ اینکه چرا اون دو خط کد مهمه

                Config Timer1 = Counter , Edge = Falling
                این خط میگه که شما تمایل دارید از تایمر یک بعنوان کانتر استفاده نمایید.
                بخش دومش هم میگه چه زمانی بشماره، وقتی مینویسید Falling یعنی میخواهید هر زمانی که پایه مربوطه ( بنابر دستور $regfile = "m16def.dat" که در اول برنامه نوشته اید و مربوط به ATmega16 میباشد، پایه مرتبط با تایمر یک پایه PD5 است ) لبه پایین رونده از یک به صفر را احساس کرد مقدار کانتر را یکی اضافه کنه.

                On Ovf1 t1​
                این خط هم میگه شما میخواهید هنگامی که وقفه سرریز Timer1 رخ داد برنامه به لیبل t1 بره و روتین وقفه را که آنجا نوشته اید اجرا کنه. خب حالا با توجه به این خط چه زمانی به اون روتین خواهد رفت؟
                تایمر یک در ATmega16 یک تایمر 16 بیتی است بنابراین وقتی سرریز خواهد شد که شما در پایه PD5 به تعداد 65536 بار لبه پایین رونده ایجاد کنید بطوریکه کانتر به ماکزیمم عدد 16 بیتی خود برسد و دوباره صفر شود.


                ​

                دیدگاه

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