اطلاعیه

Collapse
No announcement yet.

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

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

    #76
    پاسخ : فیلم

    نوشته اصلی توسط Saman.Asadi
    یادم رفت که فیلمش رو بگذارم
    این هم فیلم
    512KB
    http://s5.picofile.com/file/8119864784/LED_Rain.mp4.html
    موفق باشید
    سلام.من خیلی تلاش کردم تا شبیه این فرمی که توی این فیلم هست برنامه رو بنویسم ولی نشد.
    کلا با برنامه های نوشته دیگران مشکل دارم.دوست دارم با تحلیل خودم بنویسم.اگه بخوام فقط واسه یه led این کار رو انجام بدم چیکار باید کرد؟
    انا لله و انا اليه الراجعون

    دیدگاه


      #77
      پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

      سلام دوستان
      از اینکه خیلی با تاخیر میام جواب بدم , عذرخواهی میکنم :redface:

      نوشته اصلی توسط ababakz
      ممنون بابت جواب
      i , j , k توی برنامه اصلی با هم اختلاف 255/3 دارن فراموش کردم اینجا بذارم .
      بعد راهی نداره مقدار PWM بالاتر از 99 باشه ؟ این محدودیت به خاطر چیه ؟
      ساختن اون مقادیر جدول در حالتی که محدود باشه به 99 فکر نکنم نتیجه مطلوب رو بده .
      در مورد سه شرط حق با شماست سوتی دادم .
      راه حلی نداره که بشه تا 255 مقدار داد ؟
      بله میشه
      این خط رو تغییر بدید
      کد:
      Config Timer0 = Timer , Prescale = 1
      و این خط ها رو حذف کنید
      کد:
      Tcnt0 = 105
      کد:
      A = Max_var_pwm
      و این خط
      کد:
         Portb = Portb And 254
         Portd = 0
      رو تغییر بده به این
      کد:
           Portd=Portd And 248
      در ضمن
      نمیخواد توی روتین تایمر اون برنامه ها رو بگذارید
      فقط کافیه برنامه هاتون رو بگذارید توی حلقه اصلی برنامه ....
      همین
      موفق باشید
      ===============================================
      ===============================================
      نوشته اصلی توسط شاهین شرق
      سلام.من خیلی تلاش کردم تا شبیه این فرمی که توی این فیلم هست برنامه رو بنویسم ولی نشد.
      کلا با برنامه های نوشته دیگران مشکل دارم.دوست دارم با تحلیل خودم بنویسم.اگه بخوام فقط واسه یه led این کار رو انجام بدم چیکار باید کرد؟
      سلام
      با چه برنامه ای کار میکنید؟

      برای کدویژن :
      کد:
      for(x=99;x>=0;x--)
      {
        pwm[1]=x;
        delay_ms(7);
      }
      delay_ms(1000);

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

      دیدگاه


        #78
        پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

        سلام کد رو تغییر دادم شد این . کار میکنه اما کلی اعوجاج داره . تو ای ای دی کار میکنه اما فکر نکنم تو کنترل دور موتور کار کنه .
        بازم پیشنهادی دارین ؟
        کد:
        $regfile = "m8def.dat"
         $crystal = 8000000
        
         Motor1 Alias Portd.0
         Motor2 Alias Portd.1
         Motor3 Alias Portd.2
        
        
         Max_var_pwm Alias 99
         Dim Pwm(10) As Byte , A As Byte
         Dim I As Byte , J As Byte , K As Byte
         I = 0
         J = 85
          K = 170
        
          'Config All =============================================
          'Config Timers
          'Config Ports
           Config Timer0 = Timer , Prescale = 8
           Enable Interrupts
           Enable Timer0
           On Ovf0 T0
           Start Timer0
           Ddrb = 1
           Ddrd = 255
          'End Config ============================================
        
        
          Do
        
            Pwm(1) = Lookup(i , Sin_data)
            Pwm(2) = Lookup(j , Sin_data)
            Pwm(3) = Lookup(k , Sin_data)
           Incr I
           Incr J
           Incr K
        
          Loop
        End                             'end program
        
        
        T0:
        
        
          If A > 0 Then
           If A = Pwm(1) Then Set Motor1
           If A = Pwm(2) Then Set Motor2
           If A = Pwm(3) Then Set Motor3
        
          End If
          Decr A
          If A = 255 Then
           Portd = Pind And 248
          End If
        Return
        Sin_data:
        Data &H80 , &H83 , &H86 , &H89 , &H8C , &H8F , &H92 , &H95 , &H98 , &H9C , &H9F , &HA2 , &HA5 , &HA8 , &HAB , &HAE,
        Data &HB0 , &HB3 , &HB6 , &HB9 , &HBC , &HBF , &HC1 , &HC4 , &HC7 , &HC9 , &HCC , &HCE , &HD1 , &HD3 , &HD5 , &HD8,
        Data &HDA , &HDC , &HDE , &HE0 , &HE2 , &HE4 , &HE6 , &HE8 , &HEA , &HEC , &HED , &HEF , &HF0 , &HF2 , &HF3 , &HF5,
        Data &HF6 , &HF7 , &HF8 , &HF9 , &HFA , &HFB , &HFC , &HFC , &HFD , &HFE , &HFE , &HFF , &HFF , &HFF , &HFF , &HFF,
        Data &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFE , &HFE , &HFD , &HFC , &HFC , &HFB , &HFA , &HF9 , &HF8 , &HF7,
        Data &HF6 , &HF5 , &HF3 , &HF2 , &HF0 , &HEF , &HED , &HEC , &HEA , &HE8 , &HE6 , &HE4 , &HE2 , &HE0 , &HDE , &HDC,
        Data &HDA , &HD8 , &HD5 , &HD3 , &HD1 , &HCE , &HCC , &HC9 , &HC7 , &HC4 , &HC1 , &HBF , &HBC , &HB9 , &HB6 , &HB3,
        Data &HB0 , &HAE , &HAB , &HA8 , &HA5 , &HA2 , &H9F , &H9C , &H98 , &H95 , &H92 , &H8F , &H8C , &H89 , &H86 , &H83,
        
        Data &H80 , &H7C , &H79 , &H76 , &H73 , &H70 , &H6D , &H6A , &H67 , &H63 , &H60 , &H5D , &H5A , &H57 , &H54 , &H51,
        Data &H4F , &H4C , &H49 , &H46 , &H43 , &H40 , &H3E , &H3B , &H38 , &H36 , &H33 , &H31 , &H2E , &H2C , &H2A , &H27,
        Data &H25 , &H23 , &H21 , &H1F , &H1D , &H1B , &H19 , &H17 , &H15 , &H13 , &H12 , &H10 , &H0F , &H0D , &H0C , &H0A,
        Data &H09 , &H08 , &H07 , &H06 , &H05 , &H04 , &H03 , &H03 , &H02 , &H01 , &H01 , &H00 , &H00 , &H00 , &H00 , &H00,
        Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H01 , &H01 , &H02 , &H03 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08,
        Data &H09 , &H0A , &H0C , &H0D , &H0F , &H10 , &H12 , &H13 , &H15 , &H17 , &H19 , &H1B , &H1D , &H1F , &H21 , &H23,
        Data &H25 , &H27 , &H2A , &H2C , &H2E , &H31 , &H33 , &H36 , &H38 , &H3B , &H3E , &H40 , &H43 , &H46 , &H49 , &H4C,
        Data &H4F , &H51 , &H54 , &H57 , &H5A , &H5D , &H60 , &H63 , &H67 , &H6A , &H6D , &H70 , &H73 , &H76 , &H79 , &H7C

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

        دیدگاه


          #79
          پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

          نوشته اصلی توسط ababakz
          سلام کد رو تغییر دادم شد این . کار میکنه اما کلی اعوجاج داره . تو ای ای دی کار میکنه اما فکر نکنم تو کنترل دور موتور کار کنه .
          بازم پیشنهادی دارین ؟
          کد:
          $regfile = "m8def.dat"
           $crystal = 8000000
          
           Motor1 Alias Portd.0
           Motor2 Alias Portd.1
           Motor3 Alias Portd.2
          
          
           Max_var_pwm Alias 99
           Dim Pwm(10) As Byte , A As Byte
           Dim I As Byte , J As Byte , K As Byte
           I = 0
           J = 85
            K = 170
          
            'Config All =============================================
            'Config Timers
            'Config Ports
             Config Timer0 = Timer , Prescale = 8
             Enable Interrupts
             Enable Timer0
             On Ovf0 T0
             Start Timer0
             Ddrb = 1
             Ddrd = 255
            'End Config ============================================
          
          
            Do
          
              Pwm(1) = Lookup(i , Sin_data)
              Pwm(2) = Lookup(j , Sin_data)
              Pwm(3) = Lookup(k , Sin_data)
             Incr I
             Incr J
             Incr K
          
            Loop
          End                             'end program
          
          
          T0:
          
          
            If A > 0 Then
             If A = Pwm(1) Then Set Motor1
             If A = Pwm(2) Then Set Motor2
             If A = Pwm(3) Then Set Motor3
          
            End If
            Decr A
            If A = 255 Then
             Portd = Pind And 248
            End If
          Return
          Sin_data:
          Data &H80 , &H83 , &H86 , &H89 , &H8C , &H8F , &H92 , &H95 , &H98 , &H9C , &H9F , &HA2 , &HA5 , &HA8 , &HAB , &HAE,
          Data &HB0 , &HB3 , &HB6 , &HB9 , &HBC , &HBF , &HC1 , &HC4 , &HC7 , &HC9 , &HCC , &HCE , &HD1 , &HD3 , &HD5 , &HD8,
          Data &HDA , &HDC , &HDE , &HE0 , &HE2 , &HE4 , &HE6 , &HE8 , &HEA , &HEC , &HED , &HEF , &HF0 , &HF2 , &HF3 , &HF5,
          Data &HF6 , &HF7 , &HF8 , &HF9 , &HFA , &HFB , &HFC , &HFC , &HFD , &HFE , &HFE , &HFF , &HFF , &HFF , &HFF , &HFF,
          Data &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFE , &HFE , &HFD , &HFC , &HFC , &HFB , &HFA , &HF9 , &HF8 , &HF7,
          Data &HF6 , &HF5 , &HF3 , &HF2 , &HF0 , &HEF , &HED , &HEC , &HEA , &HE8 , &HE6 , &HE4 , &HE2 , &HE0 , &HDE , &HDC,
          Data &HDA , &HD8 , &HD5 , &HD3 , &HD1 , &HCE , &HCC , &HC9 , &HC7 , &HC4 , &HC1 , &HBF , &HBC , &HB9 , &HB6 , &HB3,
          Data &HB0 , &HAE , &HAB , &HA8 , &HA5 , &HA2 , &H9F , &H9C , &H98 , &H95 , &H92 , &H8F , &H8C , &H89 , &H86 , &H83,
          
          Data &H80 , &H7C , &H79 , &H76 , &H73 , &H70 , &H6D , &H6A , &H67 , &H63 , &H60 , &H5D , &H5A , &H57 , &H54 , &H51,
          Data &H4F , &H4C , &H49 , &H46 , &H43 , &H40 , &H3E , &H3B , &H38 , &H36 , &H33 , &H31 , &H2E , &H2C , &H2A , &H27,
          Data &H25 , &H23 , &H21 , &H1F , &H1D , &H1B , &H19 , &H17 , &H15 , &H13 , &H12 , &H10 , &H0F , &H0D , &H0C , &H0A,
          Data &H09 , &H08 , &H07 , &H06 , &H05 , &H04 , &H03 , &H03 , &H02 , &H01 , &H01 , &H00 , &H00 , &H00 , &H00 , &H00,
          Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H01 , &H01 , &H02 , &H03 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08,
          Data &H09 , &H0A , &H0C , &H0D , &H0F , &H10 , &H12 , &H13 , &H15 , &H17 , &H19 , &H1B , &H1D , &H1F , &H21 , &H23,
          Data &H25 , &H27 , &H2A , &H2C , &H2E , &H31 , &H33 , &H36 , &H38 , &H3B , &H3E , &H40 , &H43 , &H46 , &H49 , &H4C,
          Data &H4F , &H51 , &H54 , &H57 , &H5A , &H5D , &H60 , &H63 , &H67 , &H6A , &H6D , &H70 , &H73 , &H76 , &H79 , &H7C

          به نظم مشکل از اینجاست که تا وقفه تایمر کلی از اون نمونه ها رد میشن و به ترتیب خونده نمیشن
          نظر شما چیه ؟
          خوب
          الان باز دوباره اون خطی که گفتم تغییر بدید رو تغییر ندادید ...
          کد:
          Config Timer0 = Timer , Prescale = 8
          کد:
          Config Timer0 = Timer , Prescale = 1
          چندتا سوال دارم
          اول اینکه EED چیه ؟؟
          دوم : میان هر بار که PWMها تغییر کنه چقدر باید تاخیر داشته باشه ؟؟؟

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

          دیدگاه


            #80
            پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

            سلام.متشکرم از اینکه بعد این همه مدت بازم پیگیرین
            برای اتمگا8 و بسکام می خوام.
            فعلا برای یک led می خوام که نرم روشن بشه و نرم خاموش بشه.بعد می خوام خودم روش کارم تا بشه همون چیزی که توی تصویر هست البته اگه سوادم برسه
            نمی دونم این روزا چمه که اصلا نمی تونم روی برنامه ای که شما برای اتمگا8 نوشتی متمرکز شم oo:
            به دلیل درخواست زیاد برنامه برای ATmega8 ، این برنامه در تاریخ 93/2/11 اضاف شد
            سورس کد برای ATmega8 به زبان بیسیک(بسکام)
            کد:
            $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
            انا لله و انا اليه الراجعون

            دیدگاه


              #81
              پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

              نوشته اصلی توسط شاهین شرق
              سلام.متشکرم از اینکه بعد این همه مدت بازم پیگیرین
              برای اتمگا8 و بسکام می خوام.
              فعلا برای یک led می خوام که نرم روشن بشه و نرم خاموش بشه.بعد می خوام خودم روش کارم تا بشه همون چیزی که توی تصویر هست البته اگه سوادم برسه
              نمی دونم این روزا چمه که اصلا نمی تونم روی برنامه ای که شما برای اتمگا8 نوشتی متمرکز شم oo:
              به دلیل درخواست زیاد برنامه برای ATmega8 ، این برنامه در تاریخ 93/2/11 اضاف شد
              سورس کد برای ATmega8 به زبان بیسیک(بسکام)
              کد:
              $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
              سلام شاهین جان
              ببین
              خیلی از قسمت های برنامه رو کاری نداشته باش که چیکار میکنه ...
              به عنوان مثال به این کدها کاری نداشته باش ...
              فکر کن که نیستند ...
              کد:
              $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
              
                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
              فقط این رو مد نظر داشته باش که ما اگر به آرایه Pwm و اندیس مورد نظر مقدار دهی کنیم ; pwm مورد نظر تنظیم میشود ...
              مقداری که مجاز هستیم در این برنامه میتوانیم از 0 تا 99 مقدار بدهیم ... که این نشان دهنده دیوتی سایکل (درصد نسبت یک بودن به صفر بودن) است
              خوب
              حالا در این حلقه Do-Loop دو حلقه For میگذاریم یکی برای خاموشی به روشنایی کامل و دیگری از روشنایی کامل به خاموشی ...

              این کد برای خاموشی به روشنایی
              کد:
                 For X = 0 To 99
                   Pwm(1) = X
                   Waitms 10
                 Next
              این کد برای روشنایی به خاموشی
              کد:
                 For X = 99 To 0 Step -1
                   Pwm(1) = X
                   Waitms 10
                 Next
              خوب حالا اگر این دو حلقه را یکی پس از دیگری بگذاریم میبینیم که اول خاموش به روشنی و سپس روشنایی به خاموشی تغییر پیدا میکند ... (این کار به طور مداوم انجام میگیرد)
              پس از این دو حلقه اگر خواستید که یک لحظه بماند یک تاخیری بدهید مانند کد زیر

              کد:
                 For X = 0 To 99
                   Pwm(1) = X
                   Waitms 10
                 Next
              
                 Waitms 1000
              
                 For X = 99 To 0 Step -1
                   Pwm(1) = X
                   Waitms 10
                 Next
              
                 Waitms 1000
              به همین راحتی و خوشمزگی ... :nerd:
              سوالی بود در خدمتم ...
              [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
              معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
              معرفی نرم افزار Codewizard PWM
              با من بیشتر آشنا شوید

              دیدگاه


                #82
                پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                عالی
                فقط برای تغییر منطق برنامه از یک به صفر کجاهاش رو باید عوض کنم؟
                اینجا؟
                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

                و اینجا
                Decr A
                If A = 255 Then
                A = Max_var_pwm
                Portb = 0
                Portc = 0
                Portd = 0
                جدول lookup چه تغییری باید بکنه؟
                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
                انا لله و انا اليه الراجعون

                دیدگاه


                  #83
                  پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                  نوشته اصلی توسط شاهین شرق
                  عالی
                  فقط برای تغییر منطق برنامه از یک به صفر کجاهاش رو باید عوض کنم؟
                  اینجا؟
                  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
                  در این قسمت یکها رو به صفر تبدیل کنید

                  نوشته اصلی توسط شاهین شرق
                  و اینجا
                  Decr A
                  If A = 255 Then
                  A = Max_var_pwm
                  Portb = 0
                  Portc = 0
                  Portd = 0
                  اینجا باید پینهای مورد نظری که PWM هستند را یک کنید ...
                  مثلا اگر هشت پایه پورت PWM ، B بود باید بنویسید
                  کد:
                  Portb=255
                  یا مثلا اگر فقط پینهای B.0 و B.1 را PWM کرده اید باید این دو پین را یک کنید
                  کد:
                  Portb=portb Or 3
                  نوشته اصلی توسط شاهین شرق
                  جدول lookup چه تغییری باید بکنه؟
                  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
                  این قسمت هم خوبه ...
                  نمیخواد تغییرش بدهید

                  فقط این نکته رو مد نظر داشته باشید که این جدول برای اینه که بخواهیم مقدارهای مورد نظرمان را مقداردهی کنیم

                  خوب
                  فرض کنیم که میخواهیم اون برنامه خودم را بنویسیم ...
                  ابتدا باید یک حلقه For نوشته بشه که یکی یکی اضاف بشه و داخل اون با تاخیر باشه و باید با استفاده از جدول lookup مقدار دهی بشه ...
                  مثلا داخل حلقه For مقدار x داره یکی یکی اضاف میشه و با استفاده خانه چندمی (مقدار x) از جدول PWM ، lookup مورد نظر مقدار دهی میکنیم ...
                  این کار را بکنید البته با تاخیر بالاتر .... و یک PWM ... البته برای شروع ...

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

                  دیدگاه


                    #84
                    پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                    سلام
                    در عنوان نوشته شده چطور همه پایه ها رو PWM کنیم ولی از مد CTC استفاده کردیم؟
                    در PWM سخت افزاری پایه OC0 در دو وضعیت تغییر حالت میده:
                    1-در حالت تطابق
                    2-در زمان سرریز
                    ولی در مد CTC فقط در زمان تطابق تغییر وضعیت میده.
                    ابهامی که برام پیش اومده اینه که چون در PWM تغییر وضعیت در زمان سرریز که ثابته اتفاق میوفته (یعنی محل یک لبه پالسمون ثابته ) و و ما با تغییر OCR0 لبه دیگه پالس رو تغییر میدیم.
                    حالا اگه همین کار رو بخوایم در مد CTC انجام بدیم باید OCR0 رو طوری اپدیت بکنیم که یک لبه پالسمون ثابت بمونه (مثل زمان سرریز در مد PWM) و لبه دیگه پالس رو تغییر بدیم.
                    با توجه به این که گفته شده مد CTC دارای بار مضاعف نیست میشه بصورت سخت افزاری هم از مد CTC برای PWM کردن پایه ها استفاده کرد؟

                    دیدگاه


                      #85
                      پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                      نوشته اصلی توسط ((O-I-O))
                      سلام
                      در عنوان نوشته شده چطور همه پایه ها رو PWM کنیم ولی از مد CTC استفاده کردیم؟
                      در PWM سخت افزاری پایه OC0 در دو وضعیت تغییر حالت میده:
                      1-در حالت تطابق
                      2-در زمان سرریز
                      ولی در مد CTC فقط در زمان تطابق تغییر وضعیت میده.
                      ابهامی که برام پیش اومده اینه که چون در PWM تغییر وضعیت در زمان سرریز که ثابته اتفاق میوفته (یعنی محل یک لبه پالسمون ثابته ) و و ما با تغییر OCR0 لبه دیگه پالس رو تغییر میدیم.
                      حالا اگه همین کار رو بخوایم در مد CTC انجام بدیم باید OCR0 رو طوری اپدیت بکنیم که یک لبه پالسمون ثابت بمونه (مثل زمان سرریز در مد PWM) و لبه دیگه پالس رو تغییر بدیم.
                      با توجه به این که گفته شده مد CTC دارای بار مضاعف نیست میشه بصورت سخت افزاری هم از مد CTC برای PWM کردن پایه ها استفاده کرد؟
                      سلام
                      اول از هر چیز از شما بابت دیر پاسخ دادن عذرخواهی میکنم ...

                      ببین دوست عزیز
                      اگر توی این مد کار کردیم به خاطر راحتی کار خودمون و حذف کردن یک خط برنامه نویسی بوده ...
                      و اگر دقت هم کرده باشید ما با پایه های PWM سخت افزاری کاری نداریم .... و فقط وظیفه تایمر در این برنامه ها برای این بوده که هر مثلا" 150 میکرو ثانیه به یک زیر برنامه پرش کند ...
                      اگر دقت کرده باشید تایمر صفر میکروی ATmega8 مد CTC نداره و مجبور شدیم از سرریز شدن تایمر این کار را بکنیم ... و داخل تابع روتین این دستور
                      کد:
                      TCNT0 = 105;
                      گذاشته شده است ...
                      بنابراین ما کاری با PWM سخت افزاری نداریم ...
                      اگر با برنامه Code wizard کدویژن کار کنید به خوبی متوجه میشوید که مد CTC چند کاربرد دارد ...
                      اول اینکه میشه پالس سخت افزاری رو فعال کرد(زیربرنامه مقایسه فعال و غیر فعال)
                      دوم اینکه میشه پالس سخت افزاری رو غیر فعال کرد (در این قسمت اگر زیربرنامه مقایسه را غیر فعال کنیم تایمر کاربردی ندارد)



                      تنظیماتی که انجام دادم اون قسمتی هست که قرمز کردم ...
                      عکس رو نگاه کنید منظور من را به خوبی متوجه میشوید ...

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

                      دیدگاه


                        #86
                        پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                        سلام مهندس
                        یادمه این برنامه رو واسه یکی از دوستان گذاشته بودید...
                        [code=vb]
                        $regfile = "m64def.dat"
                        $crystal = 8000000

                        Motor1 Alias Porta.0
                        Motor2 Alias Porta.1
                        Motor3 Alias Porta.2
                        Motor4 Alias Porta.3
                        Motor5 Alias Porta.4
                        Motor6 Alias Porta.5
                        Motor7 Alias Porta.6
                        Motor8 Alias Porta.7
                        Motor9 Alias Portb.0

                        Max_var_pwm Alias 99
                        Dim Pwm(10) 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
                        Ddrb = 1
                        Ddra = 255

                        'End Config ============================================
                        Pwm(1) = 92
                        Pwm(2) = 45
                        Pwm(3) = 64
                        Pwm(4) = 0
                        Pwm(5) = 0
                        Pwm(6) = 0
                        Pwm(7) = 0
                        Pwm(8) = 0
                        Pwm(9) = 0

                        Do


                        Loop
                        End 'end program


                        T0:
                        Tcnt0 = 105
                        If A > 0 Then
                        If A = Pwm(1) Then Set Motor1
                        If A = Pwm(2) Then Set Motor2
                        If A = Pwm(3) Then Set Motor3
                        If A = Pwm(4) Then Set Motor4
                        If A = Pwm(5) Then Set Motor5
                        If A = Pwm(6) Then Set Motor6
                        If A = Pwm(7) Then Set Motor7
                        If A = Pwm(8) Then Set Motor8
                        If A = Pwm(9) Then Set Motor9
                        End If
                        Decr A
                        If A = 255 Then
                        A = Max_var_pwm
                        Portb = Pinb And 254
                        Porta = 0
                        End If
                        Return
                        [/code]
                        می خواستم بدونم اعداد برنامه رو از چه روابطی بدست آوردید؟
                        مثل 105 - 99
                        میشه اعداد pwm رو از 0 تا 256 تنظیم کرد ؟
                        ممنون

                        دیدگاه


                          #87
                          پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم ا

                          نوشته اصلی توسط giga0101
                          سلام مهندس
                          یادمه این برنامه رو واسه یکی از دوستان گذاشته بودید...

                          $
                          کد:
                          regfile = "m64def.dat"
                           $crystal = 8000000
                          
                           Motor1 Alias Porta.0
                           Motor2 Alias Porta.1
                           Motor3 Alias Porta.2
                           Motor4 Alias Porta.3
                           Motor5 Alias Porta.4
                           Motor6 Alias Porta.5
                           Motor7 Alias Porta.6
                           Motor8 Alias Porta.7
                           Motor9 Alias Portb.0
                          
                           Max_var_pwm Alias 99
                           Dim Pwm(10) 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
                             Ddrb = 1
                             Ddra = 255
                          
                            'End Config ============================================
                            Pwm(1) = 92
                            Pwm(2) = 45
                            Pwm(3) = 64
                            Pwm(4) = 0
                            Pwm(5) = 0
                            Pwm(6) = 0
                            Pwm(7) = 0
                            Pwm(8) = 0
                            Pwm(9) = 0
                          
                            Do
                          
                          
                            Loop
                          End                             'end program
                          
                          
                          T0:
                            Tcnt0 = 105
                            If A > 0 Then
                             If A = Pwm(1) Then Set Motor1
                             If A = Pwm(2) Then Set Motor2
                             If A = Pwm(3) Then Set Motor3
                             If A = Pwm(4) Then Set Motor4
                             If A = Pwm(5) Then Set Motor5
                             If A = Pwm(6) Then Set Motor6
                             If A = Pwm(7) Then Set Motor7
                             If A = Pwm(8) Then Set Motor8
                             If A = Pwm(9) Then Set Motor9
                            End If
                            Decr A
                            If A = 255 Then
                             A = Max_var_pwm
                             Portb = Pinb And 254
                             Porta = 0
                            End If
                          Return
                          می خواستم بدونم اعداد برنامه رو از چه روابطی بدست آوردید؟
                          مثل 105 - 99
                          میشه اعداد pwm رو از 0 تا 256 تنظیم کرد ؟
                          ممنون
                          سلام

                          ببین دوست عزیز اگر پست قبلیتون و بیشتر پستهای این تاپیک رو بخونید متوجه میشوید ...
                          ولی خــــــوبـــــب ... شما هم مثل بقیه ... (حوصله خوندن مطالب رو ندارید) :mrgreen:

                          این برنامه ای که نوشته بودم برای میکروی مگا8 بود نه مگا64 ... به هر صورت ...
                          ======================
                          این برنامه نیاز داره به یه تایمری که هر 150 میکرو ثانیه یک بار پرش کنه به روتین تایمر ...
                          از اونجایی که مد CTC برای تایمر صفر مگا8 وجود نداره و فقط سرریز میشه پس باید بالاترین مقدار تایمر که 255 هست رو منهای اون زمانتون کنید (که در اینجا 150 میکرو ثانیه مد نظر هست )
                          که اگر منها کنید میشه 105 ... پس زمانی که تایمر سرریز میشه باید مقدار اولیه تایمر را 105 قرار دهید تا موقع سرریز شدن 150 میکرو ثانیه طول بکشد ...

                          مقدار 99 رو با توجه به نیازم به دست آوردم ...
                          مثلا من برنامه ای نوشتم که از 0 تا 99 میزان پهنای پالس باشه و مقدار فرکانس هم حدودا 66 هرتز باشه ...
                          پس باید توی هر سیکل 100 بار مقدار تمامی PWMها را بررسی کند و ببیند اگر موقع تغییرش سر رسیده تغییرش بده ...
                          بنابراین توی هر ثانیه 6600 بار تمامی شرطها بررسی میشود تا میزان دیوتی سایکل پالسهای خروجی را تعیین کند ...
                          طبق گفته های بالا باید یک را تقسیم بر 6600 کنیم که میشه حدودا" 150 میکرو ثانیه ...
                          برای هر فرکانس و دقت مدنظرتون میتونید از همین روشی که من گفتم استفاده کنید ...
                          البته این هم بگه که با این فرکانس ممکنه که میکرو کم بیاره و باید توجه کنید که فرکانس و دقتی که استفاده میکنید از یک حدی فراتر نرود ...

                          یک نکته مهم
                          طبق این مدرک
                          http://www.eca.ir/forum2/index.php?topic=90246.msg560399#msg560399
                          به شما ثابت می شود که بسکام برای این کار مناسب نیست چون حدود دو برابر حافظه فلش اشغال میکنه و بنابراین دو برابر پردازش میکنه ...
                          میخوام این رو بگم که بسکام حدود 40% تا 50% تلفات پردازشی داره ...


                          [b]اضافه شده در تاریخ 1393/08/29 - ساعت 12:36[b]
                          توی این پستم سه نرم افزار کدویژن و بسکام و اتمل استودیو با هم مقایسه کردم
                          نتیجه اش هم اینه که کدویژن خیلی بهینه تر تولید کد میکنه ...

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

                          دیدگاه


                            #88
                            پاسخ : چگونه همه پایه های ATmega16-32-64-128 را PWM کنیم؟؟ ATmega8 هم اضاف شد

                            سلام مهندس خیلی ممنون از پاسختون...
                            من میخوام تمام خروجی های mega64 رو بدم به rgb led و یک طیف نوری ایجاد کنم... می خوام نور هر رنگ اصلی رو به 256 قسمت مساوی تقسیم کنم و این باید دقیق باشه...
                            والا من بخش زیادی از توضیحاتتون رو متوجه نشدم! و کلا آماتورم
                            فکر میکنم برای led بسکام کافی باشه و mega64 هم حافظه بالایی داره.
                            به نظرتون چه تغییری در برنامه ایجاد کنم؟
                            ممنون

                            دیدگاه


                              #89
                              برنامه پیشنهادی برای LED) LED RGB تمام رنگی)

                              نوشته اصلی توسط giga0101
                              من میخوام تمام خروجی های mega64 رو بدم به rgb led و یک طیف نوری ایجاد کنم... می خوام نور هر رنگ اصلی رو به 256 قسمت مساوی تقسیم کنم و این باید دقیق باشه...
                              والا من بخش زیادی از توضیحاتتون رو متوجه نشدم! و کلا آماتورم
                              نوشته اصلی توسط giga0101
                              به نظرتون چه تغییری در برنامه ایجاد کنم؟
                              سلام

                              سوال خیلی خوبی پرسیدید ... و میتونه یک پروژه خوبی باشه ...
                              البته من میخواستم که برنامه رو بگذارم که دیگه وقت نکردم برم دنبالش ...

                              خوب یریم سر اصل مطلب
                              ببین دوست عزیز
                              شما میخواین که 256 تا رنگ با 3 LED سبز و آبی و قرمز درست کنید ...
                              اگر هر LED براش چندتا طیف رنگ تعریف کنید کافیه و میتونید تولید چند صد رنگ مختلف را ایجاد کنید ...
                              به عنوان مثال
                              اگر هر LED هشت طیف رنگی براش تعریف کنید میشه 512=8X8X8
                              اگر هر LED هفت طیف رنگی براش تعریف کنید میشه 343=7X7X7
                              اگر هر LED شش طیف رنگی براش تعریف کنید میشه 216=6X6X6
                              خوب
                              الان ما میخوایم که با اولین حالت کار کنیم (512 رنگی)
                              طبق گفته های پست قبلی من باید 8 طیف رو (که میشه 0 تا 7 ) ضرب در فرکانس PWM (اینجا میگیریم 100 هرتز )کنیم میشه 800 ...
                              زمانی که نیاز داریم تا برنامه پرش کنه به روتین تایمر 1/800 ثانیه است که برابر است با 1.25 میلی ثانیه ...
                              پس باید برنامه رو طوری بنویسیم که هر 1.25 میلی ثانیه به روتین تایمر رود ...
                              با فرض اینکه فرکانس کاری ما 8مگا هرتز باشه و تقسیم کننده فرکانس تایمر صفر روی 64 تنظیم کنیم ، زمان هر بار که به مقدار تایمر کانتر صفر اضاف میشه 8 میکرو ثانیه ... که اگر بخوایم مقدار تایمر رو بدست بیاریم میشه 156=1.25mS/8us و چون شمارش دیجیتال از صفر تا n هست باید از صفر تا 155 در نظر بگیریم ...
                              خوب
                              چند تا زیر برنامه هم میخواد که تبدیل بشوند به RGB که لقمه آماده رو براتون گرفتم و فقط کافیه نوش جان کنید !
                              به زبان بیسیک هم وقت نداشتم بشینم بیش از حد فکر کنم ... به زبان سی (کدویژن) نوشتم ... ببخشید دیگه ...
                              این هم کدش

                              [code=c]
                              /************************************************** ***
                              This program was produced by the
                              CodeWizardAVR V2.05.3 Standard
                              Automatic Program Generator
                              © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
                              http://www.hpinfotech.com

                              Project : RGB(By PWM)
                              Version :
                              Date : 19/07/2014
                              Author : Saman.Asadi
                              Company :
                              Comments:


                              Chip type : ATmega64
                              Program type : Application
                              AVR Core Clock frequency: 8.000000 MHz
                              Memory model : Small
                              External RAM size : 0
                              Data Stack size : 1024
                              ************************************************** ***/
                              #include <mega64a.h>
                              #include <delay.h>
                              #include <iobits.h>

                              #define setled1 SETBIT(PORTF,0)
                              #define setled2 SETBIT(PORTF,1)
                              #define setled3 SETBIT(PORTF,2)
                              #define setled4 SETBIT(PORTF,3)
                              #define setled5 SETBIT(PORTF,4)
                              #define setled6 SETBIT(PORTF,5)
                              #define setled7 SETBIT(PORTF,6)
                              #define setled8 SETBIT(PORTF,7)
                              #define setled9 SETBIT(PORTA,0)
                              #define setled10 SETBIT(PORTA,1)
                              #define setled11 SETBIT(PORTA,2)
                              #define setled12 SETBIT(PORTA,3)
                              #define setled13 SETBIT(PORTA,4)
                              #define setled14 SETBIT(PORTA,5)
                              #define setled15 SETBIT(PORTA,6)
                              #define setled16 SETBIT(PORTA,7)
                              #define setled17 SETBIT(PORTG,2)
                              #define setled18 SETBIT(PORTC,7)
                              #define setled19 SETBIT(PORTC,6)
                              #define setled20 SETBIT(PORTC,5)
                              #define setled21 SETBIT(PORTC,4)
                              #define setled22 SETBIT(PORTC,3)
                              #define setled23 SETBIT(PORTC,2)
                              #define setled24 SETBIT(PORTC,1)
                              #define setled25 SETBIT(PORTC,0)
                              #define setled26 SETBIT(PORTG,1)
                              #define setled27 SETBIT(PORTG,0)
                              #define setled28 SETBIT(PORTD,7)
                              #define setled29 SETBIT(PORTD,6)
                              #define setled30 SETBIT(PORTD,5)
                              #define setled31 SETBIT(PORTD,4)
                              #define setled32 SETBIT(PORTD,3)
                              #define setled33 SETBIT(PORTD,2)
                              #define setled34 SETBIT(PORTD,1)
                              #define setled35 SETBIT(PORTD,0)
                              #define setled36 SETBIT(PORTG,4)
                              #define setled37 SETBIT(PORTG,3)
                              #define setled38 SETBIT(PORTB,7)
                              #define setled39 SETBIT(PORTB,6)
                              #define setled40 SETBIT(PORTB,5)
                              #define setled41 SETBIT(PORTB,4)
                              #define setled42 SETBIT(PORTB,3)
                              #define setled43 SETBIT(PORTB,2)
                              #define setled44 SETBIT(PORTB,1)
                              #define setled45 SETBIT(PORTB,0)
                              #define setled46 SETBIT(PORTE,7)
                              #define setled47 SETBIT(PORTE,6)
                              #define setled48 SETBIT(PORTE,5)
                              #define setled49 SETBIT(PORTE,4)
                              #define setled50 SETBIT(PORTE,3)
                              #define setled51 SETBIT(PORTE,2)
                              #define setled52 SETBIT(PORTE,1)
                              #define setled53 SETBIT(PORTE,0)
                              #define byte unsigned char
                              #define max_var_PWM 7
                              //////////////////////////////////////////////////
                              byte a = max_var_PWM;
                              byte pwm[60];
                              //////////////////////////////////////////////////

                              void RGB1(unsigned int color_code_0_To_511)
                              {
                              pwm[1] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[2] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[3] = color_code_0_To_511 & 0x07;
                              }
                              void RGB2(unsigned int color_code_0_To_511)
                              {
                              pwm[4] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[5] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[6] = color_code_0_To_511 & 0x07;
                              }
                              void RGB3(unsigned int color_code_0_To_511)
                              {
                              pwm[7] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[8] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[9] = color_code_0_To_511 & 0x07;
                              }
                              void RGB4(unsigned int color_code_0_To_511)
                              {
                              pwm[10] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[11] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[12] = color_code_0_To_511 & 0x07;
                              }
                              void RGB5(unsigned int color_code_0_To_511)
                              {
                              pwm[13] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[14] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[15] = color_code_0_To_511 & 0x07;
                              }
                              void RGB6(unsigned int color_code_0_To_511)
                              {
                              pwm[16] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[17] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[18] = color_code_0_To_511 & 0x07;
                              }
                              void RGB7(unsigned int color_code_0_To_511)
                              {
                              pwm[19] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[20] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[21] = color_code_0_To_511 & 0x07;
                              }
                              void RGB8(unsigned int color_code_0_To_511)
                              {
                              pwm[22] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[23] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[24] = color_code_0_To_511 & 0x07;
                              }
                              void RGB9(unsigned int color_code_0_To_511)
                              {
                              pwm[25] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[26] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[27] = color_code_0_To_511 & 0x07;
                              }
                              void RGB10(unsigned int color_code_0_To_511)
                              {
                              pwm[28] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[29] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[30] = color_code_0_To_511 & 0x07;
                              }
                              void RGB11(unsigned int color_code_0_To_511)
                              {
                              pwm[31] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[32] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[33] = color_code_0_To_511 & 0x07;
                              }
                              void RGB12(unsigned int color_code_0_To_511)
                              {
                              pwm[34] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[35] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[36] = color_code_0_To_511 & 0x07;
                              }
                              void RGB13(unsigned int color_code_0_To_511)
                              {
                              pwm[37] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[07] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[39] = color_code_0_To_511 & 0x07;
                              }
                              void RGB14(unsigned int color_code_0_To_511)
                              {
                              pwm[40] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[41] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[42] = color_code_0_To_511 & 0x07;
                              }
                              void RGB15(unsigned int color_code_0_To_511)
                              {
                              pwm[43] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[44] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[45] = color_code_0_To_511 & 0x07;
                              }
                              void RGB16(unsigned int color_code_0_To_511)
                              {
                              pwm[46] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[47] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[48] = color_code_0_To_511 & 0x07;
                              }
                              void RGB17(unsigned int color_code_0_To_511)
                              {
                              pwm[49] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[50] = color_code_0_To_511 & 0x07;
                              color_code_0_To_511 = color_code_0_To_511 >> 3;
                              pwm[51] = color_code_0_To_511 & 0x07;
                              }

                              // Timer 0 output compare interrupt service routine
                              interrupt [TIM0_COMP] void timer0_comp_isr(void)
                              {
                              if(a)
                              {
                              if(a == pwm[1] )setled1;
                              if(a == pwm[2] )setled2;
                              if(a == pwm[3] )setled3;
                              if(a == pwm[4] )setled4;
                              if(a == pwm[5] )setled5;
                              if(a == pwm[6] )setled6;
                              if(a == pwm[7] )setled7;
                              if(a == pwm[8] )setled8;
                              if(a == pwm[9] )setled9;
                              if(a == pwm[10])setled10;
                              if(a == pwm[11])setled11;
                              if(a == pwm[12])setled12;
                              if(a == pwm[13])setled13;
                              if(a == pwm[14])setled14;
                              if(a == pwm[15])setled15;
                              if(a == pwm[16])setled16;
                              if(a == pwm[17])setled17;
                              if(a == pwm[18])setled18;
                              if(a == pwm[19])setled19;
                              if(a == pwm[20])setled20;
                              if(a == pwm[21])setled21;
                              if(a == pwm[22])setled22;
                              if(a == pwm[23])setled23;
                              if(a == pwm[24])setled24;
                              if(a == pwm[25])setled25;
                              if(a == pwm[26])setled26;
                              if(a == pwm[27])setled27;
                              if(a == pwm[28])setled28;
                              if(a == pwm[29])setled29;
                              if(a == pwm[30])setled30;
                              if(a == pwm[31])setled31;
                              if(a == pwm[32])setled32;
                              if(a == pwm[33])setled33;
                              if(a == pwm[34])setled34;
                              if(a == pwm[35])setled35;
                              if(a == pwm[36])setled36;
                              if(a == pwm[37])setled37;
                              if(a == pwm[38])setled38;
                              if(a == pwm[39])setled39;
                              if(a == pwm[40])setled40;
                              if(a == pwm[41])setled41;
                              if(a == pwm[42])setled42;
                              if(a == pwm[43])setled43;
                              if(a == pwm[44])setled44;
                              if(a == pwm[45])setled45;
                              if(a == pwm[46])setled46;
                              if(a == pwm[47])setled47;
                              if(a == pwm[48])setled48;
                              if(a == pwm[49])setled49;
                              if(a == pwm[50])setled50;
                              if(a == pwm[51])setled51;
                              if(a == pwm[52])setled52;
                              if(a == pwm[53])setled53;
                              }
                              a-- ;
                              if(a == 255)
                              {
                              a = max_var_PWM;
                              PORTA=0;
                              PORTB=0;
                              PORTC=0;
                              PORTD=0;
                              PORTE=0;
                              PORTF=0;
                              PORTG=0;
                              }
                              }

                              void main(void)
                              {
                              //Config all
                              //Config timers
                              //Config PORTS
                              {
                              DDRA=255;
                              DDRB=255;
                              DDRC=255;
                              DDRD=255;
                              DDRE=255;
                              DDRF=255;
                              DDRG=31;
                              // Timer/Counter 0 initialization
                              // Clock source: System Clock
                              // Clock value: 125.000 kHz
                              // Mode: CTC top=OCR0
                              // OC0 output: Disconnected
                              ASSR=0x00;
                              TCCR0=0x0C;
                              TCNT0=0x00;
                              OCR0=0x9B;
                              // Timer(s)/Counter(s) Interrupt(s) initialization
                              TIMSK=0x02;
                              // Global enable interrupts
                              #asm("sei&quot
                              }
                              //End Config ......
                              RGB1(0);
                              RGB2(30);
                              RGB3(60);
                              RGB4(90);
                              RGB5(120);
                              RGB6(150);
                              RGB7(180);
                              RGB8(210);
                              RGB9(240);
                              RGB10(270);
                              RGB11(300);
                              RGB12(330);
                              RGB13(360);
                              RGB14(390);
                              RGB15(420);
                              RGB16(450);
                              RGB17(480);

                              while(1)
                              {

                              }
                              }
                              [/code]

                              نوشته اصلی توسط giga0101
                              فکر میکنم برای led بسکام کافی باشه و mega64 هم حافظه بالایی داره.
                              حافظه زیاد اشغال کردن خیلی مهم نیست ...
                              مهم اینه که تلفات پردازشی زیاده و ممکنه که پردازش کم بیاره ....
                              نظر من رو میخواین من میگم برید سراغ زبان سی ...
                              از همین الان ...

                              سوالی بود درخدمتم ...
                              موفق باشید
                              [hr]
                              ============================[tt]اضاف شده[/tt]
                              ببخشید دوستان
                              به دلیل اشکالات در برنامه نویسی برنامه اصلاح شد
                              [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                              معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                              معرفی نرم افزار Codewizard PWM
                              با من بیشتر آشنا شوید

                              دیدگاه


                                #90
                                پاسخ : چگونه همه پایه های128و64و32و16وATmega8 را PWM کنیم؟؟ پروژه LED RGB اضاف شد!

                                اقای اسدی میشه کد رو توضیح بدید لطفا؟!و در باره این کتابخونه
                                #include <iobits.h>
                                و یا تابع setbit در این کتاب خونه هست؟ دقیقا کارش چیه؟
                                در تابع اینتراپت هر بار مقدار a یک واحد کم میشه و مقدار اولیه 7 هست وقتی کم میشه به 0 میرسه و شرط if(a == 255) برقرار نمیشه !و اگه اضافه بشه به a از 0 تا 7 هیچوقت به a مقدار دهی نمیشه !
                                البته من کلا در برنامه نویسی و avr تازه وارد هستم اگه اشتباه از من هست به حساب نادانی من بگزارید و ممنون میشم اگه بیشتر راهنمایی کنین

                                دیدگاه

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