В программке 3 ШИМа для управления RGB диодом. Скважность зависит от частоты входного сигнала на входе INT0.
ШИМ работает номрально, а для счета импульсов за период времени задействовал Таймер 0.
Но не считате, Где то ошибочка.
Код: Выделить всё
#include <avr/io.h>
#define F_CPU 8000000UL //8MHz
#include <util/delay.h>
#include <avr/interrupt.h>
volatile unsigned char Tic_Count = 0;
volatile unsigned char i = 0;
volatile unsigned char i_Count = 10;
#define BLUE_PB 1
#define BLUE_PWM OCR1A
#define RED_PB 2
#define RED_PWM OCR1B
#define GREEN_PB 3
#define GREEN_PWM OCR2
ISR( INT0_vect ) // прерывание по внешнему сигналу
{
Tic_Count ++;
}
ISR (TIMER0_OVF_vect)
{
TCNT0 = 60; // переполнение через 25мС
i_Count--;
if(i_Count == 0)
{
i_Count = 10;
i = Tic_Count;
Tic_Count = 0x00;
}
}
int main(void)
{ //---------- настройка пинов МК
DDRB |= (1<<BLUE_PB) | (1<<RED_PB) | (1<<GREEN_PB); // на выход RGB
PORTB &= ~((1<<BLUE_PB) | (1<<RED_PB) | (1<<GREEN_PB));
DDRD |= (1<<2); // PD2 на вход (INT0)
PORTD |= (1 << 2); // Включение подтягивающего резистора
MCUSR |= (1 << ISC00) | (1 << ISC01); // Передний фронт сигнала
GICR = (1 << INT0); // Включение входа прерывания
sei(); /* Общее разрешение прерываний */
//-----------------инициализация Таймер 1---------------
TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10);
TCNT1 = 0x00;
ICR1 = 0xFF;
OCR1A = 0x00;
OCR1B = 0x00;
//-------------инициализация Таймер 2----------------------------
TCCR2 |= (1 << COM21) | (1 << WGM21) | (1 << WGM20) | (1 << CS20);
TCNT2 = 0x00;
OCR2 = 0x00;
//-------------инициализация Таймер 0--------------------------------
TCCR0 = 0b00000101; // Т0 на внутр.такт, делитель 1024
TCNT0 = 60; // переполнение через 25мС
i_Count = 10;
TIMSK |= (1 << TOIE0); /* Разрешить прерывание по
переполн.Т0*/
sei();
while(1)
{
//---------------------------------
if (i>26)
{
BLUE_PWM = 0;
RED_PWM = 255;
GREEN_PWM = 0;
}
//----------------------------------
if (i>15)
{
BLUE_PWM = 250;
RED_PWM = 250;
GREEN_PWM = 250;
}
if (i<8)
{
BLUE_PWM = 0;
RED_PWM = 0; // зеленый
GREEN_PWM = 250;
}
}
}


