اطلاعیه

Collapse
No announcement yet.

سوال در مورد ADC در میکرو ها

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

    #31
    پاسخ : سوال در مورد ADC در میکرو ها

    ممنونم حافظه خوبی دارید تبریک می گم. :applause:
    متوجه منظورتون در مورد ذخیره اعداد روی ایپرام نشدم: منظور شما همون منظور منه؟
    من منظورم این بود که مقدار متغییر ADCH رو روی eepآ‌ ذخیره کنم و فرمول تبدیل این عدد دیجیتال به عدد معادل آنالوگ رو خواندن داده های ذخیره شده روی ایپرام استفاده کنم.
    در مورد مد single و تفاضلی:من هنوز نمی دونم قراره دیتالاگر من چی اندازه بگیره معمولا توی سیستمهای عملی چه پارامترهایی مهمه (اون سیستم هایی که کاربرد عمومی تری دارند) چه سنسورهایی لازم دارند و برای خوندن این سنسورها چه مدی از adc استفاده می شه؟ دیتا لاگرهایی که می بینم بیشتر دما رو اندازه می گیرن.ولی وقتی 7 کانال آنالوگ دارم می تونم پارامترهای دیگه ای هم اضافه کنم نه؟(البته حق با شماست فکر می کنم مد single کار منو راه بندازه! :nerd
    در ضمن برای ذخیره اطلاعات روی ایپرام ترتیب ارسال داده ها چه طور باشه بهتره :در شروع زمان و تاریخ شروع نمونه برداری ارسال شود - 8 بایت مربوط به adc یه یایت مربوط به 8 ورودی دیجیتال-8 بایت مربوط به adc یه یایت مربوط به 8 ورودی دیجیتال بعدی .....
    در آخر هم زمان و تاریخ پایان نمونه برداری

    منتها نمی دونم چه طوری می تونم داده ها رو به تفکیک در ایپرام ذخیره کنم که موقع خوندن مشخص باشه هر عدد مربوط به چیه!؟نظر شما برای من بسیار محترم سازنده و کمک کننده است... :nerd:

    اگه ممکنه کمکم کنید uart رو هم یاد بگیرم انگار این یکی از بقیه سخت تره!
    همیشه بزرگوار تر از آن باشید که برنجید
    و نجیب تر از آن باشید که برنجانید!

    دیدگاه


      #32
      پاسخ : سوال در مورد ADC در میکرو ها

      با سلام ببخشید دیر جواب دادم منظور منم همون منظور شما بود در مورد دیتا لاگر هم مثلا دما رطوبت میتونه ولتاژ-جریان راهم اندازه بگیره در مورد uart هم بگید مشکلتون کجاست تا کمک کنم

      دیدگاه


        #33
        پاسخ : سوال در مورد ADC در میکرو ها

        سلام ممنون که جواب میدید
        در مورد usart دو تابع برای نوشتن و خواندن دیدم که در تابع ارسال با توجه به اینکه زمانی اطلاعات در UDR نوشته می شه که اطلاعات قبلی ارسال شده باشد و بیت UDRE واقع در رجیستر UCSRA یک شده باشد این خط از برنامه نوشته شده که من نمی دونم چه طور کار می کنه؟
        while( !(UCSRA & (1<<UDRE)) );
        البته ببخشید هر کار می کنم این پرانتز ها جابجا می شن! :redface:
        این خط رو توی تابع ارسال می نویسن و می گن تا زمانی که بیت UDRE صفر است تابع در این حلقه می ماند مشکل من با شرط حلقه است که نمی دونم چه طور اینطوری تعبیر می شه! چرا این رو به صورت زیر نمی نویسن:
        while(!UDRE);
        در تابع دریافت هم این خط رو داریم:
        while( !(UCSRA & (1<<RXC)) );
        که این طور تعبیر می شه که تا زمانی که بیت RXC صفر است به این معنی که داده جدیدی دریافت نشده و بافر دریافت خالی است برنامه روی همین خط است
        چرا اینطور نمی نویسن:
        while(!RXC);

        یه تابع هم بعضی جاها می بینم که با گرفتن Baud rate تنظیمات اولیه رو انجام می ده (مثلا مقداردهی UBRR وUCSRB وUCSTC ).مگه وقتی codewizard رو تنظیم می کنیم تنظیمات این متغیرها انجام نمی شه؟
        با تشکر فراوان
        همیشه بزرگوار تر از آن باشید که برنجید
        و نجیب تر از آن باشید که برنجانید!

        دیدگاه


          #34
          پاسخ : سوال در مورد ADC در میکرو ها

          با سلام تا اونجا که من میدونم چون میخواد یک بیت از یک رجیستر را فقط بخونه این کار را کرده باز هم از دوستان دیگه هم میتونید بپرسید در مورد تنظیماتم چرا خود کدویژن انجام میده

          دیدگاه


            #35
            پاسخ : سوال در مورد ADC در میکرو ها

            سلام آقا زوار سوالم رو از سایرین هم پرسیدم ولی هنوز گره ای توشه!ولی به این نتیجه رسیدم که بی خیال این موضوع بشم و بپذیرم!
            http://www.eca.ir/forum2/index.php?topic=49749.0
            بقیه سوالام رو طی یکی دو روز آینده می پرسم. :redface:
            بازم به خاطر ثانیه ثانیه هایی که در اختیارم گذاشتید تشکر می کنم و براتون بهترین ها رو آرزو می کنم. :biggrin:
            همیشه بزرگوار تر از آن باشید که برنجید
            و نجیب تر از آن باشید که برنجانید!

            دیدگاه


              #36
              پاسخ : سوال در مورد ADC در میکرو ها

              سلام آقا زوار
              امیدوارم که از سوال های ساده من خسته نشده باشیدو :redface:
              برنامه ای برای خواندن و نوشتن از EEPROM نوشته ام که در ابتدا محتوای یک آرایه 8 بایتی را در 8 بایت از EEPROM ذخیره می کند و پس از آن که عمل نوشتن تمام شد شروع به خواندن محتوای 8 بایت اول EEPROM می کند اما متاسفانه اعدادی که در این حالت روی lcdآ‌ نشان داده می شود اشتباه است! :surprised: :cry:
              کد برنامه را اینجا قرار می دهم لطفا منو راهنمایی کنید. :redface:
              کد:
              [left]/*********************************************
              This program was produced by the
              CodeWizardAVR V1.23.8c Standard
              Automatic Program Generator
              © Copyright 1998-2003 HP InfoTech s.r.l.
              http://www.hpinfotech.ro
              e-mail:office@hpinfotech.ro
              
              Project : 
              Version : 
              Date  : 12/8/2010
              Author : zeinab             
              Company :                 
              Comments: 
              
              
              Chip type      : ATmega32
              Program type    : Application
              Clock frequency   : 8.000000 MHz
              Memory model    : Small
              External SRAM size : 0
              Data Stack size   : 512
              *********************************************/
              
              #include <mega32.h>
              
              // Alphanumeric LCD Module functions
              #asm
                .equ __lcd_port=0x18
              #endasm 
              
              // I2C Bus functions
              #asm
                .equ __i2c_port=0x15 ;PORTC
                .equ __sda_bit=0
                .equ __scl_bit=1
              #endasm
                    
              #include <lcd.h>  
              #include <i2c.h>
              #include <delay.h> 
              #include <stdio.h>
              
              #define eeprom_bus_address_read 0xa1
              #define eeprom_bus_address_write 0xa0
              
              
              unsigned char eeprom_read(unsigned char address){
              unsigned char data;
              i2c_start();
              i2c_write(eeprom_bus_address_write);
              i2c_write((address&0xff00)>>8);
              i2c_write(address&0x00ff);
              i2c_start();
              i2c_write(eeprom_bus_address_read);
              data=i2c_read(0);
              i2c_stop();
              return data;
              }
              
              void eeprom_write(unsigned char address,unsigned char data){
              i2c_start();
              i2c_write(eeprom_bus_address_write);
              i2c_write((address&0xff00)>>8);
              i2c_write(address&0x00ff);
              i2c_write(data);
              i2c_stop();
              delay_ms(10);
              }
              
              // Declare your global variables here
              int i1,ad,x;
              char buff[33];
              char adcbuff[8]={1, 2 ,3 ,4, 5, 6, 7, 8};
              char test[8];
              
              void main(void)
              {
              // Declare your local variables here
              
              // Input/Output Ports initialization
              // Port A initialization
              // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In 
              // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T 
              PORTA=0x00;
              DDRA=0x00;
              
              // Port B initialization
              // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In 
              // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T 
              PORTB=0x00;
              DDRB=0x00;
              
              // Port C initialization
              // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In 
              // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T 
              PORTC=0x00;
              DDRC=0x00;
              
              // Port D initialization
              // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In 
              // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T 
              PORTD=0x00;
              DDRD=0x00;
              
              // Timer/Counter 0 initialization
              // Clock source: System Clock
              // Clock value: Timer 0 Stopped
              // Mode: Normal top=FFh
              // OC0 output: Disconnected
              TCCR0=0x00;
              TCNT0=0x00;
              OCR0=0x00;
              
              // Timer/Counter 1 initialization
              // Clock source: System Clock
              // Clock value: Timer 1 Stopped
              // Mode: Normal top=FFFFh
              // OC1A output: Discon.
              // OC1B output: Discon.
              // Noise Canceler: Off
              // Input Capture on Falling Edge
              TCCR1A=0x00;
              TCCR1B=0x00;
              TCNT1H=0x00;
              TCNT1L=0x00;
              OCR1AH=0x00;
              OCR1AL=0x00;
              OCR1BH=0x00;
              OCR1BL=0x00;
              
              // Timer/Counter 2 initialization
              // Clock source: System Clock
              // Clock value: Timer 2 Stopped
              // Mode: Normal top=FFh
              // OC2 output: Disconnected
              ASSR=0x00;
              TCCR2=0x00;
              TCNT2=0x00;
              OCR2=0x00;
              
              // External Interrupt(s) initialization
              // INT0: Off
              // INT1: Off
              // INT2: Off
              GICR|=0x00;
              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
              // Analog Comparator Output: Off
              ACSR=0x80;
              SFIOR=0x00;
              
              // 2 Wire Bus initialization
              // Generate Acknowledge Pulse: On
              // 2 Wire Bus Slave Address: 0h
              // General Call Recognition: On
              // Bit Rate: 400.000 kHz
              TWBR=0x00;
              TWAR=0x00;
              TWCR=0x00;
              
              // LCD module initialization
              
              lcd_init(16);
              i2c_init();
              for (x=0;x<8;x++) {
              eeprom_write(ad,adcbuff[x]);
              
                };
              x=0 ; 
              ad=0x00;
              
              for (x=0;x<8;x++) {
              test[x]=eeprom_read(ad);
              ad=ad&0x0fff;
              ad=ad+1;
              PORTA=test[x];
                 sprintf(buff,"%d ",test[x]);
                 lcd_puts(buff);
                 delay_ms(100);
                };
               
              
              while (1)
                 {
                 // Place your code here
                 
                 
              
              
                 };
              }[/left]
              با تشکر
              همیشه بزرگوار تر از آن باشید که برنجید
              و نجیب تر از آن باشید که برنجانید!

              دیدگاه


                #37
                پاسخ : سوال در مورد ADC در میکرو ها

                سلام شرمنده مشکلم حل شد :applause: :wow:
                باید در حلقه forآ‌ اول هم دو خط تغییر آدرس رو هم می نوشتم که جا افتاده بود :redface:
                این دو خط:
                ad=ad&0x0fff;
                ad=ad+1;
                پس با تشکر تا سوالات بعدی :biggrin:
                همیشه بزرگوار تر از آن باشید که برنجید
                و نجیب تر از آن باشید که برنجانید!

                دیدگاه


                  #38
                  پاسخ : سوال در مورد ADC در میکرو ها

                  سلام آقا زوار عزیز :biggrin:
                  به خاطر این تاخیر طولانی معذرت می خوام.
                  و اما بعد:
                  اومدم سراغ اینکه کیپد رو از طریق adc اسکن کنم اما متاسفانه به علت اینکه دقت adc کم است این ایده هم خوب جواب نداد
                  :sad:
                  و بالاخره تصمیم برآن شد تا از یه میکروی دیگه برای اسکن کیپد استفاده کنم و در نهایت اطلاعات اسکن شده را از طریق i2c busآ‌ برای میکرو اصلی ارسال کنم
                  . با اسکن صفحه کلید مشکلی ندارم و به راحتی برنامه ای نوشتم که در اون میکرو اسلیو از کاربر می خواهد که یکسری از تنظیمات datalogger از جمله timesampleآ‌ و تعداد نمونه ها رو وارد کند و در اینجا می خواهم پس از پایان این تنظیمات میکرو اسلیو به مستر اتمام کار را اعلام کند و پس از فرستادن timesample و ... مستر کار نمونه برداری و ذخیره کردن زمان و نمونه ها در eeprom را انجام دهد و در صورت درخواست Pcآ‌ داده های ذخیره شده در ایپرام رو برای آن ارسال کند.
                  اما سوال من این است که آیا بدون آنکه مستر تقاضای دریافت تنظیمات را کندمی توان برنامه را طوری نوشت که اسلیو پس از پایان این تنظیمات خودش این تنظیمات را بفرستد و مستر تا این تنظیمات را نگرفته کاری انجام ندهد؟
                  و البته در اینکه چطور این ارتباط رو برقرار کنم مشکل دارم و نیازمند راهنمایی های ارزنده شمام! نمی دونم برای برقراری این ارتباط از کجا باید شروع کنم!! oo: :cry:
                  اگر نظری در این رابطه دارید و یا روند اجرایی که من در نظر گرفتم مشکل داره لطفا منو در جریان بذارید.
                  بی نههههههایت سپاس گزارم :biggrin:
                  همیشه بزرگوار تر از آن باشید که برنجید
                  و نجیب تر از آن باشید که برنجانید!

                  دیدگاه


                    #39
                    پاسخ : سوال در مورد ADC در میکرو ها

                    با سلام به شما به نظر من شما بعد از اینکه صفحه کلید را راه انداختی بیا ارتباط بین دو میکرو را برقرار کن مثلا از این میکرو بفرست و در میکروی دیگه روی lcd نمایش بده تا از ارتباط بین دو میکرو مطمئن بشی بعد درباره روش ارسال تصمیم بگیر یه برنامه برای master و یکی برای slave بنویس اگر جواب نگرفتی برنامتا بذار اصلاحش میکنم

                    دیدگاه


                      #40
                      پاسخ : سوال در مورد ADC در میکرو ها

                      به روی چشم حتما این کار رو می کنم :biggrin:
                      یه سوال دیگه این کار رو با i2cآ‌انجام بدم یا uartآ‌؟ کدوم بهتره؟ :nerd:
                      پس تا اطلاع ثانوی... :redface:
                      با تشکر
                      همیشه بزرگوار تر از آن باشید که برنجید
                      و نجیب تر از آن باشید که برنجانید!

                      دیدگاه


                        #41
                        پاسخ : سوال در مورد ADC در میکرو ها

                        نوشته اصلی توسط jaafary1
                        به روی چشم حتما این کار رو می کنم :biggrin:
                        یه سوال دیگه این کار رو با i2cآ‌انجام بدم یا uartآ‌؟ کدوم بهتره؟ :nerd:
                        پس تا اطلاع ثانوی... :redface:
                        با تشکر
                        با سلام به شما اگر با usart انجام بدید فکر کنم تسلطتون بهش بیشتره اما شما گفتید میخواید با کامپیوتر هم ارتباط برقرار کنید که فکر کنم اونجا usart استفاده کنید

                        دیدگاه


                          #42
                          پاسخ : سوال در مورد ADC در میکرو ها

                          سلام :biggrin:
                          آقای زوار من به فرموده شما سعی کردم برنامه مستر و اسلیو رو بنویسم و جواب بگیرم:
                          قسمت های اصلی برنامه مستر:



                          #define microslave_write_address 0xe0
                          #define microslave_read_address 0xe1
                          void i2c_send(char data )
                          { i2c_start();
                          i2c_write(microslave_write_address);
                          i2c_write(data);
                          delay_ms(50);
                          i2c_stop();
                          }

                          char i2c_recieve(void)
                          {
                          char data;
                          i2c_start();
                          i2c_write(microslave_read_address);
                          data=i2c_read(0);
                          i2c_stop();
                          delay_ms(50);
                          return data;

                          }

                          // I2C Bus initialization
                          i2c_init();
                          i2c_send('z'

                          while (1)
                          {
                          // Place your code here

                          };

                          ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                          قسمت های اصلی برنامه اسلیو:
                          while (1)
                          {
                          // Place your code here
                          if(TWDR==0xe0)
                          {
                          index==1;
                          delay_ms(50);
                          };

                          if(index==1&TWDR!=0x00)
                          {
                          data=TWDR;
                          index=0;
                          };

                          lcd_putchar(TWDR);
                          delay_ms(500);

                          };
                          اما جواب نمی گیرم :cry:
                          سوالات عمده ای که تو ذهنم می چرخه مربوط به بخش اسلیو است.
                          توی کتاب ره افروز نوشته بود که استفاده از کتابخانه i2c.h میکرو را به صورت مستر تنظیم می کنه:این یعنی اینکه برای اسلیو من نمی تونم از دستورات این کتابخانه استفاده کنم؟؟؟
                          آیا برای اسلیو باید مستقیما با رجیستر TWDR کار کنم؟؟ (این کاری که الان انجام داده ام).
                          باتشکر از همکاری شما
                          :smile:
                          همیشه بزرگوار تر از آن باشید که برنجید
                          و نجیب تر از آن باشید که برنجانید!

                          دیدگاه


                            #43
                            پاسخ : سوال در مورد ADC در میکرو ها

                            با شلام لطف کن فایلهای کدویژن و پروتئوستم بذار ممنون

                            دیدگاه


                              #44
                              پاسخ : سوال در مورد ADC در میکرو ها

                              با سلام از مطرح کردن این مبحث تشکر می کنم البته من نیز در استفاده کردن از adcدرavr به مشکل بر خورد کردم از مد singleاستفاده میکنم وهمچنین noise reductionولی جواب ها درست نیستند میخواستم اگه راهی ترفندی داره کمک کنیدالبته روش خوندن left adjute هستش.ورودی ولتاژ adcفعلا یه پتانسیومتر که باید در ولتاژ های 1.5و3و4.5 حالتهاتغییر کنندولی جوابی که از میکرو می گیرم از چهار حالت تعریف شده فقط حالت های سوم و چهارم رو نشون می ده.برنامهcodevision :

                              #include <tiny13.h>
                              #include <delay.h>
                              //-------------------------
                              #define st1 PORTB.0
                              #define st2 PORTB.1
                              #define st3 PORTB.2
                              #define st4 PORTB.4
                              //---------------------------------
                              unsigned char adcin;
                              unsigned char adcin2;
                              bit a;
                              void adc_adjast(void);
                              //----------adcin--------------
                              void adc_adjast(void)
                              {
                              ADMUX=0x23;\\L.adj-5.Vref-PINB.3
                              ADCSRB=0X02;\\Ext inter0
                              st1=0;st2=1;st3=1;st4=0;delay_ms(1000);
                              ADCSRA=0XEC;\\adc start-auto trigger-inter enable-1/16ck
                              #asm ("sei"
                              MCUCR=0X28;\\sleep on-noise reduction
                              }
                              //---------------------------------
                              interrupt[10]void adc_in(void)
                              {
                              adcin2=ADCL;
                              adcin=ADCH;
                              MCUCR=0X00;ADCSRA=0X00;\\adc off-sleep off
                              st1=0;st2=0;st3=1;st4=1;delay_ms(1000);
                              if(adcin<76) {st1=1;st2=0;st3=0;st4=0;}\\<1.5v
                              if(76<adcin<153) {st1=0;st2=1;st3=0;st4=0;}\\1.5v<<3v
                              if(153<adcin<230){st1=0;st2=0;st3=1;st4=0;}\ \3v<<4.5v
                              if(adcin>230) {st1=0;st2=0;st3=0;st4=1;}\\>4.5v
                              }
                              //---------------------------------
                              void main()
                              {
                              DDRB=0x17;PORTB=0x08;
                              st1=1;st2=1;st3=0;st4=0;delay_ms(1000);
                              while(a==0)
                              {
                              adc_adjast();
                              delay_ms(1000);
                              a=0;
                              }
                              }


                              دیدگاه


                                #45
                                پاسخ : سوال در مورد ADC در میکرو ها

                                سلام آقا زوار
                                اینم لینک برنامه:
                                http://www.4shared.com/file/JHfAYTdu/i2c_-2micro.html
                                با تشکر
                                همیشه بزرگوار تر از آن باشید که برنجید
                                و نجیب تر از آن باشید که برنجانید!

                                دیدگاه

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