اطلاعیه

Collapse
No announcement yet.

برنامه نویسی XMEGA با Bascom-AVR

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

    #61
    پاسخ : برنامه نویسی XMEGA با Bascom-AVR

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

    دیدگاه


      #62
      پاسخ : برنامه نویسی XMEGA با Bascom-AVR

      compiler version : 2.0.7.2
      compiler build : 2.0.7.2.001
      IDE version : 2.0.7.2
      بسکام من نسخه اصلی و سریال آنرا خریداری کرده ام.
      کد اصلی من دقیقا مشابه همین کدی است که اینجا نوشته ام .

      دیدگاه


        #63
        پاسخ : برنامه نویسی XMEGA با Bascom-AVR

        نوشته اصلی توسط skiboy
        سلام خدمت دوستان گرامی واساتید سایت
        ما قصد کارکردن با تایمر xmega128a1 داریم ولی تا این لحظه موفق به این کار نشدیم
        فعلا در کامپایلر Bascom داریم کار می کنیم
        و نمی دونیم چطوری وقفه سرریز تایمر را فعال کنیم مثلا در avrهای معمولی می نوشتیم Enable ovf0 ولی این دستور رابرای Xmega وError می گیرد :eek: :eek:
        سلام
        اول مشخص کنید که از کدوم تایمر می خواهید استفاده کنید.
        من فرض می کنم تایمر TCC0
        برای فعال کردن وقفه ی این تایمر ، همونطور که جناب کی نژاد هم گفتن ابتدا باید توسط دستور زیر واحد اولویت وقفه را پیکربندی کنید:
        Config Priority=static, vector=application, Lo=enabled, med=enabled,hi=enabled
        از کدوم اولویت وقفه قراره استفاده کنید ( پایین ، متوسط ، بالا) همون اولویت رو فعال کنید
        این میشه مرحله ی اول. بعد باید وقفه ی سراسری رو فعال کنید(Enable Interrupts).
        بعد با دستور زیر زیر، وقفه ی سرریز شدن تایمر رو فعال کنید:
        Enable TCC0_OVF , Lo
        در این دستور وقفه سرریز با اولویت پایین برای سرریز تایمر تنظیم می شود.
        از اینجا بع بعدش رو هم که دیگه خودت می دونی.(تعیین اینکه در صورت بروز وقفه به کجا پرش کنه)
        On TCC0_OVF Lablex

        دیدگاه


          #64
          پاسخ : برنامه نویسی XMEGA با Bascom-AVR

          سلام به همگی
          راجع یه پیکربندی تایمر تو محیط Bascom می نویسم
          تو میکروهای خانواده ی Xmega ، حداکثر 8 تا تایمر وجود داره که همشون 16 بیتی هستند.
          هرکدوم از این تایمرها به یکی از پورت های میکرو مرتبط اند، یعنی پایه های ورودی و خروجی برای حالت Compare/capture (که بعداً مفصل راحع بهش توضیح می دم) روی این پورت ها قرار دارند. روی هر پورت میکرو، دو تایمر وجود داره. تایمر صفر و تایمر یک.
          که تایمر صفر مربوط به هر پورت 4 پایه Compare/capture داره و تایمر یک هر پورت 2 تا پایه Compare/Capture داره.( این پایه ها برای خروجی شکل موج تولیدی تایمر و یا برای ورودی حالت Capture به کار می رن)
          اسم هر تایمر هم دقیقا مشخص کننده اینه که تایمر مربوط به کدوم پورت هستش و تایمر شماره ی چند پورته.
          به عنوان مثال : TCC0 . در این اسم، دو حرف اول (TC) مخفف کلمه ی Timer Counter هستش و حرف بعدی(در اینجا C) به این معنیه که این تایمر مربوط به پورت C هستش و عدد آخر هم بیانگر اینه که تایمر شماره ی صفر است و یا یک.
          در میکروی Xmega128a1، تعداد 8 عدد تایمر وجود داره که این تایمرها به ترتیب روی پورت C تا پورت F قرار گرفتن(روی هر پورت ، دو تایمر وجود داره) که نام اون ها براساس پورتیه که روش قرار گرفتن. TCC0 , TCC1 , TCD0 , TCD1 , TCE0 , TCE1 , TCF0 , TCF1
          هر کدوم از این تایمر ها رو میشه در حالت های مختلفی پیکربندی کرد(شمارش عادی، حالت تولید شکل موج، مولد PWM تک شیب، مولد PWM دو شیب). فعلاً ما تایمر رو در حالت شمارش عادی پیکربندی می کنیم:
          Config TCC0=normal , prescale=1/2/4/8/64/256/1024
          که در عبارت بالا، می توان یکی از مقادیر فوق را به عنوان Prescale تایمر انتخاب نمود.
          در ضمن ، تایمر ها در Xmega دارای رجیستری به نام PER هستند که توسط آن می توان حداکثر مقدار شمارش تایمر را مشخص کرد که تایمر پس از رسیدن به این مقدار ، سرریز خواهد کرد. دسترسی به این رجیستر به این ترتیب است: TCxn_PER= value که در آن X ، شماره پورتی است که تایمر روی آن قرار دارد و n ، شماره ی تایمر مزبور است که می توان در آن مقداری را قرار دارد.

          دیدگاه


            #65
            پاسخ : برنامه نویسی XMEGA با Bascom-AVR

            با سلام خدمت همه ی دوستان ...
            آقا هیچ pdf وجود نداره که آموزش xmega با بسکام رو نوشته باشه ؟؟؟؟؟؟؟؟؟؟
            اگه هست میشه لینکش رو بنویسید ؟؟؟؟؟؟؟/

            دیدگاه


              #66
              پاسخ : برنامه نویسی XMEGA با Bascom-AVR

              با سلام

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

              http://www.iranmicro.ir/forum/showthread.php?t=4271
              دکتر شريعتي:

              زنده بودن را به بيداري بگذرانيم که سالها به اجبار خواهيم خفت.

              دیدگاه


                #67
                پاسخ : برنامه نویسی XMEGA با Bascom-AVR

                با سلام

                بنده در خصوص کار با xmega128a1 در بسکام سه تا مشکل دارم ، خواهشمندم در صورت امکان بنده را راهنمایی بفرمایید .

                مشکل اول :

                بنده وقتی Priority اینتراپتهای USARTx0 , USARTx1 را فعال میکنم میکرو کنترلر هیچ کاری انجام نمیده

                بنده ابتدا Priority را به شکل زیر تعریف کردم :

                Config Priority = Static , Vector = Application , Lo = Enabled

                و اینتراپت USARTC0_RXC به به شکل زیر تعریف کردم :

                Enable Interrupts
                Enable Usartc0_rxc , Lo
                On Usartc0_rxc Mainloop

                متاسفانه در این شرایط کدی که در mainloop نوشتم اجرا نمیشه ولی اگر Config Priority رو کاملا بردارم و , LO رو هم از قسمت Enable USARTC0_RXC بردارم همون کد در mainloop اجرا میشه

                مشکل دوم :

                بنده در برنامه ام 3 تا ورودی سریال دارم که برای هر کدام یک اینتراپت بروی USARTxx_RXC تعریف کردم . دیتای ورودی رو در این اینتراپتها میخونم ولی اگر یکیشون که به USARTE1_RXC متصل هستش رو خاموش کنم ( دستگاه ورودی رو خاموش کنم ) همه برنامه متوقف میشه تا زمانی که مجددا اون رو روشن کنم که توی این اینتراپت دیتای ورودیش برگرده

                مشکل سوم :

                به چه شکل میتونم از یک تایمر برای انجام چند عمل ریاضی و محاسباتی در کنار این اینتراپتها استفاده کنم . من تایمر TCC0 رو راه اندازی کردم ولی نشد .

                سپاسگزارم .

                دیدگاه


                  #68
                  پاسخ : برنامه نویسی XMEGA با Bascom-AVR

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

                  دیدگاه


                    #69
                    پاسخ : برنامه نویسی XMEGA با Bascom-AVR

                    با سلام

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

                    کد:
                    $regfile = "xm128a1def.dat"
                    $crystal = 32000000
                    $hwstack = 64
                    $swstack = 64
                    $framesize = 64
                    $lib "xmega.lib"
                    $external _xmegafix_clear
                    $external _xmegafix_rol_r1014
                    
                    Config Osc = Enabled , 32mhzosc = Enabled
                    
                    Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
                    
                    
                    Enable Interrupts
                    Enable Usarte1_rxc
                    On Usarte1_rxc Pressuredata
                    Enable Usarte0_rxc
                    On Usarte0_rxc Radioswitch_isr
                    Enable Usartc0_rxc
                    On Usartc0_rxc Test1_isr
                    
                    
                    Config Com1 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
                    Open "COM1:" For Binary As #1
                    Config Com2 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
                    Open "COM2:" For Binary As #2
                    Config Com3 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
                    Open "COM3:" For Binary As #3
                    Config Com4 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
                    Open "COM4:" For Binary As #4
                    Config Com5 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
                    Open "COM5:" For Binary As #5
                    Config Com6 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
                    Open "COM6:" For Binary As #6
                    Config Com7 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
                    Open "COM7:" For Binary As #7
                    Config Com8 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
                    Open "COM8:" For Binary As #8
                    
                    Config Eeprom = Mapped
                    
                    $eeprom
                    
                    Dim A As Integer
                    Dim B As String * 25 , Alt As String * 10 , Spd As String * 10 , E As String * 25 , F As String * 25
                    Dim C As Byte , C1 As Byte
                    Dim Ar(5) As String * 10
                    
                    Dim P As Integer
                    Dim O As Byte
                    Dim L As String * 25
                    
                    Dim Positionarray(20) As Integer
                    Dim Myposition(20) As String * 25
                    Dim R1 As String * 1
                    Dim R2 As String * 10
                    Dim R3 As String * 10
                    
                    Dim Mytimer As Integer
                    
                    Mytimer = 0
                    
                    Do
                    NOP
                    Loop
                    
                    Pressuredata:
                    Disable Usarte1_rxc
                    Do
                      C = Inkey(#6)
                      B = B + Chr(c)
                    Loop Until C = 13
                    E = ""
                    For A = 0 To Len(b) Step 1
                      If Left(b , 1) <> "$" Then
                       E = E + Left(b , 1)
                      End If
                      Delchar B , 1
                    Next
                    F = Trim(e)
                    
                    A = Instr(b , ",AS=")
                    C1 = Split(f , Ar(1) , ",")
                    Delchar Ar(1) , 1
                    Delchar Ar(1) , 1
                    Delchar Ar(1) , 1
                    Print #8 , " Alt : " ; Ar(1)
                    Delchar Ar(2) , 1
                    Delchar Ar(2) , 1
                    Delchar Ar(2) , 1
                    Print #8 , " Spd : " ; Ar(2)
                    
                    
                    Waitms 100
                    Enable Usarte1_rxc
                    Return
                    
                    
                    Radioswitch_isr:
                    Disable Usarte0_rxc
                    Dim Rv As Byte
                    Dim Radiovalue As String * 5
                    Rv = Inkey(#5)
                    If Rv <> 0 Then
                      Print #8 , " Radio In : " ; Rv
                    Else
                      Print #8 , " Radio Input is empty "
                    End If
                    Waitms 100
                    Enable Usarte0_rxc
                    Return
                    
                    Test1_isr:
                    Disable Usartc0_rxc
                    Dim Rv2 As Byte
                    Dim Radiovalue2 As String * 4
                    Dim Radiovalue2_2 As String * 4
                    Rv2 = Inkey(#1)
                    Radiovalue2 = Radiovalue2 + Chr(rv2)
                    If Rv2 = 13 Then
                    '  Radiovalue2_2 = Trim(radiovalue2)
                      Print #8 , " Com1 : " ; Radiovalue2
                      Radiovalue2 = ""
                    '  Radiovalue2_2 = ""
                    End If
                    'Waitms 100
                    Enable Usartc0_rxc
                    Return

                    با تشکر

                    دیدگاه


                      #70
                      پاسخ : برنامه نویسی XMEGA با Bascom-AVR

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

                      دیدگاه


                        #71
                        پاسخ : برنامه نویسی XMEGA با Bascom-AVR

                        با سلام

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

                        به این شکل :
                        کد:
                        Config Priority = Static , Vector = Application , Lo = Enabled
                        
                        
                        Enable Interrupts
                        Enable Usarte1_rxc , Lo
                        On Usarte1_rxc Pressuredata_isr
                        Enable Usarte0_rxc , Lo
                        On Usarte0_rxc Radioswitch_isr
                        Enable Usartc0_rxc , Lo
                        On Usartc0_rxc Test1_isr
                        بنده به ترتیب زیر تایمر TCD0 را راه اندازی کردم :
                        کد:
                        Config Tcd0 = Normal , Prescale = 8 
                        Enable Tcd0_ovf
                        On Tcd0_ovf Itimer
                        در این حالت در رویداد Itimer یک عدد را در هر بار اجرا شدن تایمر با یک جمع میکنم و روی یکی از پورتهای UART مینویسم :
                        کد:
                        Itimer:
                        Mytimer = Mytimer + 1
                        Print #8 , " From Timer : " ; Mytimer
                        Return
                        من به تازگی برنامه نویسی برای میکروکنترلرها رو شروع کردم و قبلا با Delphi و برای ویندوز برنامه نویسی میکردم . شاید من این تایمرهای موجود در میکروکنترلر و روش استفاده از آنها رو با تایمرهایی که در برنامه نویسی برای ویندوز استفاده میکردم اشتباه گرفتم و اصلا کار این تایمرها به اون شکل نباشه . خواهشمندم در صورت امکان در این مورد توضیح بدید که اصولا کار این تایمرها چیه و چه استفاده هایی میشه ازشون کرد . از اسمشون بر میاد که تایمر هستند و نباید تفاوتی در عملکردشون با اون تایمرها باشه . استفاده ای که بنده ازش انتظار دارم در این میکروکنترلر برام انجام بده اینه که یک سری محاسبات ریاضی رو هر 20 میلی ثانیه یکبار انجام بده . برای این محاسبات یک سری متغییرهایی وجود داره که مقادیر اونها از طریق پورتهای سریال و در اینتراپتهایی که تعریف کردم دریافت میشه و میبایست در این تایمر ازشون استفاده بشه و در نهایت پس از انجام این محاسبات نتیجه محاسبه بروی یکی از پورتهای سریال که اینتراپت ورودی براش تعریف نشده نوشته بشه . ممنون میشم اگر راهنمایی بفرمایید .

                        با تشکر .

                        دیدگاه


                          #72
                          پاسخ : برنامه نویسی XMEGA با Bascom-AVR

                          با تنظیماتی که ذکر کرده اید، به تایمر کلاک 4 مگاهرتز وارد می شود که بسته به اینکه حداکثر مقدار تایمر چقدر باشد، زمان سرریز آن مشخص خواهد شد. در کد شما برای حداکثر تایمر TCD0مقداری مشخص نشده که از طریق مقدار دهی به TCD0_PER اینکار انجام می شود. مسئله بعدی زمان 20 میلی ثانیه است که با کلاک 4 مگاهرتز و طول 16 بیت برای تایمر نمی توان به این زمان رسید و بنابراین باید ضریب تقسیم prescaler را افزایش دهید. با قرار دادن prescaler در ضریب تقسیم 64 و TCD0_PER=9999 زمان 20 میلی ثانیه بدست می آید.
                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


                            #73
                            پاسخ : برنامه نویسی XMEGA با Bascom-AVR

                            سلام ؛

                            از پاسختون ممنونم ، خیلی لطف کردید .
                            اما در خصوص Priority بنده هنوز متوجه مشکل نشدم . میشه در این مورد هم توضیح بدید ؟

                            پیشاپیش سپاسگزارم .

                            دیدگاه


                              #74
                              پاسخ : برنامه نویسی XMEGA با Bascom-AVR

                              با سلام ؛

                              با استفاده از تایمر TCD0 و تنظیمات Prescale برابر با 64 و TCD0_Per برابر با 9999 یک سری عملیات ریاضی رو انجام میدم که خیلی ساده هستند یک ضرب و یک جمع بروی دو عدد صحیح و اعشاری . حاصل عملیات ریاضی کاملا صحیح هستش ولی پس از گذشت مدتی که هر بار ممکنه متفاوت باشه میکروکنترلر ریست میشه و از کار باز میمونه .

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

                              دیدگاه


                                #75
                                پاسخ : برنامه نویسی XMEGA با Bascom-AVR

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

                                دیدگاه

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