اطلاعیه

Collapse
No announcement yet.

کمک در فهم یک برنامه

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

    کمک در فهم یک برنامه

    بچه ها راجع به این برنامه خواهشا توضیحاتی بهم بدید
    کد:
    #ifndef adc_INCLUDED_
    #define adc_INCLUDED_
    
    void config_adc(char adc);
    	unsigned int adc_data;	
    void start_adc(void);
    void config_adc(char adc)
    {
    *AT91C_ADC_CR = AT91C_ADC_SWRST;                 
    *AT91C_ADC_CHER = (adc);          
    *AT91C_ADC_MR = 0x0f1f3f00;			
    *AT91C_ADC_IDR = 0xffffffff;	
    }
    void start_adc(void){
    *AT91C_ADC_CR = AT91C_ADC_START; 
    } 
    unsigned int read_adc(char channel)	
    {
    switch (channel)
    {
    	case 0:
    	
    		  while ((*AT91C_ADC_SR & AT91C_ADC_EOC0) == 0); 	
    	adc_data = (unsigned int) *AT91C_ADC_CDR0 & AT91C_ADC_DATA;
    		
    break;
    		
    	case 1:
    	
    		  while ((*AT91C_ADC_SR & AT91C_ADC_EOC1) == 0); 		 
    	adc_data = (unsigned int) *AT91C_ADC_CDR1 & AT91C_ADC_DATA;
    	break;
    		case 2:
    	
    		  while ((*AT91C_ADC_SR & AT91C_ADC_EOC2) == 0); 		 
    	adc_data = (unsigned int) *AT91C_ADC_CDR2 & AT91C_ADC_DATA;
    	
    	break;
    	
    	case 3:
    	
    		  while ((*AT91C_ADC_SR & AT91C_ADC_EOC3) == 0); 	 
    	adc_data = (unsigned int) *AT91C_ADC_CDR3 & AT91C_ADC_DATA;
    	
    	break;
    		case 4:
    	
    		  while ((*AT91C_ADC_SR & AT91C_ADC_EOC4) == 0); 	
    	adc_data = (unsigned int) *AT91C_ADC_CDR4 & AT91C_ADC_DATA;
    		
    	 break;
    
    	case 5:
    	
    		  while ((*AT91C_ADC_SR & AT91C_ADC_EOC5) == 0); 	 
    	adc_data = (unsigned int) *AT91C_ADC_CDR5 & AT91C_ADC_DATA;
    
    	break;
    		case 6:
    	
    		  while ((*AT91C_ADC_SR & AT91C_ADC_EOC6) == 0); 	
    	adc_data = (unsigned int) *AT91C_ADC_CDR6 & AT91C_ADC_DATA;
    	
    	break;
    
    	case 7:
    	
    		  while ((*AT91C_ADC_SR & AT91C_ADC_EOC7) == 0); 		 
    	adc_data = (unsigned int) *AT91C_ADC_CDR7 & AT91C_ADC_DATA;
    	break;
    
    }
    	return(adc_data);	
    } 
    
    
    
    #endif

    #2
    پاسخ : کمک در فهم یک برنامه

    اینو می گی
    اینطوری بنویسی بهتره (از گزینه قرار دادن کد استفاده کن )
    کد:
    #ifndef adc_INCLUDED_
    #define adc_INCLUDED_
    
    void config_adc(char adc);
      unsigned int adc_data;  
    void start_adc(void);
    void config_adc(char adc)
    {
    *AT91C_ADC_CR = AT91C_ADC_SWRST;                 
    *AT91C_ADC_CHER = (adc);          
    *AT91C_ADC_MR = 0x0f1f3f00;     
    *AT91C_ADC_IDR = 0xffffffff;  
    }
    void start_adc(void){
    *AT91C_ADC_CR = AT91C_ADC_START; 
    } 
    unsigned int read_adc(char channel)  
    {
    switch (channel)
    {
      case 0:
      
         while ((*AT91C_ADC_SR & AT91C_ADC_EOC0) == 0);   
      adc_data = (unsigned int) *AT91C_ADC_CDR0 & AT91C_ADC_DATA;
       
    break;
       
      case 1:
      
         while ((*AT91C_ADC_SR & AT91C_ADC_EOC1) == 0);     
      adc_data = (unsigned int) *AT91C_ADC_CDR1 & AT91C_ADC_DATA;
      break;
       case 2:
      
         while ((*AT91C_ADC_SR & AT91C_ADC_EOC2) == 0);     
      adc_data = (unsigned int) *AT91C_ADC_CDR2 & AT91C_ADC_DATA;
      
      break;
      
      case 3:
      
         while ((*AT91C_ADC_SR & AT91C_ADC_EOC3) == 0);   
      adc_data = (unsigned int) *AT91C_ADC_CDR3 & AT91C_ADC_DATA;
      
      break;
       case 4:
      
         while ((*AT91C_ADC_SR & AT91C_ADC_EOC4) == 0);   
      adc_data = (unsigned int) *AT91C_ADC_CDR4 & AT91C_ADC_DATA;
       
      break;
    
      case 5:
      
         while ((*AT91C_ADC_SR & AT91C_ADC_EOC5) == 0);    
      adc_data = (unsigned int) *AT91C_ADC_CDR5 & AT91C_ADC_DATA;
    
      break;
       case 6:
      
         while ((*AT91C_ADC_SR & AT91C_ADC_EOC6) == 0);   
      adc_data = (unsigned int) *AT91C_ADC_CDR6 & AT91C_ADC_DATA;
      
      break;
    
      case 7:
      
         while ((*AT91C_ADC_SR & AT91C_ADC_EOC7) == 0);     
      adc_data = (unsigned int) *AT91C_ADC_CDR7 & AT91C_ADC_DATA;
      break;
    
    }
      return(adc_data);  
    } 
    
    
    
    #endif
    خداوند بی نهایت است اما به قدر نیاز تو فرود می آید ، به قدر آرزوی تو گسترده می شود و به قدر ایمان تو کارگشاست.
    [hr]

    دیدگاه


      #3
      پاسخ : کمک در فهم یک برنامه

      این برنامه اینقده ساده هستش که آدم....
      شما کافیه یوزر مانوال میکرو این برنامه رو داشته باشی و توش دنبال این ریجسترها بگردی و ببینی چیکار میکنن. با وجود اینکه من با این میکرو کار نمیکنم می فهمم که:
      اولی که علامت شارپ داره میگه اگه ADC اینکلود نشده، اینکلودش کن.(ماکرو شرطی)
      بعدش توابع هستن:
      اولی ADC رو پیکربندی میکنه::config_adc
      دومی بهش کلاک میده(اگه اشتباه نکرده باشم)::start_adc
      سومی هم که باید بش یه مقدار بین 0 تا 7 بدی که که فکر کنم شماره کانال هستش که باید مقدارش رو بخونه. بعد هم مقدار رو بر میگردنوه::read_adc

      دیدگاه


        #4
        پاسخ : کمک در فهم یک برنامه

        نوشته اصلی توسط Rohalamin
        این برنامه اینقده ساده هستش که آدم....
        شما کافیه یوزر مانوال میکرو این برنامه رو داشته باشی و توش دنبال این ریجسترها بگردی و ببینی چیکار میکنن. با وجود اینکه من با این میکرو کار نمیکنم می فهمم که:
        اولی که علامت شارپ داره میگه اگه ADC اینکلود نشده، اینکلودش کن.(ماکرو شرطی)
        بعدش توابع هستن:
        اولی ADC رو پیکربندی میکنه::config_adc
        دومی بهش کلاک میده(اگه اشتباه نکرده باشم)::start_adc
        سومی هم که باید بش یه مقدار بین 0 تا 7 بدی که که فکر کنم شماره کانال هستش که باید مقدارش رو بخونه. بعد هم مقدار رو بر میگردنوه::read_adc

        ifdenf یعنی چی؟؟؟؟
        و چرا از case استفاده کرده؟؟؟

        دیدگاه


          #5
          پاسخ : کمک در فهم یک برنامه

          کد:
          #include <at91sam7s64.h>
          #include "adc.h"
          
          
          
          /* Declare LCD Rotation */
          //#define PORTRAIT 
          #define LANDSCAPE
          /* LCD Pin Configuration */
          #define TFTLCD_DATAPORT_A       
          #define TFTLCD_DATAPORT_OFFSET   0
          #define TFTLCD_CONTROLPORT_A     
          #define TFTLCD_RST         16
          #define TFTLCD_RS          18
          #define TFTLCD_CS          17
          #define TFTLCD_WR          19
          #define TFTLCD_RD          20               
          /* LCD Functions */
          
          #include "functions.h"
          
          void delay_ms(unsigned int);
          
          
          char str[5]= "test";
          
          int main(void) 
           {	
           int x,y,z,cun=0 ,amud;
           int bx=20,by=20,ok=0;	
          
          	delay_ms(100);
          	/* LCD Initialization */
          	tftlcd_init();
          	config_adc(0x70);
            #ifdef LANDSCAPE
          //  tftlcd_write_pic(0,0,picture);
          //	delay_ms(5000);
          	tftlcd_gotoxy(11,6);
          	tftlcd_putsf("Keep The Ball In Center",RED,WHITE,1);
          
          	tftlcd_gotoxy(11,7);
          	tftlcd_putsf("For 3 Seconds ! ^_^",RED,WHITE,1);
          
          
          	tftlcd_gotoxy(11,9);
          	tftlcd_putsf("ARM Project :",BLUE,WHITE,1);
          
          	tftlcd_gotoxy(11,10);
          	tftlcd_putsf("Saed Khodayari",BLUE,WHITE,1);
          	
          
          	delay_ms(6000);
          	tftlcd_clear();
          
          	tftlcd_draw_rectangle(0,0,319,239,1,GREEN);
          	tftlcd_draw_rectangle(3,3,316,236,1,WHITE);
          	
          	tftlcd_draw_circle(160,120,10,1,GREEN);
          	tftlcd_draw_circle(160,120,60,0,BLUE);
          	
          
          	while(!ok)
          	{
          	tftlcd_draw_circle(bx,by,5,1,RED);
          	start_adc();
          	x=read_adc(4);
          	y=read_adc(5);
          	delay_ms(10);
          	tftlcd_draw_circle(bx,by,5,1,WHITE);
          	by += x/10 - 50 ;
          	bx += y/10 - 50 ;
          	if(by > 230)by -= 220;
          	if(by <10 )by += 220;
          	if(bx > 310)bx -= 300;
          	if(bx <10 )bx += 300;
          	if(bx <176 && bx>144 && by<136 && by>104)
          		{
          		 tftlcd_draw_circle(160,120,10,1,GREEN);
          		 
          		 if(bx <170 && bx>150&& by<130 && by>110)
          		 {
          		  cun +=2;
          			tftlcd_draw_circle(160,120,10,1,BLUE);
          		 }
          		}
          	
          	cun -- ;
          	if(cun<0)cun=0;
          	
          	if(cun>40) ok=1;	
            	}
          
          
          	tftlcd_draw_rectangle(70,72,260,170,1,RED);
          	tftlcd_draw_rectangle(75,77,255,165,1,BLUE);
          	tftlcd_gotoxy(11,7);
          	tftlcd_putsf("Congratulation ! :)",RED,WHITE,1);
          	delay_ms(2000);
          
          
          
          	delay_ms(1000);
          	tftlcd_clear();
          	tftlcd_draw_line(60,45,318,45,PURPLE);
          	tftlcd_draw_line(60,125,318,125,PURPLE);
          	tftlcd_draw_line(60,210,318,210,PURPLE);
          	tftlcd_draw_line(103,1,103,238,GREEN);
          	tftlcd_draw_line(146,1,146,238,GREEN);
          	tftlcd_draw_line(189,1,189,238,GREEN);
          	tftlcd_draw_line(232,1,232,238,GREEN);
          	tftlcd_draw_line(275,1,275,238,GREEN);
          
          
          
          	config_adc(0x70);
          	cun = 60;
          	while(1)
          		{
          		 
          		 start_adc();
          		 x=read_adc(4);
          		 y=read_adc(5);
          		 z=read_adc(6);
          	
          	  intstr(x,str);
          		tftlcd_gotoxy(1,2);
            	tftlcd_putsf("X:" ,RED,WHITE,1);
          		tftlcd_gotoxy(1,3);
            	tftlcd_putsf(str ,RED,WHITE,1);
          		amud = 80 - x/15;
          		if(amud <0 || amud >237) amud = 0;
          	
          		tftlcd_draw_circle(cun , amud ,1,1, RED) ;
          
           		intstr(y,str);
            	tftlcd_gotoxy(1,7);
          	  tftlcd_putsf("Y:",GREEN,WHITE,1);
            	tftlcd_gotoxy(1,8);
          	  tftlcd_putsf(str,GREEN,WHITE,1);
          		amud = 160 - y/15;
          		if(amud <0 || amud >237) amud = 0;
          
          		tftlcd_draw_circle(cun , amud ,1,1, BLACK) ;
          
          		intstr(z,str);
          		tftlcd_gotoxy(1,12);
          		tftlcd_putsf("Z:",BLUE,WHITE,1);
          		tftlcd_gotoxy(1,13);
          		tftlcd_putsf(str,BLUE,WHITE,1);
          		amud = 239 - z/15;
          		if(amud <0 || amud >237) amud = 0;
          
          		tftlcd_draw_circle(cun , amud ,1,1, BLUE) ;
          
          		cun =cun+2;
          		if(cun>318){
          		 cun=60;
          		 tftlcd_clear();
          		 tftlcd_draw_line(60,45,318,45,PURPLE);
          		 tftlcd_draw_line(60,125,318,125,PURPLE);
          		 tftlcd_draw_line(60,210,318,210,PURPLE);
          		 tftlcd_draw_line(103,1,103,238,GREEN);
            	 tftlcd_draw_line(146,1,146,238,GREEN);
            	 tftlcd_draw_line(189,1,189,238,GREEN);
            	 tftlcd_draw_line(232,1,232,238,GREEN);
            	 tftlcd_draw_line(275,1,275,238,GREEN);
          			}
          		delay_ms(220);
          //		tftlcd_clear();
          		};
            #endif


          دیدگاه


            #6
            پاسخ : کمک در فهم یک برنامه

            نوشته اصلی توسط saeeddhk
            ifdenf یعنی چی؟؟؟؟
            و چرا از case استفاده کرده؟؟؟
            یه ماکرو شرطی هستش.
            چون وقتی دستورات شرطی که همه مساوی هستن(==) از این دستور استفاده میشه. می تونید مثلا از If هم استفاده کنید ولی Switch case توی خوانایی خیلی تاثیر داره.

            لطفا به کتابهای آموزشی C/C++ رجوع کنید.

            دیدگاه


              #7
              پاسخ : کمک در فهم یک برنامه

              ifdef# میگه اگه فلان چیز قبلاً define# شده باشه، کدهای بعد از این تا برسه به endif# توسط کامپایلر کامپایل بشه. اگه اون فلان چیز تعریف نشده باشه که هیچی، کامپایلر ازش میگذره.

              جستجو در اینترنت، کتاب و جزوه و مقالات آموزشی C/C++ می تونه راهگشا باشه..

              مثلاً اولین جستجوی گوگل:
              http://stackoverflow.com/questions/3...def-and-ifndef
              بیایید با Google آشتی کنیم!

              دیدگاه

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