اطلاعیه

Collapse
No announcement yet.

چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

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

    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    با سلام
    من تو یه تاپیک قدیمی کنترل شدت نور LED می خواستم سوالاتمو مطرح کنم فرستادنم اینجا. من نه میخام تاپیک جدید بزنم نه پست اضافی بزنم حتی شرمنده دوستانی هستم که این همه توضیحات نوشتند و من باز سوال دارم. حقیقتش مقداری این تاپیک رو مطالعه کردم ولی هنوز نفهمیدم...
    در حال حاضر سوال مشخصم اینه میخام با اتمگا8 2 تا خروجی pwm بگیرم برای کنترل شدت نور.فعلا همینو یاد بگیرم بعد با مطالعه بیشتر اونو توسعه میدم به 8 کانال و شدت نور متغییر. این برنامه که زحمتشو کشیدید من متوجه نشدم.
    [code=vb] $regfile = "m8def.dat"
    $crystal = 8000000


    Led1 Alias portd.0
    Led2 Alias portd.1
    Led3 Alias portd.2
    Led4 Alias portd.3
    Led5 Alias portd.4
    Led6 Alias Portb.6
    Led7 Alias Portb.7
    Led8 Alias Portd.5
    Led9 Alias Portd.6
    Led10 Alias Portd.7
    Led11 Alias Portb.0
    Led12 Alias Portb.1
    Led13 Alias Portb.2
    Led14 Alias Portb.3
    Led15 Alias Portb.4
    Led16 Alias Portb.5
    Led17 Alias Portc.0
    Led18 Alias Portc.1
    Led19 Alias Portc.2
    Led20 Alias Portc.3
    Led21 Alias Portc.4
    Led22 Alias Portc.5

    Max_var_pwm Alias 99
    Max_led Alias 22
    Delay1 Alias 20
    'ms
    Delay2 Alias 200
    'ms
    Dim Pwm(35) As Byte , A As Byte , _
    Y2 As Byte , _
    X1 As Byte , X2 As Byte , X3 As Byte
    Y2 = Max_led + Max_led
    A = Max_var_pwm

    'Config All =============================================
    'Config Timers
    'Config Ports
    Config Timer0 = Timer , Prescale = 8
    Enable Interrupts
    Enable Timer0
    On Ovf0 T0
    Tcnt0 = 105
    Start Timer0
    Ddrb = 255
    Ddrc = 63
    Ddrd = 255
    'End Config ============================================

    Do
    X1 = 0
    While X1 < Y2
    X2 = Max_led
    While X2 > 1
    X3 = X2 - 1
    Pwm(x2) = Pwm(x3)
    Decr X2
    Wend
    Pwm(1) = Lookup(x1 , Rain)
    Waitms Delay1
    Incr X1
    Wend
    Waitms Delay2
    Loop
    End 'end program


    T0:
    Tcnt0 = 105
    If A > 0 Then
    If A = Pwm(1) Then Led1 = 1
    If A = Pwm(2) Then Led2 = 1
    If A = Pwm(3) Then Led3 = 1
    If A = Pwm(4) Then Led4 = 1
    If A = Pwm(5) Then Led5 = 1
    If A = Pwm(6) Then Led6 = 1
    If A = Pwm(7) Then Led7 = 1
    If A = Pwm(8) Then Led8 = 1
    If A = Pwm(9) Then Led9 = 1
    If A = Pwm(10) Then Led10 = 1
    If A = Pwm(11) Then Led11 = 1
    If A = Pwm(12) Then Led12 = 1
    If A = Pwm(13) Then Led13 = 1
    If A = Pwm(14) Then Led14 = 1
    If A = Pwm(15) Then Led15 = 1
    If A = Pwm(16) Then Led16 = 1
    If A = Pwm(17) Then Led17 = 1
    If A = Pwm(18) Then Led18 = 1
    If A = Pwm(19) Then Led19 = 1
    If A = Pwm(20) Then Led20 = 1
    If A = Pwm(21) Then Led21 = 1
    If A = Pwm(22) Then Led22 = 1

    End If
    Decr A
    If A = 255 Then
    A = Max_var_pwm
    Portb = 0
    Portc = 0
    Portd = 0
    End If
    Return

    Rain:
    Data 99 , 80 , 70 , 60 , 40 , 20 , 15 , 9 , 7 , 5 , _
    3 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , _
    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,_
    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,_
    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
    [/code]
    اگه ممکنه برای 2 خروجی بگید تا بعد روش کار کنم. قبلا با بسکام برنامه می نوشتم ولی الان یه سالی هست کلا از الکترونیک فاصله گرفتم ؛ امشب تازه پروگرامرمو از انباری پیدا کردم یه خورده مطالعه کردم و چیزی دستگیرم نشد
    خودم خاستم با استفاده از تاخیر waitus موج pwm درست کنم ، ولی نمی دونم عملی میشه!
    [code=vb]L1:
    A = &B11
    Portb = A
    Waitus 5
    A = &B01 : Portb = A
    Waitus 1
    A = &B0
    Portb = A
    Waitus 4
    Goto L1[/code]
    لطفا یک برنامه ساده برای 2 یا 3 خروجی بهم بدید تا بتونم تحلیل کنم.
    هستم اگر می روم، گر نروم نیستم :rolleyes:

    دیدگاه


      پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

      نوشته اصلی توسط saeedbordbar
      با سلام
      من تو یه تاپیک قدیمی کنترل شدت نور LED می خواستم سوالاتمو مطرح کنم فرستادنم اینجا. من نه میخام تاپیک جدید بزنم نه پست اضافی بزنم حتی شرمنده دوستانی هستم که این همه توضیحات نوشتند و من باز سوال دارم. حقیقتش مقداری این تاپیک رو مطالعه کردم ولی هنوز نفهمیدم...
      در حال حاضر سوال مشخصم اینه میخام با اتمگا8 2 تا خروجی pwm بگیرم برای کنترل شدت نور.فعلا همینو یاد بگیرم بعد با مطالعه بیشتر اونو توسعه میدم به 8 کانال و شدت نور متغییر. این برنامه که زحمتشو کشیدید من متوجه نشدم.
      [code=vb] $regfile = "m8def.dat"
      $crystal = 8000000


      Led1 Alias portd.0
      Led2 Alias portd.1
      Led3 Alias portd.2
      Led4 Alias portd.3
      Led5 Alias portd.4
      Led6 Alias Portb.6
      Led7 Alias Portb.7
      Led8 Alias Portd.5
      Led9 Alias Portd.6
      Led10 Alias Portd.7
      Led11 Alias Portb.0
      Led12 Alias Portb.1
      Led13 Alias Portb.2
      Led14 Alias Portb.3
      Led15 Alias Portb.4
      Led16 Alias Portb.5
      Led17 Alias Portc.0
      Led18 Alias Portc.1
      Led19 Alias Portc.2
      Led20 Alias Portc.3
      Led21 Alias Portc.4
      Led22 Alias Portc.5

      Max_var_pwm Alias 99
      Max_led Alias 22
      Delay1 Alias 20
      'ms
      Delay2 Alias 200
      'ms
      Dim Pwm(35) As Byte , A As Byte , _
      Y2 As Byte , _
      X1 As Byte , X2 As Byte , X3 As Byte
      Y2 = Max_led + Max_led
      A = Max_var_pwm

      'Config All =============================================
      'Config Timers
      'Config Ports
      Config Timer0 = Timer , Prescale = 8
      Enable Interrupts
      Enable Timer0
      On Ovf0 T0
      Tcnt0 = 105
      Start Timer0
      Ddrb = 255
      Ddrc = 63
      Ddrd = 255
      'End Config ============================================

      Do
      X1 = 0
      While X1 < Y2
      X2 = Max_led
      While X2 > 1
      X3 = X2 - 1
      Pwm(x2) = Pwm(x3)
      Decr X2
      Wend
      Pwm(1) = Lookup(x1 , Rain)
      Waitms Delay1
      Incr X1
      Wend
      Waitms Delay2
      Loop
      End 'end program


      T0:
      Tcnt0 = 105
      If A > 0 Then
      If A = Pwm(1) Then Led1 = 1
      If A = Pwm(2) Then Led2 = 1
      If A = Pwm(3) Then Led3 = 1
      If A = Pwm(4) Then Led4 = 1
      If A = Pwm(5) Then Led5 = 1
      If A = Pwm(6) Then Led6 = 1
      If A = Pwm(7) Then Led7 = 1
      If A = Pwm(8) Then Led8 = 1
      If A = Pwm(9) Then Led9 = 1
      If A = Pwm(10) Then Led10 = 1
      If A = Pwm(11) Then Led11 = 1
      If A = Pwm(12) Then Led12 = 1
      If A = Pwm(13) Then Led13 = 1
      If A = Pwm(14) Then Led14 = 1
      If A = Pwm(15) Then Led15 = 1
      If A = Pwm(16) Then Led16 = 1
      If A = Pwm(17) Then Led17 = 1
      If A = Pwm(18) Then Led18 = 1
      If A = Pwm(19) Then Led19 = 1
      If A = Pwm(20) Then Led20 = 1
      If A = Pwm(21) Then Led21 = 1
      If A = Pwm(22) Then Led22 = 1

      End If
      Decr A
      If A = 255 Then
      A = Max_var_pwm
      Portb = 0
      Portc = 0
      Portd = 0
      End If
      Return

      Rain:
      Data 99 , 80 , 70 , 60 , 40 , 20 , 15 , 9 , 7 , 5 , _
      3 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , _
      0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,_
      0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,_
      0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
      [/code]
      اگه ممکنه برای 2 خروجی بگید تا بعد روش کار کنم. قبلا با بسکام برنامه می نوشتم ولی الان یه سالی هست کلا از الکترونیک فاصله گرفتم ؛ امشب تازه پروگرامرمو از انباری پیدا کردم یه خورده مطالعه کردم و چیزی دستگیرم نشد
      خودم خاستم با استفاده از تاخیر waitus موج pwm درست کنم ، ولی نمی دونم عملی میشه!
      [code=vb]L1:
      A = &B11
      Portb = A
      Waitus 5
      A = &B01 : Portb = A
      Waitus 1
      A = &B0
      Portb = A
      Waitus 4
      Goto L1[/code]
      لطفا یک برنامه ساده برای 2 یا 3 خروجی بهم بدید تا بتونم تحلیل کنم.
      درود بر شما
      نخست از شما سپاسگذاری میکنم از اینکه تاپیک جدید باز نکردید
      نیازی نیست که خودتون موج PWM بسازید
      برنامه ای که نوشتم میتونید خیلی راحت اون کاری که بخواید رو انجام بده
      فقط باید به اندیس مورد نظر آرایه pwm تعیین کنید و به آن مقدار دهید ....
      همین ...
      این برنامه برای دوتا PWM طراحی شده
      این برنامه را که اجرا کنید خواهید دید که چه اتفاقی خواهد افتاد
      [code=vb] $regfile = "m8def.dat"
      $crystal = 8000000


      Led1 Alias portd.0
      Led2 Alias portd.1

      Max_var_pwm Alias 99
      Dim Pwm(5) As Byte , A As Byte
      A = Max_var_pwm

      'Config All =============================================
      'Config Timers
      'Config Ports
      Config Timer0 = Timer , Prescale = 8
      Enable Interrupts
      Enable Timer0
      On Ovf0 T0
      Tcnt0 = 105
      Start Timer0
      Ddrd = 255
      'End Config ============================================


      Do
      pwm(1) = 0
      waitms 500
      pwm(1) = 10
      waitms 500
      pwm(1) = 20
      waitms 500
      pwm(1) = 30
      waitms 500
      pwm(1) = 40
      waitms 500
      pwm(1) = 50
      waitms 500
      pwm(1) = 60
      waitms 500
      pwm(1) = 70
      waitms 500
      pwm(1) = 80
      waitms 500
      pwm(1) = 90
      waitms 500
      pwm(1) = 99
      waitms 500
      Loop
      End 'end program


      T0:
      Tcnt0 = 105
      If A > 0 Then
      If A = Pwm(1) Then Led1 = 1
      If A = Pwm(2) Then Led2 = 1

      End If
      Decr A
      If A = 255 Then
      A = Max_var_pwm
      Portd = Portd and 252
      End If
      Return
      [/code]




      اضافه شده در تاریخ :
      راستی
      شما نیازی به تحلیل کردن ندارید
      تنها کاری که شما باید انجام دهید این است که درون حلقه do-loop برنامه خودتون رو بنویسید
      به کدی که نوشتم دقت کنید
      روی عمل هم ببینید که چه اتفاقی خواهد افتاد

      موفق باشید
      [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
      معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
      معرفی نرم افزار Codewizard PWM
      با من بیشتر آشنا شوید

      دیدگاه


        پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

        فکر کردم برنامه ایراد داره چون فقط برا portd.0 عمل میکرد . اما الان با توجه به توصیه شما
        نوشته اصلی توسط سامان اسدی
        تنها کاری که شما باید انجام دهید این است که درون حلقه do-loop برنامه خودتون رو بنویسید
        فهمیدم که باید داخل حلقه به جز (1)pwm . باید (2)pwm هم نوشته شود ، دوستان به دل نگیرید اینجانب مبتدی می باشم :icon_razz:
        به نظرم حالا بتونم برنامه رو برا کانال های بیشتر توسعه بدم . تشکر آقای اسدی @};-
        هستم اگر می روم، گر نروم نیستم :rolleyes:

        دیدگاه


          پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

          نوشته اصلی توسط saeedbordbar
          فکر کردم برنامه ایراد داره چون فقط برا portd.0 عمل میکرد . اما الان با توجه به توصیه شمافهمیدم که باید داخل حلقه به جز (1)pwm . باید (2)pwm هم نوشته شود ، دوستان به دل نگیرید اینجانب مبتدی می باشم :icon_razz:
          به نظرم حالا بتونم برنامه رو برا کانال های بیشتر توسعه بدم . تشکر آقای اسدی @};-
          خواهش میکنم ...

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

          به امید پیشرفت و سربلندی ایران عزیزمان ... :rolleyes: :nerd:
          [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
          معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
          معرفی نرم افزار Codewizard PWM
          با من بیشتر آشنا شوید

          دیدگاه


            پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

            سلام دوستان،من تازه با این تا پیک آشنا شدم.
            برنامه ی موردنظر برای ایجاد pwm رو نوشتم اما قسمت افکت ا رو ننوشتم و ساده تر و فقط برای یک پورت نوشتم و با یک حلقه ی for دیوتی سایکل رو از 0 تا 99 تغییر دادم،اما یک مشکل دارم:
            Led پر پر میکند یعنی انگار تند تند داره خاموش روشن میشه و اون تدریجی کم و زیاد شدن وجود نداره.با هر مقاومتی هم امتحان کردم( 330 اهم، 4.7 کیلو اهم و... )
            لطفا دوستانی که در این تاپیک اشتراک داشته اند ،مخصوصا جناب اسدی،کمک کنند.
            میکرو atmega32a , فرکانس داخلی 8
            در ضمن اگر درمورد تنظیمات لازم برای timer0 در کدویزارد توضیح بدید ممنون میشم.

            دیدگاه


              پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

              نوشته اصلی توسط amir 93101038
              سلام دوستان،من تازه با این تا پیک آشنا شدم.
              برنامه ی موردنظر برای ایجاد pwm رو نوشتم اما قسمت افکت ا رو ننوشتم و ساده تر و فقط برای یک پورت نوشتم و با یک حلقه ی for دیوتی سایکل رو از 0 تا 99 تغییر دادم،اما یک مشکل دارم:
              Led پر پر میکند یعنی انگار تند تند داره خاموش روشن میشه و اون تدریجی کم و زیاد شدن وجود نداره.با هر مقاومتی هم امتحان کردم( 330 اهم، 4.7 کیلو اهم و... )
              لطفا دوستانی که در این تاپیک اشتراک داشته اند ،مخصوصا جناب اسدی،کمک کنند.
              میکرو atmega32a , فرکانس داخلی 8
              در ضمن اگر درمورد تنظیمات لازم برای timer0 در کدویزارد توضیح بدید ممنون میشم.
              فیوزبیت هارو هم با فرکانس تطبیق داده اید؟
              http://s6.uplod.ir/i/00674/9cm41hm4inx0.jpg

              دیدگاه


                پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

                نوشته اصلی توسط MAHDI ZAMANI
                فیوزبیت هارو هم با فرکانس تطبیق داده اید؟
                نه
                چطور باید این کار رو انجام بدم؟ با کد ویژن کار میکنم. درضمن اگر بخوام فیوزبیت های مربوط به کلاک رو تنظیم کنم باید بقیه رو هم دوباره تنظیم کنم؟ از اونجایی که هنوز تو این کار مبتدی ام و خیلی هم در مورد خطرات تنظیم اشتباه فیوز بیت شنیدم تا بحال سمتش نرفتم و با همون پیش فرض ها کار کردم. :redface:
                ممنون میشم پاسخ بدید یا یک تاپیک خوب مربوط به این موضوع معرفی کنید. :smile:

                دیدگاه


                  پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

                  نوشته اصلی توسط amir 93101038
                  نه
                  چطور باید این کار رو انجام بدم؟ با کد ویژن کار میکنم. درضمن اگر بخوام فیوزبیت های مربوط به کلاک رو تنظیم کنم باید بقیه رو هم دوباره تنظیم کنم؟ از اونجایی که هنوز تو این کار مبتدی ام و خیلی هم در مورد خطرات تنظیم اشتباه فیوز بیت شنیدم تا بحال سمتش نرفتم و با همون پیش فرض ها کار کردم. :redface:
                  ممنون میشم پاسخ بدید یا یک تاپیک خوب مربوط به این موضوع معرفی کنید. :smile:
                  پروگرامر شما چی هست؟
                  http://s6.uplod.ir/i/00674/9cm41hm4inx0.jpg

                  دیدگاه


                    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

                    نوشته اصلی توسط MAHDI ZAMANI
                    پروگرامر شما چی هست؟
                    آقا ممنون
                    حل شد ، تونستم فیوز بیت ها رو تنظیم کنم
                    برنامه هم عالی اجرا میشه
                    ممنون از شما و مهندس اسدی.

                    دیدگاه


                      پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

                      نوشته اصلی توسط سامان اسدی
                      درود بر شما
                      نخست از شما سپاسگذاری میکنم از اینکه تاپیک جدید باز نکردید
                      نیازی نیست که خودتون موج PWM بسازید
                      برنامه ای که نوشتم میتونید خیلی راحت اون کاری که بخواید رو انجام بده
                      فقط باید به اندیس مورد نظر آرایه pwm تعیین کنید و به آن مقدار دهید ....
                      همین ...
                      این برنامه برای دوتا PWM طراحی شده
                      این برنامه را که اجرا کنید خواهید دید که چه اتفاقی خواهد افتاد
                      [code=vb] $regfile = "m8def.dat"
                      $crystal = 8000000


                      Led1 Alias portd.0
                      Led2 Alias portd.1

                      Max_var_pwm Alias 99
                      Dim Pwm(5) As Byte , A As Byte
                      A = Max_var_pwm

                      'Config All =============================================
                      'Config Timers
                      'Config Ports
                      Config Timer0 = Timer , Prescale = 8
                      Enable Interrupts
                      Enable Timer0
                      On Ovf0 T0
                      Tcnt0 = 105
                      Start Timer0
                      Ddrd = 255
                      'End Config ============================================


                      Do
                      pwm(1) = 0
                      waitms 500
                      pwm(1) = 10
                      waitms 500
                      pwm(1) = 20
                      waitms 500
                      pwm(1) = 30
                      waitms 500
                      pwm(1) = 40
                      waitms 500
                      pwm(1) = 50
                      waitms 500
                      pwm(1) = 60
                      waitms 500
                      pwm(1) = 70
                      waitms 500
                      pwm(1) = 80
                      waitms 500
                      pwm(1) = 90
                      waitms 500
                      pwm(1) = 99
                      waitms 500
                      Loop
                      End 'end program


                      T0:
                      Tcnt0 = 105
                      If A > 0 Then
                      If A = Pwm(1) Then Led1 = 1
                      If A = Pwm(2) Then Led2 = 1

                      End If
                      Decr A
                      If A = 255 Then
                      A = Max_var_pwm
                      Portd = Portd and 252
                      End If
                      Return
                      [/code]




                      اضافه شده در تاریخ :
                      راستی
                      شما نیازی به تحلیل کردن ندارید
                      تنها کاری که شما باید انجام دهید این است که درون حلقه do-loop برنامه خودتون رو بنویسید
                      به کدی که نوشتم دقت کنید
                      روی عمل هم ببینید که چه اتفاقی خواهد افتاد

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

                      Portd = Portd and 252
                      که مقدار و دستکاری کردم که توی شبیه ساز ظاهرا درست شد این دستور چیه ؟
                      انا لله و انا الیه الراجعون

                      دیدگاه


                        پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

                        سلام. اول باید بسیار بسیار زیاد تشکر کنم از شما آقایان اسدی و علوی عزیز که بدون چشم داشتی برای انتشار دانسته های خودتون به دیگران وقت زیادی صرف کردید.
                        این تاپیک و مخصوصاً آموزشی که قرار دادید فوق العاده برای بنده آموزنده بود و به نوعی مدیون شما خواهم بود. بازم تشکر میکنم
                        یک مشکلی که واسه من پیش اومده اینه که وقتی عدد a که نماینده tcnt هست و ocr رو روی مقادیر بیشتر از 100 و تا نزدیکی 255 بالا میبرم تا حداکثر نور led رو داشته باشم، ریپل خیلی شدیدی ایجاد میشه و خیلی سریع روشن خاموش میشه.مشکلش از کجاس؟

                        دیدگاه


                          پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

                          ببخشید دوباره پست میزنم
                          لطفا روند کار برنامه rgb برای مگا 16، پست 115 صفحه 8 رو توضیح بدید.
                          مخصوصاً این قسمت که هیچی نفهمیدم ازش
                          void RGB1(unsigned int RGB_0_to_511)
                          {
                          PWM[1] = RGB_0_to_511 & 7;
                          RGB_0_to_511 /= 8;
                          PWM[2] = RGB_0_to_511 & 7;
                          RGB_0_to_511 /= 8;
                          PWM[3] = RGB_0_to_511 & 7;
                          }

                          سپاس

                          دیدگاه


                            پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کن

                            سلام دوستان
                            امشب میخوام به قولم عمل کنم ...
                            یه برنامه ای میگذارم که دیگه خودتون رو با کدها درگیر نخواهید کرد ...
                            http://www.eca.ir/forum2/index.php?topic=117809.msg768085#msg768085


                            اضافه شده در تاریخ :
                            نوشته اصلی توسط nicebluesky
                            سلام. اول باید بسیار بسیار زیاد تشکر کنم از شما آقایان اسدی و علوی عزیز که بدون چشم داشتی برای انتشار دانسته های خودتون به دیگران وقت زیادی صرف کردید.
                            این تاپیک و مخصوصاً آموزشی که قرار دادید فوق العاده برای بنده آموزنده بود و به نوعی مدیون شما خواهم بود. بازم تشکر میکنم
                            یک مشکلی که واسه من پیش اومده اینه که وقتی عدد a که نماینده tcnt هست و ocr رو روی مقادیر بیشتر از 100 و تا نزدیکی 255 بالا میبرم تا حداکثر نور led رو داشته باشم، ریپل خیلی شدیدی ایجاد میشه و خیلی سریع روشن خاموش میشه.مشکلش از کجاس؟
                            درود به شما ...
                            ممنونم دوست عزیز ...شما لطف دارید ...

                            دوست عزیز به دلیل اینکه از 0 تا 100 باید عدد داد نه اینکه از 100 تا 255 ... منظورم این هست که بالاترین حدش 100 هست ...
                            شما این کار را کنید ببینید که مشکلتون برطرف میشه یا نه ...

                            نوشته اصلی توسط nicebluesky
                            ببخشید دوباره پست میزنم
                            لطفا روند کار برنامه rgb برای مگا 16، پست 115 صفحه 8 رو توضیح بدید.
                            مخصوصاً این قسمت که هیچی نفهمیدم ازش
                            void RGB1(unsigned int RGB_0_to_511)
                            {
                            PWM[1] = RGB_0_to_511 & 7;
                            RGB_0_to_511 /= 8;
                            PWM[2] = RGB_0_to_511 & 7;
                            RGB_0_to_511 /= 8;
                            PWM[3] = RGB_0_to_511 & 7;
                            }

                            سپاس
                            زیر برنامه رو میخواهید توضیح بدم؟
                            عدد را از 0 تا 511 میگیره و بعدا سه بیت سه بیت جدا میکنه و میده به هر کدوم از PWMها ... همین ...

                            برای بکار گیری فقط کافی هست بنویسیم
                            کد:
                            while(1)
                            {
                            	RGB1(100);
                            	delay_ms(500);
                            	RGB1(200);
                            	delay_ms(500);
                            	RGB1(300);
                            	delay_ms(500);
                            	RGB1(400);
                            	delay_ms(500);
                            	RGB1(500);
                            	delay_ms(500);
                            	RGB1(450);
                            	delay_ms(500);
                            	RGB1(350);
                            	delay_ms(500);
                            	RGB1(250);
                            	delay_ms(500);
                            	RGB1(150);
                            	delay_ms(500);
                            	RGB1(50);
                            	delay_ms(500);
                            	RGB1(0);
                            	delay_ms(500);
                            }
                            اگر عدد بین 0 تا 511 تغییر کنه RGB ما تغییر رنگ خواهد داد ... اینجا دیگه میزان روشنایی RGB مطرح نیست ... بلکه رنگش برای ما مهم هست ... البته این رو هم بگم که هر کدامیک از رنگها تغییر شدت نور خواهند داد ... ولی چون هر سه رنگ آبی و قرمز و سبز با هم هستند تنها رنگش فرق میکند ...

                            موفق باشید

                            اضافه شده در تاریخ :
                            نوشته اصلی توسط شاهین شرق
                            سلام.برای سه خروجی کردن تغییرات لازم رو دادم ولی این یه تیکه مشکل ایجاد می کرد:

                            Portd = Portd and 252
                            که مقدار و دستکاری کردم که توی شبیه ساز ظاهرا درست شد این دستور چیه ؟
                            درود بر شما
                            این میاد بعضی از خروجی هایی PWM هستند را صفر میکنه
                            مثلا اینجا که 252 هست میاد خروجی 0 و 1 را از پورت D صفر میکنه ... و مقدار پایه های 2 تا 7 که ربطی به PWM نداره را بدون تغییر مقدار گذاری میکنه ...
                            [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                            معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                            معرفی نرم افزار Codewizard PWM
                            با من بیشتر آشنا شوید

                            دیدگاه


                              پاسخ : پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کن

                              نوشته اصلی توسط سامان اسدی



                              دوست عزیز به دلیل اینکه از 0 تا 100 باید عدد داد نه اینکه از 100 تا 255 ... منظورم این هست که بالاترین حدش 100 هست ...
                              شما این کار را کنید ببینید که مشکلتون برطرف میشه یا نه ...
                              ممنون بابت پاسختون
                              بنده اومدم و توی برنامه حداکثر a رو 250 دادم، در انتهای روتین وقفه
                              بعدش آرایه rain رو هم بین 0تا250 تغییر دادم و توی حلقه های for هم به تعداد عناصر rain مقدار دهی کردم ولی خب ریپل زیاده شاید درحد 40 50میلی ثانیه که کاملاً مشاهده میشه


                              زیر برنامه رو میخواهید توضیح بدم؟
                              عدد را از 0 تا 511 میگیره و بعدا سه بیت سه بیت جدا میکنه و میده به هر کدوم از PWMها ... همین ...
                              بله تقریبا متوجه شدم که کارش به چه صورت هست ولی راستش از این عملگرها مثلا &7 و =/ سر در نیاوردم که میخواد چیکار کنه. :redface:

                              دیدگاه


                                پاسخ : پاسخ : چگونه همه پایه های میکروکنترلر AVR &#

                                نوشته اصلی توسط nicebluesky
                                ممنون بابت پاسختون
                                بنده اومدم و توی برنامه حداکثر a رو 250 دادم، در انتهای روتین وقفه
                                بعدش آرایه rain رو هم بین 0تا250 تغییر دادم و توی حلقه های for هم به تعداد عناصر rain مقدار دهی کردم ولی خب ریپل زیاده شاید درحد 40 50میلی ثانیه که کاملاً مشاهده میشه
                                خواهش میکنم
                                فقط اون نیست ... باید رجیستر های تایمر رو هم تغییر داد ...
                                250 یعنی یه جورایی هشت بیتی میخواین ... که این خودش به شدت پردازش میکرو را زیاد خواهد کرد ...
                                شما چرا 250 میخواهید ؟ من با 50 یا حتی 20 هم کار کردم و جواب گرفتم ... هر چه کمتر بهتر چون پردازش کمتر میگیره ...
                                خیلی عالی جواب میده ...
                                شما بفرمایید توی این تاپیک و برنامه ای که ساختم و بگیرید و تنظیمات دلخواهتون رو انجام بدید و سپس کدها به دست میاد ...
                                دیگه نمیخواهید کپی بگیرید چون خودش کپی میگیره ...
                                بنابراین تنها کافیه کلید Convert را بزنید و مستقیم به کامپایلر مورد نظر برید و Paste کنید ...
                                این تنها قالبش رو بهتون تحویل میده و شما باید برنامه خودتون رو هم درون حلقه اصلی و یک سری تعریفات (متغیرها و آرایه و ...)را هم بنویسید ...

                                نوشته اصلی توسط nicebluesky
                                بله تقریبا متوجه شدم که کارش به چه صورت هست ولی راستش از این عملگرها مثلا &7 و =/ سر در نیاوردم که میخواد چیکار کنه.
                                ببینید در زبان شیرین سی یک سری عملگردهایی تعریف شده که کار ما را بسیار ساده تر میکنه ...
                                به عنوان مثال
                                10=/a
                                این معادل این هست
                                10/a=a
                                دیگه نیازی به یک a بیشتر نیست ...
                                شما =/ را که بگذارید خودش میفهمه که منظورتون اینه که متغیر a رو تقسیم به 10 کن و بریز توی خودش
                                متوجه شدید؟
                                حالا ...
                                وقتی که متغیری را به (2به توان n) تقسیم کنیم به اندازه n شیفت به راست پیدا خواهد کرد ...
                                مثلا اگر بگیم متغیر را به (2 به توان 3 که میشه 8 ) تقسیم کنیم یعنی سه بیت به راست شیفت پیدا کنه ...
                                این حالت را اگر خواستیم به چپ تغییر دهیم باید از ضرب استفاده کنید ...

                                ===========
                                توی دیجیتال اگر AND را بکار ببریم یعنی اگر این و این شد آنگاه خروجی را فعال کن ...
                                AND توی زبان سی & هست و توجه داشته باشید که 7 به باینری میشه 00000111 و چون دستور AND به کار بردیم یعنی اینکه هرچی سه بیت سمت راست بود بریز توی متغیر فلان چیز ... که همون PWM ما هست ...

                                امیدوارم که خوب متوجه شده باشید ...
                                شاد و خندان باشید ...
                                [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                                معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                                معرفی نرم افزار Codewizard PWM
                                با من بیشتر آشنا شوید

                                دیدگاه

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