اطلاعیه

Collapse
No announcement yet.

پروتکل ویگند

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

    #16
    پاسخ : پروتکل ویگند

    من هم تقریبا همین کار شما رو انجام دادم نمونه برنامه من اینجا هست

    http://www.4shared.com/file/9bbhEp8V/sanatgar_card_reader.html

    من با شروع خوندن کارت buzzer رو فعال میکنم و با گرفتم 26 بیت یا با گذشت زمان خاصی عمل خواندن کد رو تمام میکنم و buzzer خاموش میشه اما بعضی اوقات که کارت میزنم buzzer شروع میکنه به بوق زدن و قطع نمیشه نمی ذونم مشکل کجاست ؟ ...
    Don't hesitate to ask any question ..

    دیدگاه


      #17
      پاسخ : پروتکل ویگند

      سیاوش جان فکر میکنم برنامت احتیاج به یخورده کار اضافی داره
      من متوجه نشدم چرا صدایbeep رو با هر بار که پالسی به ورودی داده بشه فعال میکنی (حالا چه کارت بصورت صحیح خونده بشه یا نه شما صدای beep رو داری)
      به نظر من beep رو از تو وقفه ها حذف کن و بذار برا بعد از دیکد کردن دیتا
      مثلا اگه کارت ok بود با 3 تا بیپ کوچولو کارت رو تایید کنه یا اگه بیتها از 16 کمتر بود یا هر error دیگه یه بیپ ممتد یه ثانیه داشته باشی
      اگه هم اصراری هست که با هر پالس int0 یا int1 صدای بیپ در بیاد همونطور که خودت میدونی مطمئن ترین راهش اینه که از وقفه تایمر استفاده کنی یعنی با فعال شدن int0 یا int1 به یه متغییر مقدار میدیم و تو روتین وقفه تایمر علاوه بر کم کردن مقدار متغییر شرط یک بودنش رو چک میکنیم تا وقتی به صفر برسه اونوقت beep رو خاموش میکنیم
      کد:
      
      // External Interrupt 1 service routine
      interrupt [EXT_INT0] void ext_int0_isr(void)
      {
       Beep_on_timer=3;//1sec delay
       ...
       ...
       
      }
      
      // External Interrupt 1 service routine
      interrupt [EXT_INT1] void ext_int1_isr(void)
      {
       Beep_on_timer=3;//1sec delay
       ...
       ...
      }
      
      // Timer1 overflow interrupt service routine
      interrupt [TIM1_OVF] void timer1_ovf_isr(void)
      {
       if (!Beep_on_timer) Beep=0;
       else Beep_on_timer--; 
      }

      دیدگاه


        #18
        پاسخ : پروتکل ویگند

        ممنون
        این رو ننوشتم تا کاربردی باشه
        بعضی وقتها میدیدم میکرو کارت رو نمی خونه (کد کارت رو ارسال نمیکنه ) واسه همین تو اینتراپت ها beep رو فعالیدم (و غیر فعال نکردم ) تا زمانی که کد کارت کامل خونده بشه یا مدت زمان خاصی بگذره و سپس خاموش شه
        (توجه نکرده بودم که این beep داره با هربیت کارت مجددا فعال میشه گرچه تفاوتی هم نداره چون تا 26 بیت کامل نشه اصلا غیر فعال نمیشه پس این یه دستور بی فایده هست ...) اما مشکل اینجاست که چرا بعضی وقتها گیر میکنه و beep خاموش نمیشه ؟
        چطور میتونم در این برنامه از watchdog استفاده کنم ؟ به نظر شما مفید هست ؟
        Don't hesitate to ask any question ..

        دیدگاه


          #19
          پاسخ : پروتکل ویگند


          تو برنامه ای که شما نوشتی اگه بیتهای دریافتی برابر 26 یا کمتر از 26 بیت باشه beep خاموش میشه ولی اگه بهر دلیل تعداد پالسهایی که دریافت میشه بیشتر از 26 باشه برا همچین وضعیتی کدی تعریف نکردین
          یعنی کد زیر رو :

          if (i<26){
          i=0;
          reset1=0;
          beep=0;
          }

          به این کد تغییر بدین:
          if (i !=26){
          i=0;
          reset1=0;
          beep=0;
          }

          چطور میتونم در این برنامه از watchdog استفاده کنم ؟ به نظر شما مفید هست ؟
          مطمعنا فعالش کنی بهتره و اینکه wdr رو کجای برنامه بذاری هم که خودتون استادین آفا سیاوش :smile:
          اگه درست متوجه منظورتون شده باشم ساده ترینش قرار دادن wdr داخل لوپ اصلی برنامست

          دیدگاه


            #20
            پاسخ : پروتکل ویگند

            ممنون
            اگر مشکل از این باشه خیلی خوب میشه این قضیه که من شرطش رو کمتر از 26 بیت گذاشتم واسه یه برنامه دیگه بود بعد که آوردم اینجا کلا حواسم بهش نبود که ممکنه بیشتر از 26 بیت بشه
            در مورد watchdog هم باید بگم که من هیچ تجربه استفاده ازش ندارم و بر حسب اتفاق باهش آشنا شدم (دیدم میکرو من درست کار نمیکنه ...) تا جایی که من متوجه شدم وقتی فعایش میکنیم بعد باید هرجایی که زمانبر هست رو محاسبه بکنیم و با دستور خاصی اون رو غیر فعال کنیم درسته؟ این یعنی ما در هر حلقه یا ... باید مرتبا اون دستور رو بذاریم؟
            Don't hesitate to ask any question ..

            دیدگاه


              #21
              پاسخ : پروتکل ویگند

              watchdog یه تایمر سخت افزاریه که با اتمام شمارش و overflow شدن زمان تایمر باعث ریست شدن میکرو میشه
              تو حالت نرمال وقتی برنامه در حال اجرا باشه با یه فرمان asm("wdr" زمان این تایمر صفر میشه و عملا تو قسمتهای مختلف برنامه که توقف زیاده تایمر watchdog رو با همین دستور ریستش کنیم
              حالا اگه میکروی ما بدلیل وجود نویز هنگ کنه چون برنامه متوقف شده تایمر watchdog آور فلو میشه و میکرو رو ریست میکنه و میکرو دوباره به کار خودش ادامه میده

              واحد watchdog تو avr یه تایمر سخت افزاریه که کلاک اون ضریبی از فرکانس اسیلاتور هستش البته فرکانس
              ورودی به این تایمر هم با استفاده از codewizard کامپایلر codevision قابل تعریف هستش

              اما اینکه چه زمانهایی باید فرمان wdr رو بیاریم بستگی به تنظیمات تقسیم فرکانسی watchdog داره

              دیدگاه

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