اطلاعیه

Collapse
No announcement yet.

LED RGB+bascom

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

    LED RGB+bascom

    با سلام به همه دوستان (من به پیشنهاد یکی از دوستان خوبم :nerd: این تاپیک را میزنم تا به کمک شما مشکلم را حل کنم)
    میخوام یک ماتریس 8*8 led rgb را با کمک atmega راه اندازی کنم و از بیسیک نیز استفاده میکنم لطفا قدم به قدم راهنماییم کنید
    هم در مورد سخت افزار پیشنهادی و هم در مورد برنامه آن.این یک پروژه دانشجوییه که استاد مربوطه میخواد به کمک avr و پالس pwm حداقل یه کاراکتر را نمایش بدهم و این پالس را میکرو تولید میکند نه Ic pwm .

    #2
    پاسخ : LED RGB+bascom

    سلام دوست خوبم

    قرار بر این شد که یک میکرو مولد پالس pwm باشه و میکرو دیگه عملکرد جاروب و ورودی اطلاعات و کنترل مولد spwm رو کنترل کنه
    کد:
    $regfile "M16DEF.DAT"
    $crystal = 8000000
    Config Timer0 = Timer , Prescale = 8
    On Ovf0 Isr
    Enable Ovf0
    Enable Interrupts
    
    Config Portb = Output
    
    
    Ch1 Alias Portb.0
    Ch2 Alias Portb.1
    Ch3 Alias Portb.2
    Ch4 Alias Portb.3
    Ch5 Alias Portb.4
    Ch6 Alias Portb.5
    Ch7 Alias Portb.6
    Ch8 Alias Portb.7
    
    
    
    
    '----------------------var---------------------------------------------
    Dim A As Byte
    Dim Isrnum As Byte , Chanal As Byte , Value(8) As Byte
    Timer0 = -40
    
    Value(1) = 50
    Value(2) = 220
    Value(3) = 125
    Value(4) = 10
    
    
    
    '--------------------------------------------------------------********
    Isrnum = 0
    Portb = &HFF
    
    
    
    Do
    A = A + 1
    ' dar in ghesmat routin darayft dastorat rs-232 ro bezar
    
    Loop
    
    
    End
    
    Isr:
    Stop Timer0
    
    Incr Isrnum
    '---------------------------------------------------------------------
    If Isrnum = Value(1) Then
    Toggle Ch1
    End If
    
    
    If Isrnum = Value(2) Then
    Toggle Ch2
    End If
    
    
    
    If Isrnum = Value(3) Then
    Toggle Ch3
    End If
    
    
    
    If Isrnum = Value(4) Then
    Toggle Ch4
    End If
    
    
    
    
    If Isrnum = 250 Then
    Isrnum = 0
    Portb = 0
    
    End If
    
    Start Timer0
    
    Return

    حالااین برنامه رو توسعه باید داد که ورودیش شماره کانال و مقدار دوره کار کرد موج باشه و با rs232 و خروجیش 24 تا کانال pwm که کار سختی نیست و میشه درش آورد .
    بعدش میریم سذاغ مسائل جاروب ماتریس که تو انجمن کلی در موردش گفته شده
    فایل های پیوست شده

    دیدگاه


      #3
      پاسخ : LED RGB+bascom

      نوشته اصلی توسط علی یعقوبی
      سلام دوست خوبم

      قرار بر این شد که یک میکرو مولد پالس pwm باشه و میکرو دیگه عملکرد جاروب و ورودی اطلاعات و کنترل مولد spwm رو کنترل کنه
      .................................
      حالااین برنامه رو توسعه باید داد که ورودیش شماره کانال و مقدار دوره کار کرد موج باشه و با rs232 و خروجیش 24 تا کانال pwm که کار سختی نیست و میشه درش آورد .
      بعدش میریم سذاغ مسائل جاروب ماتریس که تو انجمن کلی در موردش گفته شده
      با سلام

      این 24 تا کانال خروجی PWM ، بصورت همزمان هستند ؟

      دیدگاه


        #4
        پاسخ : LED RGB+bascom

        سلام آقای معیری

        شروع و پایان این موج ها با هم است و اختلاف فاز ندارند و هر 24 کانال روی 3 تا پورت از میکرو ایجاد میشه ، الان مدار روی RC داخلی تنظیم شده ولی فکر کنم با گذاشتن کریستال 16 مگ میشه ، دقت رو به حداکثر رساند

        دیدگاه


          #5
          پاسخ : LED RGB+bascom

          نوشته اصلی توسط علی یعقوبی
          سلام آقای معیری

          شروع و پایان این موج ها با هم است و اختلاف فاز ندارند و هر 24 کانال روی 3 تا پورت از میکرو ایجاد میشه ، الان مدار روی RC داخلی تنظیم شده ولی فکر کنم با گذاشتن کریستال 16 مگ میشه ، دقت رو به حداکثر رساند
          با سلام

          یعنی اینکه هر کدام از این 24 کانال ( پین میکرو ) دارای یک شمارنده PWM جداگانه هستند ؟ یعنی بطور مثال ، در وهله اول ، رجیستر PWM کانال یک تا 24 را با اعداد مختلفی مثل :
          کانال 1 - 10
          .
          .
          .
          کانال 10 - 45

          .
          .
          .
          کانال 24 - 200


          ست میکنیم و سپس و بعد از استارت ، هر کدام از این خروجیها ، بصورت همزمان ، با اعدادی که گفته شد ، شروع به کار میکنند ؟
          یعنی پایه خروجی اول ، 10 واحد HIGH , و مابقی LOW است و همینطور ، همزمان ، پایه خروجی دهم , 45 واحد HIGH و مابقی LOW است ؟ و همینطور پایه خروجی 24 ، 200 واحد HIGH و مابقی LOW و بهمین صورت ، پایه های دیگر ؟

          دیدگاه


            #6
            پاسخ : LED RGB+bascom

            یعنی اینکه هر کدام از این 24 کانال ( پین میکرو ) دارای یک شمارنده PWM جداگانه هستند ؟
            بله متغیر value که یک آرایه است مقدار روشن بودن هر کانال رو تعیین میکنه ( یا مقدار خاموش بودن با توجه به برنامه برنامه )


            ست میکنیم و سپس و بعد از استارت ، هر کدام از این خروجیها ، بصورت همزمان ، با اعدادی که گفته شد ، شروع به کار میکنند ؟
            یعنی پایه خروجی اول ، 10 واحد HIGH , و مابقی LOW است و همینطور ، همزمان ، پایه خروجی دهم , 45 واحد HIGH و مابقی LOW است ؟ و همینطور پایه خروجی 24 ، 200 واحد HIGH و مابقی LOW و بهمین صورت ، پایه های دیگر ؟
            دقیقا همین جوری که شما گفتید ، البته بهتره که با یک واسط مثل rs232 بشه مقادیر رو در طول برنامه تغییر داد

            --

            تایمر با مقدار منفی 40 پر شده و وقفه سرریز ان فعال شده است با توجه به اینکه کریستال 8 مگ و کلاک تایمر 1/8 میباشد پس هر 1 میکروثانیه یک واحد به تایمر اضافه مبشود و 40 میکرو ثاینه میکرو به روتین وقه میرود
            زمانی که به روتین وقفه رفت یک واحد به رجیستر isrnum اضافه میشود و مقدار این رجیستر با تک تک مقادیر مربوط به هر کانال مقایسه میشود و در صورت برابر بودن وضیعت پابه برعکس میشود

            مقدار حداکثر isrnum رو برابر 250 در نظر گرفته شده 250 ضرب در 40 میکرو ثانیه میشود 10 میلی ثانیه پس فرکانس میشود 100 هرتز :redface:

            دیدگاه


              #7
              پاسخ : LED RGB+bascom

              نوشته اصلی توسط علی یعقوبی
              یعنی اینکه هر کدام از این 24 کانال ( پین میکرو ) دارای یک شمارنده PWM جداگانه هستند ؟
              بله متغیر value که یک آرایه است مقدار روشن بودن هر کانال رو تعیین میکنه ( یا مقدار خاموش بودن با توجه به برنامه برنامه )
              ست میکنیم و سپس و بعد از استارت ، هر کدام از این خروجیها ، بصورت همزمان ، با اعدادی که گفته شد ، شروع به کار میکنند ؟
              یعنی پایه خروجی اول ، 10 واحد HIGH , و مابقی LOW است و همینطور ، همزمان ، پایه خروجی دهم , 45 واحد HIGH و مابقی LOW است ؟ و همینطور پایه خروجی 24 ، 200 واحد HIGH و مابقی LOW و بهمین صورت ، پایه های دیگر ؟
              دقیقا همین جوری که شما گفتید ، البته بهتره که با یک واسط مثل rs232 بشه مقادیر رو در طول برنامه تغییر داد
              --
              تایمر با مقدار منفی 40 پر شده و وقفه سرریز ان فعال شده است با توجه به اینکه کریستال 8 مگ و کلاک تایمر 1/8 میباشد پس هر 1 میکروثانیه یک واحد به تایمر اضافه مبشود و 40 میکرو ثاینه میکرو به روتین وقه میرود
              زمانی که به روتین وقفه رفت یک واحد به رجیستر isrnum اضافه میشود و مقدار این رجیستر با تک تک مقادیر مربوط به هر کانال مقایسه میشود و در صورت برابر بودن وضیعت پابه برعکس میشود
              مقدار حداکثر isrnum رو برابر 250 در نظر گرفته شده 250 ضرب در 40 میکرو ثانیه میشود 10 میلی ثانیه پس فرکانس میشود 100 هرتز :redface:
              بنده با روش دیگری این این کار رو بدون دخالت مستقیم میکرو انجام دادم یعنی یک چیپ درایور RGB LED طراحی شد و ، میکرو ( هر نوع و یا مدل از میکروکنترولر ، فقط اطلاعات مربوط به هر یک از 24 کانال رو در چیپ درایور ، ذخیره و از آن به بعد ، چیپ درایور، هر خروجی رو با مقایسه مقدار عددی PWM GENERATOR داخلی و اون عدد ذخیره شده ) ، روشن و یا خاموش میکنه .
              به همین دلیل ، این روش ، برام کمی ، مبهمه !!
              توی سایت بیسکام ، قبلا یه پروژه دیدم که یه همچین کاری کرده بود ، منتها ، بدلیل عدم آشنایی با طرز کار AVR ، باز هم ، برام قضیه جا نیفتاد .!
              اگه امکان داره یه مقداری موضوع را باز بفرمایید
              با احترام

              دیدگاه


                #8
                پاسخ : LED RGB+bascom

                سلام خدمت دوستان گرامی
                آقا این برنامه خیلی تمیز کار میکنه من 32 تا خروجی ازش گرفتم بیشتر نمیزاشت میکرو گفت دیگه پایه ندارم اگه میخوای لچ بزار!!!
                قبلا من همچین برنامه ای نوشتم ولی جواب نگرفتم چون هر بار تایمر وقفه میداد تایمر رو خاموشش نمی کردم برا همی محاسبات اشتباه میشد الان که این رو دیدیم یاد گذشته کردم خندم گرفت یه ای ول به شما گفتم و بدش کلی کیف کردم :wow:
                این هم نتیجه رو 8 کانال دئوتی هم بین 0 تا99 تنظیم کردم...

                اگه انجا که ماکزیمم مقدار کونتر رو 250 رو رو 100 بگذاریم بازمون بین 0 تا 100 میشه فرکانس هم که فرکانس وقفه خوردن تایمر است....

                بازم ای ولا گل کاشتی چیز خیلی تمیزی شد...
                یا علی

                دیدگاه


                  #9
                  پاسخ : LED RGB+bascom

                  اگه امکان داره یه مقداری موضوع را باز بفرمایید
                  با کمال میل

                  تایمر جوری تنظیم شده که هر 40 میکرو ثانیه مقدار اون به ff میرسه و سرریز اتفاق میفته و چون وقفه سرریز هم فعال شده برنامه در هر جایی از برنامه باشه به زیر روال مربوط به وقفه پرش میکنه که اینجا iSR نام داره ، خوشبختانه اینجا ما کاری به بردار وقفه نداریم و به راحتی با نوشتن یک پرچسب از وقفه استفاده میکنیم

                  تحلیل برنامه از زمان شروع
                  Isrnum = 0
                  Portb = &HFF
                  تمام پابه های پورت b به عنوان خروجی تعریف شده اند و با قرار گرفتن مقدار ff در آن تمامی پایه ها ست میشوند

                  برنامه در حلقه do-loop گیر کرده بعد از 40 میکروثانیه تایمر سرریز میشه و به پرچسب isr میرود

                  تایمر در این لحظه خاموش میشود که مدار دیگر وقفه نخورد Stop Timer0

                  متغیر Isrnumتا قبل از این 0 بوده با دستور Incr Isrnum یک واحد به این متغییر اضافه میشود
                  در خطهای بعدی هیچ کدام از شرط هایی که گذاشته شده اند درست نیستند به عنوان مثال



                  If Isrnum = Value(2) Then
                  Toggle Ch2
                  End If

                  قبل از این Value(2) = 220 مقدار داده شده و Isrnum در این لحظه 0 است پس شرط درست نمی باشد و از خط بعد ار End If دوباره شروع میکند

                  چون در این حالت هیچ کدام از شرط ها درست نمی باشند به خط start timer0 میرسیم و در نهایت با دستور return از وقفه باز میگریدم و به یک ادرس بعد از آدرسی که پشته مقدار ان را دارد پرش میکنیم که جایی در حلقه do-loop است

                  این عمل این قدر تکرار میشود تا مثلا isrnum به مقدار 50 برسد در این حالت کانال یک که بیت صفر پورت b است برعکس میشود یعنی تا الان که یک بوده میشود صفر

                  If Isrnum = Value(1) Then
                  Toggle Ch1
                  End If


                  و با افزایش مقدار isrnum شرط ها درست میشوند و پین متناظر با آن نیز بر عکس میشود
                  حال اگر مقدار isrnum به 250 برسد پورت برابر 0 قرار میگیرد و مقدار متغیر isrnum را برابر 0 قرار می دهیم که در دفعه بعدی این فرایند دوباره تکرار شود




                  دیدگاه


                    #10
                    پاسخ : LED RGB+bascom

                    نوشته اصلی توسط علی یعقوبی
                    اگه امکان داره یه مقداری موضوع را باز بفرمایید
                    با کمال میل
                    تایمر جوری تنظیم شده که هر 40 میکرو ثانیه مقدار اون به ff میرسه و سرریز اتفاق میفته و چون وقفه سرریز هم فعال شده برنامه در هر جایی از برنامه باشه به زیر روال مربوط به وقفه پرش میکنه که اینجا iSR نام داره ، خوشبختانه اینجا ما کاری به بردار وقفه نداریم و به راحتی با نوشتن یک پرچسب از وقفه استفاده میکنیم
                    تحلیل برنامه از زمان شروع
                    Isrnum = 0
                    Portb = &HFF
                    تمام پابه های پورت b به عنوان خروجی تعریف شده اند و با قرار گرفتن مقدار ff در آن تمامی پایه ها ست میشوند
                    برنامه در حلقه do-loop گیر کرده بعد از 40 میکروثانیه تایمر سرریز میشه و به پرچسب isr میرود
                    تایمر در این لحظه خاموش میشود که مدار دیگر وقفه نخورد Stop Timer0
                    متغیر Isrnumتا قبل از این 0 بوده با دستور Incr Isrnum یک واحد به این متغییر اضافه میشود
                    در خطهای بعدی هیچ کدام از شرط هایی که گذاشته شده اند درست نیستند به عنوان مثال
                    If Isrnum = Value(2) Then
                    Toggle Ch2
                    End If
                    قبل از این Value(2) = 220 مقدار داده شده و Isrnum در این لحظه 0 است پس شرط درست نمی باشد و از خط بعد ار End If دوباره شروع میکند
                    چون در این حالت هیچ کدام از شرط ها درست نمی باشند به خط start timer0 میرسیم و در نهایت با دستور return از وقفه باز میگریدم و به یک ادرس بعد از آدرسی که پشته مقدار ان را دارد پرش میکنیم که جایی در حلقه do-loop است
                    این عمل این قدر تکرار میشود تا مثلا isrnum به مقدار 50 برسد در این حالت کانال یک که بیت صفر پورت b است برعکس میشود یعنی تا الان که یک بوده میشود صفر
                    If Isrnum = Value(1) Then
                    Toggle Ch1
                    End If
                    و با افزایش مقدار isrnum شرط ها درست میشوند و پین متناظر با آن نیز بر عکس میشود
                    حال اگر مقدار isrnum به 250 برسد پورت برابر 0 قرار میگیرد و مقدار متغیر isrnum را برابر 0 قرار می دهیم که در دفعه بعدی این فرایند دوباره تکرار شود
                    با سلام

                    یک نکته :

                    تا اونجا که متوجه شدم ، در تولید PWM باید ، مقدار شمارنده با مقادیر ثبت شده در رجیستر هر کانال ، مقایسه ( بزرگتر - کوچکتر ) شود ، آیا این دستورات ،
                    همین کار مقایسه ( بزرگتر - کوچکتر ) بین شمارنده و تک تک رجیسترها را انجام میدهند ، یا اینکه مدل مقایسه در این دستورات ، شرط مساوی بودن مقادیر است ؟

                    If Isrnum = Value(0) Then
                    Toggle Ch1
                    End If
                    .
                    .
                    .
                    .
                    .
                    If Isrnum = Value(12) Then
                    Toggle Ch1
                    End If
                    .
                    .

                    دیدگاه


                      #11
                      پاسخ : LED RGB+bascom

                      تا اونجا که متوجه شدم ، در تولید PWM باید ، مقدار شمارنده با مقادیر ثبت شده در رجیستر هر کانال ، مقایسه ( بزرگتر - کوچکتر ) شود ، آیا این دستورات ،
                      همین کار مقایسه ( بزرگتر - کوچکتر ) بین شمارنده و تک تک رجیسترها را انجام میدهند ، یا اینکه مدل مقایسه در این دستورات ، شرط مساوی بودن مقادیر است ؟
                      فقط شرط مساوی بودن رو گذاشتم ، من منظور شما رو کامل متوجه نشدم

                      -----------
                      http://www.eca.ir/forum2/index.php?topic=21565.msg101506#msg101506
                      http://www.electronics.blogsky.com/1387/11/23/post-35/
                      http://en.wikipedia.org/wiki/Pulse-width_modulation
                      :redface:


                      دیدگاه


                        #12
                        پاسخ : LED RGB+bascom

                        نوشته اصلی توسط علی یعقوبی
                        تا اونجا که متوجه شدم ، در تولید PWM باید ، مقدار شمارنده با مقادیر ثبت شده در رجیستر هر کانال ، مقایسه ( بزرگتر - کوچکتر ) شود ، آیا این دستورات ،
                        همین کار مقایسه ( بزرگتر - کوچکتر ) بین شمارنده و تک تک رجیسترها را انجام میدهند ، یا اینکه مدل مقایسه در این دستورات ، شرط مساوی بودن مقادیر است ؟
                        فقط شرط مساوی بودن رو گذاشتم ، من منظور شما رو کامل متوجه نشدم
                        ...................
                        http://en.wikipedia.org/wiki/Pulse-width_modulation
                        با سلام

                        عرض میکنم :
                        نوشته های آدرس آخری که قید فرمودید را مطالعه کردم ، در قسمتی از آن نوشته ها آمده است که ( البته با برداشت" اکابری " بنده از معنای این متن ) :



                        مدارات دیجیتالی زیادی میتوانند سیگنال PWM تولید کنند ( ...حتی خیلی از میکروکنترولرها دارای خروجیهای PWM هستند )
                        بصورت معمولی یک شمارنده بصورت پریودیک اضافه ( که این شمارنده مستفیم و یا غیر مستقیم ، به کلاک یک مدار وصل میشه )
                        و این شمارنده ، در پایان هر دوره از PWM ریست میشه .

                        اگر مقدار شمارنده بزرگتر ازمقدار ریفرنس باشد ، آنگاه حالت خروجی PWM از HIGH به LOW ( یا LOW به HIGH ) تغییر وضعیت خواهد داد .

                        با این تفاصیل ، این دستورات در برنامه شما ،
                        If Isrnum = Value(2) Then
                        Toggle Ch2
                        End If

                        چگونه تفسیر میشود ؟

                        دیدگاه


                          #13
                          پاسخ : LED RGB+bascom

                          اگر مقدار شمارنده بزرگتر ازمقدار ریفرنس باشد ، آنگاه حالت خروجی PWM از HIGH به LOW ( یا LOW به HIGH ) تغییر وضعیت خواهد داد .

                          با این تفاصیل ، این دستورات در برنامه شما ،
                          If Isrnum = Value(2) Then
                          Toggle Ch2
                          End If
                          چگونه تفسیر میشود ؟
                          سلام اقای معیری

                          من در ابتدای برنامه پورت را FF کردم و در انتهای برنامه جایی که مقدار شمارنده وقفه isrnum برابر 250 میشه پورت رو صفرکردم ، اگه بخواهیم جای این دو حالت عوض بشه ، جای مقدار اولیه و مقدار پورت در 250 رو جابجا کنیم درست در میاد :nerd:

                          من به سخت افزار داخلی میکرو زیاد وارد نیستم ، فقط یادم بود که رجیستر ocr با مقدار تایمر مقایسه میشود و در لحظه ای که این دو مقدار با هم یکی میشد خروجی مربوطه تغییر میکرد ، و با همون ذهنیت این برنامه رو نوشتم :redface:

                          دیدگاه


                            #14
                            پاسخ : LED RGB+bascom

                            سلام و عرض ارادت به آقای یعقوبی و بقیه دوستانی که این بحث جالب ایجاد کردند .

                            مایلم به چند نکته اشاره کنم . برای اینکه تصویر خوب و بدون لرزشی داشته باشید نیاز است که ماتریس شما حداقل با فرکانس 50 هرتز رفرش بشه ، به عبارتی در هر 20 میلی ثانیه یک جاروب کامل داشته باشید ، با توجه به gray = 250 که در نظر گرفتید و جاروب 8 سطری باید در هر 2.5 میلی ثانیه یک سطر و در هر 2500/250 = 10 میکروثانیه یک اینتراپت تایمر داشته باشید ، که در این تابع اینتراپت 24 مقایسه باید صورت بگیرد در ضمن زمانی برای دریافت دیتا باید باقی بماند ، به نظر من با avr studio چک کنید ببینید زمان اجرای اینتراپت برای 24 کانال کمتر از 10 میکروثانیه هست یا نه ؟
                            موفق باشید .
                            حضرت علي (ع) : خداوند از جاهلان پيمان فراگيرى علم نگرفته ، مگر آنكه قبلا از دنشمندان پيمان تعليم دادن گرفته است .

                            دیدگاه


                              #15
                              پاسخ : LED RGB+bascom

                              این بحث جالب چرا متوقف شد ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ :eek:
                              حضرت علي (ع) : خداوند از جاهلان پيمان فراگيرى علم نگرفته ، مگر آنكه قبلا از دنشمندان پيمان تعليم دادن گرفته است .

                              دیدگاه

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