اطلاعیه

Collapse
No announcement yet.

رهیافت در کدویژن

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

    رهیافت در کدویژن

    سلام
    یه سری دستور رو می خوام بصورت ماژول در بیارم که مجبور نشم در طول برنامه هی تکرارشون کنم. در ضمن تعداد خطوط برنامه
    هم بصورت قابل ملاحظه ای کم میشه.
    و اما مشکل:
    مشل اینجاست که لازمه توی ماژول در هر بار فراخوانی، عملیات ها روی پین های متفاوتی اعمال بشن. در حال حاضر پین ها رو
    توسط define توسط کامپایلر جایگزین کردن.
    =====> چطور میشه توی کدویژن پین رو به یه تابع پاس کرد :question:

    متشکرم.



    #2
    پاسخ : رهیافت در کدویژن

    هر پورت یک یا چند ثبات کنترلی داره که در برنامه با اسم اونها رو میشناسیم در حالیکه در اصل اونها دارای آدرس های مشخصی هستند. با استفاده از آدرس بجای اسم میتونی با پینهای مختلف کار کنی. (اسامی پورتها هم در واقع در هدر فایلها با آدرس جایگزین میشن)

    دیدگاه


      #3
      پاسخ : رهیافت در کدویژن

      چطور میشه توی کدویژن پین رو به یه تابع پاس کرد
      خوب شماره پینی که باید تغییر بدی رو بفرست به تابع و با عملگر های منطقی کار مورد نظر رو انجام بدید.
      اگه تیکه ای از برنامه رو که میخوای تابع بشه رو بزاری من برات ردیفش میکنم.
      مثلا این تابع رو نگاه کن:Set_PORTB(n)
      این تابع ساده بیت n ام پورت B رو یک منطقی میکنه.برای بدنه ی تابع باید این جوری تعریف بشه:
      PORTB |=1<<n
      این یه مثال خیلی ساده بود.شما این کار رو به روش های مختلف میتونی انجام بدی.یادت نره C خیلی انعطاف پذیره و هر کاری که منطقی باشه رو میتونی توش انجام بدی. :agree:
      [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

      دیدگاه


        #4
        پاسخ : رهیافت در کدویژن

        سلام



        کد:
        void tester(int first_port,int first_pin,int second_port,second_pin)
        {
        	int a,b,c;
        	DDRIN(first_port,pin);
        	a=PIN(first_port,0);
        	DDRIN(second_port,pin);
        	b=PIN(second_port,0);
        	c=b;
        	b=a;
        	a=c;
        	DDROUT(first_port,pin);
        	PORT(first_port,pin)=a;
        	DDROUT(second_port,pin);
        	PORT(second_port,pin)=b; //end
        {

        رو چطور میشه انجام داد؟
        راستش می خوام لایبرری کنم یه کدی رو. لازم دارمش.

        دیدگاه


          #5
          پاسخ : رهیافت در کدویژن

          خوب برای این کار چند جور کار مختلف میشه انجام داد.ساده ترین و سریعترینش استفاده از ماکرو هاست.
          این تکه کد تقریبا همون کد شماست.راستش من برنامه ی شما رو درست متوجه نشدم که چی کار میخواد بکنه.
          یکم آرگومان هاش بیشتر شد که فکر نمیکنم مساله ای باشه.
          اگر وسط برنامه سوتی دیدید ببخشید چون الان ساعت 3 نصفه شبه و من تقریبا خوابم. oo:
          از قیافش هم نترسید.ساده تر از این حرفاست.
          کد:
          #define DDRIN(DDR,n)		DDR &=~(1<<n)
          #define read_pin(x,pin,n)	x=(pin &(1<<n))
          #define DDROUT(DDR,n)		DDR |=(1<<n)
          #define write_PORT(x,PORT,n)	if(x) PORT |=(1<<n);	else PORT &=~(1<<n)
          
          
          #define tester(firstddr,firstpin,firstport,n,secondddr,secondpin,secondport,m)		int a,b,c; \
          													DDRIN(firstddr,n); read_pin(a,firstpin,0); \
          													DDRIN(secondddr,m); read_pin(b,secondpin,0);\
          													c=b; b=a; a=c;\
          													DDROUT(firstddr,n); write_PORT(a,firstport,n);\
          													DDROUT(secondddr,m); write_PORT(b,secondport,m);
          													
          													
          void main()
          {
            tester(DDRA,PINA,PORTA,2,DDRB,PINB,PORTB,4);
          }												[left]
          [/left]
          [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

          دیدگاه


            #6
            پاسخ : رهیافت در کدویژن

            راستی اگر خواستی میشه برنامه رو ساده تر کرد و از enum ها هم استفاده کرد.
            مزیت استفاده از enum اینه که به جای ماکرو میتونی تابع تعریف کنی. :agree:
            [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

            دیدگاه

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