اطلاعیه

Collapse
No announcement yet.

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

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

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

    نوشته اصلی توسط سامان اسدی
    سلام
    برنامه خودتون رو بگذارید تا ببینم ...
    به گمانم فیوزبیتها رو اشتباهی تنظیم کردی
    CKSEL0=0
    CKSEL1=0
    CKSEL2=1
    CKSEL3=0

    موفق باشید
    سلام مهندس

    دقیقا همین شکلی پروگرم کردم

    با کمک پتانسیو متر روی پین صفر پورت شش pdm می اندازد

    کد:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V1.25.8 Professional
    Automatic Program Generator
    © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    
    Project : 
    Version : 
    Date  : 5/11/2015
    Author : F4CG              
    Company : F4CG              
    Comments: 
    
    
    Chip type      : ATmega8
    Program type    : Application
    Clock frequency   : 1.000000 MHz
    Memory model    : Small
    External SRAM size : 0
    Data Stack size   : 256
    *****************************************************/
    
    #include <mega8.h> 
    #include <delay.h> 
    #define ADC_VREF_TYPE 0x60 
    
    unsigned char data,sata;
    
    
    
    
     unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCH;
    }
    
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {  
       
     
       if(PIND.6==1)
         { 
            PORTD.6=0; 
            
          
           
          
            TCNT0=sata;
          }
        if(PIND.6==0)
         { 
          
          PORTD.6=1; 
          
         
        
          TCNT0=data;
          
          } 
    
    // Place your code here
    
    }
    
    
    
     
    
    
    
    
    
    // Read the AD conversion result
    
    
    // Declare your global variables here
    
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTB=0x00;
    DDRB=0x00;
    
    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTC=0x00;
    DDRC=0x00;
    
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0xFF;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    TCCR0=0x02;
    TCNT0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // ADC initialization
    // ADC Clock frequency: 500.000 kHz
    // ADC Voltage Reference: AVCC pin
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x82;
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
       { 
        
       data=read_adc(0);
      sata=256-data; 
      
       
       
      
       
        
        
          
       // Place your code here
    
       };
    }

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


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

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

    گذاشتم روی 8 مگاهرتز داخلی ولی دیگه پروگرم نمیشه میکرو یعنی باید میکرو عوض کنم؟
    سلام
    برنامه خودتون رو بگذارید تا ببینم ...
    به گمانم فیوزبیتها رو اشتباهی تنظیم کردی
    CKSEL0=0
    CKSEL1=0
    CKSEL2=1
    CKSEL3=0

    موفق باشید

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


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

    نوشته اصلی توسط MAHDI ZAMANI
    سرعت کلاک و تنظیم فیرزبیتها رو دقت کن
    سلام

    گذاشتم روی 8 مگاهرتز داخلی ولی دیگه پروگرم نمیشه میکرو یعنی باید میکرو عوض کنم؟

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


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

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

    ممنون برای برنامه مهندس اسدی
    وقتی این برنامه را پیاده سازی میکنم به صورت چشمک زن در می آید
    سرعت کلاک و تنظیم فیرزبیتها رو دقت کن

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


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

    نوشته اصلی توسط سامان اسدی
    درود بر دوستاندوست عزیز همانطور که پیش از این هم گفته شد باید عدد را از ADC بخوانید و عدد را مساوی با PWM مورد نظر را مقدار دهی کنید
    نمونه کد :
    [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 : 32-channel PWM (Rain LED)
    Version : 2.1
    Date : 2/27/2014
    Author : Saman.Asadi
    www.ECA.ir
    Chip type : ATmega16
    Program type : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    ************************************************** ***/
    #include <mega16a.h>
    #include <delay.h>

    #define ADC_VREF_TYPE 0x60
    // Read the 8 most significant bits
    // of the AD conversion result
    unsigned char read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCH;
    }

    #define led PORTB.0
    #define max_var_PWM 100
    unsigned char a = max_var_PWM;
    unsigned char pwm[35];

    // Timer 0 output compare interrupt service routine
    interrupt [TIM0_COMP] void timer0_comp_isr(void)
    {
    if(a == pwm[1])led=1;
    if(--a == 255)
    {
    a = max_var_PWM;
    PORTB = 0;
    }
    }

    void main(void)
    {
    unsigned char x;
    //Config all
    {
    //Config PORTS
    DDRB = 0xFF;

    //Config timers
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: CTC top=OCR0
    // OC0 output: Disconnected
    TCCR0=0x0A;
    OCR0=150;
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x02;
    // Global enable interrupts
    #asm("sei&quot

    //Config ADC
    // ADC initialization
    // ADC Clock frequency: 62.500 kHz
    // ADC Voltage Reference: AVCC pin
    // ADC Auto Trigger Source: ADC Stopped
    // Only the 8 most significant bits of
    // the AD conversion result are used
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x87;
    }
    //End Config ......
    while(1)
    {
    x = read_adc(0) / 2.55;
    pwm[1] = x ;
    delay_ms(50);
    }
    }
    [/code]
    توضیحات پایین هم بخوانید بهتر متوجه خواهید شد ...
    ممنون از ابراز لطفتون
    اگر واقعا تنها یک بار با دقت کامل خوانده باشید خیلی راحت می توانید با آن کار کنید ...
    دقیقا پست اول :من واقعا در تعجبم که چرا دوستان میگن که ما تاپیک رو خواندیم ولی یاد نگرفتیم !!!!
    اون دیگه مشکل از من نیست
    خودتون باید برنامه نویسی رو خوب بلد بشوید و بدونید که اعداد رو چطوری جایگزین کنید و با اعداد چطوری بازی کنید... !!!
    http://www.eca.ir/forum2/index.php?topic=90246.msg604568#msg604568
    این پست رو نگاه کن ...
    بله میشه
    مثلا عدد بالاترین حد را به اسم مستعار روشن و عدد 0 را به اسم مستعار خاموش شدن تعریف کنید ...
    توی زبان سی :
    کد:
    #define	on_LED	max_var_PWM
    #define	off_LED	0
    و در قسمت کد نویسی توی حلقه اصلی باید نوشت ...
    کد:
    while(1)
    {
    	pwm[1] = on_LED;
    	delay_ms(500);
    	pwm[1] = off_LED;
    	delay_ms(500);
    }
    همین ...
    حالا اگر خواستیم که به عنوان pwm استفاده کنیم ...
    کد:
    while(1)
    {
    	for(x=0;x<100;x++)
    	{
    		pwm[1] = x;
    		delay_ms(10);	
    	}
    }
    تنها کافی هست که به آرایه مورد نظر (مثلا [pwm[1 ) مقدار صفر تا 99 بدهیم ... که این میزان شدت نور (از خاموشی تا روشنایی کامل) را تعیین میکند ...

    موفق باشید
    سلام

    ممنون برای برنامه مهندس اسدی
    وقتی این برنامه را پیاده سازی میکنم به صورت چشمک زن در می آید

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


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

    نوشته اصلی توسط soltanfarid
    گذاشتن تاخیر در حد میلی ثانیه ، تایمر را به هم نمیزند؟؟
    خیر ... به شرطی که تاخیر در حلقه اصلی برنامه باشد و نه در زیر برنامه تایمر ...

    نوشته اصلی توسط soltanfarid
    اگر بخاهیم مقدار یک پین را به پین دیگری شیفت دهیم با تاخیری چه کار باید کرد؟؟
    کد:
    for(x=2;x<9;x++)
    {
    	pwm[x-1] = pwm[x];
    	delay_ms(100);
    }
    
    for(x=8;x>1;x++)
    {
    	pwm[x] = pwm[x-1];
    	delay_ms(100);
    }
    نوشته اصلی توسط soltanfarid
    چرا آرایه pwm را سی وپنج تایی اتخاب کردیم؟
    مساله ای نداره ....
    شما همون رو بسته به نیازتون کمترش کنید ...

    نوشته اصلی توسط soltanfarid
    با یه تیکه کد کنار نمیام
    کد:
    if(a == pwm[1])led=1;
    برای بار اول که اجرا میشه a=100 هست چطور خودشو تنظیم میکنه با pwm??
    دوست عزیز شاید بعضی مواقع لازم نباشه خود سورس برنامه را تجزیه و تحلیل کنیم ...
    و شاید لازم باشه که تنها کار کردن با آن را یاد بگیریم ...
    شما برنامه رو از همون پست دوم کپی کنید و تنها کافیه که با انتخاب متغیر pwm و اندیس آرایه PWMها را تغییر بدهیم ...
    همین ...

    نوشته اصلی توسط arsin
    با توجه به اینکه بحث های گوناگونی مرتبط با تایمر در این تاپیک مطرح شده بود و ایجاد این نوع پالس هم خودش از روشهای مختلف مثل PWM میتونه ایجاد بشه به نظرم رسید در این تاپیک مطرح کنم سوال رو بهتر باشه. خیلی متوجه راه حل شما نشدم!؟ با منبع خارجی پالس ایجاد کنم یعنی؟ خب استفاده از منابع خارجی که کلا صورت مسئله رو یک چیز دیگه میکنه من قصدم هست بدون استفاده از منابع خارجی حتی المقدور این کار رو انجام بدم. تقریبا شش هفت کتاب مختلف آموزش AVR دارم که هیچکدام بدرد نمی خوره و فقط برای کار های معمولی راه انداختن جواب داره حالا این کتابی هم که فرمودید میگردم امیدوارم چیز قابل توجهی گفته باشه چون تا به حال که جز این بوده
    دوست عزیز شما پالسهایی نیاز دارید که در حد 200 نانویی ایجاد بشه ...
    بهتر این است که با میکروهای Xmega و ARM کار کنید ... چون سرعت آنها بسیار بالاتر است ...
    تازه فکر کنم که Xmega هم نتواند این کار را کند ...
    و تنها میکرویی که میتواند به داد شما برسد ARM است نه AVR ...

    موفق باشید

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


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

    نوشته اصلی توسط " سید محمد "
    کاش یه تاپیک جدید میزدید تا بحث تاپیک pwm منحرف نشه .
    شما با avr اگه کلاک خارجی بزارید و تقسیم بر n تایمر رو پوری بزارید که با فرکانس cpu هم کلاک باشه ( تقسیم بر 1 ) هر پالس معرف 65 نانو ثانیه است .
    اتفاقا رفتار خروجی کاملا مشخصه . فصل تایمر رو از کتاب جناب سپاسیار بخونید تا با ریزه کاری های تایمر ( مثل glitch ) بیشتر اشنا بشید .
    با توجه به اینکه بحث های گوناگونی مرتبط با تایمر در این تاپیک مطرح شده بود و ایجاد این نوع پالس هم خودش از روشهای مختلف مثل PWM میتونه ایجاد بشه به نظرم رسید در این تاپیک مطرح کنم سوال رو بهتر باشه. خیلی متوجه راه حل شما نشدم!؟ با منبع خارجی پالس ایجاد کنم یعنی؟ خب استفاده از منابع خارجی که کلا صورت مسئله رو یک چیز دیگه میکنه من قصدم هست بدون استفاده از منابع خارجی حتی المقدور این کار رو انجام بدم. تقریبا شش هفت کتاب مختلف آموزش AVR دارم که هیچکدام بدرد نمی خوره و فقط برای کار های معمولی راه انداختن جواب داره حالا این کتابی هم که فرمودید میگردم امیدوارم چیز قابل توجهی گفته باشه چون تا به حال که جز این بوده

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


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

    نوشته اصلی توسط سامان اسدی
    درود بر دوستاندوست عزیز همانطور که پیش از این هم گفته شد باید عدد را از ADC بخوانید و عدد را مساوی با PWM مورد نظر را مقدار دهی کنید
    نمونه کد :
    [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 : 32-channel PWM (Rain LED)
    Version : 2.1
    Date : 2/27/2014
    Author : Saman.Asadi
    www.ECA.ir
    Chip type : ATmega16
    Program type : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    ************************************************** ***/
    #include <mega16a.h>
    #include <delay.h>

    #define ADC_VREF_TYPE 0x60
    // Read the 8 most significant bits
    // of the AD conversion result
    unsigned char read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCH;
    }

    #define led PORTB.0
    #define max_var_PWM 100
    unsigned char a = max_var_PWM;
    unsigned char pwm[35];

    // Timer 0 output compare interrupt service routine
    interrupt [TIM0_COMP] void timer0_comp_isr(void)
    {
    if(a == pwm[1])led=1;
    if(--a == 255)
    {
    a = max_var_PWM;
    PORTB = 0;
    }
    }

    void main(void)
    {
    unsigned char x;
    //Config all
    {
    //Config PORTS
    DDRB = 0xFF;

    //Config timers
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: CTC top=OCR0
    // OC0 output: Disconnected
    TCCR0=0x0A;
    OCR0=150;
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x02;
    // Global enable interrupts
    #asm("sei&quot

    //Config ADC
    // ADC initialization
    // ADC Clock frequency: 62.500 kHz
    // ADC Voltage Reference: AVCC pin
    // ADC Auto Trigger Source: ADC Stopped
    // Only the 8 most significant bits of
    // the AD conversion result are used
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x87;
    }
    //End Config ......
    while(1)
    {
    x = read_adc(0) / 2.55;
    pwm[1] = x ;
    delay_ms(50);
    }
    }
    [/code]
    توضیحات پایین هم بخوانید بهتر متوجه خواهید شد ...
    ممنون از ابراز لطفتون
    اگر واقعا تنها یک بار با دقت کامل خوانده باشید خیلی راحت می توانید با آن کار کنید ...
    دقیقا پست اول :من واقعا در تعجبم که چرا دوستان میگن که ما تاپیک رو خواندیم ولی یاد نگرفتیم !!!!
    اون دیگه مشکل از من نیست
    خودتون باید برنامه نویسی رو خوب بلد بشوید و بدونید که اعداد رو چطوری جایگزین کنید و با اعداد چطوری بازی کنید... !!!
    http://www.eca.ir/forum2/index.php?topic=90246.msg604568#msg604568
    این پست رو نگاه کن ...
    بله میشه
    مثلا عدد بالاترین حد را به اسم مستعار روشن و عدد 0 را به اسم مستعار خاموش شدن تعریف کنید ...
    توی زبان سی :
    کد:
    #define	on_LED	max_var_PWM
    #define	off_LED	0
    و در قسمت کد نویسی توی حلقه اصلی باید نوشت ...
    کد:
    while(1)
    {
    	pwm[1] = on_LED;
    	delay_ms(500);
    	pwm[1] = off_LED;
    	delay_ms(500);
    }
    همین ...
    حالا اگر خواستیم که به عنوان pwm استفاده کنیم ...
    کد:
    while(1)
    {
    	for(x=0;x<100;x++)
    	{
    		pwm[1] = x;
    		delay_ms(10);	
    	}
    }
    تنها کافی هست که به آرایه مورد نظر (مثلا [pwm[1 ) مقدار صفر تا 99 بدهیم ... که این میزان شدت نور (از خاموشی تا روشنایی کامل) را تعیین میکند ...

    موفق باشید
    چرا آرایه pwm را سی وپنج تایی اتخاب کردیم؟

    با یه تیکه کد کنار نمیام

    کد:
    if(a == pwm[1])led=1;
    برای بار اول که اجرا میشه a=100 هست چطور خودشو تنظیم میکنه با pwm??

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


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

    نوشته اصلی توسط arsin
    سلام و درود،
    جناب اسدی و دیگر دوستان صاحب نظر یک سوال فنی داشتم که در نظر همه احتمالا خیلی مشخص است و در چندین کتاب آموزشی نیز توسط اساتید به نام نمونه کدهای این بحث گفته شده که تماما غلط بود و جواب نادرست می داد. خواستم اگر پاسخی عملی (تست شده در سخت افزار یا شبیه ساز) دارید که مطمئن هستید جواب می دهد راهنمایی بفرمایید.
    بنده قصد دارم توسط تایمر در ATmega32 یک زوج پالس ایجاد کنم به قرار شکل زیر:

    این شکل موج بصورت پریودیک تکرار می شود. قصد دارم در کد تنظیمات جوری باشد که بتوانم مقادیر W,D1,D2,D3 را به دلخواه انتخاب کنم و البته دقت بالایی مدنظرم است. یعنی پهنای پالس ها در حدود دویست نانو ثانیه و D2 نیز در همین حدود چند صد نانو ثانیه باشد.
    شاید بیش از دو سه ماه باشد که خودم و یکی از دوستانم مشغول سر و کله زدن با AVR هستیم اما جواب های عجیبی میگیریم. یا تاخیر ها بسیار زیاد است یا اصلا رفتار خروجی غیرقابل پیشبینی است. خلاصه عملا مایوس شدیم و تصمیم گرفتیم از روش ایجاد تاخیر در پورت های ورودی خروجی معمولی این پالس را ایجاد کنیم که البته مشکلات دیگری بوجود می آورد. در هر حال از دوستان اگر کسی راهنمایی عملی داشت ممنون می شوم بفرماید.
    کاش یه تاپیک جدید میزدید تا بحث تاپیک pwm منحرف نشه .
    شما با avr اگه کلاک خارجی 16 مگ بزارید و تقسیم بر n تایمر رو طوری بزارید که با فرکانس cpu هم کلاک باشه ( تقسیم بر 1 ) هر پالس معرف 65 نانو ثانیه است . بنابراین رسیدن به دقت مورد نظر شما بعید به نظر میرسه. چون به خاطر شکل موجتون حالت سخت افزاری نمیشه و حتما باید نرم افزاری ( حتی تو زیر روال وقفه تایمر ) پیاده بشه .
    اتفاقا رفتار خروجی کاملا مشخصه . فصل تایمر رو از کتاب جناب سپاسیار بخونید تا با ریزه کاری های تایمر ( مثل glitch ) بیشتر اشنا بشید .

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


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

    نوشته اصلی توسط سامان اسدی
    آهان ...
    اینجوری سوال رو مطرح میکردی بهتر متوجه میشدم ...
    دوستان عزیز دقت کنید که دیگه اینجا توی این برنامه نباید اینطور برنامه را نوشت چون به طور مداوم رجیستر PORTx در pwm در حال تغییر است ... بنابر این از این روش نباید پیش رفت ...
    باید کاری کنیم که مقدار pwmها یکی پس از دیگری مقدار داده شود و مقدار قبلی صفر شود ...
    بنابراین برنامه را باید به صورت کدهای زیر نوشت ...
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    for(x=1;x<9;x++)
    {
    	pwm[x] = on_LED;
    	delay_ms(500);
    }
    
    ===================================
    for(x=1;x<9;x++)pwm[x]=0;
    for(x=8;x>0;x--)
    {
    	pwm[x] = on_LED;
    	delay_ms(500);
    }
    
    ===================================
    for(x=1;x<9;x++)pwm[x]=0;
    pwm[1] = on_LED;
    for(x=1;x<8;x++)
    {
    	pwm[x+1] = pwm[x];
    	pwm[x] = off_LED;
    	delay_ms(500);
    }
    
    ===================================
    for(x=1;x<9;x++)pwm[x]=0;
    pwm[8] = on_LED;
    for(x=8;x>1;x--)
    {
    	pwm[x-1] = pwm[x];
    	pwm[x] = off_LED;
    	delay_ms(500);
    }
    برنامه ها را تک تک تحلیل میکنیم و به رفتارهای آنها می پردازیم ...
    این تیکه از برنامه:
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    for(x=1;x<9;x++)
    {
    	pwm[x] = on_LED;
    	delay_ms(500);
    }
    رفتار :
    کد:
    pwm[1]=0
    pwm[2]=0
    pwm[3]=0
    pwm[4]=0
    pwm[5]=0
    pwm[6]=0
    pwm[7]=0
    pwm[8]=0
    --------
    pwm[1]=on_LED
    delay_ms(500)
    pwm[2]=on_LED
    delay_ms(500)
    pwm[3]=on_LED
    delay_ms(500)
    pwm[4]=on_LED
    delay_ms(500)
    pwm[5]=on_LED
    delay_ms(500)
    pwm[6]=on_LED
    delay_ms(500)
    pwm[7]=on_LED
    delay_ms(500)
    pwm[8]=on_LED
    delay_ms(500)
    این تیکه از برنامه:
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    for(x=8;x>0;x--)
    {
    	pwm[x] = on_LED;
    	delay_ms(500);
    }
    رفتار :
    کد:
    pwm[1]=0
    pwm[2]=0
    pwm[3]=0
    pwm[4]=0
    pwm[5]=0
    pwm[6]=0
    pwm[7]=0
    pwm[8]=0
    --------
    pwm[8]=on_LED
    delay_ms(500)
    pwm[7]=on_LED
    delay_ms(500)
    pwm[6]=on_LED
    delay_ms(500)
    pwm[5]=on_LED
    delay_ms(500)
    pwm[4]=on_LED
    delay_ms(500)
    pwm[3]=on_LED
    delay_ms(500)
    pwm[2]=on_LED
    delay_ms(500)
    pwm[1]=on_LED
    delay_ms(500)
    این تیکه از برنامه:
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    pwm[1] = on_LED;
    for(x=1;x<8;x++)
    {
    	pwm[x+1] = pwm[x];
    	pwm[x] = off_LED;
    	delay_ms(500);
    }
    رفتار :
    کد:
    pwm[1]=0
    pwm[2]=0
    pwm[3]=0
    pwm[4]=0
    pwm[5]=0
    pwm[6]=0
    pwm[7]=0
    pwm[8]=0
    --------
    pwm[1]=on_LED
    --------
    pwm[2]=pwm[1]
    pwm[1]=off_LED
    delay_ms(500)
    pwm[3]=pwm[2]
    pwm[2]=off_LED
    delay_ms(500)
    pwm[4]=pwm[3]
    pwm[3]=off_LED
    delay_ms(500)
    pwm[5]=pwm[4]
    pwm[4]=off_LED
    delay_ms(500)
    pwm[6]=pwm[5]
    pwm[5]=off_LED
    delay_ms(500)
    pwm[7]=pwm[6]
    pwm[6]=off_LED
    delay_ms(500)
    pwm[8]=pwm[7]
    pwm[7]=off_LED
    delay_ms(500)
    این تیکه از برنامه:
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    pwm[8] = on_LED;
    for(x=8;x>1;x--)
    {
    	pwm[x-1] = pwm[x];
    	pwm[x] = off_LED;
    	delay_ms(500);
    }
    رفتار :
    کد:
    pwm[1]=0
    pwm[2]=0
    pwm[3]=0
    pwm[4]=0
    pwm[5]=0
    pwm[6]=0
    pwm[7]=0
    pwm[8]=0
    --------
    pwm[8]=on_LED
    --------
    pwm[7]=pwm[8]
    pwm[8]=off_LED
    delay_ms(500)
    pwm[6]=pwm[7]
    pwm[7]=off_LED
    delay_ms(500)
    pwm[5]=pwm[6]
    pwm[6]=off_LED
    delay_ms(500)
    pwm[4]=pwm[5]
    pwm[5]=off_LED
    delay_ms(500)
    pwm[3]=pwm[4]
    pwm[4]=off_LED
    delay_ms(500)
    pwm[2]=pwm[3]
    pwm[3]=off_LED
    delay_ms(500)
    pwm[1]=pwm[2]
    pwm[2]=off_LED
    delay_ms(500)
    روی برنامه هایی که نوشتم خوب فکر کنید ... بسیار ساده است ولی با یه خورده تغییرات خاص میتوانید با همین تیکه های ساده افکتهای بسیار جالب تری ایجاد کنید ...

    موفق باشید

    اضافه شده در تاریخ : ببخشید یه نکته یادم رفت بگم ...
    اگر خواستید که خاموش نشود باید به جای off_LED از مقدار میانه PWM که تقریبا 50 میشود را مقدار دهی کنید که همین را میتوانید در بالا دیفاین کنید ...
    یا اینکه هر مقداری که دلخواهتون هست آن را مقداردهی یا در قسمت بالا آن عدد مورد نظر را دیفاین و از آن در برنامه نویسی استفاده کنید ...

    موفق باشید


    گذاشتن تاخیر در حد میلی ثانیه ، تایمر را به هم نمیزند؟؟

    اضافه شده در تاریخ :
    نوشته اصلی توسط سامان اسدی
    درود بر دوستاندوست عزیز همانطور که پیش از این هم گفته شد باید عدد را از ADC بخوانید و عدد را مساوی با PWM مورد نظر را مقدار دهی کنید
    نمونه کد :
    [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 : 32-channel PWM (Rain LED)
    Version : 2.1
    Date : 2/27/2014
    Author : Saman.Asadi
    www.ECA.ir
    Chip type : ATmega16
    Program type : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    ************************************************** ***/
    #include <mega16a.h>
    #include <delay.h>

    #define ADC_VREF_TYPE 0x60
    // Read the 8 most significant bits
    // of the AD conversion result
    unsigned char read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCH;
    }

    #define led PORTB.0
    #define max_var_PWM 100
    unsigned char a = max_var_PWM;
    unsigned char pwm[35];

    // Timer 0 output compare interrupt service routine
    interrupt [TIM0_COMP] void timer0_comp_isr(void)
    {
    if(a == pwm[1])led=1;
    if(--a == 255)
    {
    a = max_var_PWM;
    PORTB = 0;
    }
    }

    void main(void)
    {
    unsigned char x;
    //Config all
    {
    //Config PORTS
    DDRB = 0xFF;

    //Config timers
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: CTC top=OCR0
    // OC0 output: Disconnected
    TCCR0=0x0A;
    OCR0=150;
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x02;
    // Global enable interrupts
    #asm("sei&quot

    //Config ADC
    // ADC initialization
    // ADC Clock frequency: 62.500 kHz
    // ADC Voltage Reference: AVCC pin
    // ADC Auto Trigger Source: ADC Stopped
    // Only the 8 most significant bits of
    // the AD conversion result are used
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x87;
    }
    //End Config ......
    while(1)
    {
    x = read_adc(0) / 2.55;
    pwm[1] = x ;
    delay_ms(50);
    }
    }
    [/code]
    توضیحات پایین هم بخوانید بهتر متوجه خواهید شد ...
    ممنون از ابراز لطفتون
    اگر واقعا تنها یک بار با دقت کامل خوانده باشید خیلی راحت می توانید با آن کار کنید ...
    دقیقا پست اول :من واقعا در تعجبم که چرا دوستان میگن که ما تاپیک رو خواندیم ولی یاد نگرفتیم !!!!
    اون دیگه مشکل از من نیست
    خودتون باید برنامه نویسی رو خوب بلد بشوید و بدونید که اعداد رو چطوری جایگزین کنید و با اعداد چطوری بازی کنید... !!!
    http://www.eca.ir/forum2/index.php?topic=90246.msg604568#msg604568
    این پست رو نگاه کن ...
    بله میشه
    مثلا عدد بالاترین حد را به اسم مستعار روشن و عدد 0 را به اسم مستعار خاموش شدن تعریف کنید ...
    توی زبان سی :
    کد:
    #define	on_LED	max_var_PWM
    #define	off_LED	0
    و در قسمت کد نویسی توی حلقه اصلی باید نوشت ...
    کد:
    while(1)
    {
    	pwm[1] = on_LED;
    	delay_ms(500);
    	pwm[1] = off_LED;
    	delay_ms(500);
    }
    همین ...
    حالا اگر خواستیم که به عنوان pwm استفاده کنیم ...
    کد:
    while(1)
    {
    	for(x=0;x<100;x++)
    	{
    		pwm[1] = x;
    		delay_ms(10);	
    	}
    }
    تنها کافی هست که به آرایه مورد نظر (مثلا [pwm[1 ) مقدار صفر تا 99 بدهیم ... که این میزان شدت نور (از خاموشی تا روشنایی کامل) را تعیین میکند ...

    موفق باشید

    اگر بخاهیم مقدار یک پین را به پین دیگری شیفت دهیم با تاخیری چه کار باید کرد؟؟

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


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

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


    از کدوم ورژن کدویژن استفاده کنیم بهتر است؟
    3.12

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


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

    سلام و درود،
    جناب اسدی و دیگر دوستان صاحب نظر یک سوال فنی داشتم که در نظر همه احتمالا خیلی مشخص است و در چندین کتاب آموزشی نیز توسط اساتید به نام نمونه کدهای این بحث گفته شده که تماما غلط بود و جواب نادرست می داد. خواستم اگر پاسخی عملی (تست شده در سخت افزار یا شبیه ساز) دارید که مطمئن هستید جواب می دهد راهنمایی بفرمایید.
    بنده قصد دارم توسط تایمر در ATmega32 یک زوج پالس ایجاد کنم به قرار شکل زیر:

    این شکل موج بصورت پریودیک تکرار می شود. قصد دارم در کد تنظیمات جوری باشد که بتوانم مقادیر W,D1,D2,D3 را به دلخواه انتخاب کنم و البته دقت بالایی مدنظرم است. یعنی پهنای پالس ها در حدود دویست نانو ثانیه و D2 نیز در همین حدود چند صد نانو ثانیه باشد.
    شاید بیش از دو سه ماه باشد که خودم و یکی از دوستانم مشغول سر و کله زدن با AVR هستیم اما جواب های عجیبی میگیریم. یا تاخیر ها بسیار زیاد است یا اصلا رفتار خروجی غیرقابل پیشبینی است. خلاصه عملا مایوس شدیم و تصمیم گرفتیم از روش ایجاد تاخیر در پورت های ورودی خروجی معمولی این پالس را ایجاد کنیم که البته مشکلات دیگری بوجود می آورد. در هر حال از دوستان اگر کسی راهنمایی عملی داشت ممنون می شوم بفرماید.

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


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

    سلام


    از کدوم ورژن کدویژن استفاده کنیم بهتر است؟

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


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

    نوشته اصلی توسط سامان اسدی
    آهان ...
    اینجوری سوال رو مطرح میکردی بهتر متوجه میشدم ...
    دوستان عزیز دقت کنید که دیگه اینجا توی این برنامه نباید اینطور برنامه را نوشت چون به طور مداوم رجیستر PORTx در pwm در حال تغییر است ... بنابر این از این روش نباید پیش رفت ...
    باید کاری کنیم که مقدار pwmها یکی پس از دیگری مقدار داده شود و مقدار قبلی صفر شود ...
    بنابراین برنامه را باید به صورت کدهای زیر نوشت ...
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    for(x=1;x<9;x++)
    {
    	pwm[x] = on_LED;
    	delay_ms(500);
    }
    
    ===================================
    for(x=1;x<9;x++)pwm[x]=0;
    for(x=8;x>0;x--)
    {
    	pwm[x] = on_LED;
    	delay_ms(500);
    }
    
    ===================================
    for(x=1;x<9;x++)pwm[x]=0;
    pwm[1] = on_LED;
    for(x=1;x<8;x++)
    {
    	pwm[x+1] = pwm[x];
    	pwm[x] = off_LED;
    	delay_ms(500);
    }
    
    ===================================
    for(x=1;x<9;x++)pwm[x]=0;
    pwm[8] = on_LED;
    for(x=8;x>1;x--)
    {
    	pwm[x-1] = pwm[x];
    	pwm[x] = off_LED;
    	delay_ms(500);
    }
    برنامه ها را تک تک تحلیل میکنیم و به رفتارهای آنها می پردازیم ...
    این تیکه از برنامه:
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    for(x=1;x<9;x++)
    {
    	pwm[x] = on_LED;
    	delay_ms(500);
    }
    رفتار :
    کد:
    pwm[1]=0
    pwm[2]=0
    pwm[3]=0
    pwm[4]=0
    pwm[5]=0
    pwm[6]=0
    pwm[7]=0
    pwm[8]=0
    --------
    pwm[1]=on_LED
    delay_ms(500)
    pwm[2]=on_LED
    delay_ms(500)
    pwm[3]=on_LED
    delay_ms(500)
    pwm[4]=on_LED
    delay_ms(500)
    pwm[5]=on_LED
    delay_ms(500)
    pwm[6]=on_LED
    delay_ms(500)
    pwm[7]=on_LED
    delay_ms(500)
    pwm[8]=on_LED
    delay_ms(500)
    این تیکه از برنامه:
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    for(x=8;x>0;x--)
    {
    	pwm[x] = on_LED;
    	delay_ms(500);
    }
    رفتار :
    کد:
    pwm[1]=0
    pwm[2]=0
    pwm[3]=0
    pwm[4]=0
    pwm[5]=0
    pwm[6]=0
    pwm[7]=0
    pwm[8]=0
    --------
    pwm[8]=on_LED
    delay_ms(500)
    pwm[7]=on_LED
    delay_ms(500)
    pwm[6]=on_LED
    delay_ms(500)
    pwm[5]=on_LED
    delay_ms(500)
    pwm[4]=on_LED
    delay_ms(500)
    pwm[3]=on_LED
    delay_ms(500)
    pwm[2]=on_LED
    delay_ms(500)
    pwm[1]=on_LED
    delay_ms(500)
    این تیکه از برنامه:
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    pwm[1] = on_LED;
    for(x=1;x<8;x++)
    {
    	pwm[x+1] = pwm[x];
    	pwm[x] = off_LED;
    	delay_ms(500);
    }
    رفتار :
    کد:
    pwm[1]=0
    pwm[2]=0
    pwm[3]=0
    pwm[4]=0
    pwm[5]=0
    pwm[6]=0
    pwm[7]=0
    pwm[8]=0
    --------
    pwm[1]=on_LED
    --------
    pwm[2]=pwm[1]
    pwm[1]=off_LED
    delay_ms(500)
    pwm[3]=pwm[2]
    pwm[2]=off_LED
    delay_ms(500)
    pwm[4]=pwm[3]
    pwm[3]=off_LED
    delay_ms(500)
    pwm[5]=pwm[4]
    pwm[4]=off_LED
    delay_ms(500)
    pwm[6]=pwm[5]
    pwm[5]=off_LED
    delay_ms(500)
    pwm[7]=pwm[6]
    pwm[6]=off_LED
    delay_ms(500)
    pwm[8]=pwm[7]
    pwm[7]=off_LED
    delay_ms(500)
    این تیکه از برنامه:
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    pwm[8] = on_LED;
    for(x=8;x>1;x--)
    {
    	pwm[x-1] = pwm[x];
    	pwm[x] = off_LED;
    	delay_ms(500);
    }
    رفتار :
    کد:
    pwm[1]=0
    pwm[2]=0
    pwm[3]=0
    pwm[4]=0
    pwm[5]=0
    pwm[6]=0
    pwm[7]=0
    pwm[8]=0
    --------
    pwm[8]=on_LED
    --------
    pwm[7]=pwm[8]
    pwm[8]=off_LED
    delay_ms(500)
    pwm[6]=pwm[7]
    pwm[7]=off_LED
    delay_ms(500)
    pwm[5]=pwm[6]
    pwm[6]=off_LED
    delay_ms(500)
    pwm[4]=pwm[5]
    pwm[5]=off_LED
    delay_ms(500)
    pwm[3]=pwm[4]
    pwm[4]=off_LED
    delay_ms(500)
    pwm[2]=pwm[3]
    pwm[3]=off_LED
    delay_ms(500)
    pwm[1]=pwm[2]
    pwm[2]=off_LED
    delay_ms(500)
    روی برنامه هایی که نوشتم خوب فکر کنید ... بسیار ساده است ولی با یه خورده تغییرات خاص میتوانید با همین تیکه های ساده افکتهای بسیار جالب تری ایجاد کنید ...

    موفق باشید

    اضافه شده در تاریخ : ببخشید یه نکته یادم رفت بگم ...
    اگر خواستید که خاموش نشود باید به جای off_LED از مقدار میانه PWM که تقریبا 50 میشود را مقدار دهی کنید که همین را میتوانید در بالا دیفاین کنید ...
    یا اینکه هر مقداری که دلخواهتون هست آن را مقداردهی یا در قسمت بالا آن عدد مورد نظر را دیفاین و از آن در برنامه نویسی استفاده کنید ...

    موفق باشید
    big likkkkkkkkkkkkkkkkkkkkkkkkkkkkke

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


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

    نوشته اصلی توسط Mohammad_2007
    ممنون ار پیگیریت سامان جان
    ببین منظور من اینه
    مثلا این افکت رو چطور باید توی برنامه شما بنویسم؟
    درضمن نمیخوام خاموش داشته باشم میخوام جای خاموش شدن کم نور بشن ، مثلا 1/3 نور اصلی

    کد:
    for(i=1;i<=128;i*=2)
    {
    PORTB=i;
    }
    ممنون از لطفت
    آهان ...
    اینجوری سوال رو مطرح میکردی بهتر متوجه میشدم ...
    دوستان عزیز دقت کنید که دیگه اینجا توی این برنامه نباید اینطور برنامه را نوشت چون به طور مداوم رجیستر PORTx در pwm در حال تغییر است ... بنابر این از این روش نباید پیش رفت ...
    باید کاری کنیم که مقدار pwmها یکی پس از دیگری مقدار داده شود و مقدار قبلی صفر شود ...
    بنابراین برنامه را باید به صورت کدهای زیر نوشت ...
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    for(x=1;x<9;x++)
    {
    	pwm[x] = on_LED;
    	delay_ms(500);
    }
    
    ===================================
    for(x=1;x<9;x++)pwm[x]=0;
    for(x=8;x>0;x--)
    {
    	pwm[x] = on_LED;
    	delay_ms(500);
    }
    
    ===================================
    for(x=1;x<9;x++)pwm[x]=0;
    pwm[1] = on_LED;
    for(x=1;x<8;x++)
    {
    	pwm[x+1] = pwm[x];
    	pwm[x] = off_LED;
    	delay_ms(500);
    }
    
    ===================================
    for(x=1;x<9;x++)pwm[x]=0;
    pwm[8] = on_LED;
    for(x=8;x>1;x--)
    {
    	pwm[x-1] = pwm[x];
    	pwm[x] = off_LED;
    	delay_ms(500);
    }
    برنامه ها را تک تک تحلیل میکنیم و به رفتارهای آنها می پردازیم ...
    این تیکه از برنامه:
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    for(x=1;x<9;x++)
    {
    	pwm[x] = on_LED;
    	delay_ms(500);
    }
    رفتار :
    کد:
    pwm[1]=0
    pwm[2]=0
    pwm[3]=0
    pwm[4]=0
    pwm[5]=0
    pwm[6]=0
    pwm[7]=0
    pwm[8]=0
    --------
    pwm[1]=on_LED
    delay_ms(500)
    pwm[2]=on_LED
    delay_ms(500)
    pwm[3]=on_LED
    delay_ms(500)
    pwm[4]=on_LED
    delay_ms(500)
    pwm[5]=on_LED
    delay_ms(500)
    pwm[6]=on_LED
    delay_ms(500)
    pwm[7]=on_LED
    delay_ms(500)
    pwm[8]=on_LED
    delay_ms(500)
    این تیکه از برنامه:
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    for(x=8;x>0;x--)
    {
    	pwm[x] = on_LED;
    	delay_ms(500);
    }
    رفتار :
    کد:
    pwm[1]=0
    pwm[2]=0
    pwm[3]=0
    pwm[4]=0
    pwm[5]=0
    pwm[6]=0
    pwm[7]=0
    pwm[8]=0
    --------
    pwm[8]=on_LED
    delay_ms(500)
    pwm[7]=on_LED
    delay_ms(500)
    pwm[6]=on_LED
    delay_ms(500)
    pwm[5]=on_LED
    delay_ms(500)
    pwm[4]=on_LED
    delay_ms(500)
    pwm[3]=on_LED
    delay_ms(500)
    pwm[2]=on_LED
    delay_ms(500)
    pwm[1]=on_LED
    delay_ms(500)
    این تیکه از برنامه:
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    pwm[1] = on_LED;
    for(x=1;x<8;x++)
    {
    	pwm[x+1] = pwm[x];
    	pwm[x] = off_LED;
    	delay_ms(500);
    }
    رفتار :
    کد:
    pwm[1]=0
    pwm[2]=0
    pwm[3]=0
    pwm[4]=0
    pwm[5]=0
    pwm[6]=0
    pwm[7]=0
    pwm[8]=0
    --------
    pwm[1]=on_LED
    --------
    pwm[2]=pwm[1]
    pwm[1]=off_LED
    delay_ms(500)
    pwm[3]=pwm[2]
    pwm[2]=off_LED
    delay_ms(500)
    pwm[4]=pwm[3]
    pwm[3]=off_LED
    delay_ms(500)
    pwm[5]=pwm[4]
    pwm[4]=off_LED
    delay_ms(500)
    pwm[6]=pwm[5]
    pwm[5]=off_LED
    delay_ms(500)
    pwm[7]=pwm[6]
    pwm[6]=off_LED
    delay_ms(500)
    pwm[8]=pwm[7]
    pwm[7]=off_LED
    delay_ms(500)
    این تیکه از برنامه:
    کد:
    for(x=1;x<9;x++)pwm[x]=0;
    pwm[8] = on_LED;
    for(x=8;x>1;x--)
    {
    	pwm[x-1] = pwm[x];
    	pwm[x] = off_LED;
    	delay_ms(500);
    }
    رفتار :
    کد:
    pwm[1]=0
    pwm[2]=0
    pwm[3]=0
    pwm[4]=0
    pwm[5]=0
    pwm[6]=0
    pwm[7]=0
    pwm[8]=0
    --------
    pwm[8]=on_LED
    --------
    pwm[7]=pwm[8]
    pwm[8]=off_LED
    delay_ms(500)
    pwm[6]=pwm[7]
    pwm[7]=off_LED
    delay_ms(500)
    pwm[5]=pwm[6]
    pwm[6]=off_LED
    delay_ms(500)
    pwm[4]=pwm[5]
    pwm[5]=off_LED
    delay_ms(500)
    pwm[3]=pwm[4]
    pwm[4]=off_LED
    delay_ms(500)
    pwm[2]=pwm[3]
    pwm[3]=off_LED
    delay_ms(500)
    pwm[1]=pwm[2]
    pwm[2]=off_LED
    delay_ms(500)
    روی برنامه هایی که نوشتم خوب فکر کنید ... بسیار ساده است ولی با یه خورده تغییرات خاص میتوانید با همین تیکه های ساده افکتهای بسیار جالب تری ایجاد کنید ...

    موفق باشید

    اضافه شده در تاریخ :
    نوشته اصلی توسط Mohammad_2007
    درضمن نمیخوام خاموش داشته باشم میخوام جای خاموش شدن کم نور بشن ، مثلا 1/3 نور اصلی
    ببخشید یه نکته یادم رفت بگم ...
    اگر خواستید که خاموش نشود باید به جای off_LED از مقدار میانه PWM که تقریبا 50 میشود را مقدار دهی کنید که همین را میتوانید در بالا دیفاین کنید ...
    یا اینکه هر مقداری که دلخواهتون هست آن را مقداردهی یا در قسمت بالا آن عدد مورد نظر را دیفاین و از آن در برنامه نویسی استفاده کنید ...

    موفق باشید

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

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