اطلاعیه

Collapse
No announcement yet.

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

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

  • SAMAN.ASADI
    replied
    پاسخ : پاسخ : چگونه همه پایه های میکروکنترلر AVR &#

    نوشته اصلی توسط stk
    سلام من هر دو برنامه سی و بیسکام را در عمل تست کردم بعد مدت کوتاهی قطعی دارن . جالبه
    سلام
    شما واچ تاگ رو فعال نکردید؟
    این باید غیر فعال باشه هاااا ....
    یه چیزه دیگه ....
    اگر از منبع سوئیچینگ استفاده میکنید و جریان زیاد میکشید ممکنه خود منبع سوئیچینگ قطع و وصل کنه (عمل ریست)
    یا اینکه ممکنه منبع تغذیه شما نویز داشته باشه .... و یا اینکه نویز داره روی اون تاثیر میگذاره ....
    خازن 100 نانو موازی با تغذیه میکرو که هرچی نزدیکتر میکرو باشه بهتره ... و یک مقاومت یک کیلو هم به پایه ریست میکرو وصل کن و یه پایه دیگه رو به VCC وصل کن ...
    این کارها رو کنید ...
    ببینید بهتر نمیشه ...

    یک دیدگاه بنویسید:


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

    سلام من هر دو برنامه سی و بیسکام را در عمل تست کردم بعد مدت کوتاهی قطعی دارن . جالبه

    یک دیدگاه بنویسید:


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

    سلام آقای مهندس اسدی

    من فکر میکرم از تنظیمات من باشه یا میکرو . که گقتم شما هم یک چک کنید بر حال از شما متشکرم

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط stk
    سلام اقای اسدی خسته نباشید
    من فیوزبیت رو روی 8 مگاهرتز داخلی تنظیم کردم.
    درود بر شما ...
    بله درسته
    بررسی کردم ...
    ولی این دیگه مقصر من نیستم ...
    مقصر کامپایلر بد بسکام هست ...
    دقیقا همین کد را روی کدویژن امتحان کردم و عالی عالی جواب میده ....
    بدون یک ذره مکث و قطعی ...
    [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 : 1 PWM
    Resolution : 100 States (0 To 99)
    Date : 18/Jan/2016
    Time : 2142
    Author : Saman.Asadi www.ECA.ir
    Author's Email : Saman.asadi.ir@gmail.com
    http://www.eca.ir/forum2/index.php?topic=90246.0
    Chip type : ATmega8
    Program type : Application
    AVR Core Clock frequency : 8 MHz
    Memory model : Small
    Data Stack size : 256
    ************************************************** ***/
    #include <mega8.h> //for ATmega8 or ATmega8L or ATmega8A
    #include <delay.h>

    #define Max_Variable_PWM 99
    #define Set_PWM Max_Variable_PWM
    #define Reset_PWM 0

    unsigned char Counter_PWM , pwm[3];

    interrupt [TIM2_COMP] void timer2_comp_isr(void);

    //pwm[1] ===> PORTD.0

    void main(void)
    {
    signed char x;
    //Config all
    //Config timers
    //Config PORTS
    {
    DDRD |= 0x01;
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 KHz
    // Mode: CTC top=OCR2
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2 = 0x0A;
    OCR2 = 0x99;
    TCNT2= 0x00;
    //Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK |= 0x80;
    // Global enable interrupts
    #asm("sei&quot
    }//End Config ...


    while(1)
    {
    for(x=0;x<100;x++)
    {
    pwm[1]=x;
    delay_ms(50);
    }
    for(x=99;x>0;x--)
    {
    pwm[1]=x;
    delay_ms(50);
    }
    }
    }


    // Timer 2 output compare interrupt service routine
    interrupt [TIM2_COMP] void timer2_comp_isr(void)
    {
    if(Counter_PWM)
    {
    if(Counter_PWM == pwm[1]) PORTD |= 0x01;
    }
    if(--Counter_PWM == 255)
    {
    Counter_PWM = Max_Variable_PWM;
    PORTD &= 0xFE;
    }
    }
    [/code]
    این کد در کدویژن هست ...
    این هم کد در بسکام
    [code=qbasic]
    '******************************************** *********
    'Project : 1 PWM
    'Resolution : 100 States (0 To 99)
    'Date : 18/Jan/2016
    'Time : 2125
    'Author : Saman.Asadi www.ECA.ir
    'Author's Email : Saman.asadi.ir@gmail.com
    'http://www.eca.ir/forum2/index.php?topic=90246.0
    'Chip type : ATmega8
    'Program type : Application
    'AVR Core Clock frequency : 8 MHz
    '******************************************** *********
    $regfile = "m8def.dat" 'for ATmega8 or ATmega8A
    $crystal = 8000000
    Max_Variable_PWM Alias 99
    Set_PWM Alias Max_Variable_PWM
    Reset_PWM Alias 0

    Dim Counter_pwm As Byte , Pwm(3) As Byte

    'Config All =============================================
    Config Timer2 = TIMER , Prescale = 8
    Enable Compare2
    ON Compare2 T2
    ' Timer/Counter 2 initialization
    ' Clock source: System Clock
    ' Clock value: 1000.000 KHz
    ' Mode: CTC top=OCR2
    ' OC2 output: Disconnected
    Assr = &H00
    TCCR2 = &H0A
    OCR2 = &H99
    Tcnt2 = &H00
    'Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK = &H80
    'Global enable interrupts
    Enable Interrupts
    'Config Outputs
    DDRD = &H01 OR DDRD
    'End Config ============================================

    Dim X1 As Byte

    Do
    '******************************

    For X1 = 0 To 99 Step 1
    Pwm(1) = X1
    Waitms 50
    Next X1
    For X1 = 99 To 0 Step -1
    Pwm(1) = X1
    Waitms 50
    Next X1
    Loop
    End


    T2:
    If Counter_pwm > 0 Then
    If Counter_pwm = Pwm(1) Then PORTD = &H01 OR PORTD
    End If
    Decr Counter_pwm
    If Counter_pwm = 255 Then
    Counter_pwm = Max_variable_pwm
    PORTD = &HFE AND PORTD
    End If
    Return
    [/code]

    توی دوره کاردانی که بودم اینقدر اشکال از بسکام گرفتم که حد و حساب نداشت ...
    خیلی خیلی عذر میخوام ولی نظر شخصی منه ...
    بسکام اصلا جالب نیست ...
    از نظر خودم کدویژن بهترین نرم افزار برای این کاره ...
    دومین نرم افزاری که من پیشنهاد میکنم اتمل استودیو است ... (به همین دلیل ترتیب نرم افزارها را به این شکل در نرم افزارم قرار دادم)

    موفق باشید ...

    یک دیدگاه بنویسید:


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

    سلام اقای اسدی خسته نباشید
    من فیوزبیت رو روی 8 مگاهرتز داخلی تنظیم کردم.

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط stk
    سلام اقای اسدی عزیز ممنون از زحمات بیدریغ شما
    یک سوال برنامه کم نور شدن و پرنور شدن با مگا 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


    Max_var_pwm Alias 99
    Max_led Alias 16

    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 , D As Byte , X 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
    Ddrd = 255
    'End Config ============================================
    Do
    '******************************

    For X1 = 0 To 99 Step 3
    Pwm(1) = X1
    Waitms Delay1
    Next X1
    For X1 = 99 To 0 Step -3
    Pwm(1) = X1
    Waitms Delay1
    Next X1
    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


    End If
    Decr A
    If A = 255 Then
    A = Max_var_pwm
    Portb = 0
    Portd = 0
    End If
    Return
    [/code]
    درود بر شما ...
    ممنونم از لطفتون ...
    فرکانسش 8 مگا هست ....
    آیا شما فیوزبیتها رو تغییر دادید؟

    یک دیدگاه بنویسید:


  • stk
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را 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


    Max_var_pwm Alias 99
    Max_led Alias 16

    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 , D As Byte , X 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
    Ddrd = 255
    'End Config ============================================
    Do
    '******************************

    For X1 = 0 To 99 Step 3
    Pwm(1) = X1
    Waitms Delay1
    Next X1
    For X1 = 99 To 0 Step -3
    Pwm(1) = X1
    Waitms Delay1
    Next X1
    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


    End If
    Decr A
    If A = 255 Then
    A = Max_var_pwm
    Portb = 0
    Portd = 0
    End If
    Return
    [/code]

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط شاهین شرق
    م در عمل مشکلی با این برنامه دارم.این برنامه در خروجی های میکرو ولتاژی بین ۰ تا ۴ ولت ایجاد می کنه ولی من نیاز به صفر تا ۵ ولت دارم.مگه pwm دامنه اش صفر تا ۵ ولت نیست؟
    بله درسته ...
    باید صفر تا VCC باشه ...
    VCC اگر 4 ولت باشه خروجی میکرو 4 ولت میشه ...
    یا اینکه شما دارید از میکرو جریان میکشید و در همان لحظه ولتاژ خروجی میکرو را میخوانید ... اگر این کار رو میکنید این غلطه ... چون جریان کشیدن باعث افت ولتاژ میشود ...
    در ضمن
    دوتا پایه AVCC و VCC را به هم وصل کنید و بعدش به 5V+ وصل کنید ...
    این چند مورد را بررسی کنید ...
    موفق باشید ...

    یک دیدگاه بنویسید:


  • shahin-shargh
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

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

    Portd = Portd and 252
    که مقدار و دستکاری کردم که توی شبیه ساز ظاهرا درست شد این دستور چیه ؟
    م در عمل مشکلی با این برنامه دارم.این برنامه در خروجی های میکرو ولتاژی بین ۰ تا ۴ ولت ایجاد می کنه ولی من نیاز به صفر تا ۵ ولت دارم.مگه pwm دامنه اش صفر تا ۵ ولت نیست؟

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : پاسخ : چگونه همه پایه های میکروکنترلر 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 ما هست ...

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

    یک دیدگاه بنویسید:


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

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



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


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

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر 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 نداره را بدون تغییر مقدار گذاری میکنه ...

    یک دیدگاه بنویسید:


  • nicebluesky
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر 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;
    }

    سپاس

    یک دیدگاه بنویسید:


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

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

    یک دیدگاه بنویسید:


  • shahin-shargh
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر 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
    که مقدار و دستکاری کردم که توی شبیه ساز ظاهرا درست شد این دستور چیه ؟

    یک دیدگاه بنویسید:

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