اطلاعیه

Collapse
No announcement yet.

شروع کار با AVR و زبان C

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

    شروع کار با AVR و زبان C

    سلام بر همه دوستان و اساتید محترم.
    من قبلا با زبان بیسیک کار می کردم و چند روزی میشه که کار با زبان C و کامپایلر winavr رو شروع کردم. حالا امروز به یه مشکل برخوردم اونم اینکه دو تا تابع می خوام یکی برای معکوس کردن هر کدوم از پورت های میکرو یا دیتاهای دیگر مثل دستور Toggle تو بسکام و یه تابع یا دستور برای شیفت بیت ها مثلا پورت B برابر 00000001 باینری هستش می خوام با شیفت دادن جای 1 رو با صفر ها تغییر بدم تا در نهایت به این فرم تبدیل بشه :10000000
    با تشکر از همگی.
    چرا ناراحتی پاتریک!
    + امروز ی بچه دیدم سرچهارراه گل میفروخت
    - از دیدنش ناراحت شدی؟
    + نه
    پس چی ناراحتت کرده
    + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
    ------------------------------------------------------------------------------------------------------
    تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
    ------------------------------------------------------------------------------------------------------
    محصولات

    #2
    پاسخ : شروع کار با AVR و زبان C

    نوشته اصلی توسط soran111
    سلام بر همه دوستان و اساتید محترم.
    من قبلا با زبان بیسیک کار می کردم و چند روزی میشه که کار با زبان C و کامپایلر AVR Studio5 رو شروع کردم. حالا امروز به یه مشکل برخوردم اونم اینکه دو تا تابع می خوام یکی برای معکوس کردن هر کدوم از پورت های میکرو یا دیتاهای دیگر مثل دستور Toggle تو بسکام و یه تابع یا دستور برای شیفت بیت ها مثلا پورت B برابر 00000001 باینری هستش می خوام با شیفت دادن جای 1 رو با صفر ها تغییر بدم تا در نهایت به این فرم تبدیل بشه :10000000
    با تشکر از همگی.
    PORTA |=(1<<i)
    i رو از 0 تا 7 توی لوپ کم و زیاد کم
    با winavr کار کن
    خدا گفت : به جهنم ببریدش، او برگشت و با تعجب به خدا نگاه کرد. خدا گفت : به بهشت ببریدش. فرشتگان پرسیدند: چرا؟! خدا گفت : او هنوز به من امیدوار است...

    دیدگاه


      #3
      پاسخ : شروع کار با AVR و زبان C

      سلام.
      آقای نجفی از پاسختون ممنون. متاسفانه همونطور که گفتم من تو زبان C مبتدی هستم پس اگر لطف کنید در مورد این دستور بیشتر توضیح بدین یا یه مثال عملی بیارین ممنون میشم. :cry2:
      با تشکر.
      چرا ناراحتی پاتریک!
      + امروز ی بچه دیدم سرچهارراه گل میفروخت
      - از دیدنش ناراحت شدی؟
      + نه
      پس چی ناراحتت کرده
      + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
      ------------------------------------------------------------------------------------------------------
      تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
      ------------------------------------------------------------------------------------------------------
      محصولات

      دیدگاه


        #4
        پاسخ : شروع کار با AVR و زبان C

        نوشته اصلی توسط soran111
        سلام.
        آقای نجفی از پاسختون ممنون. متاسفانه همونطور که گفتم من تو زبان C مبتدی هستم پس اگر لطف کنید در مورد این دستور بیشتر توضیح بدین یا یه مثال عملی بیارین ممنون میشم. :cry2:
        با تشکر.
        عدد سمت راستی یا i میتونه 1 بودن هر بیت رو مشخص کنه مثلا : روی پورت این رو میخوای : 00100000 مینویسی : PORTA |=(1<<6)
        حالا همون بیت رو صفر میکنیم PORTA &=~(1<<6)
        خدا گفت : به جهنم ببریدش، او برگشت و با تعجب به خدا نگاه کرد. خدا گفت : به بهشت ببریدش. فرشتگان پرسیدند: چرا؟! خدا گفت : او هنوز به من امیدوار است...

        دیدگاه


          #5
          پاسخ : شروع کار با AVR و زبان C

          سلامی مجدد.
          از راهنماییتون ممنون اقای نجفی. حالا مشکل شیفت حل شده فقط می خوام وقتی این یک به بیت آخر رسید بازم برگرده بیت اول یعنی هی گردش کنه. این برنامه روو نوشتم فقط در یک سمت تا آخر میره و دیگه بر نمی گرده. خواهشا ببینید مشکل از کجاست :
          کد:
          #include <avr/io.h>
          #include<util/delay.h>
          
          int main(void)
          {
          	DDRA=0xff;
          	PORTA=0x00;
          	int a=0b00000001;
          	int e=0b10000000;
          	int i;
          	int b;
          	
            while(1)
            {
              for (i=0;i<8;i++)
          		{
          			PORTA=a;
          		   a=a<<1;
          			 _delay_ms(1000);
          		if (i>=8)
          		{
          		 for (i=0;i<8;i++)
          		{
          			PORTA=e;
          		   e=e>>1;
          			 _delay_ms(1000);	
          		}
          		}		
          		
          		}
            }
          }
          با تشکر.
          چرا ناراحتی پاتریک!
          + امروز ی بچه دیدم سرچهارراه گل میفروخت
          - از دیدنش ناراحت شدی؟
          + نه
          پس چی ناراحتت کرده
          + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
          ------------------------------------------------------------------------------------------------------
          تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
          ------------------------------------------------------------------------------------------------------
          محصولات

          دیدگاه


            #6
            پاسخ : شروع کار با AVR و زبان C

            از دوستان اگر کسی هست خواهشا کمک کنه.
            من تو زبان c هنوز خیلی مبتدیم.
            کمک ، :cry2: :cry2: :cry2:
            چرا ناراحتی پاتریک!
            + امروز ی بچه دیدم سرچهارراه گل میفروخت
            - از دیدنش ناراحت شدی؟
            + نه
            پس چی ناراحتت کرده
            + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
            ------------------------------------------------------------------------------------------------------
            تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
            ------------------------------------------------------------------------------------------------------
            محصولات

            دیدگاه


              #7
              پاسخ : شروع کار با AVR و زبان C

              یک راهنمایی!
              وقتی قراره یک بیت در یک بایت (8 بیتی) این ور و اونور بره در هر جهت شما فقط 7 حرکت احتیاج دارین. نه 8 تا!
              0-1-2-3-4-5-6-7-6-5-4-3-2-1-0-1-2-3-4-5-6-7-6-5-4-3-2-1-0-....
              هر خط تیره یعنی یک حرکت!

              دیدگاه


                #8
                پاسخ : شروع کار با AVR و زبان C


                کد:
                #include<util/delay.h>
                
                int main(void)
                {
                	DDRA=0xff;
                	PORTA=0x00;
                	int a=0b00000001;
                	int e=0b10000000;
                	int i;
                	int b;
                	
                  while(1)
                  {
                   for (i=0;i<7;i++)
                   {
                		PORTA=a;
                	   a=a<<1;
                		_delay_ms(1000);
                   }
                	 for (i=0;i<7;i++)
                	 {
                		PORTA=a;
                		a=a>>1;
                		_delay_ms(1000);	
                   }
                  }
                }
                بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
                اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست

                دیدگاه


                  #9
                  پاسخ : شروع کار با AVR و زبان C

                  دوستان سلام.
                  از راهنماییهای قبلی تون سپاس گذارم. حالا یه مشکل دیگه .
                  من می خوام با lm35 یه دماسنج بسازم حالا موقعی که عدد گرفته شده adc (منظورم همون 0 تا 1023 هستش) رو می خوام نشون بده هیچ مشکلی نداره ولی وقتی یه فرمول به برنامه اضافه می کنم و می خوام مقدار دقیق دما رو نشون بده جای اعداد خالی می مونه!
                  این برنامه ای که نوشتم :
                  کد:
                  #include <mega32a.h>
                  #include <stdlib.h>
                  #include <delay.h>
                  #include <stdio.h>
                  
                  // Alphanumeric LCD Module functions
                  #include <alcd.h>
                  
                  #define ADC_VREF_TYPE 0x40
                  
                  // Read the AD conversion result
                  unsigned int read_adc(unsigned char adc_input)
                  {
                  ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
                  // Delay needed for the stabilization of the ADC input voltage
                  delay_us(10);
                  // Start the AD conversion
                  ADCSRA|=0x40;
                  // Wait for the AD conversion to complete
                  while ((ADCSRA & 0x10)==0);
                  ADCSRA|=0x10;
                  return ADCW;
                  }
                  
                  void main(void)
                  {
                  char lcd_buff[10];
                  unsigned int adc_in;
                  float temp;
                  
                  PORTA=0x00;
                  DDRA=0x00;
                  
                  
                  PORTB=0x00;
                  DDRB=0x00;
                  
                  
                  PORTC=0x00;
                  DDRC=0x00;
                  
                  
                  PORTD=0x00;
                  DDRD=0x00;
                  
                  
                  TCCR0=0x00;
                  TCNT0=0x00;
                  OCR0=0x00;
                  
                  TCCR1A=0x00;
                  TCCR1B=0x00;
                  TCNT1H=0x00;
                  TCNT1L=0x00;
                  ICR1H=0x00;
                  ICR1L=0x00;
                  OCR1AH=0x00;
                  OCR1AL=0x00;
                  OCR1BH=0x00;
                  OCR1BL=0x00;
                  
                  
                  ASSR=0x00;
                  TCCR2=0x00;
                  TCNT2=0x00;
                  OCR2=0x00;
                  
                  
                  MCUCR=0x00;
                  MCUCSR=0x00;
                  
                  
                  TIMSK=0x00;
                  
                  
                  UCSRB=0x00;
                  
                  
                  ACSR=0x80;
                  SFIOR=0x00;
                  
                  
                  ADMUX=ADC_VREF_TYPE & 0xff;
                  ADCSRA=0x86;
                  
                  
                  SPCR=0x00;
                  
                  TWCR=0x00;
                  
                  // Alphanumeric LCD initialization
                  // Connections specified in the
                  // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
                  // RS - PORTA Bit 0
                  // RD - PORTA Bit 1
                  // EN - PORTA Bit 2
                  // D4 - PORTA Bit 4
                  // D5 - PORTA Bit 5
                  // D6 - PORTA Bit 6
                  // D7 - PORTA Bit 7
                  // Characters/line: 16
                  lcd_init(16);
                  
                  while (1)
                     {
                      adc_in=read_adc(3);
                      temp=adc_in/2.46;
                      sprintf(lcd_buff,"temp=%e c",temp);
                      lcd_clear();
                      lcd_gotoxy(0,0);
                      lcd_puts(lcd_buff);
                      delay_ms(500);
                     }
                  }
                  اگر لطف کنید در این زمینه هم بنده را یاری کنید ممنون میشم.
                  با تشکر
                  چرا ناراحتی پاتریک!
                  + امروز ی بچه دیدم سرچهارراه گل میفروخت
                  - از دیدنش ناراحت شدی؟
                  + نه
                  پس چی ناراحتت کرده
                  + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                  ------------------------------------------------------------------------------------------------------
                  تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                  ------------------------------------------------------------------------------------------------------
                  محصولات

                  دیدگاه


                    #10
                    پاسخ : شروع کار با AVR و زبان C

                    دوستان خوشبختانه این مشکل حل شد و اینم برنامه ش:
                    کد:
                    #include <mega32a.h>
                    #include <stdlib.h>
                    #include <delay.h>
                    #include <stdio.h>
                    
                    // Alphanumeric LCD Module functions
                    #include <alcd.h>
                    
                    #define ADC_VREF_TYPE 0x40
                    
                    // Read the AD conversion result
                    unsigned int read_adc(unsigned char adc_input)
                    {
                    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
                    // Delay needed for the stabilization of the ADC input voltage
                    delay_us(10);
                    // Start the AD conversion
                    ADCSRA|=0x40;
                    // Wait for the AD conversion to complete
                    while ((ADCSRA & 0x10)==0);
                    ADCSRA|=0x10;
                    return ADCW;
                    }
                    
                    // Declare your global variables here
                    
                    void main(void)
                    {
                    char lcd_buff[10];
                    unsigned int adc_in;
                    unsigned int temp;
                    //float temp;
                    // Declare your local variables here
                    
                    // Input/Output Ports initialization
                    // Port A initialization
                    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                    PORTA=0x00;
                    DDRA=0x00;
                    
                    // Port B initialization
                    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                    PORTB=0x00;
                    DDRB=0x00;
                    
                    // Port C initialization
                    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                    PORTC=0x00;
                    DDRC=0x00;
                    
                    // Port D initialization
                    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                    PORTD=0x00;
                    DDRD=0x00;
                    
                    // Timer/Counter 0 initialization
                    // Clock source: System Clock
                    // Clock value: Timer 0 Stopped
                    // Mode: Normal top=0xFF
                    // OC0 output: Disconnected
                    TCCR0=0x00;
                    TCNT0=0x00;
                    OCR0=0x00;
                    
                    // Timer/Counter 1 initialization
                    // Clock source: System Clock
                    // Clock value: Timer1 Stopped
                    // Mode: Normal top=0xFFFF
                    // OC1A output: Discon.
                    // OC1B output: Discon.
                    // Noise Canceler: Off
                    // Input Capture on Falling Edge
                    // Timer1 Overflow Interrupt: Off
                    // Input Capture Interrupt: Off
                    // Compare A Match Interrupt: Off
                    // Compare B Match Interrupt: Off
                    TCCR1A=0x00;
                    TCCR1B=0x00;
                    TCNT1H=0x00;
                    TCNT1L=0x00;
                    ICR1H=0x00;
                    ICR1L=0x00;
                    OCR1AH=0x00;
                    OCR1AL=0x00;
                    OCR1BH=0x00;
                    OCR1BL=0x00;
                    
                    // Timer/Counter 2 initialization
                    // Clock source: System Clock
                    // Clock value: Timer2 Stopped
                    // Mode: Normal top=0xFF
                    // OC2 output: Disconnected
                    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;
                    
                    // USART initialization
                    // USART disabled
                    UCSRB=0x00;
                    
                    // Analog Comparator initialization
                    // Analog Comparator: Off
                    // Analog Comparator Input Capture by Timer/Counter 1: Off
                    ACSR=0x80;
                    SFIOR=0x00;
                    
                    // ADC initialization
                    // ADC Clock frequency: 125.000 kHz
                    // ADC Voltage Reference: AVCC pin
                    ADMUX=ADC_VREF_TYPE & 0xff;
                    ADCSRA=0x86;
                    
                    // SPI initialization
                    // SPI disabled
                    SPCR=0x00;
                    
                    // TWI initialization
                    // TWI disabled
                    TWCR=0x00;
                    
                    // Alphanumeric LCD initialization
                    // Connections specified in the
                    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
                    // RS - PORTA Bit 0
                    // RD - PORTA Bit 1
                    // EN - PORTA Bit 2
                    // D4 - PORTA Bit 4
                    // D5 - PORTA Bit 5
                    // D6 - PORTA Bit 6
                    // D7 - PORTA Bit 7
                    // Characters/line: 16
                    lcd_init(16);
                    
                    while (1)
                       {
                        adc_in=read_adc(3);
                        temp=adc_in/2.46;
                        sprintf(lcd_buff,"temp=%d c",temp);
                        lcd_clear();
                        lcd_gotoxy(0,0);
                        lcd_puts(lcd_buff);
                        delay_ms(500);
                       }
                    }
                    حالا بازم یه سوال دیگه.
                    چطوری تو زبان c تعداد ارقام صحیح و اعشاری رو تعیین کنم؟
                    مثلا من می خوام در جواب یک محاسبه تا دو رقم اعشار داشته باشم.
                    چرا ناراحتی پاتریک!
                    + امروز ی بچه دیدم سرچهارراه گل میفروخت
                    - از دیدنش ناراحت شدی؟
                    + نه
                    پس چی ناراحتت کرده
                    + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                    ------------------------------------------------------------------------------------------------------
                    تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                    ------------------------------------------------------------------------------------------------------
                    محصولات

                    دیدگاه


                      #11
                      پاسخ : شروع کار با AVR و زبان C

                      برای نمایش اعداد اعشاری از %f بحای %d استفاده میشود

                      دیدگاه


                        #12
                        پاسخ : شروع کار با AVR و زبان C

                        از راهنماییتون ممنون دوست عزیز.
                        این درست، حالا اگر بخوام فقط تا دو رقم صحیح و دو رقم اعشار داشته باشه باید %2.2f نوشته بشه درسته ؟
                        چرا ناراحتی پاتریک!
                        + امروز ی بچه دیدم سرچهارراه گل میفروخت
                        - از دیدنش ناراحت شدی؟
                        + نه
                        پس چی ناراحتت کرده
                        + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                        ------------------------------------------------------------------------------------------------------
                        تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                        ------------------------------------------------------------------------------------------------------
                        محصولات

                        دیدگاه


                          #13
                          پاسخ : شروع کار با AVR و زبان C

                          نوشته اصلی توسط soran111
                          از راهنماییتون ممنون دوست عزیز.
                          این درست، حالا اگر بخوام فقط تا دو رقم صحیح و دو رقم اعشار داشته باشه باید %2.2f نوشته بشه درسته ؟
                          رقم اول تعداد کاراکتر ورقم دوم تعداد اعشار است که با ممیز میشود %5.2f حالا اگر رقم اول کمتر نوشته شد ممکنه قبول بکنه ولی اگر بیشتر باشه سمت چپ عدد، جای خالی blankچاپ میشه و برای اینکه جای خالی را به سمت راست منتقل کنیم یک علامت - به قبل از عدد اضافه میکنیم مثلا %-8.2

                          دیدگاه


                            #14
                            پاسخ : شروع کار با AVR و زبان C

                            عدد بلافاصله بعد از % طول میدان رو مشخص میکنه و عدد بعد از نقطه تعداد ارقام اعشار رو.

                            دیدگاه

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