نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
آزادی حجاز از دست نااهلان
مهدی دمیرچیلو

آموزش جامع میکروکنترلر AVR جلسه2

به نام خدا

آموزش جامع میکروکنترلر AVR جلسه2

آموزش جامع میکروکنترلر AVR جلسه2

آموزش جامع میکروکنترلر AVR جلسه2

مبدل آنالوگ به دیجیتال

اگر به PORTA.0  تا  PORTA.7  نگاه کرده باشید کنارشون یه کلماتی هست : ADC0 تا ADC7 که با استفاده از این پورت( PORTA ) میتونیم سیگنال آنالوگ رو دیجیتال کنیم.

مبدل آنالوگ به دیجیتال در میکروکنترلرهای AVR

یه سری توضیحات مقدماتی ولی لازم ^_^

 6 روش وجود داره که بشه سیگنال آنالوگ رو به دیجیتال تبدیل کرد :
1) روش موازی یا همزمان
2) روش دو شیب
3) روش پله ای
4) روش تبدیل ولتاژ به فرکانس
5) روش تبدیل ولتاژ به زمان
6) روش تقریب متوالی
حالا میکروکنترلر AVR از کدوم یک از این روش ها استفاده میکنه ؟ روش تقریب متوالی

کانال

معمولا در یک میکرو AVR چندین کانال ADC وجود داره ؛ مثلا در مدل ATMEGA16  تعداد 8 عدد کانال ADC وجود داره !
توجه داشته باشید که در میکروکنترلر AVR تنها یک مبدل آنالوگ به دیجیتال وجود دارد و برای هر کانال از یک مبدل جدا استفاده نشده است.
یعنی اگر میبینید 8 تا کانال ADC در میکرو ATmega32 داریم ،
معناش این نیست که 8 تا مبدل داریم بلکه این 8 کانال با یکدیگر مالتی پلکس شدند و در نهایت اون که مورد نیازه به مبدل وصل میشه.
مثال خودمونی : تو خونتون 8 تا تلوزیون هست(چه شود ^_^) !!! حالا بابات میره یه آنتن میخره برا همشون و همشون مجبورن از این آنتن استفاده کنن.    افتاد؟؟؟؟؟
حالا با همدیگه میخوایم ببینیم برای تبدیل ( آنالوگ به دیجیتال ) چه فرایندی طی میشه :
فرض کنید ؛ در حوزه آنالوگ یه ولتاژِ بین 0 تا 5 ولت به کانال ADC داده میشه. این ولتاژی که داده میشه پیوسته است و میتونه هرمقداری داشته باشه.مثلا : 1.13 یا 4.69 و ... اما این ولتاژ
چجوری برای میکرو قابل فهم میشه ؟؟؟
در روش تقریب متوالی یه فرمولی وجود داره بدین صورت :
Vadc=(Vin*1024)/Vref
پس سه تا مجهول داریم :
Vin : همون ولتاژی هست که کانال میگیره و قراره تبدیل به سیگنال دیجیتال بشه.(همون ولتاژی که رو یکی از پایه ها مثلا  PORTA.1   اعمال میشه)
Vref : ولتاژ مرجع
n : دقت یا درجه تفکیک ؛ در مورد n هم میتونم بگم که میکروکنترلرهای AVR دقت 10 بیتی دارند .
یعنی مقدار سیگنال تبدیل شده با دقت 10 بیت ذخیره میشود. (البته لازم بذکره که میشه با دقت 8 بیت نیز ازشون استفاده کرد)
ببینید دوستان ، بنده گفتم درجه دقت 10 بیتی این یعنی چه ؟
ما وقتی به یکی از کانال های ADC میکرو ولتاژی بین 0 تا 5 ولت میدیم و انتظار داریم که میکرو هم برامون نسبت بگیره و اونو تبدیل به سیگنال دیجیتال کنه ، روش کار بدین صورته که در دقت 10 بیت،میکرو بازه بین 0 تا 5 ولت رو به  210 = (1024) واحد تقسیم میکنه :
آموزش جامع میکروکنترلر AVR جلسه2
تصویر بالا کاملا گویاست !
در حالت گفته شده 0 ولت برابر عدد 0 دیجیتال و 5 ولت برابر عدد 1023 دیجیتال میباشد.
و هر ولتاژی بین 0 تا 5 ولت با همون نسبتی که گفتم خدمتتون به مقدار دیجیتالش تبدیل میشه.
برای مثال ولتاژ 2.5 ولت معادل دیجیتالش در این حالت برابر با عدد 512 میباشد.
کاملا مشخص است که هرچقدر این درجه دقت (n) بالاتر باشد،مقدار دیجیتال بدست آمده نیز به مقدار آنالوگ آن نزدیکتر است.
در مورد ولتاژ مرجع( Vref  )
واحد ADC برای اینکه عملیات تبدیل رو انجام بده نیاز به یه ولتاژ مرجع داره تا ولتاژ وارد شده رو با اون مقایسه کنه.
در واقع اگر ولتاژ مرجع رو مثلا 3 ولت انتخاب کردیم،بازه 0 تا 3 ولت به 1024 قسمت تبدیل میشه و همون ماجرای بالا ...

=============================================

ریجسترهای دوس داشتنی خودمون!!!

1) بررسی رجیستر کنترلی ADMUX

1) بررسی رجیستر کنترلی ADMUX

رجیستر کنترلی ADMUX


بیت های 
و 7 (REFS 1,0 ) :  طبق جدول زیر میتونیم ولتاژ مرجعمون رو انتخاب کنیم :
رجیستر کنترلی ADMUX

حالت اول : ولتاژ روی پایه AREF به عنوان مرجع انتخاب میشود. (یکی از پایه های میکرو کنترلر مون هستش اگه ATMEGA 16   رو یه نگاه بندایزی پیداش میکنی!!!!)
حالت دوم : ولتاژ روی پایه AVCC به عنوان مرجع انتخاب میشود. (اینم یکی از پایه های میکرو کنترلر مون هستش اگه ATMEGA 16   رو یه نگاه بندایزی  پیداش میکنی!!!!)
حالت سوم : ------ (رزرو شده)
حالت چهارم : ولتاژ مرجع داخلی 2.56 ولت تثبیت شده به عنوان مرجع انتخاب میشود.

اگه حالت اول انتخاب بشه،ما هر ولتاژی که به پین AREF وصل کنیم به عنوان مرجع در نظر گرفته میشه.
در حالت دوم هم هر ولتاژی که به پین AVCC بدیم به عنوان ولتاژ مرجع در نظر گرفته میشه.
در حالت چهارم میکرو میاد و خودش یه ولتاژ 2.56 ولتی تثبیت شده و درجه یک ! رو میسازه و اون رو به عنوان ولتاژ مرجع انتخاب میکنه.

بیت های 0 و 1 و 2 و 3 و 4  ( MUX 4,0 ) :  از این بیت ها برای پیکربندی کانال های ADC میکروکنترلر AVR استفاده میشه.

برای اینکه مشخص کنیم که میخوایم از کدوم کانال (PA0-PA7) استفاده کنیم ، طبق جدول زیر مقادیر رو انتخاب میکنیم :

آموزش جامع میکروکنترلر AVR جلسه2

2) بررسی رجیستر ADCSRA

2) بررسی رجیستر ADCSRA

رجیستر ADCSRA

بیت 7  :   ADEN همونطور که از اسمش پیداست ، وظیفه ی فعال/غیر فعال کردن واحد ADC رو داره.

بیت 6 :   ADSC قبل از اینکه هر عمل تبدیلی انجام بدید،اول مقدار این بیت رو 1 کنید.==> فرمان شروع تبدیل (آنالوگ به دیجیتال منظورمه.) بعد از اینکه عمل تبدیل به پایان رسید مقدار این بیت 0 میشه.

بیت 5 :   ADATE   با 1 شدن این فلگ،خاصیت تحریک اتوماتیک فعال میشه. در اینصورت با هرلبه بالارونده پالس اعمال شده به CPU ، واحد ADC تحریک میشه.

بیت 4   : ADIF   این فلگ هم معروف به فلگ وقفه ADC هست و هر وقت که عملیات تبدیل ADC تمام شد این بیت بصورت اتوماتیک 1 میشه و ما رو مطلع میکنه که آیا عملیات تبدیل انجام شده یا نه ؟!

بیت 3 :  ADIE      یک بودن این بیت به این معنیه که وقفه ADC فعاله و 0 بودنش هم حاکی از غیرفعال بودنشه !

بیت های 0 و 1 و 2 :     این بیت ها هم برای انتخاب ضریب تقسیم فرکانس واحد ADC هستند.
این بیتها سرعت تدیل رو  تعیین میکنن.فرکانس ADC از کلاک سیستم تامین میشود.

با توجه به جدول زیر میتونید ضریب فرکانس  مورد نظرمون رو انتخاب کنیم :

آموزش میکروکنترلر avr

3) بررسی رجیستر (ADC (ADCH,ADCL

3) بررسی رجیستر  (ADC (ADCH,ADCL

آموزش میکروکنترلر avr

در این دو رجیستر اطلاعات خروجی ADC قرار میگیرند. یعنی وقتی تبدیل انجام شد،مقدار حاصل با دقت مورد نظر میاد و تو این رجیستر میشینه !
اگه یادتون باشه گفتم که دقت واحد ADC در میکروکنترلرهای AVR به 10 بیت میرسه ! این یعنی چه ؟ یعنی اینکه طول داده ها 10 بیتیه !
اما مگه نگفتیم که طول هر رجیستر 8 بیته ؟ حالا چجوری 10 بیت رو تو 8 بیت جا بدیم ؟؟؟ چاره اش رو اتمل پیدا کرده !
میگه میایم 2 تا رجیستر 8 بیتی به اینکار اختصاص میدیم میشه 8+8 = 16 بعد ما 10 تاشو لازم داریم دیگه ؟!
اون 6 تا که اضافیه رو هم بهشون محل نمیذاریم ! لذا داستان اینجوری میشه که این رجیستر 2 تیکه است !
و در واقع 2 تا رجیستر هستند اما با یک نام و یک وظیفه که بهم چسبیدند !
فقط برای اینکه با هم قاطی نشند اومدند و یه پسوند H و L بهشون دادند.(مخفف High و Low )

حالا چرا 2 شکل کشیدیم از این رجیسترها ؟

اون بیت ADLAR بود توی رجیستر ADMUX ، یادتونه که ایشالا ؟!اون مال همینه.
اگه ADLAR=1 باشه نتیجه تبدیل بصورت تنظیم از چپ و اگر ADLAR=0 باشه بصورت تنظیم از راست اطلاعات درون رجیسترها قرار میگیره !
شکل بالایی تنظیم از راست و شکل پایینی تنظیم از چپه !
نکته ای که باید بگم اینه که به مجموع دو تا رجیستر ADCL و  ADCH میگند ADCW که در واقع قراره یه عدد 10 بیتی رو به ما تحویل بده !

4) بررسی رجیستر SFIOR

4) بررسی رجیستر SFIOR

 آموزش جامع avr

در کل ما زیاد کاری به این رجیستر در مبحث ADC نداریم.
ولی اگه بیت ADATE از رجیستر ADSRA رو 1 کردید ، تبدیل هامون با یک لبه صعودی تحریک کننده اتفاق میوفته !

میدونم چیزی متوجه نشدید ولی عیبی نداره !!! خودم هم چیزی نفهمیدم 😀 

بیت های 5 و 6 و 7  :  ADTS 5,7 از طریق این سه بیت و با توجه به جدول زیر مشخص میکنیم که واحد ADC چجوری تحریک بشه !
گاهی وقتها لازمه که براساس یه رخداد خاصی،ADC بکار بیوفته !
مثلا : هرگاه وقفه خارجی اتفاق افتاد،ADC تبدیل رو شروع کنه.

 آموزش جامع avr
استفاده های خاص خودشو داره و چون بیشتر مواردش مربوط به مبحث تایمر/کانترها میشه.

 

پروژه avr یک

آموزش ساده ساخت دماسنج با lm35 رو بخونید.

پروژه avr دو

عکس مدار پروژه
 پروژه avr

کدهای پروژه

توجه : یکی از بازدید کننده های سایت یه فایل شامل کد و یه سری توضیحات برای این پروژه قرار دادن که دیدنش ظرر نداره – البته من هنوز وقت و حوصله نکردم بشینم بررسیش کنم : دانلود

تنظیمات کدویژن
 میکروکنترلر AVR

دانلود پروژه AVR دو

منبع
noise.blog.ir

این وبلاگ خوبی هستش حتما یه سری بزنید.
در ضمن این مطلب کپی پیس خالی نیست ==>تغیراتی هم داده شده

گروه پرسش و پاسخ الکترونیکی در سروش
مهدی دمیرچیلو گوگل میفرماید : إِنَّ اللّه مَعَ الساچِرین ( خداوند با سرچ کنندگان است )
ارسال دیدگاه
163

1) نظرات غیر فارسی به صورت خودکار حذف میشوند ( حداقل 5 حرف فارسی وارد کنید ).

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) برای گزاشتن کدهاتون از این سایت استفاده کنید ( طبیعتا لینک کدتون رو باید برای من بفرستید! ) : debian

4) پسورد فایل های سایت : www.dmf313.ir

  1. Avatar

    مهمان

    pm

    سلام خیلی لطف میکنید این اطلاعات رو در سایتتون میگذارید ممنون

  2. Avatar

    مهمان

    amir

    سلام
    ممنون از توضیحاتتون. می‎خواستم بدونم فرکانسی که بر عددای مختلف تقسیم میشه تا فرکانس کاری واحد adc رو به وجود بیاره چه فرکانسی هستش؟ فرکانس خود میکرو هست؟
    و تا چقدر مینونه باشه؟

    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام.
      دقیقا متوجه منظورتون نشدم ولی :
      رجیستر ADCSRA، فیلد ADPS ( بیت 0 تا 2 ) وظیفه تقسیم فرکانسی واحد ADC رو بر عهده داره – که مقدارشو میتونید 1-2-4-8 و … تنظیم کنید تا فرکانس میکرو بر این مقدار فوق تقسیم بشه حاصل بشه فرکانس واحد ADC

  3. Avatar

    مهمان

    ایزدپناه

    مهندس عزیز سلام :
    میخواستم بدونم چطور میشه مقدار منفی سیگنال سینوسی رو با adc بخوانیم؟لطفا راهنمایی فرمایید . تشکر.

    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام-تنها روشی که من بلدم – سیگنال رو شیف میدی بالا تا مثبت بشه و بعد سطح ولتاژشو میاری بین 0 تا 5 ولت.
      مثلا بین -7 تا +7 هستش – بعد شیفت دادن میشه 0 تا +14 و بعد از کاهش سطح ولتاژ باید بشه 0 تا +5

  4. Avatar

    مهمان

    مسلم حسینی

    متشکرم از مطالب خوب شما من میخواستم یک برنامه را از اتمل استودیو ورژن 7را به پروتیوس وارد کنم بعد هم میخواستم بدونم چطور میشه با ای سی 74244برنامه را پروگرام کنم میشود

    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      خب کد هگز اتمل استدیو رو میدی به پروتئوس – 74244 سرچ کردم آیسی بافر هستش – چه ربطی به پروگرام کردن داره؟

  5. Avatar

    مهمان

    مسعود سلیمانی

    سلام وقتتون بخیر
    من میخواستم اطلاعات از چندتا سنسور مختلف بخونم مثلا دوتا سنسور نور و دما چیجوری میتونم adc رو طوری فعال کنم و وقفه مورد نیاز هر سنسور بنویسم اگر میشه کد مناسب اتمل رو برام بنویسید.

  6. Avatar

    مهمان

    ایران

    ضریب تقسیم فرکلنسی
    این قضیه تحریکCPU باSFIORتوضیح میدی نفهمیدم چه جور تحریک میکنه

    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      بیت ACME از رجیستر SFIOR :
      Analog Comparator Multiplexer Enable
      بیتهای ADTS0 و ADTS1 و ADTS2 :
      ADC Auto Trigger Source
      خب اگه بیت ADATE از رجیستر ADCSRA یک بشه – 3 بیت بالا – تعیین میکنن کدام تغییر وضعیت ( trigger ) باعث رخ دادن تبدیل adc بشه.
      که خب برا تعیین منبع شروع تبدیل ( یه چیزی رخ بده تا تبدیل adc انجام بشه ) رو با مقدار دهی بیت های بالا انجام میشه – که نحوه مقدار دهی بیت های فوق – رو در جدول 86 ( صفحه 221 – دیتاشیت مگا16) – یا تو فصل adc دنبالش هم بگردی پیدا میکنی این جدولو
      0 : Free Running mode ( نیازی به تحریک شدن برای شروع تبدیل نداره – یرخی تبدیل میکنه میره – فک کنم )
      1 : Analog Comparator
      2 : External Interrupt Request 0
      3 : Timer/Counter0 Compare Match
      4 : Timer/Counter0 Overflow
      5 : Timer/Counter1 Compare Match B
      6 : Timer/Counter1 Overflow
      7 : Timer/Counter1 Capture Event

  7. Avatar

    مهمان

    سعید

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

  8. Avatar

    مهمان

    MOrteZA

    #define F_CPU 1000000UL
    #include
    //#include
    #include
    #include
    #include
    //#define ADC_VREF_TYPE 0x20
    void lcd_cmd(unsigned char cmd) // create a function for sending commands to lcd
    {
    PORTD = cmd ; //using port b for data and command
    PORTC &= ~(0x01); //using port c for controlling lcd with rs rw en pins.clear rs pin for sending
    PORTC |=(0x04); // set enable
    _delay_ms(10);
    PORTC &=~(0x04); // clear enable
    }
    void lcd_data(unsigned char data) // create a function for sending data to lcd
    {
    PORTD = data ; //using port b for data and command
    PORTC |= (0x01); //using port c for controlling lcd with rs rw en pins.set rs pin for sending
    PORTC |=(0x04); // set enable
    _delay_ms(10);
    PORTC &=~(0x04); // clear enable
    }
    void lcd_str(char *str)
    {
    while(*str)
    lcd_data(*str++);
    }
    void lcd_init()
    {
    lcd_cmd(0x38); //8bit mode
    lcd_cmd(0x0e); //enable cursor
    lcd_cmd(0x06); //cursor increament
    lcd_cmd(0x01); //lcd clear
    lcd_cmd(0x80); //select 1st row and 1col for data
    }
    int read_adc()
    {
    ADCSRA|= (1<<ADEN) | (1<<ADSC);
    while ((ADCSRA & (1<<ADIF))==0);
    return ADCH;
    }
    int main(void)
    {
    DDRD = 0xff;
    DDRC = 0xff;
    lcd_init();
    float voltage;
    char str[2];
    ADMUX= (1<<ADLAR);
    ADCSRA= (1<<ADEN) | (1<<ADSC) | (1<<ADPS1) | (1<<ADPS0);
    lcd_str(" Voltage is");
    while (1)
    {
    voltage = read_adc();
    voltage = (voltage * 5)/256 ;
    dtostrf(voltage,1,4,str);
    lcd_cmd(0xc5);
    lcd_str(str);
    }
    }
    سلام این کد مال atmel studio هست
    lcd پورت های data هر 8 رو به پورت D و rs , e رو به پورت c0 , c3 وصل کردم و پایه rw رو زمین کردم
    یا علی

  9. Avatar

    مهمان

    مهدی امانی

    یه چند جایی از اون فایل راهنمای من ایراد داره ظاهرا
    مقدار دهی رجیستر

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      تصحیح کن بده مجدا قرار بدم good

  10. Avatar

    مهمان

    مهدی امانی

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

  11. Avatar

    مهمان

    amir

    سلام میشه اموزش وقفه adc هم بزاری هر چی تو نت میگردم نیست

  12. Avatar

    مهمان

    مهدی

    سلام چرا تو ای دی سی اچ رریترن زدی چرا تو ای دی سی دبلیو نزدی

  13. Avatar

    مهمان

    س

    سلام میگم چرا اینجا return تو adc h زدی چرا تو adcw نزدی

  14. Avatar

    مهمان

    عسل

    در واقع خروجی رو روی pinb.0 میخوام بریزم.
    ورودی:x
    خروجی:y که روی pinb.0 ریخته میشه

  15. Avatar

    مهمان

    عسل

    ببینید من یه ولتاژ آنالوگ به میکرو میدم که چون این ولتاژ آنالوگه و برای میکرو قابل فهم نیست از بخش adc میکرو استفاده میکنم
    بر اساس اینکه ورودی مقدار x رو داشته میخوام بگم مثلا pinb.0 مقدار y رو داشته باشه.
    میدونیم که مقادیر پایه های میکرو یا صفر هستن یا یک . اما من میخوام مقدار pinb.0 عددی بین 0تا یک باشه مثلا 0.2 بشه
    چطوری میتونم این خروجی ر از pinb.0 بگیرم.

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      خب پایه های پورت A که همشون Adc دارن و رو اون پایه ها بحثی نیست – اما برا پورت های دیگه که پایه هاشون adc نداره – میتونید از تایمر( pwm ) برای این کار استفاده کنید.

  16. Avatar

    مهمان

    عسل

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

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      متوجه نشدم دقیقا میخواین چیکار کنید.

  17. Avatar

    مهمان

    amir

    سلام
    من متوجه نشدم معنی (while(ADSRA==0 چیه؟؟؟؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام-تا زمانی که مقدار رجیستر ADCSRA صفر هستش…

  18. Avatar

    مهمان

    علی

    سلام و خسته نباشید بابت سایت خوبتون و سوالم اینه که الان این برنامه فقط مقدار dc رو نشون میده، وقتی به adc سینوسی دادم، lcd مقدار صفر نشون داد، برای اینکه سینوسی رو هم نشون بده چه تغییری لازمه؟؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام.بستگی داره.اولا نباید مقدار ولتاز شما به زیر ۰ ولت بره
      ولتاژ منفی نباید به adc بدی
      اگه ولتاژت قسمت منفی داره باید شیفت ولتاژ بدیش
      حالا بازم بستگی به فرکانس موجت هم داره.اگه بالا باشه.میزاان تغیرات اعداد تو نمایشگر زیاد میشه و نمایشگر به مشکل میخوره

  19. Avatar

    مهمان

    محدثه

    سلام
    خدا قوت
    زمانی که دو تا ورودی (مثلا دو تا سنسور) به adc میکرو وصل بشه چجوری میکرو بهشون رسیدگی میکنه؟کدش چجوری تغییر میکنه؟
    تشکر

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام – امقدار پایه ها رو پشت سر هم میخونیم – در داخل تابع main هم اگه نیاز باشه پایه های مورد استفاده رو باید پیکربندی کنیم در نقش adc تا جایی که در خاطرمه.
      read_adc(0);
      .
      .
      .
      read_adc(1);

  20. Avatar

    مهمان

    حمید رضا

    سلام خسته نباشید .
    ببخشید من زیاد وارد نیستم . فقط میخواستم بدونم نحوه جابجایی پایه ها چجوریه؟ مثلا توی همین برنامه به جای پایه ۴۰ به پایه ۳۰ وصل بشه ؟
    چند جا فرموده بودین مطالب adc مربوط به avr ، اوناروهم خوندم چیزی متوجه نشدم یا هرچی با برنامه کلنجار میرم جواب نمیده ممنون میشم راهنمایی کنید .

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      جابجایی بین پایه های adc? خب رجیستر ADMUX رو بخونین توضیحاتشو – کم بود – تو نت بزنید و توضیحات دیگران رو هم بخونید – دیتاشیت هم که هستش.

      • Avatar

        مهمان

        حمید رضا

        دمت گرم .
        فقط یه سوال دیگه برای پورتای دیگه چی ؟ از همین روش هست ؟
        مثلا پورت b، اگه بخوایم به جای پورت ۱و۲ از پورت ۵و۶ استفاده کنیم ولی همون مقدار بهمون بده ؟ smile

        • مهدی دمرچیلو

          نویسنده این مطلب

          مهدی دمرچیلو

          adc فقط رو یه پورت سوار هستش.

  21. Avatar

    مهمان

    عرفان

    با عرض سلام و تشکراز مطالب مفید سایتتون
    یه سوال داشتم
    منظور از اینکه فلان میکرو کنترلر ۸ بیتیه یعنی چی؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      رجیسترها ۸ بیتی هستن – مثلا تو ارتباط سریال دیتایی بخوای بخونی یا بنویسی به طبع اونم ۸ بیتی میشه… چیزی که میدونستم…
      مطلب زیر رو هم بخون :
      http://digiato.com/article/2014/10/30/%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-64-%D8%A8%DB%8C%D8%AA%DB%8C-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F/

  22. Avatar

    مهمان

    علی

    سلام میشه پالس مربعی ۱۰ MHZ با میکرو ساخت؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام.حداکثر ۸ میگ
      یه کلاک برا ساخت سطح ۰ و یه کلاک برا سطح ۱
      فرکانس میکرو رو ۱۶ میگ در نظر بگیری….حداکثر ۸ میگ میتونه باشه موجت

  23. Avatar

    مهمان

    مهدی

    سلام خدا قوت اقا مهدی اگ میشه درباره خط ۱۶ یه توضیحی بدید

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      #define ADC_VREF_TYPE 0x20
      ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);

      خب مقدار ADC_VREF_TYPE برابر ۰x20 هستش – این از این.
      تو خط دوم، ADC_VREF_TYPE با ۰xff اند بیتی میشه ( اگه نمیدونی چیه، تو نت سرچ کن – تو سایت تو قسمت برنامه نویسی c هم فک کنم آموزشش رو گزاشتم) و جوابش میشه ۰x20 و این جواب با adc_input اور بیتی میشه( اینم برو آموزشش رو بخون که اور بیتی یعنی چی )، این adc_input هم که شماره پایه Adc ما هستش و ما از پایه ۰ استفاده میکنیم و لذا اور بیتی ۰x20 با ۰ میشه همون ۰x20 ؛ و بعد این جواب به رجیستر ADMUX داده میشه که بیت ۵ این رجیستر ۱ میشه و بقیه بیتهاش ۰ میشن

  24. Avatar

    مهمان

    رضا123456789

    سلام.من از کد ویزارد استفاده میکنم.هر متغیری میتونه تو تابع پایین استفاده شه؟یا فقط باید رشته باشه؟
    lcd_puts
    با lcd_putsf چه فرقی داره؟
    اگه میشه برنامم رو چک کن.برنامه هم برات میفرستم به ایمیلت.

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام.فقط رشته
      اگه عدد داری باید به رشته تبدیل کنی به کمک توابع itoa و ftoa که پروزه های avr توی سایت رو بررسی کنی نحوه کارش دستت میاد

  25. Avatar

    مهمان

    رضا

    سلام—–(ftoa(voltage,2,str
    دستور بالا ، متغیر voltage رو دو رقم اعشار روند میکنه و تبدیل به استرینگش میکنه؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام – بله –
      متغیر اعشاری فوق رو در Str ذخیره میکنه – بعد از فراخونی این تابع باید از Str استفاده کنیم.

  26. Avatar

    مهمان

    یاسر

    میگم دمتون گرم که این سایتو درست کردین کار مردمو راه میندازین ولی حداقل جواب طرفو بدید!

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام آقا یاسر
      والا تو هر سایت تاخیر تو پاسخ دهی وجود داره.
      منم پشت سایت نیستم همیشه و لذا نمیتونم در آن نظر دادن کاربر همون لحظه جواب بدم – ممکنه یه ساعت بعدش سایت رو بررسی کنم و جواب بدم.
      عرضم به حظورتون که این کار زیاد سخت نیست شما کافیه از دستور if استفاده کنید – مقدار adc رو با if های تو در تو بررسی کنید.

  27. Avatar

    مهمان

    یاسر

    کسی نیست؟

  28. Avatar

    مهمان

    یاسر

    سلام آقا مهدی
    یه سوال اگر این ولتاژی که از سنسور LM35(آنالوگ) وارد ADC میشه رو بخواهیم برای هر درجه دما یه متن هم روی LCD بنویسه باید چکار کنم

  29. Avatar

    مهمان

    ehsan-mikro

    سلام بر آقا مهدی عزیز
    فک کنم تو بحث ولتاژ refrence یه ایرادی باشه//منظورم اینه که به پایه AVCCفقط میشه تغذیه میکرو با یک فیلترLCمتصل نمود و قابلیت انعطاف نداره یعنی اینکه مثل پایه ی AREF نمی توان بصورت دلخواه ((متناسب با پروژه)) از 0 تا سطح تغذیه(مثلا5ولت)را داد—البته با توجه به این قضیه میگم که اگه ولتاژی که روی پایه AVCCاعمال میکنیم به اندازه( +-0.3ولت)با Vccمدار اختلاف داشته باشه قسمت ADCمیکرو مقایسه کننده اش از دس میره وحتی پورت دوگانه ای که در حالت غیر از ADC استفاده میشه هم میسوزه——–<>>>>>>>>>>>>–ایییی ک وگفتی یعنیییی چههه—هاااا ای چی بیده—من ک نوفهمم–اشتباه گفته بیدم؟؟؟؟؟

  30. Avatar

    مهمان

    Myself

    سلام
    ببخشید توی خط ۱۹ وقتی که شرط داخل حلقه رو این شکلی مینویسیم یعنی چی؟
    ببخشید من یه مشکل توی خط ۱۶ دارم
    چرا ما میایم با صفر عمل or کردن رو‌ انجام میدیم که‌ همیشه‌ حاصل خود عبارت غیر صفر میشه؟
    ممنون پیشاپیش

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      خط 19) خب کاراکتر & یعنی اند بیتی، تو این خط گفتیم تا زمانی که بیت 5 ام(بیت شماره 4، شماره گزاری از 0 شروع میشه!) 0 هستش صبر کن >>>> به کمک & اومدیم غیر از بیت 5ام(شماره4) بقیه مقادیر رو 0 کردیم و اودیم گفتیم تا زمانی که این بیت 5ام مقدار 0 هست وایسا(while)
      به نظرم مطلب زیر رو بخون – و یکم تو گوگل سرچ کن – آموزشش پیدا میشه – من بخوام توضیح بدم بدتر میشه و شما به نظرم قاطی میکنید چون من بد توضیح میدم.
      تغییر و یا خوندن یه بیت از یک متغیر

  31. Avatar

    مهمان

    رضا

    من عینا همین کد ها رو استفاده کردم ولی lcd فقط 4.98 چاپ میکنه و تغییر هم نمیکنه
    نباید پوینتر استفاده کرد ؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      اون دو تا پایه توی شماتیک رو به vcc وصل کردی؟ اگه نشد یه بار یکیشون رو وصل کن اون یکی رو قطع و برعکس

  32. Avatar

    مهمان

    مهجور

    سلام جناب مهندس
    یه توضیحات و تغییراتی برا پروژه 2 گذاشتم ببین اگه مناسبه و ایرادی نداره برا بقیه بذار
    و بسیار متشکرم از همه وقتی که گذاشتی و به قول خودت زکات علم کردی.
    به ایمیل شما ارسال کردم

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      پیوست کردم

  33. Avatar

    مهمان

    وحید

    سلام خسته نباشی
    الان این پروژه والتاژ بین 0و5 ولت نشون میده ولی اگر بخوام 0تا12 ولت نشون بده باید چه کار کنم , چه جوری محاسبه کنم میشه راهنمایی کنید.ممنون میشم

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      تنها ورش فعلا فقط تقسیم ولتاژ به ذهنم میرسه

  34. Avatar

    مهمان

    محمدرضا

    آقا اوکی شد، با همون روش push-pull با استفاده از دو کانال درستش کردم. smile

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      good

  35. Avatar

    مهمان

    محمدرضا

    خب وقتی از روش اول میرم، lcd درست به فرمان های برنامه عمل نمیکنه و قاطی میکنه. میدونین مشکلش چیه؟ البته هنوز روش وقفه رو امتحان نکردم ببینم اونم همین مشکل رو داره یا نه

  36. Avatar

    مهمان

    محمدرضا

    اها…از روش push-pull برم!؟ یا از روش وقفه!؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      اولی

  37. Avatar

    مهمان

    محمدرضا

    سلام آقا مهدی، میگما میشه همزمان از سه تا کانال adc استفاده کرد!؟ میخوام یک کانال رو واسه سنجش ولتاژ خروجی یک مدار استفاده کنم (ولتمتر دیجیتال) و دو کانال دیگه رو در مد تفاضلی بزارم و تفاضل ولتاژ دو سر یک مقاومت رو اندازه بگیرم. چنین کاری شدنیه!؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      مد تفاظلی کار نکردم
      ولی اندازه گیری 8 تا پشت سر هم، هم میشه و مشکلی نیست.
      ولی همزمان که نمیشه اصلا – اول پایه 1 رو اندازه میگیری بعد میری 2 و …

  38. Avatar

    مهمان

    ناصری

    سلام دوست عزیز
    سوالم چرا تایید نشد؟
    سوالم این بود که ftoa در برنامه خط 47 یعنی چی؟
    من وقتی تاپیش میکنم کامپایل میکنم برنامه ارور میگیره
    ممنون میشم راهنمایی کنید؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      کدوم مطلب/؟
      تبدیل متغییر float به رشته

  39. Avatar

    مهمان

    ناصری

    سلام دوست عزیز خسته نباشی و بابت آموزشهای خوبت از تشکر میکنم
    من این برنامه رو نوشته ام اما error داد در خط 47 شما نوشتین ftoa این یعنی چی از این کلمه error .میگیره لطفا راهنمایی کنید
    با تشکر

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      تابع ftoa میاد و یه متغییر float رو میگیره و در یه رشته ذخیره میکنه و در ضمن میشه تعداد ارقام اعشار رو تعیین کرد.

  40. Avatar

    مهمان

    حامد

    چرا سوالات من اصلا تایید نمیشه و نمایش داده نمیشه آقای مدیر سایت؟؟؟؟؟؟؟؟
    تا حالا چن بار نظر دادم سال پرسیدم اما اصلا ج ندادین که هیچ تاییدشم نکردین

  41. Avatar

    مهمان

    حامد

    آقا من یه ال سی دی کارکتری گرفتم اصلا نمیدونم چشه مدار میبندم باید 2 ساعت بزنم تو سرش اینورو اونورش کنم تا یه چیز نشون بده واللا فقط مستطیلارو نشون میده خیلی گیره چیکارش کنم؟

  42. Avatar

    مهمان

    بنده

    نزدیک ۲ ساعتی هست دارم میخونم خیلی سنگینه
    ولی عالی هستی مهندس خدا قوت

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      اکثر مطالبش رو نگفتم….وقتم خالی بشه این مبحث رو کامل رو میکنم.

  43. Avatar

    مهمان

    سهیل

    سلام
    در این سایت چیزی درمورد اینی که گفتم نبود؟؟؟!!!!!!

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

  44. Avatar

    مهمان

    سهیل

    سلام
    چه جوری می شود از همه ی پایه های avr خروجی pwm گرفت؟
    مثلا برای ساخت led ابشاری

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      با استفاده از تایمر فک کنم
      میتونی لینک زیر رو هم ببینی….فک کنم طرف یه کتابخونه آماده برا اینکار نوشته (البته باید بسرچی تا پیداش کنی)
      http://www.eca.ir/forum2/index.php?board=161.0

  45. Avatar

    مهمان

    سهیل

    سلام
    چه جوری میشه از ADC خروجی PWM گرفت؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      دقیقا متوجه نشدم
      یعنی میگی از پایه های adc به عنوان pwm استفاده کنی یا…؟
      چون adc میاد آنالوک رو میخونه و دیجیتال میکنه و pwm برعکس این کار رو میکنه

1 2