نمایش نتایج 1 تا 3 از 3

نام تاپیک: درخواست توضیح در مورد کد مبدل آنالوگ به دیجیتال (ولت متر)

  1. #1
    کاربر دائمی
    تاریخ عضویت
    بهمن 1387
    محل زندگی
    بابل
    پست
    281

    درخواست توضیح در مورد کد مبدل آنالوگ به دیجیتال (ولت متر)

    با سلام

    کد زیر مربوط به یه برنامه تبدیل آنالوگ به دیحیتال هست . ولی زیاد با توابع avr آشنا نیستم و نمی دونم این توابع چی کار می کنند. لطفا اگه ممکنه یکی از دوستان تابع Run رو توضیح بده خط به خط چیکار میکنه و اون توابع COMMAND و CHAR_0 کارشون چیه؟

    با تشکر

         register addresses for Atmega 8535 */
    #include "io8535.h"

    #define ADSC ADCSR_Bit6
    #define DDD7 DDRD_Bit7
    #define DDD3 DDRD_Bit3
    #define PIND3 PIND_Bit3
    #define I SREG_Bit7

    // Declare variables
    unsigned char flag;
    unsigned int result;
    __flash unsigned char msg1[]=" Volt meter ";
    __flash unsigned char msg2[]=" ADC0: 0.000 [V]";
    __flash unsigned char ASCII[]="0123456789ABCDEF"; // ASCII Code
    // PC0-PC7 : Data bus, PB5=RS, PB6=RW, PB7=E
    #include "LCD8.h"

    // ADC conversion complete handler
    #pragma vector = ADC_vect
    __interrupt void A_D_C(void)
    {
    result = ADC;
    flag = 1 ;
    }

    void RUN(void)
    {
    unsigned char bcdh,bcdl;
    flag = 0;
    ADSC = 1; // Start ADC conversion
    while(!(flag));
    ADSC = 0;
    //
    result &= 0x03ff;
    result *= 5;

    bcdh = result >> 10;
    bcdh <<= 4;

    result &= 0x03ff;
    result *= 10;
    bcdh |= result >> 10;

    result &= 0x03ff;
    result *= 10;
    bcdl = result >> 10;
    bcdl <<= 4;

    result &= 0x03ff;
    result *= 10;
    bcdl |= result >> 10;

    COMMAND(0xc7);
    CHAR_O((bcdh >> 4)+0x30);
    CHAR_O('.');
    CHAR_O((bcdh & 0x0f)+0x30);
    CHAR_O((bcdl >> 4)+0x30);
    CHAR_O((bcdl & 0x0f)+0x30);
    COMMAND(0xcf);
    }
    // Main
    void main(void)
    {
    L_INIT();
    DISPLAY();
    DDRA = 0; // Set PA0 input
    DDD7 = 1; // Set PD7 output
    DDD3 = 0; // Set PD3 input
    ADMUX = 0; // Channel 0
    ADCSR = 0xbc;
    I = 1; // Set global interrupt enable
    // Scan key
    do{
    if (!PIND3) RUN();
    }while(1);
    }

  2. #2
    کاربر دائمی
    تاریخ عضویت
    بهمن 1387
    محل زندگی
    بابل
    پست
    281

    نقل قول: درخواست توضیح در مورد کد مبدل آنالوگ به دیجیتال (ولت متر)

    نزدیک یه هفته است یه سوال پرسیدم که آقا این دو تا تابع چی کار میکنن یکی پیدا نشد جواب بده!

  3. #3
    کاربر جدید آواتار sharin
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    ايران
    پست
    22

    نقل قول: درخواست توضیح در مورد کد مبدل آنالوگ به دیجیتال (ولت متر)

    سلام.

    خط به خط كه زياد مي شه ...
    كدها يه مقداري الكي پيچيده هستن ... كامپايلرش winnavr هست ؟
    نمي دونم اين كد ماله كي هست ...!

    تنه ي اصلي برنامه كه در تابع main نوشته شدهه ...
    يه سري پيكربندي ها صورت مي گيره و برنامه وارد حلقه ي بينهايت مي شه و منتظر زده شدن كيدي كه به PD7 وصل هست مي شه تا به تابع RUN پرش كنه .

    تابع RUN مي ياد ADC رو روشن مي كنه و شروع مي كنه به تبديل . flag تا موقعي كه صفر هست برنامه رو معطل مي كنه ( در واقع ميكرو و منتظر مي ذارهه تا ADC كار تبديل مقدارش رو تمام كنه )
    وقتي كار تبديل مقدار ADC تمام شد يه وقفه رخ مي ده و خط برنامه مي رهه به روال وقفه و اونجا flag رو 1 مي كنه و مقدار تبديل شده ي ADC رو در result ذخيره مي كنه و بر مي گرده به خط
     while(!(flag));

    از تابع RUN . در اين حالت شرط while برقرار نيست و برنامه ي ميكرو از اين خط در مياد و خط هاي بعدي رو اجرا مي كنه ...
    result &= 0x03ff

    مي خواد از رزولوشن 10 بيت ADC استفاده كنه ، پس مقدار هاي Valid رو نگه مي دارهه و بقيه رو 0 مي كنه ، 3FF به باينري مي شه 10 بيت 1 پشت سر هم.
    بعد ضربدر 5 اش مي كنه و حاصل رو مي ذارهه تو result در ادامه به اين ور و اونور شيفتش مي دهه و ...
    اينها بستگي به سخت افزاري دارهه كه طراح آماده كردهه و كاري كه مي خواد براش انجام بدهه ... ، عمليات كه مشخص هستن ...

    بعد مي رسيم به تابع COMMAND كه يه سري دستور رو به LCD مي فرسته ( در ديتاشيتش موجودهه )
    در خطوط بعد هم مقدار هاي تبديل شده ي ADC رو كه قبلا به فرمي در آوردهه بود كه روي LCD نشون بده رو به LCD مي فرسته براي نمايش و در نهايت دوبارهه بر مي گرده به main و ...
    روز از نو ، روزي از نو ...

    اميدوارم كافي بودهه باشه ...
    البته كدها در codvision و bascom به شدت مي تونن ساده تر باشن ...
    موفق باشيد.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •