اطلاعیه

Collapse
No announcement yet.

آموزش winavr و avrlib

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    پاسخ : آموزش winavr و avrlib

    سلام
    آقا این یه کتابه که ماله avrlib و گریقه استفاده از winavr هستش نمیدونم کسی قبلا لینک داده یا نه
    امید وارم به دردتون بخوره
    http://savannah.nongnu.org/download/avr-libc/avr-libc-user-manual-1.7.0.pdf.bz2

    دیدگاه


      پاسخ : آموزش winavr و avrlib

      سلام.
      من میخوام یه پایه رو چک کنم ببینم که 0 شده یا یک برای همین برنامه زیر رو نوشتم :
      کد:
      #include <avr/io.h>
      #include <util/delay.h>
      int main (){
      DDRB|=2;
      PORTB|=1;
      char x;
      while (1){
      
      x=PINB;
      if (x & 1){
      PORTB|=2;}
      else {
      PORTB&=~2;}
      }}
      مگه تو مثال بالا هر وقت که مقدار داخل پرانتز جلوی if برابر 1 بشه شرط اجرا نمیشه؟؟
      حالا من برنامه رو به صورت زیر نوشتم که باز هم با فشردن کلید مقدار تو پرانتز برابر 1 میشه ولی این برنامه فقط یک بار پس از فشردن کلید شرط اجرا میشه و دیگه دستور else اجرا نمیشه!!! برنامه رو اشتباه نوشتم ؟؟؟
      کد:
      #include <avr/io.h>
      #include <util/delay.h>
      int main (){
      DDRB|=2;
      PORTB|=1;
      char x;
      while (1){
      
      x=PINB;
      if (x ^ 1){
      PORTB|=2;}
      else {
      PORTB&=~2;}
      }}

      دیدگاه


        پاسخ : آموزش winavr و avrlib

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

        در مورد عبارت x^1 بایستی گفت اگر x که در اینجا همون PINB هست در نظر گرفته بشه مقدارش مساوی با صفر نشه شرط اجرا میشه. یعنی فرض اولیه اینه که x یا همون PINB مساوی یک باشه.

        اما....

        موقعی که برای بار اول این شرط پیش میاد و دستورات پس از if اجرا میشه بیت دوم از PORTB یک میشه و این یعنی به ما تبع اون (اگر فرض کنیم بیت 1 از این پورت به جایی وصل نشده باشه) باعث میشه مقدار رجیستر PINB هم عوض بشه. یعنی در صورت بودن یا نبودن کلید مقدار این رجیستر برابر با 2 یا 3 بشه. که در این دو صورت eor با مقدار یک؛ برابر میشه با 3 یا 2 یعنی به ازای فشار کلید یا عدم فشار اون در هر صورت دیگه نباید else اجرا بشه.
        اگر میخوایین این مورد پیش نیاد بایستی کاری کنین که بقیه بیت های PINB روی عبارت داخل شرطتون اثر نذارن:

        مثلا:

        x = PINB & 1;
        if(x ^ 1)
        {
        }
        else
        {
        }



        در این صورت همه چی درست اجرا میشه.

        دیدگاه


          پاسخ : آموزش winavr و avrlib

          سلام.
          من میخوام یه کتابخونه برای lcd کاراکتری بنویسم.
          کسی از دوستان هست که بتونه از ابتدا راهنمایی کنه؟؟

          دیدگاه


            پاسخ : آموزش winavr و avrlib

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

            دیدگاه


              پاسخ : آموزش winavr و avrlib

              نوشته اصلی توسط reza_agha
              جسارتا معمولا چرخ رو دوباره اختراع نمیکنن. اگر میخوایین اینکارو انجام بدین لابد دنبال مورد خاصی هستین که کد های موجود اون رو پوشش نمیدن. در غیر اینصورت اختراع دوباره چرخ میشه.
              اما اگه باز هم میخوایین این کارو بکنین مشکلی نیست. یکی دو تا دیتا شیت lcd های موجود رو بگیرین و نحوه ارسال دیتا و فرمان رو پیاده سازی کنین و حواستون هم به سیکل ریست باشه. تقریبا 90 درصد کار حله.
              سلام.
              من نمیخوام چرخ رو اختراع کنم میخوام بفهمم چرخ چطوری میچرخه :mrgreen:
              دنبال مورد خاصی هم نیستم فقط میخوام با کتابخونه نویسی آشنا بشم همین.
              پس یه کار دیگه میکنیم من کد یه کتابخونه رو اینجا میزارم بعد طبق دیتاشیت میریم جلو (اگه زحمتی نیست) و کد رو تشریح میکنیم (میکنید :agree

              دیدگاه


                پاسخ : آموزش winavr و avrlib

                سلام.
                این هم یه کتابخونه :
                http://287744.20upload.net/files/1389/bahman/lcd-lib.zip
                اگه خودتون کتابخونه بهتر سراغ دارید معرفی کنید غیر از avrlib !!!
                دیتا شیت هم من اینو دانلود کردم (lcm 1602a)
                www.vintagecomputercables.com/.../LCM1602A-FL-YBW.pdf

                دیدگاه


                  پاسخ : آموزش winavr و avrlib

                  سلام.
                  یعنی کسی تو این انجمن پیدا نمیشه که یه کمکی کنه و کتابخونه رو تشریح کنیم؟؟

                  دیدگاه


                    پاسخ : آموزش winavr و avrlib

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

                    این تیپ سئوالات رو نمیشه در هر جایی برای هر موردی طرح کرد. یعنی صرف نمیکنه. توضیحاتی قراره داده بشه که عملا شما احتیاجی بهش ندارین یا خودتون بیشترشو میدونین.

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

                    دیدگاه


                      پاسخ : آموزش winavr و avrlib

                      سلام.
                      کتابخونه lcd رو فعلا در حالت تعلیق در میاریم!!!
                      خوب حالا یه سوال:
                      کسی میتونه یه مثال بزنه که وقفه میکرو راه اندازی کنه؟؟
                      من که هر کاری میکنم نمیشه مثلا میخوام وقتی تایمر 1 سرریز شد یه کاری رو انجام بده.
                      اگه یه مثال بزنید ممنون میشم.

                      دیدگاه


                        پاسخ : آموزش winavr و avrlib

                        سلام.
                        من تونستم وقفه رو راه اندازی کنم حالا یه سوال دیگه دارم:
                        چرا وقفه دقیق نیست؟؟؟
                        تو بیسکام با همون پرسیکال امتحان میکنم درسته ولی تو winavr خیر!!!!

                        دیدگاه


                          پاسخ : آموزش winavr و avrlib

                          سلام به همگی
                          می خوام به یه میکرو از طریق rs232 دستور بدم که یه کارایی بکنه و میکرو هم جواب بده
                          از چه کتابخونه ای باید استفاده بکنم ؟
                          ممنون

                          دیدگاه


                            پاسخ : آموزش winavr و avrlib

                            نوشته اصلی توسط محمد حسینی
                            سلام
                            به درخواست یکی از دوستان، می خوام تو این تاپیک به کتابخونه ارتباط سریال uart رو معرفی کنم. این کتابخونه جدا از کتابخونه های avrlib و چون راحتر بود دیگه بیخیال کتابخونه uart Avrlib شدم. این فایل رو می تونین از اینجا دانلود کنید : (چرا سایت امکان پلود نداره؟؟!)
                            http://beaststwo.org/avr-uart/Updated%20_UART_Library.zip
                            کار کردن باهاش خیلی ساده. (البته یه باگ داشت که در راه پیدا کردنش، دست دوتا mega16 هام از این دنیا کوتاه شد و البته یه mega16 دیگه رو هم فلج کردم!! بهرحال در راه علم ...)
                            uart.h رو باز کنید. خیلی سریع بررسی می کنیم. یه ماکرو به شکل زیر تعریف کرده :

                            #define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu)/((baudRate)*16l)-1)

                            این ماکرو برای معرفی کردن نرخ ارتباط سریال (یا همون سرعت خودمون!!) استفاده میشه. پارامتر هاش هم که مشخص، اولی baud و دومی فرکانس کلاک. بعد از این یه ماکرو دیگه یه نام UART_BAUD_SELECT_DOUBLE_SPEED برای استفاده از سرعت دو برابر تعریف شده.
                            ادامه:

                            /** Size of the circular receive buffer, must be power of 2 */
                            #ifndef UART_RX_BUFFER_SIZE
                            #define UART_RX_BUFFER_SIZE 32
                            #endif
                            /** Size of the circular transmit buffer, must be power of 2 */
                            #ifndef UART_TX_BUFFER_SIZE
                            #define UART_TX_BUFFER_SIZE 32
                            #endif

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

                            extern void uart_init(unsigned int baudrate);

                            این تابع uart رو فعال میکنه و مقداردهی های اولیه رو انجام میده. پارامتر تابع باید با ماکرو تعیین baud باشه. مثلا این دستور برای تعیین باوود 9600 برای کلاک 1 مگاهرتز :

                            uart_init(UART_BAUD_SELECT(9600, 1000000L));

                            بقیه توابع هم مشخص دیگه! من فقط با uart_puts کار میکنم. برای ارسال رشته. بقیه توابع بکار نمیان!!!
                            uart.c رو باز کنید. اینجا دو تا متغیر مهم داریم.
                            UART_RxBuf
                            این رشته، همون بافر برای نگه داری اطلاعات دریافتیه. هر بایت اطلاعاتی که بیاد تو این متغیر ذخیره میشه.
                            UART_RxHead
                            این متغیر نشون میده چند بایت تو بافر UART_RxBuf اطلاعات دریافتی ذخیره شده.
                            وقفه دربافت رو ببینید ...

                            ISR(UART0_RECEIVE_INTERRUPT)
                            /************************************************** ***********************
                            Function: UART Receive Complete interrupt
                            Purpose: called when the UART has received a character
                            ************************************************** ************************/
                            { …

                            این خط رو آخر وقفه می بینیم :

                            UART_RxBuf[tmphead] = data;

                            بایت دریافتی رو تو بافر مینویسه. اما یه مشکل داره! اونم اینه که از اندیس شماره 1 شروع به نوشتن میکنه نه صفر!! چراش رو دیگه خودتون تو چند خط بالاتر ببینین. خوب برای رفع این مشکل اینطوری تغییرش بدین:

                            UART_RxBuf[tmphead-1] = data;

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

                            #include <avr/io.h>
                            #include <util/delay.h>
                            #include "uart.c"
                            char *str="test serial";
                            int main()
                            {
                            sei();
                            uart_init(UART_BAUD_SELECT(9600, 1000000L));
                            _delay_ms(2000);
                            uart_puts(str);
                            _delay_ms(2000);
                            uart_puts("ok"
                            return 0;
                            }

                            اینم برنامه میکرو دوم که اطلاعات ارسال شده رو دریافت میکنه و رو ال سی دی نمایش میده:

                            #include <avr/io.h>
                            #include <util/delay.h>
                            #include "lcd.c"
                            #include "uart.c"
                            int main()
                            {
                            sei();
                            lcdInit();
                            uart_init(UART_BAUD_SELECT(9600, 1000000L));

                            while(1)
                            {
                            lcdClear();
                            if (UART_RxHead != 0)
                            lcdPrintData(UART_RxBuf, UART_RxHead);
                            _delay_ms(20);
                            }
                            }

                            دستور sei یادتون نره! وقفه ها باید فعال بشن.
                            ضمنا فریم ارسال اطلاعات هم تو تابع uart_init تعیین شده. پیش فرض همون 8 بیت داده بدون parity و یک بیت داده. معمولا همینه دیگه. مگه اینکه یه پروژه مخوف سری داشته باشین ... !!
                            موفق باشید.
                            همین برنامه ساده شمارو میزارم ! کلا برنامه قفل می کنه !
                            به هر چی کد و موجود زنده که می بینه گیر میده ! علتش چیه ؟



                            **** Build of configuration Release for project rs232 ****

                            make all
                            Building file: ../main.c
                            Invoking: AVR Compiler
                            avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=11059200UL -MMD -MP -MF"main.d" -MT"main.d" -c -o"main.o" "../main.c"
                            Finished building: ../main.c

                            Building target: rs232.elf
                            Invoking: AVR C++ Linker
                            avr-g++ -Wl,-Map,rs232.map,--cref -mmcu=atmega8 -o"rs232.elf" ./main.o ./uart.o
                            ./uart.o: In function `__vector_11':
                            uart.c:(.text+0x0): multiple definition of `__vector_11'
                            ./main.o:main.c:(.text+0x0): first defined here
                            ./uart.o: In function `__vector_12':
                            uart.c:(.text+0x54): multiple definition of `__vector_12'
                            ./main.o:main.c:(.text+0x54): first defined here
                            ./uart.o: In function `uart_init':
                            uart.c:(.text+0x9e): multiple definition of `uart_init'
                            ./main.o:main.c:(.text+0x9e): first defined here
                            ./uart.o: In function `uart_getc':
                            uart.c:(.text+0xc8): multiple definition of `uart_getc'
                            ./main.o:main.c:(.text+0xc8): first defined here
                            ./uart.o: In function `uart_putc':
                            uart.c:(.text+0x102): multiple definition of `uart_putc'
                            ./main.o:main.c:(.text+0x102): first defined here
                            ./uart.o: In function `uart_puts':
                            uart.c:(.text+0x126): multiple definition of `uart_puts'
                            ./main.o:main.c:(.text+0x126): first defined here
                            ./uart.o: In function `uart_puts_p':
                            uart.c:(.text+0x13e): multiple definition of `uart_puts_p'
                            ./main.o:main.c:(.text+0x13e): first defined here
                            ./uart.o: In function `uart_available':
                            uart.c:(.text+0x158): multiple definition of `uart_available'
                            ./main.o:main.c:(.text+0x158): first defined here
                            ./uart.o: In function `uart_flush':
                            uart.c:(.text+0x170): multiple definition of `uart_flush'
                            ./main.o:main.c:(.text+0x170): first defined here
                            make: *** [rs232.elf] Error 1



                            Description Resource Path Location Type
                            first defined here main.c ‪/rs232‬ line 0 C/C++ Problem
                            make: *** [rs232.elf] Error 1 rs232 line 0 C/C++ Problem
                            multiple definition of `__vector_11' uart.c ‪/rs232‬ line 0 C/C++ Problem
                            multiple definition of `__vector_12' uart.c ‪/rs232‬ line 0 C/C++ Problem
                            multiple definition of `uart_available' uart.c ‪/rs232‬ line 0 C/C++ Problem
                            multiple definition of `uart_flush' uart.c ‪/rs232‬ line 0 C/C++ Problem
                            multiple definition of `uart_getc' uart.c ‪/rs232‬ line 0 C/C++ Problem
                            multiple definition of `uart_init' uart.c ‪/rs232‬ line 0 C/C++ Problem
                            multiple definition of `uart_putc' uart.c ‪/rs232‬ line 0 C/C++ Problem
                            multiple definition of `uart_puts_p' uart.c ‪/rs232‬ line 0 C/C++ Problem
                            multiple definition of `uart_puts' uart.c ‪/rs232‬ line 0 C/C++ Problem


                            کسی نیست به داد ما برسه :(

                            دیدگاه


                              پاسخ : آموزش winavr و avrlib

                              آقا سلام به همگی.
                              من یکسری مشاکل (جمع مشکل) دارم.
                              برای اینکه یک بافر 10 کیلویی رو در رم خارجی قرار بدیم باید چه کارهایی رو انجام بدیم؟
                              آیا نیاز به تعریف .extmem در تنظیمات هست؟ یا اینکه باید با بک linker command این کار رو انجام بدیم؟ اگر اینجوریه دستورش چیه؟.
                              تفاوت .bss و .data و .extmem چیه؟
                              اگر بخوایم این فضا رو در heap بگیریم چی؟
                              ممنون.

                              دیدگاه


                                پاسخ : آموزش winavr و avrlib

                                نوشته اصلی توسط atm8
                                همین برنامه ساده شمارو میزارم ! کلا برنامه قفل می کنه !
                                به هر چی کد و موجود زنده که می بینه گیر میده ! علتش چیه ؟



                                **** Build of configuration Release for project rs232 ****

                                make all
                                Building file: ../main.c
                                Invoking: AVR Compiler
                                avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=11059200UL -MMD -MP -MF"main.d" -MT"main.d" -c -o"main.o" "../main.c"
                                Finished building: ../main.c

                                Building target: rs232.elf
                                Invoking: AVR C++ Linker
                                avr-g++ -Wl,-Map,rs232.map,--cref -mmcu=atmega8 -o"rs232.elf" ./main.o ./uart.o
                                ./uart.o: In function `__vector_11':
                                uart.c:(.text+0x0): multiple definition of `__vector_11'
                                ./main.o:main.c:(.text+0x0): first defined here
                                ./uart.o: In function `__vector_12':
                                uart.c:(.text+0x54): multiple definition of `__vector_12'
                                ./main.o:main.c:(.text+0x54): first defined here
                                ./uart.o: In function `uart_init':
                                uart.c:(.text+0x9e): multiple definition of `uart_init'
                                ./main.o:main.c:(.text+0x9e): first defined here
                                ./uart.o: In function `uart_getc':
                                uart.c:(.text+0xc8): multiple definition of `uart_getc'
                                ./main.o:main.c:(.text+0xc8): first defined here
                                ./uart.o: In function `uart_putc':
                                uart.c:(.text+0x102): multiple definition of `uart_putc'
                                ./main.o:main.c:(.text+0x102): first defined here
                                ./uart.o: In function `uart_puts':
                                uart.c:(.text+0x126): multiple definition of `uart_puts'
                                ./main.o:main.c:(.text+0x126): first defined here
                                ./uart.o: In function `uart_puts_p':
                                uart.c:(.text+0x13e): multiple definition of `uart_puts_p'
                                ./main.o:main.c:(.text+0x13e): first defined here
                                ./uart.o: In function `uart_available':
                                uart.c:(.text+0x158): multiple definition of `uart_available'
                                ./main.o:main.c:(.text+0x158): first defined here
                                ./uart.o: In function `uart_flush':
                                uart.c:(.text+0x170): multiple definition of `uart_flush'
                                ./main.o:main.c:(.text+0x170): first defined here
                                make: *** [rs232.elf] Error 1



                                Description Resource Path Location Type
                                first defined here main.c ‪/rs232‬ line 0 C/C++ Problem
                                make: *** [rs232.elf] Error 1 rs232 line 0 C/C++ Problem
                                multiple definition of `__vector_11' uart.c ‪/rs232‬ line 0 C/C++ Problem
                                multiple definition of `__vector_12' uart.c ‪/rs232‬ line 0 C/C++ Problem
                                multiple definition of `uart_available' uart.c ‪/rs232‬ line 0 C/C++ Problem
                                multiple definition of `uart_flush' uart.c ‪/rs232‬ line 0 C/C++ Problem
                                multiple definition of `uart_getc' uart.c ‪/rs232‬ line 0 C/C++ Problem
                                multiple definition of `uart_init' uart.c ‪/rs232‬ line 0 C/C++ Problem
                                multiple definition of `uart_putc' uart.c ‪/rs232‬ line 0 C/C++ Problem
                                multiple definition of `uart_puts_p' uart.c ‪/rs232‬ line 0 C/C++ Problem
                                multiple definition of `uart_puts' uart.c ‪/rs232‬ line 0 C/C++ Problem


                                کسی نیست به داد ما برسه :(
                                من کد شمارو امتحان کردم ! مشکلی نداشت.
                                البته کدتون رو تو avrstudio 5 امتحان کردم. یه جورایی میشه گفت avrstudio جدید رو با کد شما امتحان کردم.
                                یک مشکل کوچیک داشت، ولی نه اینایی که شما لیست کردید !

                                دیدگاه

                                لطفا صبر کنید...
                                X