اطلاعیه

Collapse
No announcement yet.

چند تا سوال خیلی ساده درباره برنامه (( کنترل دور موتور dc ))دارم

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

    چند تا سوال خیلی ساده درباره برنامه (( کنترل دور موتور dc ))دارم

    سلام به همگی

    مدتی هست که روی پروژه کنترل دور موتور dc که جناب یار محمدی زحمت طراحی اون رو کشیده بودند کار میکنم و تقریبا جواب هم داده...

    حالا چند تا سوال درباره برنامه ی این پروژه و متغیر های اون دارم که ممنون میشم اگر جواب بدید

    برنامه اینه... البته کامنتها رو حذف کردم

    کد:
    #include <mega16.h>
    
    // Alphanumeric LCD Module functions
    #asm
      .equ __lcd_port=0x1B ;PORTA
    #endasm
    #include <lcd.h> 
    #include<delay.h>
    void display_no(int no); 
    void direction(char dir);
    
    void main(void)
    {
    
    // Input/Output Ports initialization
    // Port A initialization
    PORTA=0x00;
    DDRA=0x00;
    
    // Port B initialization
    PORTB=0x00;
    DDRB=0x08;
    
    // Port C initialization
    PORTC=0x00;
    DDRC=0x00;
    
    // Port D initialization
    PORTD=0x00;
    DDRD=0xFF;
    
    // Timer/Counter 0 initialization
    TCCR0=0x6A;
    TCNT0=0x00;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // LCD module initialization
    lcd_init(16);
    PORTC=255;
    direction(3); 
    while (1)
       {
       
       if (PINC.2==0 || PINC.3==0 || PINC.4==0 ) 
       {  
         delay_ms(10); 
         if (PINC.2==0) 
             direction(1);
         if (PINC.3==0) 
             direction(2);
         if (PINC.4==0) 
             direction(3);
             
        } 
        
       lcd_gotoxy(0,1);
       lcd_putsf("      ");
       lcd_gotoxy(0,1);
       lcd_putsf("OCR0: ");
       display_no(OCR0);
         
       if (PINC.0==0 || PINC.1==0 ) 
       {  
         delay_ms(10);
         
         if (PINC.0==0) 
         {   
           
           if (OCR0> 250)
             OCR0=255; 
           else
             OCR0=OCR0+5;
         }  
         else if (PINC.1==0) 
         {   
              
              if(OCR0<5)
               OCR0=0;
              else   
               OCR0=OCR0-5;
         }     
        }
        else
        {
         
           
        }  
        
      }
    }
     
    ///////////////////////// 
    void direction(char dir)
    {
      switch(dir)
      {
         case 1:
         PORTD.0=0;
         PORTD.1=1;
         lcd_clear();
         lcd_putsf("Direction: Left ");
         break;
         
         case 2:
         PORTD.0=1;
         PORTD.1=0; 
         lcd_clear();
         lcd_putsf("Direction: Right ");
         break;
         
         case 3:
         PORTD.0=0;
         PORTD.1=0;
         lcd_clear();
         lcd_putsf("Direction: Brake ");
         break;
      }
    }
    /////////////////////////
    void display_no(int no)
    {  
      int array[5];
      int i=0,j;
      /*if( no < 0)
      {
       lcd_putchar('-');
       no=-1*no;
      }
      else
       lcd_putchar('+');*/
      while(no > 9)
      {
        array[i++]=no % 10;
        no/=10;
      }
      array[i]=no;
      for(j=i;j >=0 ;j--)  
      {
        lcd_putchar(48+array[j]);
        delay_us(100);
        }
        
    }


    حالا میخوام بدونم اون برابر قرار دادم مقدار پروتهای A , b,c,d با مقدار صفر در ابتدای برنامه برای مقدار دهی اولیه پورتها هست دیگه...؟؟ درسته؟

    عبارات DDR که برای هر دسته از پورتها مطرح شده چه چیزی رو نشون میده...؟؟ و چرا مقادیر اون برای هر دسته از پورتها تفاوت داره و این مقادیر روی چه حسابی تنظیم شده؟ مثلا چرا DDRB=0x08 هست ؟

    اینکه در قسمت تعریف LCD از سه تا پارامتر استفاده شده برای این هست که LCD سه تا جهت یعنی حرکت موتور یه چپ و راست و توقف رو نشون میده دیگه... درسته؟

    در قسمت مربوط به تعریف LCD متغیر های pinc چه هستند...؟؟

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

    #2
    پاسخ : چند تا سوال خیلی ساده درباره برنامه (( کنترل دور موتور dc ))دارم

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

    PORTB=0x00;
    DDRB=0x08;

    دستور اول همونیه که خودت گفتی.
    یعنی مقدار اولیه پروت B صفر میشه

    دستور دوم برای تعیین ورودی خروجیه
    اگه عدد 0x88 رو به باینری تبدیل کنی میشه:
    00001000
    و این یعنی پایه چهارم ورودیه بقیه خروجی ان
    (PORTB.3=ورودیی) بقیه خروجی ان
    هستم اگر می روم گر نروم نیستم

    دیدگاه


      #3
      پاسخ : چند تا سوال خیلی ساده درباره برنامه (( کنترل دور موتور dc ))دارم

      ممنون

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

      دیدگاه


        #4
        پاسخ : چند تا سوال خیلی ساده درباره برنامه (( کنترل دور موتور dc ))دارم

        نوشته اصلی توسط roohipatala
        داداش من درباره دو تا سوال اول میتونم بهت جواب بدم

        PORTB=0x00;
        DDRB=0x08;

        دستور اول همونیه که خودت گفتی.
        یعنی مقدار اولیه پروت B صفر میشه

        0x08= 00001000
        یعنی پایه چهارم پورت PORTB.3 خروجی و بقیه پایه ها ورودی .

        دستور دوم برای تعیین ورودی خروجیه
        اگه عدد 0x88 رو به باینری تبدیل کنی میشه:
        00001000
        و این یعنی پایه چهارم ورودیه بقیه خروجی ان
        (PORTB.3=ورودیی) بقیه خروجی ان
        ?chetori ya na
        (TIM_Prescaler+1) * TIM_Period /Source Frequency

        دیدگاه

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