اطلاعیه

Collapse
No announcement yet.

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

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

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

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

    برای ابتدا در مورد روشهای اسکن 7 سگمنت من از این روش استفاده میکنم نظر شما چیه ؟

    موارد نیاز
    1 - یکی از تایمرهارو با پروید حدود 10 تا 50 کلو هرتز تنظیم میکنم
    2 - جدول یا یه ارایه با مقادیر مورد نیاز برای نمایش اعداد یا حروف روی سگمنت ایجاد میکنم
    3 - اگر فرض رو بر این بزاریم که 8 تا سگمنت داریم به دو پرت میکرو نیاز دارم (مشترک این سگمنتهارو SCAN و دیتا رو DATA دیفاین میکنم)

    حالا پروسه برنامه داخل اینتراپت تایمر

    1- مقدار SCAN رو صفر میکنم
    2 - یه تاخیر خیلی کوچیک برای حذف سایه و خاموش شدن سگمنتها
    3 - مقدار متناسب رو بعد از محاسبه از جدول که قبلا درست کردم داخل پرت DATA میریزم
    4 - بعد بیت متناظر با متغیر dg رو از پرت SCAN یک میکنم
    5 - یک واحد به مقدار متغیر dg اضافه میکنم
    6 - چک میکنیم که متغیر dg از 7 بزرگتر نشه اگر بشه صفر میکنیم و از اینتراپت خارج میشیم

    یه برنامه کوچیک هم میزارم البته من این برنامرو توی C نوشتم ولی شما روش رو یاد بگیرید میتونید خودتون توی هر زبانی استفاده کنید نه ؟



    #define DATA PORTA
    #define SCAN PORTB
    unsigned char Cdgit[8];
    unsigned char dg;
    flash unsigned char nom[]=
    {
    // ! " # $ % & ' ( ) * + , - . /
    0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,64 ,0 ,0 ,

    // 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
    63 ,6 ,91 ,79 ,102,109,125,7 ,127,111,0 ,0 ,0 ,0 ,0 ,0 ,

    // @ A B C D E F G H I J K L M N O
    0 ,119,124,57 ,94 ,121,113,61 ,118,48 ,14 ,120,56 ,85 ,84 ,63 ,

    // P Q R S T U V W X Y Z [ \ ] ^ _
    115,103,80 ,109,120,62 ,50 ,29 ,100,110,73 ,0 ,0 ,0 ,0 ,0 ,

    // ` a b c d e f g h i j k l m n o
    99 ,119,124,88 ,94 ,121,113,61 ,116,48 ,14 ,120,56 ,85 ,84 ,92 ,

    // p q r s t u v w x y z { | } ~
    115,103,80 ,109,120,28 ,50 ,29 ,100,110,73 ,0 ,0 ,0 ,0 ,
    };

    interrupt [TIM2_COMP] void timer2_comp_isr(void)
    {
    SCAN = 0;
    delay_us(5);
    DATA = nom[Cdgit[dg] - 32];
    SCAN |= (1<<dg);
    dg++;
    if(dg > 7)dg = 0;
    }
    تجربه معلم خشنی هست اول امتحان میگیره بعد درس میده !!!
    به دلیل برخی مشکلات بوجود اماده دیگه امکان ادامه فعالت در این انجمن مقدور نیست.

    #2
    پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

    با سلا .ممنون از شما میشه بگید این برنامتون چیا روی سون سگمنت نشون میده؟واینها را چه جوری بدست آوردی
    // ! " # $ % & ' ( ) * + , - . /
    0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,64 ,0 ,0 ,

    دیدگاه


      #3
      پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

      نوشته اصلی توسط زوار
      با سلا .ممنون از شما میشه بگید این برنامتون چیا روی سون سگمنت نشون میده؟واینها را چه جوری بدست آوردی
      // ! " # $ % & ' ( ) * + , - . /
      0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,64 ,0 ,0 ,
      زوار جان اونهایی که مقدار متناظرشون صفره نمیشه توی سگمت های 7 قسمتی نشون داد
      ولی اونهایی که مقدار دارن رو میتونید نشون بدید

      a = بیت 0
      b = بیت 1
      c = بیت 2
      d = بیت 3
      e = بیت 4
      f = بیت 5
      g = بیت 6
      تجربه معلم خشنی هست اول امتحان میگیره بعد درس میده !!!
      به دلیل برخی مشکلات بوجود اماده دیگه امکان ادامه فعالت در این انجمن مقدور نیست.

      دیدگاه


        #4
        پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

        از پاشخت ممنونم تاپیک خوبی راه انداختی منم برای خوندن کلید و تنظیمات یه روتین دارم امروز یا فردا میذارم البته میخوام اساتید نظر بدن برای بهتر شدنش اما تاپیک خیلی خوبی میشه اگر همه همکاری کنند من این قسمت برنامه را متوجه نمیشم DATA = nom[Cdgit[dg] - 32];
        اینی که گذاشتی Cdgit[dg] برای چیه و چه جوری باید مثلا حرف a را انتخاب کرد؟

        دیدگاه


          #5
          پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

          تاپیک خوبی را ایجاد کردید و از شما تشکر می کنم. در روالی که برای Refresh کردن 7segment توضیح دادید، به لحاظ زمانی و پردازشی اشکالاتی مشاهده می شود. زمان مناسب برای Refresh کردن در محدوده نیم تا 2 میلی ثانیه کفایت می کند و با افزایش بیشتر تعداد وقفه ها، CPU بدون جهت زیر بار می رود که اگر بار پردازشی آن زیاد باشد، ممکن است تعداد وقفه های بالا ایجاد مشکل کند. اگر در محدوده ای که شما ذکر کردید، بدترین شرایط را که 50 کیلوهرتز است در نظر بگیریم، این بدین معنی است که هر 20 میکروثانیه یک وقفه اتفاق می افتد. حال با وجود این فرض، ببینیم که وجود خط زیر در برنامه چه تبعاتی را ایجاد می کند:

          کد:
          delay_us(5);


          اگر در هر 20 میکروثانیه، CPU بخواهد 5 میکروثانیه معطل بماند، این بدان معناست که عملا یک چهارم توان پردازشی میکروکنترلر بخاطر همین دستور بدون استفاده شده است. مشکل دوم این دستور این است که کل 7segment ها به غیر از خاموشی ناشی از تکنیک Refresh، در عمل در یک چهارم تمام زمان ها بصورت اضافه خاموش می مانند و بنابراین نور آنها کاهش می یابد. حال اگر زمان وقفه را بجای 20 میکروثانیه، مثلا 1 میلی ثانیه قرار دهید، اولا بار پردازشی CPU به همان نسبت از نظر اجرای روتین وقفه کاهش می یابد و دیگر اینکه حضور تاخیر مذکور اصلا لازم نیست و می توانید بدون آنکه مشکل ایجاد سایه بوجود آید، آن را حذف کنید.
          به عنوان یک توضیح تکمیلی، اگر در برنامه روتین هایی مانند تشخیص صفحه کلید مورد نیاز باشد، می توان در همین روتین وقفه یک شمارنده نرم افزاری را به تعداد مناسب افزایش داد و بعد از رسیدن آن به ضریب مورد نظر ( بین 20 تا 40 بار که معادل 20 تا 40 میلی ثانیه است) عملیات خواندن صفحه کلید را انجام داد که این خواندن با فاصله در حکم یک Debouncing نرم افزاری است.
          اوژن: به معنای افکننده و شکست دهنده است
          دانایی، توانایی است-Knowledge is POWER
          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

          دیدگاه


            #6
            پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

            با عرض سلام خدمت اساتید
            با اجازه اساتید من هم یک برنامه برای 7سگمنت های چهار رقمی البته با بسکام نوشته ام ولی یک مشکلی دارم اینکه نمی دونم اعداد اعشاری رو چجوری نشون بدم ، توی جدول اعداد با اعشار روهم نوشتم اما نتونستم ازشون استفاده کنم :
            کد:
            $regfile = "m8def.dat"
            $crystal = 8000000
            '----------------------
            Ddrd = &H0F
            Ddrb = &HFF
            '-----------------------------------------
            Config Timer0 = Timer , Prescale = 8
            Stop Timer0
            Tcnt0 = 6
            Enable Ovf0
            On Ovf0 T0
            Enable Interrupts
            Start Timer0
            '--------------------------------------
            Dim A(8) As Byte , B As Single , Temp(2) As Single
            '--------initial value---------------
            Portb = &HC0
            Portd = &H80
            '-------------------------------------
            Do
            '---B : quantity of 7segment------------------
            B = 4501
            Gosub Column
            Loop
            End 'end program  
            '-----------------------------------
            T0:
            Tcnt0 = 6
            Rotate Portd , Left
            Portb = Lookup(a(portd) , Table)
            If Portd = &H10 Then Portd = &H80
            Return
            '---------------------------------
            Table:
            Data &HC0 , &HF9 , &HA4 , &HB0 , &H99 , &H92 , &H83 , &HF8 , &H80 , &H98_
              , &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H03 , &H78 , &H00 , &H18
            '-------------
            Column:
            '--------A(1) TO A(8) : calculate columns of 7segment------
            Temp(1) = B / 1000
            A(1) = Fix(temp(1))
            Temp(2) = A(1) * 1000
            B = B - Temp(2)
            '..................
            Temp(1) = B / 100
            A(2) = Fix(temp(1))
            Temp(2) = A(2) * 100
            B = B - Temp(2)
            '..................
            Temp(1) = B / 10
            A(4) = Fix(temp(1))
            Temp(2) = A(4) * 10
            B = B - Temp(2)
            '...............
            A(8) = B
            '---------------------------------------
            Return
            این هم کل فایل ها بهمراه فایل پرتئوسش : 7SEGMENT.rar

            دیدگاه


              #7
              پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

              گاهی این امکان وجود دارد که برای صرفه جویی در حافظه و زمان در عین استفاده از اعداد میز دار، اعداد را بصورت صحیح و 10n برابر در نظر بگیریم و فقط در هنگام نمایش، نقطه 7segment مربوطه را روشن کنیم. مثلا اگر منظور نمایش دمای 21.3 درجه روی 7segment است بجای کار با متغیر اعشاری 21.3 می توان عملیات را با 213 انجام داد و فقط نقطه مربوط به 7segment دوم را همیشه موقع نمایش روشن کرد.
              اوژن: به معنای افکننده و شکست دهنده است
              دانایی، توانایی است-Knowledge is POWER
              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

              دیدگاه


                #8
                پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

                سلام به همه دوستان
                منم یه سوال داشتم مطرح میکنم وقن داشتین بعد از این موضوع من رو هم راهنمایی کنین
                من می خوام واسه 16 انتخاب 16 پسورد مختلف 4 رقمی داشته باشم
                با بسکام کار میکنم
                کوتاه ترین برنامه ای که میتونم داشته باشم چیه ؟
                به هر انتخاب از 16 انتخاب یه متغیر بدم اینجوری باید اعدادی که وارد میشن رو چطور تو این متغیر ذخیره کنم ؟
                یا اینکه به هر حالت یه ارایه 4 عنصری بدم و هر عددی که وارد میشه رو بترتیب تو عنصر های ارایه ذخیره کنم
                و زمانی که داره از پسورد میشه اعداد ورودی رو در یک ارایه 4 عنصری نگه دارم و در مرحله مقایسه عناصر ارایه ذخیره شده مربوطه به اون 16 انتخاب مورد نظر رو به ترتیب عناصر ورودی مقایسه کنم .
                اگه سوالم رو خوب مطرح نکردم لطفا بگین و بپرین تا بیشتر توضیح بدم

                دیدگاه


                  #9
                  پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

                  نوشته اصلی توسط طراح
                  گاهی این امکان وجود دارد که برای صرفه جویی در حافظه و زمان در عین استفاده از اعداد میز دار، اعداد را بصورت صحیح و 10n برابر در نظر بگیریم و فقط در هنگام نمایش، نقطه 7segment مربوطه را روشن کنیم. مثلا اگر منظور نمایش دمای 21.3 درجه روی 7segment است بجای کار با متغیر اعشاری 21.3 می توان عملیات را با 213 انجام داد و فقط نقطه مربوط به 7segment دوم را همیشه موقع نمایش روشن کرد.
                  ممنون استاد
                  درستش کردم ، الان می تونه اعداد رو از 0.001 تا 9999 نشون بده .
                  البته یک چیزی حدود 6 درصد به حافظه اشغال شده از فلش اضافه شد . از 21 درصد به 27 درصد رسید به همراه یک تاخیر زمانی توی نمایش که البته توی پرتئوس خودش رو نشون نمیده نمی دونم به نظرتون امکان داره توی عمل در نمایش با مشکل مواجه بشه ؟

                  کد:
                  $regfile = "m8def.dat"
                  $crystal = 8000000
                  '----------------------
                  Ddrd = &H0F
                  Ddrb = &HFF
                  '-----------------------------------------
                  Config Timer0 = Timer , Prescale = 8
                  Stop Timer0
                  Tcnt0 = 6
                  Enable Ovf0
                  On Ovf0 T0
                  Enable Interrupts
                  Start Timer0
                  '--------------------------------------
                  Dim A(8) As Byte , B As Single , Temp(2) As Single
                  Dim F1 As Word , F2 As String * 16 , R(3) As Byte , L As Byte
                  '--------initial value---------------
                  Portb = &HC0
                  Portd = &H80
                  '-------------------------------------
                  Do
                  '---B : quantity of 7segment------------------
                  B = .6699
                  Gosub Aashar
                  Gosub Column
                  Loop
                  End                             'end program
                  '-----------------------------------
                  T0:
                  Tcnt0 = 6
                  Rotate Portd , Left
                  Portb = Lookup(a(portd) , Table)
                  If Portd = &H10 Then Portd = &H80
                  Return
                  '---------------------------------
                  Table:
                  Data &HC0 , &HF9 , &HA4 , &HB0 , &H99 , &H92 , &H82 , &HF8 , &H80 , &H90_
                       , &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00 , &H10
                  '-------------
                  Column:
                  '--------A(1) TO A(8) : calculate columns of 7segment------
                  Temp(1) = B / 1000
                  A(1) = Fix(temp(1))
                  Temp(2) = A(1) * 1000
                  A(1) = A(1) + R(1)
                  B = B - Temp(2)
                  '..................
                  Temp(1) = B / 100
                  A(2) = Fix(temp(1))
                  Temp(2) = A(2) * 100
                  A(2) = A(2) + R(2)
                  B = B - Temp(2)
                  '..................
                  Temp(1) = B / 10
                  A(4) = Fix(temp(1))
                  Temp(2) = A(4) * 10
                  A(4) = A(4) + R(3)
                  B = B - Temp(2)
                  '...............
                  A(8) = B
                  Return
                  '----------------------------------
                  Aashar:
                  F1 = Round(b)
                  F2 = Str(f1)
                  L = Len(f2)
                  Select Case L
                  Case 0:
                  B = B * 10000
                  Case 1:
                  B = B * 1000 : R(1) = 10 : R(2) = 0 : R(3) = 0
                  Case 2:
                  B = B * 100 : R(1) = 0 : R(2) = 10 : R(3) = 0
                  Case 3:
                  B = B * 10 : R(1) = 0 : R(2) = 0 : R(3) = 10
                  End Select
                  Return

                  این هم فایل ها : 7SEGMENT_V2.rar

                  دیدگاه


                    #10
                    پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

                    نوشته اصلی توسط حسام هاشم
                    سلام به همه دوستان
                    منم یه سوال داشتم مطرح میکنم وقن داشتین بعد از این موضوع من رو هم راهنمایی کنین
                    من می خوام واسه 16 انتخاب 16 پسورد مختلف 4 رقمی داشته باشم
                    با بسکام کار میکنم
                    کوتاه ترین برنامه ای که میتونم داشته باشم چیه ؟
                    به هر انتخاب از 16 انتخاب یه متغیر بدم اینجوری باید اعدادی که وارد میشن رو چطور تو این متغیر ذخیره کنم ؟
                    یا اینکه به هر حالت یه ارایه 4 عنصری بدم و هر عددی که وارد میشه رو بترتیب تو عنصر های ارایه ذخیره کنم
                    و زمانی که داره از پسورد میشه اعداد ورودی رو در یک ارایه 4 عنصری نگه دارم و در مرحله مقایسه عناصر ارایه ذخیره شده مربوطه به اون 16 انتخاب مورد نظر رو به ترتیب عناصر ورودی مقایسه کنم .
                    اگه سوالم رو خوب مطرح نکردم لطفا بگین و بپرین تا بیشتر توضیح بدم
                    منظورتون رو خوب متوجه نشدم. یعنی 16 تا یوزر دارید که هر کدوم 1 پسورد دارن؟
                    چه جوری یوزر ها انتخاب میشن؟
                    به نظرم بهتره که از آرایه استفاده کنید.مخصوصا اگه پسورد رو از کی پد میآ‌گیرید. به ازای هر کلید زده شده، عدد مربوط رو توی ارایه بریزید .دریافت اعداد که تموم شد میآ‌تونید با یه حلقه For-next (البته توی بیسکام. دستور معادل C رو بلد نیستم) هر عضو از آرایه اعداد دریافتی رو با آرایه محتوی پسورد اصلی مقایسه کنید .اگه همهآ‌ی اعضا برابر بودند، رمز صحیح وارد شده و اگه حتی یک عضو از آرایه ها نابرابر بودن، رمز اشتباهه.

                    دیدگاه


                      #11
                      پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

                      نوشته اصلی توسط طراح
                      تاپیک خوبی را ایجاد کردید و از شما تشکر می کنم. در روالی که برای Refresh کردن 7segment توضیح دادید، به لحاظ زمانی و پردازشی اشکالاتی مشاهده می شود. زمان مناسب برای Refresh کردن در محدوده نیم تا 2 میلی ثانیه کفایت می کند و با افزایش بیشتر تعداد وقفه ها، CPU بدون جهت زیر بار می رود که اگر بار پردازشی آن زیاد باشد، ممکن است تعداد وقفه های بالا ایجاد مشکل کند. اگر در محدوده ای که شما ذکر کردید، بدترین شرایط را که 50 کیلوهرتز است در نظر بگیریم، این بدین معنی است که هر 20 میکروثانیه یک وقفه اتفاق می افتد. حال با وجود این فرض، ببینیم که وجود خط زیر در برنامه چه تبعاتی را ایجاد می کند:

                      کد:
                      delay_us(5);


                      اگر در هر 20 میکروثانیه، CPU بخواهد 5 میکروثانیه معطل بماند، این بدان معناست که عملا یک چهارم توان پردازشی میکروکنترلر بخاطر همین دستور بدون استفاده شده است. مشکل دوم این دستور این است که کل 7segment ها به غیر از خاموشی ناشی از تکنیک Refresh، در عمل در یک چهارم تمام زمان ها بصورت اضافه خاموش می مانند و بنابراین نور آنها کاهش می یابد. حال اگر زمان وقفه را بجای 20 میکروثانیه، مثلا 1 میلی ثانیه قرار دهید، اولا بار پردازشی CPU به همان نسبت از نظر اجرای روتین وقفه کاهش می یابد و دیگر اینکه حضور تاخیر مذکور اصلا لازم نیست و می توانید بدون آنکه مشکل ایجاد سایه بوجود آید، آن را حذف کنید.
                      به عنوان یک توضیح تکمیلی، اگر در برنامه روتین هایی مانند تشخیص صفحه کلید مورد نیاز باشد، می توان در همین روتین وقفه یک شمارنده نرم افزاری را به تعداد مناسب افزایش داد و بعد از رسیدن آن به ضریب مورد نظر ( بین 20 تا 40 بار که معادل 20 تا 40 میلی ثانیه است) عملیات خواندن صفحه کلید را انجام داد که این خواندن با فاصله در حکم یک Debouncing نرم افزاری است.
                      با سلام به همه اساتید و دوستان محترم و تشکر از شما
                      جناب اقای کی نژاد من در کار اصلی به جای این دستور از NOP استفاده کردم و برای خاموش شدن سریع سگمنتها با یک مقاومت اری 1 کیلو به GND قرار دادم ولی برنامش به این چند خط محدود نمیشه امکان کنترل کنتراست و ... رو داره البته با تکنیک Debouncing نرم افزاری که شما فرمودید و کلی مخلفات و افکتهای نمایش دیگه
                      منظور بنده هم از ایجاد این تاپیک اینه که در مورد همین تکنیکها صحبت بشه

                      حالا که بحث اینچنین مورد توجه قرار گرفته یخورده شرایط رو تنگتر میکنم و یه سوال خیلی خوب رو مطرح میکنم که میدونم به درد همه دوستان میخوره
                      فرض کنید یه میکرویی داریم که فقط 10 تا پین IO داره و میخوایم باهاش 8 تا سگمنت و 8 تا کلید رو سکن کنیم اینطوری چه پیشنهادهایی دارید ؟
                      بیشتر کسایی که با AVR و زبان برنامه نویسی بیسیک میکرو یا حتی الکترونیک رو شروع کردند به دلید تنوع بالای این میکرو قیمت کم اون نیاز نداشتند که یه همچین کارهایی بکنند ولی وقتی کمی بیشتر کار میکنی و تجربه ها بالا میره به نصبت همین تجارب کارها و پروژه ها هم سنگینتر میشه و وقتی خودت وارد بازار کار میشی و میبینی مثلا 100 تومان خالی توی تولید چند هزارتایی میخونه وادار به همچین کارهایی میشی
                      بطور مثال بنده یک برد اسانسور ساده 16 طبقه رو اگر بگم چند تا ورودی و خروجی داره شاید باورتون نشه که این کار با این تعداد IO چطور با یه 89c55 یا mega32 خدمون قابل اجرا هست
                      1- حدود 16 ورودی برای سنس سنسورها و میکرو سوئچ ها
                      2 - حدود 6 ورودی 110 ولت برای سنس قسمتهای ایمنی اسانسور معروف به سری استپ
                      3 - حدود 10 خروجی رله برای کنترل قسمتهای مختلف اسانسور از کنتاکتور یا درایو گرفته تا روشنایی اسانسور
                      4 - حدود 8 خروجی با جریان حدود 1 امپر 24 ولت برای سگمنتهای داخل کابین و راهپله
                      5 - 16 ورودی برای سنس شستی های راه پله
                      6 - 16 خروجی بافرشده 24 ولت برای LED های روی شستیهای راه پله
                      7 - 16 ورودی برای سنس شستی های داخل کابین
                      8 - 16 خروجی بافرشده 24 ولت برای LED های روی شستیهای داخل کابین
                      میشه حدود 104 تا ورودی و خروجی ناقابل البته بدون مخلفاتی مثل پینهای I2C برای یه EEPROM خارجی یا یه همچین چیزهایی

                      البته من خودم خوب میدونم یه همچین کارهایی با ایسیهای لچ یا افزایش پرت قابل اجراست ولی خود این اجراش کلی دردسر و تجربه و سروکله زدن با نویز (اونهم وقتی قراره یه بمب نویزی مثل یه موتور 3 فاز القایی یا یه درایو موتور پیشت باشه)داره نه؟
                      سرتونو درد نیارم وقتی صحبت از بهینه شدن یه برنامه است و یا یاد گرفتن بهترین تکنیکها این مشکلات هستند که ادم رو وادار به تست و گشتن راه های دیگر و یا راه های بهتر میکنه
                      برای مثال بنده برای سخنگوی همین اسانسور شاید 50 نوع برد مختلف با 50 روش مختلف برای پخش یه فایل WAV امتحان کردم تا تونستم بهترین و با کیفیتترین و مقاومترین اونها در مقابل نویز رو طراحی کنم واقعا شاخ گولو شکوندم ها نه ؟ oo: البته اینها همه از بیسوادی بنده بوده ها :cry2: :cry:
                      از ادیسن پرسیدند چطور لامپ رو اختراع کردی گفت 99 راه پیدا کردم که باهاش لامپ درست نمیشه
                      تجربه معلم خشنی هست اول امتحان میگیره بعد درس میده !!!
                      به دلیل برخی مشکلات بوجود اماده دیگه امکان ادامه فعالت در این انجمن مقدور نیست.

                      دیدگاه


                        #12
                        پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

                        یه میکرویی داریم که فقط 10 تا پین IO داره و میخوایم باهاش 8 تا سگمنت و 8 تا کلید رو سکن کنیم اینطوری چه پیشنهادهایی دارید ؟
                        با سلام برای سون سگمنتها از شیفت رجیستر و برای کلیدها از یک کانال adc استفاده میکنیم سوادم بیشتر از این نیست :cry:اگه درست نبود بفرمایید تا یه راهی پیدا کنیم :read:

                        دیدگاه


                          #13
                          پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

                          نوشته اصلی توسط زوار
                          یه میکرویی داریم که فقط 10 تا پین IO داره و میخوایم باهاش 8 تا سگمنت و 8 تا کلید رو سکن کنیم اینطوری چه پیشنهادهایی دارید ؟
                          آقا ببخشید ، من میگم برای اسکن مثلا یک سگمنت 8 رقمی از یک دی کودر 3 به 8 که 3 تا پایه اش به میکرو و 8تا پایه اش هم به سگمن وصل بشه و برای اسکن کلید ها از یک انکودر 8 به سه استفاده کنیم 8 تا پایه اش به کلید ها و سه تا پایه اش هم به میکرو که این جوری 4 تا پایه اش هم میمونه که میشه اونو بدیم به یک bcd to 7segment که ورودی هاش که 4 تا هسند رو بدیم به میکرو و اون ور رو هم بدیم به سگمنت !؟؟؟

                          دیدگاه


                            #14
                            پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

                            حالا نظر شما در مورد این چیه؟ تازه من 8 تا LED هم بهش اضافه کردم
                            NET هایی که به میکرو وصل میشن D0 تا D7 و RST و CLK هستند که با هم میشه فقط 10 تا IO
                            در ضمن زوار جان IO یعنی فقط خروجی یا ورودی نه ADC ولی خوبه در مورد این روش هم بیشتر توضیح بدی تا برای همه قابل فهم بشه
                            اگر سگمنتها کاتد مشترک باشند میتونید از ULN2803 هم به جای ترانزیستورها استفاده کنید .


                            تجربه معلم خشنی هست اول امتحان میگیره بعد درس میده !!!
                            به دلیل برخی مشکلات بوجود اماده دیگه امکان ادامه فعالت در این انجمن مقدور نیست.

                            دیدگاه


                              #15
                              پاسخ : اشنایی با روشها و تکنیکهای بهینه برنامه نویسی همدیگه

                              با سلام
                              برای نمایش 8 عدد 7seg و اسکن 8 کلید:(با حداقل پورت/پین)
                              داده 8 بیتی را از طریق شیفت رجیستر 4094 و دو پین برای serial_out_data , clk1 و یک پین برای enable/disable فراهم می کنیم.
                              اسکن 8 ستون ( 7seg ) هم با serial_out_data , clk2 , نیز همان پین برای enable/disable فراهم می کنیم.
                              تا اینجا 4 پین نیاز داریم.

                              برای اسکن 8 کلید از شیفت رجیست ورودی موازی و خروجی سری استفاده می کنیم.
                              و با یکی از کلاکهای فوق و یک پین serial_data_in .
                              جمعا 5 پین نیاز دارد.

                              درباره فرکانس رفرش:
                              دقیقا مطالب جناب طراح را اجرا می کنیم.
                              بر اساس تجربه ، 7seg باید 50 یا 100 بار در ثانیه رفرش شود. (گاهی فرکانس های میانی باعث فلیکر در نور لامپهای 50 هرتزی می شوند )
                              با 8 سگمنت که به ترتیب روشن می شوند ، نیاز به 400 تا 800 هرتز در عملیات خروجی داریم
                              (2.5 یا 1.25 میلی ثانیه )

                              یک تایمر را برای اینتراپتهای مستمر در هر 1250 میکرو ثانیه ( یا 1000 میکرو ثانیه ) تنظیم می کنیم(1000 هرتز)
                              و در هر نوبت اینتراپت تمام مراحل ذیل را برای یک سگمنت تکرار می کنیم:
                              1- disable نمودن تغذیه سگمنتها در 1 تا 4 سایکل
                              2- ارسال 8 بیت داده به 4094 اولی + خواندن همزمان شیفت رجیست کلیدها در 40 تا 160 سایکل برای میکروهای مختلف
                              3- ارسال 8 بیت اسکن ستون به 4094 دومی در 20 تا 80 سایکل
                              4- enable نمودن تغذیه سگمنتها

                              بین 70 سایکل تا 250 سایکل در هر میلی ثانیه صرف نمایش سگمنت و کلیدها می شود.
                              و سایر ظرفیت میکروکنترلر برای سایر امور باقی می ماند.

                              با سپاس
                              گشتی در لاله زار
                              http://www.eca.ir/forum2/index.php?topic=76138.0

                              http://www.eca.ir/forum2/index.php?topic=76141

                              دیدگاه

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