Показать сообщение отдельно
Старый 31.05.2016, 15:26   #4 (permalink)
wss60
Member
 
Аватар для wss60
 
Регистрация: 09.08.2015
Адрес: Minsk
Сообщений: 245
Сказал(а) спасибо: 12
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 3649
По умолчанию

У меня получилось как-то так:
Код:
// winavr

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>


volatile unsigned char pwm;             // шим
volatile unsigned char pwm_counter; // яркость
		 unsigned char rev;        // переключение режимов
		 

int main(void)
{

	DDRB = 0x01;
	
	TCCR0 |= (0<<CS02)|(1<<CS01)|(0<<CS00); // настройка тактирования таймера
	TIMSK |= (1<<TOIE0);                    // настройка прерывания по переполнению
	sei();	                                // включить глобальные прерывания
	
	
	while(1)
	{
		// плавное мигание светодиодом
		switch(rev)
		{
			case 0:	// плавное разгорание
				pwm_counter++;
				if(pwm_counter == 255)
				{
					rev = 1;
				};_delay_ms(4); // время разгорания
			break;
			case 1: // плавное затухание
				pwm_counter--;
				if(pwm_counter == 0)
				{
					rev = 0;
				};_delay_ms(6); // время затухания
			break;
		}
	}
}

SIGNAL(TIMER0_OVF_vect)
{
	TCNT0 = 200; // частота шим

	// программный  ШИМ
	if(pwm++ < pwm_counter)
	{
		PORTB|=_BV(0); // зажечь светодиод
	}else{
		PORTB&=~_BV(0);// погасить светодиод
	}
	
	
}
wss60 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070