NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3761 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 10 از 10

موضوع: کمک در نوشت برنامه

  1. #1
    عضو جدید kiar آواتار ها
    تاریخ عضویت
    Sep 2013
    نوشته ها
    9
    تشکر
    8
    تشکر شده 0 بار در 0 پست

    Exclamation کمک در نوشت برنامه

    سلام خدمت اساتید عزیز

    من تازه کارکردن با ARM رو شروع کردم یه تمرین بهمون دادن گفتن حل کنید.
    خوم یه چیزایی نوشتم ولی همه جاش ارور میده. لطفا اگه امکانش بود برنامه رو اصلاح کنید.

    تمرین :
    برنامه بنویسید که با استفاده از کانالهای 4 تا 7 ADC ورودی ها را بخواند و باتوجه به سطح ولتاژ پایه های PB20-23 را روشن کند. Vref = 1.5
    if Vin AD4 = 1.2V >>> PB20=ON
    if Vin AD5 = 0.7V >>> PB21=ON
    if 0.2V < Vin AD6 < 0.8V >>> PB22=ON
    if Vin AD7 <= 0.95V >>> PB23=ON

    کد:
    #include "AT91SAM7X256.H"
    #include "lib_AT91SAM7X256.h"
    #include "adc.h"
    int main (void){
    config_adc(0xF0);
    while (1)
    {
    int a ;
    int b ;
    int c ;
    int d ;
    start_adc();
    a = read_adc(4);
    b = read_adc(5);
    c = read_adc(6);
    d = read_adc(7);
    if ( 1.2 == a ){
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 0x00F00000);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x00100000);
    }
    if (0.7 > b ){
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 0x00F00000);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x00200000);
    }
    if (0.2 > c && c < 0.8){
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 0x00F00000);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x00400000);
    }
    if (0.95 < d && d == 0.95){
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 0x00F00000);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x00800000);
    }}}

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    عضو جدید kiar آواتار ها
    تاریخ عضویت
    Sep 2013
    نوشته ها
    9
    تشکر
    8
    تشکر شده 0 بار در 0 پست

    پیش فرض

    دوستان لطفا راهنمایی کنید.

  4. #3
    کاربر ارشد 1nafar آواتار ها
    تاریخ عضویت
    Jul 2007
    نوشته ها
    2,745
    تشکر
    1,266
    تشکر شده 4,874 بار در 1,377 پست

    پیش فرض

    سلام
    من تازه کارکردن با ARM رو شروع کردم یه تمرین بهمون دادن گفتن حل کنید.
    بهتره مطالب مجلات pmm یک تا 4 ( ویرایش دوم ) رو مطالعه کنید :
    دانلود مجله تخصصی میکرو pmm - ایـــــــــران میـــــــکرو ™
    خوم یه چیزایی نوشتم ولی همه جاش ارور میده. لطفا اگه امکانش بود برنامه رو اصلاح کنید.
    adc های میکروکنترلر های arm در حالت عادی به ازای ولتاژ 3.3 ولت اعمالی عدد 1023 و به ازای ولتاژ 0 ولت عدد 0 رو میگردونن .
    در این حالت اگه شما ولتاژ 1.2 ولت رو به adc کانال 4 اعمال کنید ، عدد 372 در متغیر a ریخته میشه .
    دستورات شرطی باید مثل زیر نوشته بشه :
    if ( a == 1.2 ){
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 0x00F00000);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x00100000);
    }
    در این حالت باید متغیر a از جنس flout باشه تا بشه اون رو با اعداد اعشاری مقایسه کرد .

  5. کاربران : 2 تشکر کرده اند از شما 1nafar برای ارسال این پست سودمند:


  6. #4
    عضو جدید kiar آواتار ها
    تاریخ عضویت
    Sep 2013
    نوشته ها
    9
    تشکر
    8
    تشکر شده 0 بار در 0 پست

    پیش فرض

    نقل قول نوشته اصلی توسط 1nafar نمایش پست ها
    سلام

    بهتره مطالب مجلات pmm یک تا 4 ( ویرایش دوم ) رو مطالعه کنید :
    دانلود مجله تخصصی میکرو pmm - ایـــــــــران میـــــــکرو ™

    adc های میکروکنترلر های arm در حالت عادی به ازای ولتاژ 3.3 ولت اعمالی عدد 1023 و به ازای ولتاژ 0 ولت عدد 0 رو میگردونن .
    در این حالت اگه شما ولتاژ 1.2 ولت رو به adc کانال 4 اعمال کنید ، عدد 372 در متغیر a ریخته میشه .
    دستورات شرطی باید مثل زیر نوشته بشه :

    در این حالت باید متغیر a از جنس flout باشه تا بشه اون رو با اعداد اعشاری مقایسه کرد .
    ممنون. همه PMM هارو دارم. خوندم ولی مشکلمو نتونستم حل کنم.

    الان این دستور رو به برنامه اضافه کردم ولی بازم ارور میده.
    کد:
    float a , b , c , d;
    تو تمرین گفته Vref 1.5 ولت باشه. این مقدار چطوری تعریف میشه؟
    میشه خودتون ببینین اشکال برنامه کجاست؟

  7. #5
    عضو جدید kiar آواتار ها
    تاریخ عضویت
    Sep 2013
    نوشته ها
    9
    تشکر
    8
    تشکر شده 0 بار در 0 پست

    پیش فرض

    هدر فایلها رو عوض کردم مشکل ارور برطرف شد.

    الان ببینین این برنامه دقیقا جواب تمرینه یانه؟

    کد:
    #include "AT91SAM7X256.H"
    #include "lib_AT91SAM7X256.h"
    #include "adc.h"
    int main (){
    float a , b , c , d;
    config_adc(0xF0);
    while (1)
    {
    int a ;
    int b ;
    int c ;
    int d ;
    start_adc();
    a = read_adc(4);
    b = read_adc(5);
    c = read_adc(6);
    d = read_adc(7);
    if ( 1.2 == a ){
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 0x00F00000);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x00100000);
    }
    if (0.7 > b ){
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 0x00F00000);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x00200000);
    }
    if (0.2 > c && c < 0.8){
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 0x00F00000);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x00400000);
    }
    if (0.95 < d && d == 0.95){
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 0x00F00000);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x00800000);
    }}}
    ضمنا من هنوز نفهمیدم اینکه تو تمرین گفته شده Vref = 1.5 یعنی چی؟ تو برنامه باید اینو تعریف کرد؟

  8. #6
    مدیرکل انجمنها agape آواتار ها
    تاریخ عضویت
    Feb 2009
    نام
    Zeus
    نوشته ها
    1,235
    تشکر
    139
    تشکر شده 2,209 بار در 846 پست

    پیش فرض

    فکر میکنم مشکل داره برنامه شما،
    ولتاژ رفرنس ، ولتاژی هست که میکرو اونو به عنوان مرجع میگیره و تبدیل بر پایه اون انجام میشه ، از اونجایی که مبدل شما 10 بیتی هست یعنی برای 0 تا ولتاژ رفرنس که همون 1.5 هست ، 1024 تا پله درنظر می گیره ، هر پله از خروجی دیجیتال 0.00146484375 ولت خواهد بود ، پس برای این که ولتاژ رو بخوای به دست بیاری باید عددی که ADC بهت میده رو در عدد 0.00146484375 ضرب کنی که بشه ولتاژ اندازه گیری شده.
    مثلا برای ورودی a به این صورت بنویس
    کد:
    float a;
    a= ((float)read_adc(4)) * 0.00146484375;

  9. تشکرها از این نوشته :


  10. #7
    عضو جدید kiar آواتار ها
    تاریخ عضویت
    Sep 2013
    نوشته ها
    9
    تشکر
    8
    تشکر شده 0 بار در 0 پست

    پیش فرض

    نقل قول نوشته اصلی توسط agape نمایش پست ها
    فکر میکنم مشکل داره برنامه شما،
    ولتاژ رفرنس ، ولتاژی هست که میکرو اونو به عنوان مرجع میگیره و تبدیل بر پایه اون انجام میشه ، از اونجایی که مبدل شما 10 بیتی هست یعنی برای 0 تا ولتاژ رفرنس که همون 1.5 هست ، 1024 تا پله درنظر می گیره ، هر پله از خروجی دیجیتال 0.00146484375 ولت خواهد بود ، پس برای این که ولتاژ رو بخوای به دست بیاری باید عددی که ADC بهت میده رو در عدد 0.00146484375 ضرب کنی که بشه ولتاژ اندازه گیری شده.
    مثلا برای ورودی a به این صورت بنویس
    کد:
    float a;
    a= ((float)read_adc(4)) * 0.00146484375;
    نمیدونم درست متوجه شدم یا نه. برنامه رو به این شکل تغییر دادم. الان درسته؟

    کد:
    #include "AT91SAM7X256.H"
    #include "lib_AT91SAM7X256.h"
    #include "adc.h"
    int main (){
    config_adc(0xF0);
    while (1)
    {
    float a ;
    float b ;
    float c ;
    float d ;
    start_adc();
    a= ((float)read_adc(4)) * 0.00146484375;
    b= ((float)read_adc(4)) * 0.00146484375;
    c= ((float)read_adc(4)) * 0.00146484375;
    d= ((float)read_adc(4)) * 0.00146484375;
    if ( 1.2 == a ){
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 0x00F00000);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x00100000);
    }
    if (0.7 > b ){
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 0x00F00000);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x00200000);
    }
    if (0.2 > c && c < 0.8){
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 0x00F00000);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x00400000);
    }
    if (0.95 < d && d == 0.95){
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 0x00F00000);
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x00800000);
    }}}
    ویرایش توسط kiar : 08-01-2014 در ساعت 15:01

  11. #8

  12. تشکرها از این نوشته :


  13. #9
    عضو جدید kiar آواتار ها
    تاریخ عضویت
    Sep 2013
    نوشته ها
    9
    تشکر
    8
    تشکر شده 0 بار در 0 پست

    پیش فرض

    از کمک دوستان تشکر میکنم.

    فقط یه سوال مونده که مربوط به برنامه نیست.

    این دو دستور چه فرقی باهم دارن؟

    کد:
    int main (){
    کد:
    int main (void){

  14. #10
    ناظم انجمن Ma3ood آواتار ها
    تاریخ عضویت
    Aug 2011
    نام
    مسعود
    نوشته ها
    2,248
    تشکر
    1,912
    تشکر شده 3,087 بار در 1,509 پست

    پیش فرض

    هیچ فرقی !

مجوز های ارسال و ویرایش

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