رفتن به مطلب
ایران چیپ

amir_yazdi

Administrators
  • تعداد ارسال ها

    68
  • تاریخ عضویت

  • آخرین بازدید

پست ها ارسال شده توسط amir_yazdi


  1.  

    سلام

    دوست عزیز

    در برنامه ایی که شما استفاده میکنید از کتابخانه ایی استفاده میکنه که 136 عدد کد مربوط به آمریکای شمالی و 139 عدد کد مربوط به اتحادیه اروپا را تست میکنه که دلیل طولانی بودن زمان هم همین هستش

    حال شما باید فقط کد مورد نظرتو فراخوانی کنی

     

    حال برای این کار به تابع sendAllCodes() مراجعه کنید و از حالت ارسال شمارشی خارج و فقط دستور مورد نظرتو وارد کن البته میتونی فقط تابع مورد نظرتو در تابع loop() هم وارد کنید

     

    اگه مشکلی داشتی بگو راهنماییت کنم

     

    یاحق

     


  2. سلام

     

    متغییر Value که داخل تابع ReadTemperature هست local هست و شما نمیتونی مقدارشو از خارج تابع بخونی

     

    اگر تابع ReadTemperature را نگاه کنی از نوع long هست و مقدار Value درانتها return شده

     

     

    در خط اولی که در حلقه while نوشتی تابع را فراخوانی کردی ولی مقدار برگشتی را نخواندی

    ReadTemperature();

     

    که باید به شکل زیر باشه

     

    Value = ReadTemperature();

     

    نکته Value که اینجا هست را خودت در بالا تعریف کردی قبل از تابع main و ربطی به متغییر Value داخل ReadTemperature که local هستش نداره

     

    long Value;

     

    یاحق


  3. سلام

    پروتکلی که سری sht1x استفاده میکنه i2c هستش ولی شما تو برنامه ات ازش استفاده نکردی

    و خروجی سنسور رو به این شکل نمیتونی بخونی

    باید

    کتابخانه i2c را فراخوانی کنی


    insert this code to your project -->> #include // I2C Bus functions
    
    

     

     

     

     

    و از دستوراتش برای خواندن سنسورت استفاده کنی

    اگر تو راه اندازیش به مشکلی خوردی بگو تا راهنمایت کنم

     

    یاحق


  4. سلام

    یک پروژه ی دانشجویی ساده هستش اگه دوستان میتونن کمک کنن تا تحویلش بدم various_082.gif

    این پروژه باید در cv avr نوشته بشه و در proteus نمایش داده بشه ممنون میشم کمک کنید

     

    پروژه : برنامه ای بنویسید که یک عدد از ورودی دریافت کند (با usart) و براساس آن عدد فرکانس روشن و خاموش شدن led به پایه PA3 را تنظیم کند اگر عدد وارد شده از 100 کوچکتر و یا از 10000 بزرگتر شود بر روی lcd عبارت ERROR را نمایش دهد

     

    باتشکر

     

    سلام

     

    فایل ها را از حالت فشرده خارج کرد و فایل hex را در پروژه proteus قرار داده شده در زیر وارد کنید

     

    یاحق

    uartnum_iranchip.rar

    uartnum_proteus_iranchip.rar


  5. سلام

     

    دستورات I2C در CCS و نحوه استفاده از آن

     

    برای تنظیم I2C از دستور زیر استفاده میکنیم

     

    در مثال پایین

     

    MASTER حالت I2C

     

    FAST سرعت انتقال داده

     

    SCL پایه همزمان سازی

     

    SDA پایه انتقال داده

    
    #use i2c(Master,Fast, scl=PIN_C3, sda=PIN_C4)
    
    

     

    دستور i2c_start در زمان شروع انتقال داده START با نماد ( S ) و یا در زمان تغییر حالت RESTART با نماد ( R ) بکار میرود

     

    [/color]i2c_start();[color=#000000]
    

     

    دستور i2c_stop در پایان و بعد از اتمام دستورات I2C بکار میرود و نماد آن ( P ) می باشد

     

    i2c_stop();
    

    دستور i2c_write برای ارسال آدرس و داده بکار میرود

     

    i2c_write (data);
    

     

    دستور i2c_read برای در یافت داده بکار میرود

     

    data = i2c_read ();
    

    نکته : دستور i2c_read در داخل پرانتز مقدار صفر (NACK) و 1 (ACK) را میگیرد که در حالت عادی مقدار آن یک (ACK) میباشد و زمانی که شما آخرین بایت را میخوانید باید مقدار آن را صفر(NACK) کنید

     

    data1 = i2c_read (1);
    
    
    data2 = i2c_read (0);
    

     

    در مثال زیر بر روی حافظه 24AA512 از نوع EEPROM با ظرفیت 512K مینویسیم

     

    مقدار 0XA0 آدرس حافظه

     

    ADDRH و ADDRL آدرس موقعیتی از حافظه که میخواهیم بر روی آن بنویسیم ( این آی سی به دلیل 16 بیتی بودن آدرس ها باید از 2 آدرس HIGH و LOW استفاده شود)

     

    DATA مقداری که میخواهیم بر روی حافظه ذخیره شود

     

    i2c_start();
    
    
    i2c_write(0xA0);
    
    
    i2c_write(ADDRH);
    
    
    i2c_write(ADDRL);
    
    
    i2c_write(DATA);
    
    
    i2c_stop();
    

     

    در مثال زیر از روی حافظه 24AA512 از نوع EEPROM با ظرفیت 512K می خوانیم

     

    START دوم برای تغییر حالت به خواندن میباشد (RESTART) و بیت R/W در آدرس نیز همانطور که در دیتاشیت ذکر شده تغییر کرده برای نوشتن (0XA0) و برای خواندن (0XA1)

     

    
    i2c_start();
    
    
    i2c_write(0xA0);
    
    
    i2c_write(ADDRH);
    
    
    i2c_write(ADDRL);
    
    
    i2c_start();
    
    
    i2c_write(0xA1);
    
    
    DATA = i2c_read (0);
    
    
    i2c_stop();
    
    

     

    نکته : پایه های I2C باید بوسیله مقاومت PULL UP شوند

     

    یاحق


  6. سلام

     

    دستورات UART در CCS

     

    برای استفاده از UART در CCS در ابتدا باید تنظیمات #USE RS232 را فراخوانی کنیم

     

    در مثال زیر پین های سخت افزاری سریال و نرخ داده (سرعت انتقال) 9600 تنظیم شده

    #use rs232(UART1,baud=9600)
    

     

    در مثال زیر از پین B6 و B7 برای UART بصورت نرم افزاری استفاده شده و با استفاده از دستور INVERT میتوان بصورت مستقیم و بدون نیاز به MAX232 و مبدل های دیگر مستقیم به کامپیوتر متصل کرد

     

    #use rs232(baud=9600, xmit=PIN_B6,rcv=PIN_B7,INVERT)
    

     

    دستور STREAM به ما اجازه میدهد که بیش از یک پورت سریال تعریف کنیم

     

    #use rs232(baud=9600, xmit=PIN_B6,rcv=PIN_B7,INVERT,STREAM=RS1)
    
    
    #use rs232(baud=9600, xmit=PIN_B5,rcv=PIN_B4,STREAM=RS2)
    
    
    #use rs232(baud=115200, xmit=PIN_B3,STREAM=RS3)
    

     

    راسال کاراکتر با دستور putc انجام میشود

     

    putc("A");
    

     

    در صورت داشتن چند پورت UART و استفاده از STREAM دستور زیر را استفاده میکنیم

     

    fputc ("A", stream);
    

     

    دریافت کاراکتر با دستور getc انجام میشود

     

    value = getc ();
    

     

    در صورت داشتن چند پورت UART و استفاده از STREAM دستور زیر را استفاده میکنیم

     

    value = fgetc (stream);
    

     

    راسال رشته با دستور puts انجام میشود

     

    puts ( "iranchip");
    

     

    در صورت داشتن چند پورت UART و استفاده از STREAM دستور زیر را استفاده میکنیم

     

    fputs ( "iranchip", stream);
    

     

    دریافت رشته با دستور gets انجام میشود

     

    value = gets ();
    

     

    در صورت داشتن چند پورت UART و استفاده از STREAM دستور زیر را استفاده میکنیم

     

    value = fgets (stream);
    

     

    دستور kbhit در صورتی که داده ایی بر روی پایه دریافت پورت UART دریافت شود مقدار یک (TRUE) را برمیگرداند در غیر اینصورت مقدار صفر(FALSE)

     

    
    value = kbhit();
    
    

     

    در صورت داشتن چند پورت UART و استفاده از STREAM دستور زیر را استفاده میکنیم

     

    value = kbhit (stream);
    

     

    دستور printf برای ارسال انواع داده اعم از کاراکتر , رشته , اعشاری , اعداد صحیح و هگزال و ..... بکار میرود

     

    
    printf("iranchip %c %s %u %lu %X %f \n\r",A,B,C,D,E,F);
    
    

     

    نکته:

     

    c% متغیر را بصورت کاراکتر نمایش میدهد

     

    s% متغیر را بصورت رشته نمایش میدهد

     

    u% متغیر را بصورت عدد صحیح 8 بیتی نا منفی نمایش میدهد

     

    d% متغیر را بصورت عدد صحیح 8 بیتی نمایش میدهد

     

    lu% متغیر را بصورت عدد صحیح +8 بیتی نا منفی نمایش میدهد

     

    ld% متغیر را بصورت عدد صحیح +8 بیتی نمایش میدهد

     

    x% متغیر را بصورت هگزال 8 بیتی نمایش میدهد

     

    lx% متغیر را بصورت هگزال +8 بیتی نمایش میدهد

     

    f% متغیر را بصورت عدد اعشاری نمایش میدهد

     

    یاحق


  7. سلام

     

    استفاده از پین ها و پورت ها بعنوان خروجی و ورودی

     

    در کامپایلر ccs در حالت کلی نیازی به تعریف خروجی ها و ورودی ها در ابتدای برنامه نیست و خود کامپایلر این کار را انجام میدهد البته دستوراتی برای این کار وجود دارد که بعدا به برسی آنها میپردازیم

     

    دستور output_high(pin) مقدار پین مورد نظر را یک (high) میکند

     

    output_high(PIN_B0);
    

     

     

    دستور output_low(pin) مقدار پین مورد نظر را صفر (low) میکند

     

    output_low(PIN_B0);
    

     

     

     

    دستور output_x (value) برای مقدار دهی به یک پورت استفاده میشود

     

    OUTPUT_B(0xf0);
    

     

     

    دستور output_bit (pin, value) مقدار پین مورد نظر را از متغیر (value) میگیرد

    نکته:متغیر باید 1 بیتی باشد در غیر اینصورت مقدار بیت اول متغیر را فقط در نظر میگیرد

     

    output_bit( PIN_B0, 0);
    

     

    دستور output_float (pin) پین مورد نظر را در حالت open collector خروجی میکند

     

    نکته:در این حالت باید پایه با مقاومت پول اپ (pull up) شود

     

    output_float(pin_B0);
    

     

    دستور input (pin) مقدار پین مورد نظر را بعنوان ورودی میگیرد

    نکته:در صورتی که خارج از شرط استفاده شود و برای مقدار دهی متغیر باشد متغیر باید 1 بیتی باشد در غیر اینصورت مقدار بیت اول متغیر را تغییر میدهد

     

    A=input(PIN_B1);
    

     

     

    دستور input_state (pin) حالت پین را از لحاظ HIGH یا LOW برمیگرداند

    نکته:در صورتی که خارج از شرط استفاده شود و برای مقدار دهی متغیر باشد متغیر باید 1 بیتی باشد در غیر اینصورت مقدار بیت اول متغیر را تغییر میدهد

     

    A = input_state (pin_B0);
    

     

    دستور input_change_x () حالت پورت را چک میکند و با بار قبل که همین دستور را اجرا کرده باشید مقایسه میکند در صورتی که مقدار پین های پورت تغییر کرده باشد عدد 1 (TRUE) و اگر تغییر نکرده باشد عدد 0 (FALSE) را برمیگرداند

    نکته:در صورتی که خارج از شرط استفاده شود و برای مقدار دهی متغیر باشد متغیر باید 1 بیتی باشد در غیر اینصورت مقدار بیت اول متغیر را تغییر میدهد

     

    A = input_change_b( );
    

     

    یاحق


  8. سلام

     

    تعریف متغییر

     

    انواع متعددی متغیر , ثابت و داده وجود داره که من برای شروع ساده ترین و کاربردی ترین آموزش میدم و در آموزش های بعدی مدل های مختلف اونو در مثال ها آموزش میدم

     

    انوع متغیر در ccs

     

    متغیر های مشترک

    int1

    int8

    int16

    int32

    float (اعشاری)

     

    متغیر های سری 24 بیتی به بالا

     

    int48

    int64

     

    
    int1 data;
    
    
    int8 a,b,c,d;
    
    
    int16 e;
    
    
    int32 f,g;
    
    
    float h,i;
    
    

     

    یاحق


  9. سلام

     

    دستور BREAK

     

    در هرجا بکار رود از حلقه (LOOP) یا سویچ (SWITCH) مورد نظر در همانجا بدون انجام دستورات بعد از آن خارج میشود

     

    در مثال زیر A و B مقدار میگیرند ولی C و D مقدار نمیگیرند و مقدار قبلی خود را حفظ میکنند

     

    VOID test()
    {
    A= 0;
    
    
    B= 1;
    
    
    BREAK;
    
    
    C= 2;
    
    
    D= 3;
    }
    

     

    دستور continue

     

    این دستور برای از سر گیری حلقه بکار برده میشود

     

    در مثال زیر تا زمانی که مقدار A به 10 نرسد حلقه به ابتدا برمیگردد و دوباره دستورات را اجرا میکند

     

    VOID test()
    {
    A++;
    
    
    B= 1;
    
    
    IF (A continue;
    
    
    C= 2;
    
    
    D= 3;
    }
    

     

    یاحق


  10. سلام

     

    دستور شرطی switch

     

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

     

    نکته :

    میتوان بینهایت CASE ایجاد کرد (موردهای متفاوت)

     

    بعد از دستور آخر هر CASE باید از دستور BREAK برای خروج از حلقه استفاده شود

     

    مورد DEFAULT را در آخر قرار میدهیم که در صورتی که شرط با هیچ کدام از CASE های تعریف شده برابر نبود مقدار DEFAULT برای ما برگردانده شود

     

    
    switch (A) {
    
    
    case 0:B=1;
    
    break;
    
    
    case 1:B=2;
    
    
    break;
    
    
    default:B=255;
    
    break;
    
       }
    
    
    

     

    یا حق


  11. سلام

     

    دستور شرطی

    do while

     

    یک حلقه ایجاد میکند و یک بار حتی در صورتی که شرط صحیح نباشد دستورات را اجرا میکند . تا زمانی که شرط داخل پرانتز صحیح (TRUE) باشد دستور بعد از پرانتز را انجام میدهد

     

     

    do
    B = 2;
    while (A == 1);
    
    
    

     

    نکته: برای انجام چند دستور داخل شرط از {} استفاده میکنیم

     

    do
    {
    B = 2;
    c = 3;
    }
    while (A == 1);
    

     

    یاحق


  12. سلام

     

    دستور شرطی

    while

     

    یک حلقه ایجاد میکند و تا زمانی که شرط داخل پرانتز صحیح (TRUE) باشد دستور بعد از پرانتز را انجام میدهد

     

     

    
    while(A==1)
    B=B+1;
    
    

     

    نکته: برای انجام چند دستور داخل شرط از {} استفاده میکنیم

     

    
    while(A==1)
    {
    B=B+1;
    C=C+1;
    }
    
    

     

    یاحق


  13. یه پیشنهاد

    خدمتتون تسلیت عرض می کنم

    به نظرم اگه برید سراغ موضوعات اصلی بهتره باشه مثلا آموزش کار با ( i2c یا spi و...) چون کسانی که میکرو کار می کنند یه حداقل آشنایی با زبان c دارند.

    با تشکر از شما

    سلام و ممنون

    برای اینکه آموزش کامل باشه با همین روند پیش میرم ولی سعی میکنم تو همین یکی دو روز به پروتکل های اصلی برسم

     

    یاحق


  14. از دستورات (setup_wdt(WDT_ON و ()restart_wdt نمی خواد استفاده کنی؟

    شما خودتون از تایمر watch dog جواب گرفتید؟

     

    سلام

     

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

     

    ولی از طریق فیوز بیت ها بصورت سخت افزاری این کار انجام میشه و قابل اطمینان تره

     

    در مورد استفاده هم بله به صورت سخت افزاری برای یک فرستنده گیرنده بخاطر نویزی که ماژول فرستنده گیرنده ایجاد میکردند میکرو از روند اصلی برنامه خارج میشد یا به اصطلاح هنگ میکرد که با این تایمر دوباره ریست میشد

     

    البته بعضی مواقع بدلیل اینکه ریست کردن باعث ایجاد مشکل میکنه باید تایمر WDT خاموشش کرد

     

     

    یاحق


  15. سلام

     

    دستور شرطی if

     

    دستور if شرط داخل پرانتز را چک میکند اگر شرط صحیح بود (true) خط بعد از دستور و قبل از ( ; ) را انجام میدهد در غیر اینصورت از آن رد میشود و در صورت وجود دستور else دستور بعد از آن را انجام میدهد

     

    حالت اول

     

    
    if(a==1)
    
    b =2;
    

     

    حالت دوم

     

     

    
    if(a==1)
    
    b=2;
    
    else
    
    b=3;
    

     

    حالت سوم

     

     

    
    if(a==1)
    
    b=2;
    
    else if(a==2)
    
    b=3;
    
    else if(a==3)
    
    b=4;
    

     

    نکته: برای انجام چند دستور داخل شرط از {} استفاده میکنیم

     

    
    if(a==1)
    {
    
    b=1;
    c=2;
    d=3;
    }
    

     

    یاحق


  16. آقای یزدی آموزش هاتون را ادامه نمی دید؟;)

    یکم پیشرفته ترflowerflower

     

    سلام

    دوست عزیز

     

    متاسفانه بخاطر فوت پدر عزیزم و اتفاقاتی که در این مدت افتاد و بشدت مرا درگیر کرده بود نتونستم ادامه بدم ولی حتما آموزش را ادامه میدم

     

    دو مورد فرمایش رامین عزیز اگر درخواستی در مورد آموزش mplab باشه به دیده منت آموزش اون هم بصورت جداگانه انجام میدم

     

    یاحق


  17. سلام

    دوست عزیز

     

    برای فعال سازیش فقط کافیه فیوز هایش را فعال کنید

     

    [b][color=#ff0000]#fuses[/color][/b] wdt
    [b][color=#ff0000]#fuses[/color][/b] wdt128
    

     

     

    البته دقت کن فیوز ICD یا همون دیباگ فعال نباشه چون بصورت خودکار فیوز سگ نگهبان غیر فعال میکنه

     

    اگر داخل فیوز هات ICD داشتی پاکش کن

     

    و نکته بعدی ممکنه پروگرامرت فیوز هارو تنظیم نمیکنه که باید دستی ست کنی

     

    امیدوارم مشکلت حل بشه

     

    یاحق


  18. سلام

    دوست عزیز

     

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

     

    امنیت در شبکه :

    برای ارتباطات رادیویی غیر عمومی امنیت مهمترین اصل ارتباط میباشد زیرا هم دسترسی افراد دیگر را محدود میکند هم با مقایسه کردن دیتا در فرستنده و گیرنده از سالم بودن ان اطمینان حاصل میکند

     

    در شبکه های رادیویی و غیر رادیویی از استاندارد MAC 802.15.4 استفاده میشه که هر دستگاه یک مک ادرس دارد که از طریق اون شناسایی میشه البته (زیگبی و nrf و .... ) مک ادرس استاندارد ندارند

     

    نکته ایی که در مورد mac وجود داره میشه دستگاهی را در شبکه بصورت تقلبی و با mac دستگاه دیگه معرفی کرد پس در حال حاضر امنیت شما را تضمین نمیکنه

     

    این مسائل مربوط به شبکه که شما باید باهاش کار کنید حالا در مورد پروژه تون چند تا نکته وجود داره

     

    1-به دلیل تعداد بالای کاربر شما از شبکه هایی که با از این دسته ماژول ها کار میکنند نمیتونید استفاده کنید زیرا ارتباط شما به امنیت , پایداری و دسترسی آسان نیاز داره

     

    پس بهتره از شبکه های موجود مثل gsm استفاده کنید

     

    2-استفاده از سنسور اثر انگشت ساده است ولی زمانی که شما بخواهید یک بانک اطلاعاتی از اون بسازید بحث کاملا متفاوت میشه و شما باید بتوانید از طریق تمام مراکز و دستگاه های کامپیوتری به اون دسترسی داشته باشید و فقط دسترسی شما نمیتواند از طریق میکرو باشه (البته اگه فقط با میکرو هم میشد)

     

    پس شما نیاز به سیستم عامل های استاندارد دارید که میتوانید از سری های متن باز (GNU) استفاده کنید مثل (Android,linux)

     

    امیدوارم این اطلاعات کمکتون کند

     

    یاحق

×
×
  • اضافه کردن...