Давайте сделаем плавную цифровую регулировку яркости светодиода. Для плавной регулировки используем ШИМ. Широтно-импульсная модуляция (ШИМ, англ. Pulse-width modulation (PWM)).
Для этого запустим Code Vision AVR, в многих микроконтроллерах есть встроенный ШИМ, выберем следующие установки:
Для реализации ШИМ*а используем Timer 0 Вот подчищаем код и дописываем: #include <mega16.h> #include <delay.h> // Declare your global variables here
void main(void) { // Declare your local variables here
// Input/Output Ports initialization // Port A 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=P State0=P PORTA=0x03; DDRA=0x00;
// Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T PORTB=0x00; DDRB=0x08;
// 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=0x00;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 125,000 kHz // Mode: Fast PWM top=FFh // OC0 output: Non-Inverted PWM TCCR0=0x6B; TCNT0=0x00; OCR0=0x00;
while (1) { // Place your code here if((PINA.0==0)&(OCR0!=0xff)) // увеличивать пока не достигло максиума { delay_ms(10); // задержка 10 мс. OCR0+=1; //увеличиваем заполнение } if((PINA.1==0)&(OCR0!=0x00)) // уменьшать пока не достигло миниума { delay_ms(10); // задержка 10 мс. OCR0-=1; //уменьшаем заполнение } }; }
Собираем схему:
Все файлы проекта в закладке «Файлы». Огромная благодарность KDAlex'y)))
|