NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 4124 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
صفحه 2 از 2 نخستنخست 12
نمایش نتایج: از 21 به 33 از 33

موضوع: مشکل با winavr(avrlib)

  1. #21
    ناظم انجمن vahidasm آواتار ها
    تاریخ عضویت
    Feb 2010
    نام
    وحید
    نوشته ها
    754
    تشکر
    1,068
    تشکر شده 881 بار در 470 پست

    پیش فرض

    سلام دوستان
    یه سوال دیگه:
    [PHP]ISR(INT0_vect)[/PHP]

    میدونید که برای اجرای روتین هر وقفه باید دستوری مثل بالا بنویسیم و بعد از اون به جای INT0_vect اسم وقفه مورد نظر رو بنویسیم
    حالا سوالم اینه که من اگه بخوام از وقفه های دیگه ای مث سرریز تایمر و .... تو winavr استفاده کنم باید این اسم ها رو از کجا پیدا کنم؟؟
    میشه یه لیستی چیزی در صورت امکان بذارید؟؟
    ممنون
    اولین مرحله شناخت آفرینش همانا خرد است چشم و گوش و زبان سه نگهبان اویند که لاجرم هر چه نیکی و شر است از همین سه ریشه می گیرد .و افسوس که بدنبال کنندگان خرد اندکند باید که به سخن دانندگان راه جست و باید جهان را کاوش نمود و از هر کسی دانشی آموخت و یک دم را هم برای آموختن نباید از دست داد . فردوسی خردمند

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

  3. #22
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    سلام مهندس
    مثلا اگه از ميكروي مگا 8 دارين استفاده ميكنيد فقط كافيه فايلي به اسم iom8.h رو باز كنيد.
    اگه عبارت Interrupt vectors رو سرچ كنيد. به اطلاعاتي كه نياز دارين ميرسين.
    فايل هدرو ميتونيد از مسير زير پيدا كنيد
    C:\WinAVR-20100110\avr\include\avr
    _____________________________________
    _____________________________________

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


  5. #23
    ناظم انجمن vahidasm آواتار ها
    تاریخ عضویت
    Feb 2010
    نام
    وحید
    نوشته ها
    754
    تشکر
    1,068
    تشکر شده 881 بار در 470 پست

    پیش فرض

    سلام دوستان

    انگار مشکل من با این وقفه حل نشدنیه
    دوستان برنامه زیر رو ببینید من با یه مشکل خیلی عجیبی گیر کردم
    [PHP]
    #include<avr/io.h>

    #include<util/delay.h>

    #include<avr/interrupt.h>

    int count;

    ISR(INT0_vect)
    {
    count++;
    }


    ISR(INT1_vect)
    {

    count--;
    }



    int main()
    {

    DDRC=0xff;

    PORTC=0x0f;

    GICR|=0xc0;

    MCUCR=0x0a;

    GIFR=0xc0;

    sei();

    while(1)

    {
    PORTC=count;
    }
    }
    [/PHP]

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

  6. #24
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    سلام مهندس
    دستور داخل حلقه while رو به اين صورت بنويس:
    کد:
    PORTC |= count;
    _____________________________________
    _____________________________________

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


  8. #25
    ناظم انجمن vahidasm آواتار ها
    تاریخ عضویت
    Feb 2010
    نام
    وحید
    نوشته ها
    754
    تشکر
    1,068
    تشکر شده 881 بار در 470 پست

    پیش فرض

    سلام مهندس
    ممنون بابت پاسخ هاتون

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

    ولی این مشکل همین الان حل شد به صورت زیر:

    باید متغیر count رو از نوع volatile تعریف میکردم طبق صحبتهای گفته شده در این لینک
    حالا من خودم هم نمیدونم داستان این volatile چیه چون تا حالا نشنیده بودم
    میدونید داستانش چیه ؟؟؟
    ویرایش توسط vahidasm : 23-11-2012 در ساعت 02:51
    اولین مرحله شناخت آفرینش همانا خرد است چشم و گوش و زبان سه نگهبان اویند که لاجرم هر چه نیکی و شر است از همین سه ریشه می گیرد .و افسوس که بدنبال کنندگان خرد اندکند باید که به سخن دانندگان راه جست و باید جهان را کاوش نمود و از هر کسی دانشی آموخت و یک دم را هم برای آموختن نباید از دست داد . فردوسی خردمند

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

    KHM

  10. #26
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    مهندس حالا بيا متغير رو به اين صورت تعريف كن:
    کد:
    static unsigned char count=0;
    _____________________________________
    _____________________________________

  11. کاربران : 2 تشکر کرده اند از شما sadmonew برای ارسال این پست سودمند:


  12. #27
    ناظم انجمن vahidasm آواتار ها
    تاریخ عضویت
    Feb 2010
    نام
    وحید
    نوشته ها
    754
    تشکر
    1,068
    تشکر شده 881 بار در 470 پست

    پیش فرض

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

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

    KHM

  14. #28
    ناظم سایت KHM آواتار ها
    تاریخ عضویت
    Jul 2010
    نوشته ها
    1,047
    تشکر
    2,895
    تشکر شده 2,131 بار در 905 پست

    پیش فرض

    دادا volatile برا متغیرهایی استفاده میشه که سریع عوض میشن یا مثلآ از پروتکل ارتباطی از جمله usart دریافت میشن..و احتمال از دست رفتن اطلاعات وجود داره...
    بدون volatile میکرو متغیر ها رو بهینه میکنه خودش..ولی وقتی متغیری از نوع volatile باشه، دیگه میکرو باهاش کاری نداره و همونجوری که هست نگه داشته میشه...
    ولی دادا اینجا دلیلی نداره که از این نوع تعریف یشه..
    حالا یه چنتا کار کن ببین بدون volatile هم کار میکنه یا نه...
    واسه پایه وقفه ها مقاومت pull up در حد 1k بذار..
    تو روتین وقفه ات اینجوری بنویس که وقتی وارد وقفه شد(یعنی پایه 1بار صفر شده) در حد مثلآ 30ms صبر کنه و دوباره پایه رو چک کنه..اگه هنوز صفر بود مقدار متغیر رو افزایش یا کاهش بده...این برا جلوگیری از نویزه...

    البته قبل همه ی اینها اینو امتحان کن شاید جواب بده ولی بعدش برا اینکه برنامه ات بهتر باشه حتمآ بالایی ها رو انجام بده:
    بعد از دستورات count++ یا count-- یه وقفه ی کوچیک بذار...همو در حد چند میلی ثانیه...ببین چی میشه.

    معمولآ اینجوری هست که اول روتین وقفه، وقفه ها رو غیر فعال میکنن و آخر روتینش دوباره وقفه ها رو فعال میکنن..(با cli )
    موفق باشی دادا
    ویرایش توسط KHM : 23-11-2012 در ساعت 12:32

  15. کاربران : 2 تشکر کرده اند از شما KHM برای ارسال این پست سودمند:


  16. #29
    کاربر فعال pooriya آواتار ها
    تاریخ عضویت
    Nov 2008
    نام
    پوریا علیزاده
    نوشته ها
    316
    تشکر
    163
    تشکر شده 676 بار در 217 پست

    پیش فرض

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

  17. کاربران : 2 تشکر کرده اند از شما pooriya برای ارسال این پست سودمند:


  18. #30
    ناظم انجمن vahidasm آواتار ها
    تاریخ عضویت
    Feb 2010
    نام
    وحید
    نوشته ها
    754
    تشکر
    1,068
    تشکر شده 881 بار در 470 پست

    پیش فرض

    سلام دوستان گلم ممنون بابت پاسخ هاتون
    دادا volatile برا متغیرهایی استفاده میشه که سریع عوض میشن یا مثلآ از پروتکل ارتباطی از جمله usart دریافت میشن..و احتمال از دست رفتن اطلاعات وجود داره...
    بدون volatile میکرو متغیر ها رو بهینه میکنه خودش..ولی وقتی متغیری از نوع volatile باشه، دیگه میکرو باهاش کاری نداره و همونجوری که هست نگه داشته میشه...
    ولی دادا اینجا دلیلی نداره که از این نوع تعریف یشه..
    حالا یه چنتا کار کن ببین بدون volatile هم کار میکنه یا نه...
    واسه پایه وقفه ها مقاومت pull up در حد 1k بذار..
    تو روتین وقفه ات اینجوری بنویس که وقتی وارد وقفه شد(یعنی پایه 1بار صفر شده) در حد مثلآ 30ms صبر کنه و دوباره پایه رو چک کنه..اگه هنوز صفر بود مقدار متغیر رو افزایش یا کاهش بده...این برا جلوگیری از نویزه...

    البته قبل همه ی اینها اینو امتحان کن شاید جواب بده ولی بعدش برا اینکه برنامه ات بهتر باشه حتمآ بالایی ها رو انجام بده:
    بعد از دستورات count++ یا count-- یه وقفه ی کوچیک بذار...همو در حد چند میلی ثانیه...ببین چی میشه.

    معمولآ اینجوری هست که اول روتین وقفه، وقفه ها رو غیر فعال میکنن و آخر روتینش دوباره وقفه ها رو فعال میکنن..(با cli )
    موفق باشی دادا
    دادا دیشب نمیدونی چه کارایی نکردم که این متغیر بدون volatile تغییر کنه ولی نکرد که نکرد
    یعنی تو وین ای وی آر اگه خودمو بکشم هم نمیتونم بدون volatile و با static این برنامه رو بنویسم
    خلاصه دمت گرم

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

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

    KHM

  20. #31
    ناظم انجمن vahidasm آواتار ها
    تاریخ عضویت
    Feb 2010
    نام
    وحید
    نوشته ها
    754
    تشکر
    1,068
    تشکر شده 881 بار در 470 پست

    پیش فرض

    سلام دوستان
    نگفتم من با این تاپیک حالا حالاها کار دارم؟؟

    آقا یه مشکلی پیش اومده

    میخوام با استفاده از کتابخونه uart چندتا عدد رو بفرستم رو پورت سریال
    text رو راحت میتونم بفرستم و کاملا هم جواب گرفتم ولی عدد رو نمیتونم بفرستم

    [PHP]
    /** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */
    extern void uart1_init(unsigned int baudrate);
    /** @brief Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc */
    extern unsigned int uart1_getc(void);
    /** @brief Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc */
    extern void uart1_putc(unsigned char data);
    /** @brief Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts */
    extern void uart1_puts(const char *s );
    /** @brief Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p */
    extern void uart1_puts_p(const char *s );
    /** @brief Macro to automatically put a string constant into program memory */
    #define uart1_puts_P(__s) uart1_puts_p(PSTR(__s))
    /** @brief Return number of bytes waiting in the receive buffer */
    extern int uart1_available(void);
    /** @brief Flush bytes waiting in receive buffer */
    extern void uart1_flush(void);
    [/PHP]

    این توابعی هستن که تو این کتابخونه وجود دارن
    خود کتابخونه ها رو هم ضمیمه میکنم ببینید
    من خودم از putc استفاده کردم نشد ولی به را حتی با استفاده از puts میتونم کلمه ok رو رو پورت سریال بفرستم
    ممنون میشم دوستان کمک کنن
    ضمنا اعدادی که میخوام رو پورت سریال بفرستم از نوع integer هستن
    فايل هاي پيوست شده فايل هاي پيوست شده
    • نوع فایل: rar uart.rar (7.6 کیلو بایت, 67 نمايش)
    ویرایش توسط vahidasm : 12-01-2013 در ساعت 18:38
    اولین مرحله شناخت آفرینش همانا خرد است چشم و گوش و زبان سه نگهبان اویند که لاجرم هر چه نیکی و شر است از همین سه ریشه می گیرد .و افسوس که بدنبال کنندگان خرد اندکند باید که به سخن دانندگان راه جست و باید جهان را کاوش نمود و از هر کسی دانشی آموخت و یک دم را هم برای آموختن نباید از دست داد . فردوسی خردمند

  21. #32
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    سلام مهندس
    از این تابع استفاده کنید:
    کد:
    char str[9];
    
    void ChTostr(unsigned int x,char b)
    {
     unsigned int t,m,count;
     unsigned char z=0,b_tmp;
     b_tmp = b;
     b--;
     for (b;b>0;b--)
        {
        switch(b){
                  case 0: t=1;
                        break;
                case 1: t=10;
                    break;
                case 2: t=100;
                    break;
                case 3: t=1000;
                    break;
                case 4: t=10000;
                    break;
                case 5: t=100000;
                    break;
                case 6: t=1000000;
                    break;
         }
         m=x/t;
         str[z]=m+0x30;
         x=x-(t*m);
         z++;
         }
         str[z]=x+0x30;
         for(count=0;count<b_tmp;count++){
        uart1_putc(str[count]);
         }        
    }
    به این صورت استفاده کنید:
    کد:
    ChTostr(23653,5);
    پارامتر اول عددی که میخواین تبدیل کنید و پارامتر دوم تعداد ارقام عدد مورد نظره.
    ویرایش توسط sadmonew : 12-01-2013 در ساعت 21:51
    _____________________________________
    _____________________________________

  22. کاربران : 2 تشکر کرده اند از شما sadmonew برای ارسال این پست سودمند:


  23. #33
    ناظم انجمن vahidasm آواتار ها
    تاریخ عضویت
    Feb 2010
    نام
    وحید
    نوشته ها
    754
    تشکر
    1,068
    تشکر شده 881 بار در 470 پست

    پیش فرض

    سلام خیلی ممنون مهندس
    این کد خییییییییییییییییییییییلی کمک کرد
    ویرایش توسط vahidasm : 13-01-2013 در ساعت 04:08
    اولین مرحله شناخت آفرینش همانا خرد است چشم و گوش و زبان سه نگهبان اویند که لاجرم هر چه نیکی و شر است از همین سه ریشه می گیرد .و افسوس که بدنبال کنندگان خرد اندکند باید که به سخن دانندگان راه جست و باید جهان را کاوش نمود و از هر کسی دانشی آموخت و یک دم را هم برای آموختن نباید از دست داد . فردوسی خردمند

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


صفحه 2 از 2 نخستنخست 12

موضوعات مشابه

  1. مشکل با winavr
    توسط piremard در انجمن AVR
    پاسخ: 11
    آخرين نوشته: 07-03-2013, 15:25
  2. نرم افزار winavr
    توسط M3R در انجمن در خواست نرم افزارو كرك
    پاسخ: 7
    آخرين نوشته: 04-10-2010, 23:16
  3. پاسخ: 9
    آخرين نوشته: 23-05-2010, 14:18
  4. ارتباط کتابخانه AVRLIB با Eclipse
    توسط mahmoudARM در انجمن AVR
    پاسخ: 2
    آخرين نوشته: 06-03-2009, 15:45
  5. کامپایلر WinAvr برای دانلود(12 قسمت )
    توسط kavir در انجمن پرسش و پاسخ (نرم افزارهای تخصصی)
    پاسخ: 3
    آخرين نوشته: 28-11-2007, 20:30

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

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