اطلاعیه

Collapse
No announcement yet.

مشکل برنامه من"کلید زده نمی شود ولی عدد وارد می شود"

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

    مشکل برنامه من"کلید زده نمی شود ولی عدد وارد می شود"

    سلام دوستان
    مشکل این برنامه چیه؟ دیوونه شدم؟
    وقتی کلید حدود 11 ثانیه زده نشود الکی یه عدد وارد می شود
    من می خوام مثلا بعد 10 ثانیه که وارد نشد بیاد یه صفحه اصلی برگردد و همینطور در زمان وارد کردن رمز اگر * زده شد دوباره رمز(رمز ها پاک شود و حلقه دوباره رمز بگیرد) وارد شود و # زده شد بیاد به صفحه اصلی(display)
    لطفا کمکم کنید؟ :angry:
    اینم فایلش : http://s6.picofile.com/file/8185592126/444444444.rar.html

    #2
    پاسخ : مشکل برنامه من"کلید زده نمی شود ولی عدد وارد می شود"

    بچه ها یکی وقت بزاره جوابمو بده

    دیدگاه


      #3
      پاسخ : مشکل برنامه من"کلید زده نمی شود ولی عدد وارد می شود"

      سلام
      کلا getchar تا موقعی که اطلاعاتی دریافت نکنه صبر میکنه این یعنی که توی مدار شما یه اتفاقی می افته حدود 11 ثانیه.
      وقتی شما کلیدی از کیبورد رو فشار دهید مثلا 2 مقداری که در بافر سریال ذخیره میشه برابر 50 هست که معادل دسیمال کاراکتر 2 هست پس در شرطهای if مقدارهایی که وارد کردید رو با 48 جمع کنید
      داخل دستور for وقتی کلید 8 فشرده بشه صفحه پاک نمیشه و مقدار 56 (8 + 48) نمایش داده میشه

      بهتره که هر قسمت از پروژه رو در یک تابع بنویسید و در تابع main باتوجه به درخواست اون رو صدا بزنید.
      شبنم از سعی به سرچشمه خورشید رسید صائب تبریزی

      دیدگاه


        #4
        پاسخ : مشکل برنامه من"کلید زده نمی شود ولی عدد وارد می شود"

        تشکر آقا شهاب از این که جواب دادید یه سوال:
        چطوری می تونم برای تابع کیبورد و یا توابع دیگر شرط بزارم که بعد از 10 ثانیه کلید زده نشد از تابع بیاد بیرون؟

        دیدگاه


          #5
          پاسخ : مشکل برنامه من"کلید زده نمی شود ولی عدد وارد می شود"

          خواهش میکنم.

          در ابتدا getchar حذف کنید.
          1. شما میتونی بیت RXC از UCSRA رو دائم چک کنی و وقتی که یک شد مقدار UDR رو بخونی که بعد از خواندن UDR، به صورت خودکار بیت RXC از UCSRA صفر میشه و میتونی به کارهای دیگه برسی تا دو باره RXC یک بشه

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

          وقتی کلیدی از کیبورد فشرده شد شما مقدارش رو میخونی و یکی از تایمرها رو روشن میکنی و تنظیم میکنی با مقدار 0 (تایمر رو به تقسیم کننده کلاک میکرو با ضریب 1/1024 وصل میکنی و داخل یک if مقدار سرریز تایمر رو چک میکنی
          اگر مثلا شده بود و اگر تایمر سرریز کرده بود یک متغیر از نوع int رو یکی افزایش میدی. وقتی مقدار اون متغیر شد مثلا 10000 شما اون متغیر و تایمر رو 0 میکنی) وقتی مقدار متغیر به مقدار درخواستی شما رسید به روتین انتظار میری و منتظر میمونی تا کلیدی فشرده بشه. وقتی کلید فشرده شد تایمر و متغیر رو صفر میکنی و دوباره به کارها میرسی تا تایمر سرریز کنه یا اگر تعداد داده دریافتی شما به 10 عدد رسید کلا تایمر رو خاموش میکنی.

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

          دیدگاه


            #6
            پاسخ : مشکل برنامه من"کلید زده نمی شود ولی عدد وارد می شود"

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

            در ابتدا getchar حذف کنید.
            1. شما میتونی بیت RXC از UCSRA رو دائم چک کنی و وقتی که یک شد مقدار UDR رو بخونی که بعد از خواندن UDR، به صورت خودکار بیت RXC از UCSRA صفر میشه و میتونی به کارهای دیگه برسی تا دو باره RXC یک بشه

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

            وقتی کلیدی از کیبورد فشرده شد شما مقدارش رو میخونی و یکی از تایمرها رو روشن میکنی و تنظیم میکنی با مقدار 0 (تایمر رو به تقسیم کننده کلاک میکرو با ضریب 1/1024 وصل میکنی و داخل یک if مقدار سرریز تایمر رو چک میکنی
            اگر مثلا شده بود و اگر تایمر سرریز کرده بود یک متغیر از نوع int رو یکی افزایش میدی. وقتی مقدار اون متغیر شد مثلا 10000 شما اون متغیر و تایمر رو 0 میکنی) وقتی مقدار متغیر به مقدار درخواستی شما رسید به روتین انتظار میری و منتظر میمونی تا کلیدی فشرده بشه. وقتی کلید فشرده شد تایمر و متغیر رو صفر میکنی و دوباره به کارها میرسی تا تایمر سرریز کنه یا اگر تعداد داده دریافتی شما به 10 عدد رسید کلا تایمر رو خاموش میکنی.

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

            دیدگاه


              #7
              پاسخ : مشکل برنامه من"کلید زده نمی شود ولی عدد وارد می شود"

              سلام
              منظورم این نیست که کلا از getchar استفاده نکنی. بلکه وقتی متوجه شدی کاراکتری موجوده اون وقت از getchar استفاده کنی.
              کار با تایمرها مثل آبخوردنه.
              تایمرها در avr یا 8 بیت یا 16 بیت هستن.
              اگر در برنامه ای نیاز به یک زمان دقیق دارید یکی از تایمرهای میکرو رو در ابتدا با ضریبی از ساعت راه اندازی میکنید که در کدویژن باتوجه به کلاک اصلی میکرو مشخص میشن.
              یعنی چی ابتدا کلاک میکرو میاد توی یه مقسم که شما از طریق کدویژن مقدارش رو تعیین میکنید و خروجی مقسم میاد توی تایمر. در avr ها 3 بیت (8 حالت) برای مقسم در نظر گرفته شده که در دیتا شیت توضیح داده شده. یکی از این حالتها که برابر 0 هست یعنی تایمر خاموش.
              خوب فرض میکنیم شما مقدار مقسم رو گذاشتید 1024 و کلاک میکرو 8 مگاهرتز هست پس کلاک خروجی مقسم برابر 7812.5 هرتز و زمان هر پالس میشه 1 تقسیم بر 7812.5 که برابر با 128 میکروثانیه. و ما از تایمر 8 بیتی استفاده میکنیم که میشه 256 حالت پس 256 ضربدر
              128 میکروثانیه برابر با 32.768 میلی ثانیه. و برای تایمر 16 بیتی برابر با 8.388608 ثانیه. ولی در کاربردهای چند منظوره که نیاز به تایمر زیاده از تایمر 8 بیتی استفاده میکنن.
              کار با تایمر 8 بیتی و مقسم 1024: با هر بار سرریز تایمر شما به زمان 32.768 میلی ثانیه میرسی پس این تایمر باید 305 بار سر ریز کنه تا شما 9.99424 (10) ثانیه تاخیر داشته باشی.
              حالا یک متغیر میسازی از نوع (uint-16t (unsigned int و با هر بار سرریز تایمر یکی اضافه میشه و داخل برنامه چک میکنی که هر موقع شد 305 تایمر صفر بشه و یه کاری انجام بشه.
              میتونی از وقفه ها استفاده کنی که داخل وقفه تایمر اول چک میکنی که آیا متغیر برابر با 305 هست؟ اگر نه پس یکی اضافه بشه. و اگر بله که متغیر صفر بشه و تایمر خاموش بشه و اون عمل مورد درخواست شما انجام بشه.
              فقط باید یخورده وقت بذاری.
              موفق باشی
              شبنم از سعی به سرچشمه خورشید رسید صائب تبریزی

              دیدگاه

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