اطلاعیه

Collapse
No announcement yet.

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

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

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

    نوشته اصلی توسط mojtabair نمایش پست ها
    هرکاری می کنم به این عبارت هایی که توش amp داره خطا میده اصلا اونا رو نمیشناسه
    خودمم نمیدونم این amp چیه تا حداقل معادلشو جاش بزارم
    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;
    }
    اگه کسی میدونه این amp ها چین یا اگه یه کتابخونه ای داره که باید اضافه بشه بگید الان چند روزه درگیرشم حل نمیشه

    لینک کل برنامه
    https://www.eca.ir/forums/thread48596-12.html
    درود بر شما
    ببخشید دیر شد
    برنامه با کلی اصلاح تقدیم شما

    /*****************************************************
    Project : 22 PWM or ( 7 RGB and 1 PWM)
    Resolution : 8 States (0 To 7)
    Date : 23/Mar/2021
    Time : 01:14:39
    Author : Saman.Asadi www.ECA.ir
    Author's Email : Saman.asadi.ir@gmail.com
    Chip type : ATmega8
    AVR Core Clock frequency : 8 MHz
    *****************************************************/
    #include <mega8.h> //for ATmega8 or ATmega8L or ATmega8A
    #include <delay.h>


    #define Max_Variable_PWM 7
    #define Set_PWM Max_Variable_PWM
    #define Reset_PWM 0


    unsigned char Counter__pwm , _pwm[24] ,pwm[24];


    interrupt [TIM2_COMP] void timer2_comp_isr(void);
    void RGB1(unsigned int input_0_to_511);
    void RGB2(unsigned int input_0_to_511);
    void RGB3(unsigned int input_0_to_511);
    void RGB4(unsigned int input_0_to_511);
    void RGB5(unsigned int input_0_to_511);
    void RGB6(unsigned int input_0_to_511);
    void RGB7(unsigned int input_0_to_511);


    //pwm[1] ===> PORTD.0 ¯¯¯¯¯\
    //pwm[2] ===> PORTD.1 ———RGB1()
    //pwm[3] ===> PORTD.2 _____/
    //pwm[4] ===> PORTD.3 ¯¯¯¯¯\
    //pwm[5] ===> PORTD.4 ———RGB2()
    //pwm[6] ===> PORTB.6 _____/
    //pwm[7] ===> PORTB.7 ¯¯¯¯¯\
    //pwm[8] ===> PORTD.5 ———RGB3()
    //pwm[9] ===> PORTD.6 _____/
    //pwm[10] ===> PORTD.7 ¯¯¯¯¯\
    //pwm[11] ===> PORTB.0 ———RGB4()
    //pwm[12] ===> PORTB.1 _____/
    //pwm[13] ===> PORTB.2 ¯¯¯¯¯\
    //pwm[14] ===> PORTB.3 ———RGB5()
    //pwm[15] ===> PORTB.4 _____/
    //pwm[16] ===> PORTB.5 ¯¯¯¯¯\
    //pwm[17] ===> PORTC.0 ———RGB6()
    //pwm[18] ===> PORTC.1 _____/
    //pwm[19] ===> PORTC.2 ¯¯¯¯¯\
    //pwm[20] ===> PORTC.3 ———RGB7()
    //pwm[21] ===> PORTC.4 _____/
    //pwm[22] ===> PORTC.5


    void main(void)
    {
    //Config all
    //Config timers
    //Config PORTS
    {
    DDRB |= 0xFF;
    DDRC |= 0x3F;
    DDRD |= 0xFF;
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 125.000 KHz
    // Mode: CTC top=OCR2
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2 = 0x0C;
    OCR2 = 0x9C;
    TCNT2= 0x00;
    //Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK |= 0x80;
    // Global enable interrupts
    #asm("sei")
    }//End Config ...


    RGB1(222);
    RGB2(222);
    RGB3(222);
    RGB4(222);
    RGB5(222);
    RGB6(222);
    RGB7(222);
    while(1)
    {
    // Place your code here
    }




    }




    // 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 == _pwm[2]) PORTD |= 0x02;
    if(Counter__pwm == _pwm[3]) PORTD |= 0x04;
    if(Counter__pwm == _pwm[4]) PORTD |= 0x08;
    if(Counter__pwm == _pwm[5]) PORTD |= 0x10;
    if(Counter__pwm == _pwm[6]) PORTB |= 0x40;
    if(Counter__pwm == _pwm[7]) PORTB |= 0x80;
    if(Counter__pwm == _pwm[8]) PORTD |= 0x20;
    if(Counter__pwm == _pwm[9]) PORTD |= 0x40;
    if(Counter__pwm == _pwm[10]) PORTD |= 0x80;
    if(Counter__pwm == _pwm[11]) PORTB |= 0x01;
    if(Counter__pwm == _pwm[12]) PORTB |= 0x02;
    if(Counter__pwm == _pwm[13]) PORTB |= 0x04;
    if(Counter__pwm == _pwm[14]) PORTB |= 0x08;
    if(Counter__pwm == _pwm[15]) PORTB |= 0x10;
    if(Counter__pwm == _pwm[16]) PORTB |= 0x20;
    if(Counter__pwm == _pwm[17]) PORTC |= 0x01;
    if(Counter__pwm == _pwm[18]) PORTC |= 0x02;
    if(Counter__pwm == _pwm[19]) PORTC |= 0x04;
    if(Counter__pwm == _pwm[20]) PORTC |= 0x08;
    if(Counter__pwm == _pwm[21]) PORTC |= 0x10;
    if(Counter__pwm == _pwm[22]) PORTC |= 0x20;
    }
    if(--Counter__pwm == 255)
    {
    Counter__pwm = Max_Variable_PWM;
    _pwm[1]=pwm[1];
    _pwm[2]=pwm[2];
    _pwm[3]=pwm[3];
    _pwm[4]=pwm[4];
    _pwm[5]=pwm[5];
    _pwm[6]=pwm[6];
    _pwm[7]=pwm[7];
    _pwm[8]=pwm[8];
    _pwm[9]=pwm[9];
    _pwm[10]=pwm[10];
    _pwm[11]=pwm[11];
    _pwm[12]=pwm[12];
    _pwm[13]=pwm[13];
    _pwm[14]=pwm[14];
    _pwm[15]=pwm[15];
    _pwm[16]=pwm[16];
    _pwm[17]=pwm[17];
    _pwm[18]=pwm[18];
    _pwm[19]=pwm[19];
    _pwm[20]=pwm[20];
    _pwm[21]=pwm[21];
    _pwm[22]=pwm[22];
    PORTB &= 0x0;
    PORTC &= 0xC0;
    PORTD &= 0x0;
    }
    }


    void RGB1(unsigned int input_0_to_511)
    {
    if( input_0_to_511>511)return;
    pwm[1] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[2] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[3] = input_0_to_511 & 0x07;
    }
    void RGB2(unsigned int input_0_to_511)
    {
    if(input_0_to_511>511)return;
    pwm[4] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[5] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[6] = input_0_to_511 & 0x07;
    }
    void RGB3(unsigned int input_0_to_511)
    {
    if(input_0_to_511>511)return;
    pwm[7] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[8] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[9] = input_0_to_511 & 0x07;
    }
    void RGB4(unsigned int input_0_to_511)
    {
    if(input_0_to_511>511)return;
    pwm[10] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[11] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[12] = input_0_to_511 & 0x07;
    }
    void RGB5(unsigned int input_0_to_511)
    {
    if(input_0_to_511>511)return;
    pwm[13] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[14] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[15] = input_0_to_511 & 0x07;
    }
    void RGB6(unsigned int input_0_to_511)
    {
    if(input_0_to_511>511)return;
    pwm[16] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[17] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[18] = input_0_to_511 & 0x07;
    }
    void RGB7(unsigned int input_0_to_511)
    {
    if(input_0_to_511>511)return;
    pwm[19] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[20] = input_0_to_511 & 0x07;
    input_0_to_511 /= 8;
    pwm[21] = input_0_to_511 & 0x07;
    }


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


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

    نوشته اصلی توسط محمد رضا نسرین پور نمایش پست ها
    سلام مهندس "سامان اسدی" خدا قوت
    بسیار اموزنده بود ..از اینکه وقت میذارید و با حوصله به تمام پرسش ها پاسخ میدین ممنونم
    من تمام 31 صفحه این مطلب رو خوندم بسیار مطالب جالبی اموختم
    خدا قوت
    درود بر شما
    خواهش میکنم برادر
    واقعاااااا از ته دلم اینو میگم که .... خدا قوت واقعا .... که حوصله به خرج دادین این 31 صفحه رو خوندید

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    نوشته اصلی توسط Fatemehra10 نمایش پست ها
    سلام دوستان یه سوال داشتم .
    من چجوری می تونم با استفاده از timer0 و timer2 یک موج pwm 10bit تولید کنم ؟
    درود بر شما
    نمیشه با تایمر هشت بیتی یک موج با دقت ده بیتی درست کنید
    شاد و پیروز باشید

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


  • Fatemehra10
    replied
    پاسخ : چگونه تمام پایه های ATmega16-32-64-128 را PWM کنیم ؟؟!!! [آموزشی]

    سلام دوستان یه سوال داشتم .
    من چجوری می تونم با استفاده از timer0 و timer2 یک موج pwm 10bit تولید کنم ؟

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


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

    سلام مهندس "سامان اسدی" خدا قوت
    بسیار اموزنده بود ..از اینکه وقت میذارید و با حوصله به تمام پرسش ها پاسخ میدین ممنونم
    من تمام 31 صفحه این مطلب رو خوندم بسیار مطالب جالبی اموختم
    خدا قوت

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


  • محمد رضا نسرین پور
    replied
    پاسخ : (برنامه اصلاح شد) چگونه تمام پایه های ATmega16-32-64-128 را PWM کنیم ؟؟!!

    بسیار عالی...مهندس سامان....سپاسگزارم از مطالب اموزندتون....عالیه...بدرد کار من زیاد اومد

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


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

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

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


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

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

    لینک کل برنامه
    جدیدترین ویرایش توسط mojtabair; 2019/02/27, 20:54.

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


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

    سلام برادر بزرگوار
    با اجازه اساتید
    ببینید بر اساس خود خطا شما یک عبارت تعریف نشده را استفاده کردید!
    چک کنید که کدام خط و کدام عبارت بدون مرجع مانده است.
    نگران نباشید حل میشه

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


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

    سلام وقت بخیر
    آقا تو این برنامه RGB برای ATMEGA16 من کدها رو تو برنامه کدویژن کامپایل می کنم اما به قسمتهایی که
    PWM[1] = RGB_0_to_511
    &amp;
    7; دارند خطا میگیره اینم کد خطا
    Error: undefined symbol 'amp'

    لطفا کمکم کنید

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


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

    عرض سلام و احترام خدمت آقای اسدی، وقتتون بخیر
    مهندس جان من برنامه را ازشروع تاپیک پیگیر شدم و تا اندازه ای مطالب را مطالعه کردم و در راه اندازی ابتدایی مشکلی نداشتم.
    یک سوال نسبتا مشکل برایم پیش آمد که خواستم در صورت امکان جنابعالی راهنمایی بفرمایید:
    1- سری های ال ای دی RGB که با ولتاژ 220 کنترل می شوند و عمدتا دارای تریستور و یک برد راه انداز با آی سی قیری شکل هستند و در طول های 30 متری در بازار موجود هستند را با استفاده از BT151 با برنامه حاضر راه اندازی کردم، متاسفانه چند مشکل وجود دارد که یکی پرپر کردن هستش (برای دادن فیدهای کامل به کانالها با مشکل روبرو شدم) و دوم اینکه نمی دونم باید برای ایزوله شدن گیت تریستور از میکرو و حفاظت از میکرو از چه قطعه ای استفاده کنم. در حال حاضر به صورت مستقیم راه اندازی شد و متاسفانه با MOC3021 هم جواب نگرفتم.
    2-مهندس جان در بررسی کدها متاسفانه متوجه بخش کنترل سرعت با ADC و اضافه نمودن دیگر افکت ها نشدم، امکان لینک دادن به مطلب برای جنابعالی میسر هست؟ به دلیل ازدیاد مطالب یافتن مطلب مناسب کمی دشوار شده است.

    پ.ن: اگر نیاز به ارائه تصویر از مدار و یا ریسه ال ای دی هست بفرمایید
    ممنونم
    موفق باشید

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


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

    نوشته اصلی توسط sjaber نمایش پست ها
    سلام دوستان
    من این برنامه رو از یه سایت پیدا کردم ولی نمیدونم چرا سرعت چشمک زدن led ها این قدر کمه لطفا اشکالشو بهم بگید
    درود بر شما
    آقا عذرخواهی میکنم بابت اینکه چند ماهی نبودم
    به آرایه ها از 0 تا 100 مقدار دهی شود
    فرکانس بر روی 8 مگا تنظیم کنید
    برنامه شما اینه
    کد:
    '*****************************************************
    'Project                   : 4 PWM
    'Resolution                : 101 States (0 To 100)
    'Date                      : 13/Jun/2017
    'Time                      : 10:31:59
    'Author                    : Saman.Asadi    www.ECA.ir
    'Author's Email            : Saman.asadi.ir@gmail.com
    'http://www.eca.ir/forums/thread48596.html
    '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 100
    Set_pwm Alias Max_variable_pwm
    Reset_pwm Alias 0
    
    Dim Counter_pwm As Byte , Pwm(6) As Byte , _pwm(6) As Byte
    
    'Config All =============================================
       Config Timer2 = TIMER , Prescale = 8 , Async = Off , Clear_timer = 1
       Enable Compare2
       ON Compare2 T2
       OCR2 = &H63
       Start Timer2
    
       'Global enable interrupts
       Enable Interrupts
       'Config Outputs
       DDRD = &H0F OR DDRD
    'End Config ============================================
    
    '(
    pwm(1) ===> PORTD.0
    pwm(2) ===> PORTD.1
    pwm(3) ===> PORTD.2
    pwm(4) ===> PORTD.3
    ')
    
    
    Pwm(1) = 1
    Do
    '===================================================
    
    '===================================================
    Loop
    End
    
    
    T2:
       If Counter_pwm > 0 Then
            If Counter_pwm = _pwm(1) Then PORTD = &H01 OR PORTD
            If Counter_pwm = _pwm(2) Then PORTD = &H02 OR PORTD
            If Counter_pwm = _pwm(3) Then PORTD = &H04 OR PORTD
            If Counter_pwm = _pwm(4) Then PORTD = &H08 OR PORTD
        End If
        Decr Counter_pwm
        If Counter_pwm = 255 Then
            Counter_pwm = Max_variable_pwm
            PORTD = &HF0 AND PORTD
            _pwm(1) = Pwm(1)
            _pwm(2) = Pwm(2)
            _pwm(3) = Pwm(3)
            _pwm(4) = Pwm(4)
        End If
    Return
    موفق باشید

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    نوشته اصلی توسط hamed.zahedi نمایش پست ها
    سلام
    لطفا بگید برای اینکه بخوایم کل پورت رو رو یه سطح ولتاژ نگه داریم چیکار باید کرد؟
    برای فلاشر میخوام
    تا بتونم نور و کم و زیاد کنم
    درود بر شما
    دوست عزیز با کمک گرفتن از PWM که ساختارش به این صورت هست که فرکانس ثابت هست ولی عرض پالس قابل تغییر است
    با این کار در حقیقت میزان سطح ولتاژ متوسط را تغییر میدهید و میزان سطح ولتاژ کم و زیاد خواهد شد
    موفق باشید

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    نوشته اصلی توسط Saviour نمایش پست ها
    سلام خدمت آقا سامان عزیز
    نمیدونم به این تاپیک سر میزنید یا خیر!!!
    ولی من این برنامه رو استفاده کردم واسه سه کاری و چند افکت دیگه هم بهش اضافه کردم، مثل موج مکزیکی، ولی تو این افکت، ال ای دی ها پرش دارند!!! چرا؟نمونه کدم رو هم ارسال میکنم لطف کنید یه نگاهی بهش بندازید
    کد:
    #include <mega8.h>#include <delay.h>
    
    
    #define     Set_LED1         PORTB.0 = 1
    #define     Set_LED2         PORTB.1 = 1
    #define     Set_LED3         PORTB.2 = 1
    #define     Set_LED4         PORTB.3 = 1
    #define     Set_LED5         PORTB.4 = 1
    #define     Set_LED6         PORTB.5 = 1
    #define     Set_LED7         PORTB.6 = 1
    #define     Set_LED8         PORTB.7 = 1
    #define     Set_LED9         PORTD.0 = 1
    #define     Set_LED10        PORTD.1 = 1
    #define     Set_LED11        PORTD.2 = 1
    #define     Set_LED12        PORTD.3 = 1
    #define     Set_LED13        PORTD.4 = 1
    #define     Set_LED14        PORTD.5 = 1
    #define     Set_LED15        PORTD.6 = 1
    #define     Set_LED16        PORTD.7 = 1
    #define     Set_LED17        PORTC.0 = 1
    #define     Set_LED18        PORTC.1 = 1
    #define     Set_LED19        PORTC.2 = 1
    #define     Set_LED20        PORTC.3 = 1
    
    
    #define     BLUE             PORTB.0=PORTB.1=PORTB.2=PORTB.3=PORTB.4=PORTB.5=PORTB.6=PORTB.7=PORTD.0=PORTD.1
    #define     RED              PORTD.2=PORTD.3=PORTD.4=PORTD.5=PORTD.6=PORTD.7=PORTC.0=PORTC.1=PORTC.2=PORTC.3
    #define     byte            unsigned char
    #define     PB              PORTB
    #define     PD              PORTD
    #define     PC              PORTC
    #define     TIME            100
    #define     max_var_PWM     100
    #define     Max_LED         20
    #define     Delay1          30  //ms
    #define     Delay2          400 //ms
    #define     D_3             40
    
    
    #define     ON              1
    #define     OFF             0
    
    
    // Declare your global variables here
    byte    a = max_var_PWM , pwm[Max_LED+3],q=0;
    flash byte  rain[]=
    {100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5
    ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    rain1[]=
    {100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5
    ,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100};
    interrupt [TIM0_OVF] void timer0_comp_isr(void)
    {
    TCNT0 = 95;
    if(a)
        {
        if(!q)
            {
            if(a == pwm[1]){Set_LED20;Set_LED1;}
            if(a == pwm[2]){Set_LED19;Set_LED2;}
            if(a == pwm[3]){Set_LED18;Set_LED3;}
            if(a == pwm[4]){Set_LED17;Set_LED4;}
            if(a == pwm[5]){Set_LED16;Set_LED5;}
            if(a == pwm[6]){Set_LED15;Set_LED6;}
            if(a == pwm[7]){Set_LED14;Set_LED7;}
            if(a == pwm[8]){Set_LED13;Set_LED8;}
            if(a == pwm[9]){Set_LED12;Set_LED9;}
            if(a == pwm[10]){Set_LED11;Set_LED10;}
            }
        else if(q==1)
            {
            if(a == pwm[20])Set_LED20;
            if(a == pwm[19])Set_LED19;
            if(a == pwm[18])Set_LED18;
            if(a == pwm[17])Set_LED17;
            if(a == pwm[16])Set_LED16;
            if(a == pwm[15])Set_LED15;
            if(a == pwm[14])Set_LED14;
            if(a == pwm[13])Set_LED13;
            if(a == pwm[12])Set_LED12;
            if(a == pwm[11])Set_LED11;
            if(a == pwm[10])Set_LED10;
            if(a == pwm[9])Set_LED9;
            if(a == pwm[8])Set_LED8;
            if(a == pwm[7])Set_LED7;
            if(a == pwm[6])Set_LED6;
            if(a == pwm[5])Set_LED5;
            if(a == pwm[4])Set_LED4;
            if(a == pwm[3])Set_LED3;
            if(a == pwm[2])Set_LED2;
            if(a == pwm[1])Set_LED1;
            }
        if(q==2)
            {
            if(a == pwm[20]){Set_LED20;Set_LED1;}
            if(a == pwm[18]){Set_LED19;Set_LED2;}
            if(a == pwm[16]){Set_LED18;Set_LED3;}
            if(a == pwm[14]){Set_LED17;Set_LED4;}
            if(a == pwm[12]){Set_LED16;Set_LED5;}
            if(a == pwm[10]){Set_LED15;Set_LED6;}
            if(a == pwm[8]){Set_LED14;Set_LED7;}
            if(a == pwm[6]){Set_LED13;Set_LED8;}
            if(a == pwm[4]){Set_LED12;Set_LED9;}
            if(a == pwm[2]){Set_LED11;Set_LED10;}
            }
        else if(q==3)
            {
            if(a == pwm[1])Set_LED20;
            if(a == pwm[2])Set_LED19;
            if(a == pwm[3])Set_LED18;
            if(a == pwm[4])Set_LED17;
            if(a == pwm[5])Set_LED16;
            if(a == pwm[6])Set_LED15;
            if(a == pwm[7])Set_LED14;
            if(a == pwm[8])Set_LED13;
            if(a == pwm[9])Set_LED12;
            if(a == pwm[10])Set_LED11;
            if(a == pwm[11])Set_LED10;
            if(a == pwm[12])Set_LED9;
            if(a == pwm[13])Set_LED8;
            if(a == pwm[14])Set_LED7;
            if(a == pwm[15])Set_LED6;
            if(a == pwm[16])Set_LED5;
            if(a == pwm[17])Set_LED4;
            if(a == pwm[18])Set_LED3;
            if(a == pwm[19])Set_LED2;
            if(a == pwm[20])Set_LED1;
            }
        }
    if(--a == 255)
        {
        a = max_var_PWM;
        PORTD=0;
        PORTB=0;
        PORTC=0;
        }
    }
    
    
    void main(void)
    {
    byte  a,b,c;
    byte y1=Max_LED-1 ,y2= Max_LED+Max_LED ,x1 ,x2;
      //Config all
      //Config timers
      //Config PORTS
      {
        DDRB=255;
        DDRC=255;
        DDRD=255;
        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: 1000.000 kHz
        TCNT0=105;
        TCCR0=2;
        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=1;
        // Global enable interrupts
        #asm("sei")
      }
    
    
    while (1)
          {
          // Place your code here 
          for(c=0;c<5;c++)
                {
                for(b=0;b<3;b++)
                   {
                   for(x1=0;x1<39;x1++)
                      {
                      for(x2=y1;x2>0;x2--)
                          {
                          pwm[x2+1]=pwm[x2];
                          }
                      pwm[1]=rain1[x1];
                      delay_ms(Delay1);
                      }
                   }
                if(q++==3) q=0;
                delay_ms(Delay2);
                }
          
          for(c=0;c<0;c++)
                {
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    BLUE=ON;
                    delay_ms(D_3);
                    BLUE=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3);
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    RED=ON;
                    delay_ms(D_3);
                    RED=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3);
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    RED=BLUE=ON;
                    delay_ms(D_3);
                    RED=BLUE=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3*4);
                }
          
          for(c=0;c<0;c++)
                {
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    BLUE=ON;
                    delay_ms(D_3);
                    BLUE=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3*4);
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    RED=ON;
                    delay_ms(D_3);
                    RED=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3*10);
                }
          
          for(c=0;c<0;c++)
                {
                #asm("cli")
                PD=PB=PC=0;
                delay_ms(300);
                PD=PB=PC=255;
                delay_ms(300);
                }      
          #asm("sei")                
          }
    }
    سلام دوست عزیز
    عذر خواهی میکنم بابت چند ماهی که نبودم
    کدی که مربوط بهخاموش و روشن کردن LED نوشتید نیازی به خاموش و روشن کردن تایمر نداره
    دستور خاموش و روشن بدید خودش خاموش و روشن میشه
    در ضمن برنامه های قبلیم یه باگی داشت که اصلاح کردم
    قالب برنامتون رو از برنامه زیر استفاده کنید ...
    موفق باشید
    کد:
    /*****************************************************
    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                   : 22 PWM
    Resolution                : 101 States (0 To 100)
    Date                      : 13/Jun/2017
    Time                      : 10:50:04
    Author                    : Saman.Asadi    www.ECA.ir
    Author's Email            : Saman.asadi.ir@gmail.com
    http://www.eca.ir/forums/thread48596.html
    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  100
    #define    set_pwm           Max_Variable_PWM
    #define    reset_pwm         0
    
    unsigned char Counter_PWM , pwm[24] , _pwm[24];
    
    interrupt [TIM2_COMP] void timer2_comp_isr(void);
    
    /*
    pwm[1] ===> PORTB.0
    pwm[2] ===> PORTB.1
    pwm[3] ===> PORTB.2
    pwm[4] ===> PORTB.3
    pwm[5] ===> PORTB.4
    pwm[6] ===> PORTB.5
    pwm[7] ===> PORTB.6
    pwm[8] ===> PORTB.7
    pwm[9] ===> PORTD.0
    pwm[10] ==> PORTD.1
    pwm[11] ==> PORTD.2
    pwm[12] ==> PORTD.3
    pwm[13] ==> PORTD.4
    pwm[14] ==> PORTD.5
    pwm[15] ==> PORTD.6
    pwm[16] ==> PORTD.7
    pwm[17] ==> PORTC.0
    pwm[18] ==> PORTC.1
    pwm[19] ==> PORTC.2
    pwm[20] ==> PORTC.3
    pwm[21] ==> PORTC.4
    pwm[22] ==> PORTC.5
    */
    
    void main(void)
    {
        //Config all
        //Config timers
        //Config PORTS
        {
            DDRB |= 0xFF;
            DDRC |= 0x3F;
            DDRD |= 0xFF;
            // 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 = 0x63;
            TCNT2= 0x00;
            //Timer(s)/Counter(s) Interrupt(s) initialization
            TIMSK |= 0x80;
            // Global enable interrupts
            #asm("sei")
        }//End Config ...
    
    
        while(1)
        {
    //===================================================
    
    //===================================================
        }
    
    
    }
    
    
    // Timer 2 output compare interrupt service routine
    interrupt [TIM2_COMP] void timer2_comp_isr(void)
    {
        if(Counter_PWM)
        {
            if(Counter_PWM == _pwm[1]) PORTB |= 0x01;
            if(Counter_PWM == _pwm[2]) PORTB |= 0x02;
            if(Counter_PWM == _pwm[3]) PORTB |= 0x04;
            if(Counter_PWM == _pwm[4]) PORTB |= 0x08;
            if(Counter_PWM == _pwm[5]) PORTB |= 0x10;
            if(Counter_PWM == _pwm[6]) PORTB |= 0x20;
            if(Counter_PWM == _pwm[7]) PORTB |= 0x40;
            if(Counter_PWM == _pwm[8]) PORTB |= 0x80;
            if(Counter_PWM == _pwm[9]) PORTD |= 0x01;
            if(Counter_PWM == _pwm[10]) PORTD |= 0x02;
            if(Counter_PWM == _pwm[11]) PORTD |= 0x04;
            if(Counter_PWM == _pwm[12]) PORTD |= 0x08;
            if(Counter_PWM == _pwm[13]) PORTD |= 0x10;
            if(Counter_PWM == _pwm[14]) PORTD |= 0x20;
            if(Counter_PWM == _pwm[15]) PORTD |= 0x40;
            if(Counter_PWM == _pwm[16]) PORTD |= 0x80;
            if(Counter_PWM == _pwm[17]) PORTC |= 0x01;
            if(Counter_PWM == _pwm[18]) PORTC |= 0x02;
            if(Counter_PWM == _pwm[19]) PORTC |= 0x04;
            if(Counter_PWM == _pwm[20]) PORTC |= 0x08;
            if(Counter_PWM == _pwm[21]) PORTC |= 0x10;
            if(Counter_PWM == _pwm[22]) PORTC |= 0x20;
        }
        if(--Counter_PWM == 255)
        {
            Counter_PWM = Max_Variable_PWM;
            PORTB &= 0x0;
            PORTC &= 0xC0;
            PORTD &= 0x0;
            _pwm[1] = pwm[1];
            _pwm[2] = pwm[2];
            _pwm[3] = pwm[3];
            _pwm[4] = pwm[4];
            _pwm[5] = pwm[5];
            _pwm[6] = pwm[6];
            _pwm[7] = pwm[7];
            _pwm[8] = pwm[8];
            _pwm[9] = pwm[9];
            _pwm[10] = pwm[10];
            _pwm[11] = pwm[11];
            _pwm[12] = pwm[12];
            _pwm[13] = pwm[13];
            _pwm[14] = pwm[14];
            _pwm[15] = pwm[15];
            _pwm[16] = pwm[16];
            _pwm[17] = pwm[17];
            _pwm[18] = pwm[18];
            _pwm[19] = pwm[19];
            _pwm[20] = pwm[20];
            _pwm[21] = pwm[21];
            _pwm[22] = pwm[22];
        }
    }

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


  • سوران آراسته
    replied
    پاسخ : (برنامه اصلاح شد) چگونه تمام پایه های ATmega16-32-64-128 را PWM کنیم ؟؟!!

    نوشته اصلی توسط Saviour نمایش پست ها
    سلام خدمت آقا سامان عزیز
    نمیدونم به این تاپیک سر میزنید یا خیر!!!
    ولی من این برنامه رو استفاده کردم واسه سه کاری و چند افکت دیگه هم بهش اضافه کردم، مثل موج مکزیکی، ولی تو این افکت، ال ای دی ها پرش دارند!!! چرا؟نمونه کدم رو هم ارسال میکنم لطف کنید یه نگاهی بهش بندازید
    کد:
    #include <mega8.h>#include <delay.h>
    
    
    #define     Set_LED1         PORTB.0 = 1
    #define     Set_LED2         PORTB.1 = 1
    #define     Set_LED3         PORTB.2 = 1
    #define     Set_LED4         PORTB.3 = 1
    #define     Set_LED5         PORTB.4 = 1
    #define     Set_LED6         PORTB.5 = 1
    #define     Set_LED7         PORTB.6 = 1
    #define     Set_LED8         PORTB.7 = 1
    #define     Set_LED9         PORTD.0 = 1
    #define     Set_LED10        PORTD.1 = 1
    #define     Set_LED11        PORTD.2 = 1
    #define     Set_LED12        PORTD.3 = 1
    #define     Set_LED13        PORTD.4 = 1
    #define     Set_LED14        PORTD.5 = 1
    #define     Set_LED15        PORTD.6 = 1
    #define     Set_LED16        PORTD.7 = 1
    #define     Set_LED17        PORTC.0 = 1
    #define     Set_LED18        PORTC.1 = 1
    #define     Set_LED19        PORTC.2 = 1
    #define     Set_LED20        PORTC.3 = 1
    
    
    #define     BLUE             PORTB.0=PORTB.1=PORTB.2=PORTB.3=PORTB.4=PORTB.5=PORTB.6=PORTB.7=PORTD.0=PORTD.1
    #define     RED              PORTD.2=PORTD.3=PORTD.4=PORTD.5=PORTD.6=PORTD.7=PORTC.0=PORTC.1=PORTC.2=PORTC.3
    #define     byte            unsigned char
    #define     PB              PORTB
    #define     PD              PORTD
    #define     PC              PORTC
    #define     TIME            100
    #define     max_var_PWM     100
    #define     Max_LED         20
    #define     Delay1          30  //ms
    #define     Delay2          400 //ms
    #define     D_3             40
    
    
    #define     ON              1
    #define     OFF             0
    
    
    // Declare your global variables here
    byte    a = max_var_PWM , pwm[Max_LED+3],q=0;
    flash byte  rain[]=
    {100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5
    ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    rain1[]=
    {100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5
    ,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100};
    interrupt [TIM0_OVF] void timer0_comp_isr(void)
    {
    TCNT0 = 95;
    if(a)
        {
        if(!q)
            {
            if(a == pwm[1]){Set_LED20;Set_LED1;}
            if(a == pwm[2]){Set_LED19;Set_LED2;}
            if(a == pwm[3]){Set_LED18;Set_LED3;}
            if(a == pwm[4]){Set_LED17;Set_LED4;}
            if(a == pwm[5]){Set_LED16;Set_LED5;}
            if(a == pwm[6]){Set_LED15;Set_LED6;}
            if(a == pwm[7]){Set_LED14;Set_LED7;}
            if(a == pwm[8]){Set_LED13;Set_LED8;}
            if(a == pwm[9]){Set_LED12;Set_LED9;}
            if(a == pwm[10]){Set_LED11;Set_LED10;}
            }
        else if(q==1)
            {
            if(a == pwm[20])Set_LED20;
            if(a == pwm[19])Set_LED19;
            if(a == pwm[18])Set_LED18;
            if(a == pwm[17])Set_LED17;
            if(a == pwm[16])Set_LED16;
            if(a == pwm[15])Set_LED15;
            if(a == pwm[14])Set_LED14;
            if(a == pwm[13])Set_LED13;
            if(a == pwm[12])Set_LED12;
            if(a == pwm[11])Set_LED11;
            if(a == pwm[10])Set_LED10;
            if(a == pwm[9])Set_LED9;
            if(a == pwm[8])Set_LED8;
            if(a == pwm[7])Set_LED7;
            if(a == pwm[6])Set_LED6;
            if(a == pwm[5])Set_LED5;
            if(a == pwm[4])Set_LED4;
            if(a == pwm[3])Set_LED3;
            if(a == pwm[2])Set_LED2;
            if(a == pwm[1])Set_LED1;
            }
        if(q==2)
            {
            if(a == pwm[20]){Set_LED20;Set_LED1;}
            if(a == pwm[18]){Set_LED19;Set_LED2;}
            if(a == pwm[16]){Set_LED18;Set_LED3;}
            if(a == pwm[14]){Set_LED17;Set_LED4;}
            if(a == pwm[12]){Set_LED16;Set_LED5;}
            if(a == pwm[10]){Set_LED15;Set_LED6;}
            if(a == pwm[8]){Set_LED14;Set_LED7;}
            if(a == pwm[6]){Set_LED13;Set_LED8;}
            if(a == pwm[4]){Set_LED12;Set_LED9;}
            if(a == pwm[2]){Set_LED11;Set_LED10;}
            }
        else if(q==3)
            {
            if(a == pwm[1])Set_LED20;
            if(a == pwm[2])Set_LED19;
            if(a == pwm[3])Set_LED18;
            if(a == pwm[4])Set_LED17;
            if(a == pwm[5])Set_LED16;
            if(a == pwm[6])Set_LED15;
            if(a == pwm[7])Set_LED14;
            if(a == pwm[8])Set_LED13;
            if(a == pwm[9])Set_LED12;
            if(a == pwm[10])Set_LED11;
            if(a == pwm[11])Set_LED10;
            if(a == pwm[12])Set_LED9;
            if(a == pwm[13])Set_LED8;
            if(a == pwm[14])Set_LED7;
            if(a == pwm[15])Set_LED6;
            if(a == pwm[16])Set_LED5;
            if(a == pwm[17])Set_LED4;
            if(a == pwm[18])Set_LED3;
            if(a == pwm[19])Set_LED2;
            if(a == pwm[20])Set_LED1;
            }
        }
    if(--a == 255)
        {
        a = max_var_PWM;
        PORTD=0;
        PORTB=0;
        PORTC=0;
        }
    }
    
    
    void main(void)
    {
    byte  a,b,c;
    byte y1=Max_LED-1 ,y2= Max_LED+Max_LED ,x1 ,x2;
      //Config all
      //Config timers
      //Config PORTS
      {
        DDRB=255;
        DDRC=255;
        DDRD=255;
        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: 1000.000 kHz
        TCNT0=105;
        TCCR0=2;
        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=1;
        // Global enable interrupts
        #asm("sei")
      }
    
    
    while (1)
          {
          // Place your code here 
          for(c=0;c<5;c++)
                {
                for(b=0;b<3;b++)
                   {
                   for(x1=0;x1<39;x1++)
                      {
                      for(x2=y1;x2>0;x2--)
                          {
                          pwm[x2+1]=pwm[x2];
                          }
                      pwm[1]=rain1[x1];
                      delay_ms(Delay1);
                      }
                   }
                if(q++==3) q=0;
                delay_ms(Delay2);
                }
          
          for(c=0;c<0;c++)
                {
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    BLUE=ON;
                    delay_ms(D_3);
                    BLUE=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3);
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    RED=ON;
                    delay_ms(D_3);
                    RED=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3);
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    RED=BLUE=ON;
                    delay_ms(D_3);
                    RED=BLUE=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3*4);
                }
          
          for(c=0;c<0;c++)
                {
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    BLUE=ON;
                    delay_ms(D_3);
                    BLUE=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3*4);
                for(a=0;a<3;a++)
                    {
                    #asm("cli")
                    RED=ON;
                    delay_ms(D_3);
                    RED=OFF;
                    delay_ms(D_3);
                    }
                delay_ms(D_3*10);
                }
          
          for(c=0;c<0;c++)
                {
                #asm("cli")
                PD=PB=PC=0;
                delay_ms(300);
                PD=PB=PC=255;
                delay_ms(300);
                }      
          #asm("sei")                
          }
    }
    پرپر زدنش به احتمال زیاد از سرعت کم رفرش هست. سرعت تایمر رو بیشتر کن. منظور افزایش کلاکش هست.

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


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

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

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


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

    نوشته اصلی توسط javat2020 نمایش پست ها
    سلام.آقای مهندس من یه پروژه دارم که باید تابلو ledبسازم که متن power lab رو با استفاده از mega32با استفاده از PWM بسازم.اگه امکانش هست راهنمایی کنید.تشکر
    با سلام و درود
    به انجمن خوش آمدید.
    در مورد کدام بخش از ساخت تابلو LED سوال دارید؟ به عنوان مثال آیا سوال شما پیرامون بخش برنامه نویسی آن است یا اینکه پیرامون بخش طراحی مدار آن یا چینش LEDها روی تابلو یا .... ؟

    در بخش «تابلو ثابت LED» به مباحث مرتبط با ساخت تابلو LED پرداخته می شود:
    انجمن: تابلو ثابت LED
    جدیدترین ویرایش توسط فکر; 2017/04/02, 16:16.

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


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

    سلام.آقای مهندس من یه پروژه دارم که باید تابلو ledبسازم که متن power lab رو با استفاده از mega32با استفاده از PWM بسازم.اگه امکانش هست راهنمایی کنید.تشکر

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

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