اطلاعیه

Collapse
No announcement yet.

آموزش winavr و avrlib

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

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

    سلام به همگی
    من یه کد نوشتم واسه صفحه کلید ، با اینتراپت ، ولی انگار نه انگار که اینتراپت کار کنه !
    میشه بگین اشکالمون چیه ؟
    [ltr]
    کد PHP:
    #include <avr/io.h>
    #include <util/delay.h>
    #include "avrlibdefs.h"
    #include <avr/interrupt.h>
    int key;

    ISR(TIMER0_OVF_vect
    {
    TCNT0 50;
    PORTB =0b01111111;


            if (
    avr(PINB).P0==0key=1;

            if (
    avr(PINB).P1==0key=;
            
    _delay_ms(10000);

        
    /*    if (bit_is_set(PINB, 1)) PORTD=3;

            if (bit_is_set(PINB, 0)) PORTD=4;


            PORTB =0b10111111;

            if (bit_is_set(PINB, 3)) PORTD=5;

            if (bit_is_set(PINB, 2)) PORTD=6;

            if (bit_is_set(PINB, 1)) PORTD=7;

            if (bit_is_set(PINB, 0)) PORTD=8;

            PORTB =0b11011111;

            if (bit_is_set(PINB, 3)) PORTD=9;

            if (bit_is_set(PINB, 2)) PORTD=10;

            if (bit_is_set(PINB, 1)) PORTD=11;

            if (bit_is_set(PINB, 0)) PORTD=12;

            PORTB =0b11101111;

            if (bit_is_set(PINB, 3)) PORTD=13;

            if (bit_is_set(PINB, 2)) PORTD=14;

            if (bit_is_set(PINB, 1)) PORTD=15;

            if (bit_is_set(PINB, 0)) PORTD=16; */

    }


    int main()
     {
    DDRB=0xF0;
    PORTB=0x0F;
    DDRD=0xFF;

        
    TCCR0 = (1<<CS02)|(1<<CS01)|(1<<CS00);
        
    TCNT0 50;
        
    TIMSK |= (1<<TOIE0);

    while(
    1){

     
    PORTD=key;
    }





    ممنون از شما

    دیدگاه


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

      داخل روال وقفه و تاخیر؟ اونم 10 ثانیه؟ تازه debounce چی میشه. مشکل اساسی منطق برنامه هست. خیلی بیش از حد همه چیز رو سهل و آسون گرفتین. تازه شماتیک رو هم بذارین شاید بد نباشه. نیبل پایینی پورت B رو خروجی گرفتین. چهار بیت بالایی رو ورودی با پول پ انتخابی. اما چرا بیت های پایینی رو چک میکنین؟ اونا که همیشه 1 هستن.

      دیدگاه


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

        تقریباً هیچی از حرفاتونو نفهمیدم :(
        توضیح مدارم اینه ، می خوام از طریق صفحه کلید یه عدد رو بخونم
        ( البته مرحله اول کار هستم و همین اول کاری .... )
        این عکسمدارم

        این هم لینک دانلود فایلم به همراه فایل پروتئوس و پروژه Avrstudio
        avrstudio.rar
        تقریباً با تایمر برای winavr تازه شروع کردم ! ممنون یمشم راهنمایی بکنید .

        دیدگاه


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

          البته بگم بعد از اینکه کار نکرد خیلی زیاد دستکاریش کردم شاید یه چیزایی مسخره به ظنر بیاد ( مثل همون تأخیر 10 ثانیه ! )

          دیدگاه


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

            دستور sei() رو برای فعال سازی وقفه سراسری جا انداختی (تو تابع main)
            https://www.linkedin.com/in/mohammadhosseini69

            http://zakhar.blog.ir

            دیدگاه


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

              الان همه چی درسته ، ولی چرا این شرط if من برای اینتراپت کار نمی کنه ؟ چجوری باید این متغییر key رو مقدار دهی کنم ؟


              کد PHP:
              #include <avr/io.h>
              #include <util/delay.h>
              #include "avrlibdefs.h"
              #include <avr/interrupt.h>
              int key=0;

              ISR(TIMER0_OVF_vect
              {

              PORTB=0b01111111;

                      if (
              avr(PINB).P0==0){ _delay_ms(10); key=1;}

                  
              /*    if (avr(PINB).P1==0) key=2 ;


                      if (bit_is_set(PINB, 1)) PORTD=3;

                      if (bit_is_set(PINB, 0)) PORTD=4;


                      PORTB =0b10111111;

                      if (bit_is_set(PINB, 3)) PORTD=5;

                      if (bit_is_set(PINB, 2)) PORTD=6;

                      if (bit_is_set(PINB, 1)) PORTD=7;

                      if (bit_is_set(PINB, 0)) PORTD=8;

                      PORTB =0b11011111;

                      if (bit_is_set(PINB, 3)) PORTD=9;

                      if (bit_is_set(PINB, 2)) PORTD=10;

                      if (bit_is_set(PINB, 1)) PORTD=11;

                      if (bit_is_set(PINB, 0)) PORTD=12;

                      PORTB =0b11101111;

                      if (bit_is_set(PINB, 3)) PORTD=13;

                      if (bit_is_set(PINB, 2)) PORTD=14;

                      if (bit_is_set(PINB, 1)) PORTD=15;

                      if (bit_is_set(PINB, 0)) PORTD=16; */

              }


              int main()
               {



              ASSR=0x00;
              TCCR0=0x06;
              TCNT0=0x00;
              OCR0=0x00;
              TCCR1A=0x00;
              TCCR1B=0x00;
              TCNT1H=0x00;
              TCNT1L=0x00;
              ICR1H=0x00;
              ICR1L=0x00;
              OCR1AH=0x00;
              OCR1AL=0x00;
              OCR1BH=0x00;
              OCR1BL=0x00;
              OCR1CH=0x00;
              OCR1CL=0x00;
              TCCR2=0x00;
              TCNT2=0x00;
              OCR2=0x00;
              TCCR3A=0x00;
              TCCR3B=0x00;
              TCNT3H=0x00;
              TCNT3L=0x00;
              ICR3H=0x00;
              ICR3L=0x00;
              OCR3AH=0x00;
              OCR3AL=0x00;
              OCR3BH=0x00;
              OCR3BL=0x00;
              OCR3CH=0x00;
              OCR3CL=0x00;
              EICRA=0x00;
              EICRB=0x00;
              EIMSK=0x00;
              TIMSK=0x01;
              ETIMSK=0x00;
              ACSR=0x80;
              SFIOR=0x00;

               
              DDRB=0b11110000;
              PORTB=0b00001111;/*
               DDRD=0b00111111;
              PORTD=0b11000000; */
              PORTD=0b10000000;
               
              DDRD=0b01111111;
                  
              sei();

              while(
              1){

               
              PORTD=key;
              if (
              avr(PIND).P7==0){
              avr(PORTD).P6=1;
              _delay_ms(500);
              avr(PORTD).P6=0;

              }

              }




              دیدگاه


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

                اولا یادتون رفته TCNT0 رو مقدار دهی کنین. ثانیا میشه اینکارو هم کرد:


                volatile short key;

                ISR(TIMER0_OVF_vect)
                {
                static unsigned short old_pat = 0xFFFF;
                static unsigned char dbnc;
                unsigned short pat = 0;
                unsigned char bit;

                TCNT0 = 0xE8;

                DDRB = 0xFF;
                for(bit=0x10; bit; bit<<=1)
                {
                PORTB = ~bit;
                pat = (pat << 4) | ((~PINB) & 0x0F);
                }
                if( pat != old_pat )
                {
                old_pat = pat;
                dbnc = 50;
                }
                else
                {
                if( dbnc )
                {
                dbnc--;
                if( dbnc == 0 )
                {
                switch(old_pat)
                {
                case 0x0001: key = 0; break;
                case 0x0002: key = 1; break;
                case 0x0004: key = 2; break;
                case 0x0008: key = 3; break;
                .....continue to 15
                default: key = -1; break;
                }
                }
                }
                }
                }



                main()
                {
                .....

                for(;
                {
                if( key != -1 )
                {
                PORTD = key;
                key = -1;
                }
                }
                }


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

                دیدگاه


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

                  سلام
                  یک سوال از اساتید WinAvr داشتم:
                  آیا در این کامپایلر می شه متغییر 64 بیتی تعریف کرد؟ من بعداز حدود یک هفته سروکله زدن با این کامپایلر نتونستنم این حاصلضرب رو به شکل درست داخل متغییر L از نو double قرار بدم!
                  L=488317892.1*.7993018480;
                  حاصلضرب عبارت بالا برابر 390313393.6 هست در حالی که برنامه مقدار 390313410 رو به ما نشون می ده!
                  به طور کلی امکان تعریف متغییرهایی بالاتر از float در کامپایلرهای مربوط به Avr وجود داره؟
                  قبل از WinAVR با CV کار می کردم که در اون کامپایلر هم این مشکل وجود داشت و خطای:
                  Warning: D:\Program Files\cvavr\sin.c(20): the 'double' data type is supported only in the Advanced or Professional version, defaulting to 'float
                  می داد. ورژنش هم 2.04a Advanced ولی نمی دونم چرا خطا می ده! شاید مشکل از کرک هست...(ولی من چندتا دیگه هم دانلود کردم همشون همین مشکل رو داشتن) فقط به خاطر این اشکال حدود یک هفته هست که از این تاپیک WinAvr رو یاد گرفتم و دارم باهاش کار می کنم، ولی مشکل متغییر 64 بیتی در این کامپایلر برای من همچنان پابرجاست!
                  البته با آرایه می تونم حل کنم ولی به دنبال یه راه حل اساسی تر و استفاده از خود متغییرها هستم! در Avrfreaks یه چیزهایی در مورد IEEE 754 نوشته و لینک داده
                  http://speleotrove.com/decimal/
                  که من کلا با خوندن اینها جز گمراهان قرار گرفتم! امیدوارم یکی پیدا بشه و ما رو از این گمراهی در بیاره!
                  از Mega8 استفاده کردم و در پروتیوس شبیه سازی می کنم.
                  اگه بحث اینجا رو منحرف کردم بگین تا برم یه جای دیگه پست بزنم!
                  مخلصیم!

                  دیدگاه


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

                    من قبلا یه چیزایی دیده بودم ولی مطمئن نبودم. سری به این آدرس بزنین:

                    http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=8 6007&start=20

                    مثل اینکه مشکل winavr هست. متغیر های نوع double رو نمیتونه مدیریت کنه. و به float تبدیلشون میکنه. یعنی میشه گفت اصلا double رو نمیشناسه. میتونین کارتون رو با استفاده از عدد صحیح 64 بیتی انجام بدین؟ اگه خواستین بفرم زیر تعریف میشه:

                    long long
                    یا
                    unsigned long long
                    دقیقا 8 بایت جا میگیره ولی نمیدونم عملیاتش رو درست انجام میده یا نه. ولی رنج عددی اش تا 10 به توان 20 میرسه.

                    دیدگاه


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

                      تشکر از جوابتون
                      اون لینک رو دیده بودم و همچنین لینک های داخل اون رو، :read: علت گمراهیم هم همون لینک های موجود در لینک شما بود! :eek: واقعا خیلی زیادن و هیچ کدوم هم به نتیجه خاصی نرسیده بودند و یا با یه روش دیگه به نتیجه رسیدن به عنوان مثال همون مشکل GPS در لینکی که گذاشتین! ولی من دقیقا لازم دارم که اون اعداد به هم ضرب و تقسیم کنم!
                      متاسفانه با long long یا unsigned long long هم مشکل حل نشد،(فقط تا 5رقم نشون می ده) در این فاصله از IEEE 754 هم سر در اوردم، ظاهرا بازم به درد کار ما نمی خوره! یه جایی هم از رجیسترها استفاده کرده بود که اونم برای 32بیت بود(با دردسرهای خودش) در مورد BCD و... هم دیگه ذهنم نمی کشه بهشون فکر کنم... :angry:
                      یعنی اینجا تا حالا کسی کارش به متغییر دوبل نیوفتاده!؟ :angry:

                      دیدگاه


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

                        از روش های نرم افزاری استفاده کن. یه سری به کتابای طراحی الگوریتم بزن. ترم قبل روش ضرب اعداد بزرگ رو خوندیم ...
                        https://www.linkedin.com/in/mohammadhosseini69

                        http://zakhar.blog.ir

                        دیدگاه


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

                          شما میتونی از همون نوع long long به صورت یک fixed point number استفاده کنی. مثلا شما تا سه رقم برات مهمه هر عدد اعشاری رو ضرب در 1000 کن و در عملیات شرکت بده. آخر کار عدد نهایی رو تقسیم بر 1000 کن تا عدد اعشاری نهایی در بیاد.
                          IEEE 754 هم چیز مهمی نیست. تمام اعداد اعشاری دقت یکه float یا دوبل double به فرمت استاندارد IEEE754 کد شدن. در حقیقت این استاندارد نحوه ذخیره و مدیریت این اعداد در حافظه رو نشون میده.

                          دیدگاه


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

                            در کامپایلر IAR متغیر double بصورت 64 بیتی پشتیبانی می شود.
                            اوژن: به معنای افکننده و شکست دهنده است
                            دانایی، توانایی است-Knowledge is POWER
                            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                            دیدگاه


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

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


                              شما میتونی از همون نوع long long به صورت یک fixed point number استفاده کنی. مثلا شما تا سه رقم برات مهمه هر عدد اعشاری رو ضرب در 1000 کن و در عملیات شرکت بده. آخر کار عدد نهایی رو تقسیم بر 1000 کن تا عدد اعشاری نهایی در بیاد.
                              IEEE 754 هم چیز مهمی نیست. تمام اعداد اعشاری دقت یکه float یا دوبل double به فرمت استاندارد IEEE754 کد شدن. در حقیقت این استاندارد نحوه ذخیره و مدیریت این اعداد در حافظه رو نشون میده.
                              متاسفانه من به 8رقم دقت اعشار نیاز دارم! و فکر نکنم این روش جواب بده چون تا جایی من تست کردم در محاسبات رقم 7و 8 نامعتبر هستند،(در حالت float می گم) البته اینها برداشت های خودم از نوشته های شما بود! اگه منظورتون این نبود لطفا بیشتر توضیح بدین.


                              فعلا تا صبح سعی می کنم بنا به توصیه ی جناب مهندس کی نژاد، برنامه رو با کامپایلر IAR راه بندازم، اگه نشد! راحل های جناب reza_agha و حسینی رو ادامه می دم، تا ببینم چی می شه...
                              بدیهی است که به کمک دوستان برای یادگیری IAR نیازمندیم!
                              مخلصیم!

                              دیدگاه


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

                                سلام
                                یک سوال! آیا امکان استفاده از کتابخونه های WinAvr برای IAR (حالا با کمی تغییرات...) وجود داره؟
                                در طول این 36 ساعت! به کمک پست های جناب "طراح" در عرض نیم ساعت تونستم کار با IAR رو شروع کنم و اون چشمک زن ها رو هم تونستنم کامپایل کنم و در میکرو بریزم، ولی به علت نبود هیچ نوع! کتابخونه ی آماده و تا حدودی تنبلی خودم سعی کردم لایبرری های WinAvr رو تغییر بدم و ازشون استفاده کنم(برای LCD کاراکتری) و تنها چیزی که برام بود خطاهای بی پایان بود که هرکدوم رو اصلاح می کردی... :angry: حتی یک لایب برای ARM هم بود که رجیسترهاش رو با رجیسترهای AVR عوض کردم و یک سری تغییرات دیگه ولی:angry: بعضا حتی نحوه نوشتن دستوراتشون هم فرق می کنه و شناسایی نمی شدند! کل جونیم در این دو روز رفت... ولی دریغ از نمایش یک کاراکتر... البته نحوه کار LCD رو هم یاد گرفتم ولی دیگه رمقی برام نمونده برای نوشتن لایب... :sad:
                                من فقط برای استفاده از متغییر دوبل اومدم سراغ IAR و گرنه هیچ در این مورد ندارم به خدا! در حال حاضر تنها چیزی که نیاز دارم اینه که مقدار یک متغییر رو روی LCD نشون بدم، تا ببینم دقت محاسبات در چه حدی است تا بعدش اگه لازم شد لایب هم می نویسم...
                                از اساتید می خوام در مورد کتابخونه LCD برای IAR کمکم کنن!(یا با تغییر در کتابخونه های WinAvr یا اگه یک کتابخونه ی آماده دارن...)
                                مخلصیم!

                                دیدگاه

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