Спойлер
Код: Выделить всё
Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#include <delay.h>
volatile int pwm_counter,R,G,B,scena=1,i;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
//Обработка событий вращения экодера
delay_us(50);
if((PIND&(1 << PORTD2))==0)
{
delay_us(50);
if((PIND&(1 << PORTD0))==0)
{
//Уменьшение яркости LED RGB
R-=17;
if(R < 1)
R = 1;
G-=17;
if(G < 1)
G = 1;
B-=17;
if(B < 1)
B = 1;
}
else
{
//Увеличение яркости LED RGB
R+=17;
if(R > 255)
R = 255;
G+=17;
if(G > 255)
G = 255;
B+=17;
if(B > 255)
B = 255;
}
}
GIFR = (1<<INTF0); // очищаем флаг внешнего прерывания
return;
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// программный ШИМ
if (pwm_counter++ > 255)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > R)
PORTB |= (1 << PORTB0);
if (pwm_counter > G)
PORTB |= (1 << PORTB1);
if (pwm_counter > B)
PORTB |= (1 << PORTB2);
}
// Declare your global variables here
void main(void)
{
//Инициализация портов
DDRB |= (1 << PORTB5)|(1 << PORTB4)|(1 << PORTB3)|(1 << PORTB2)|(1 << PORTB1)|(1 << PORTB0);// выходы
PORTB = 0x00;
DDRD |= (0 << PORTD2)|(0 << PORTD1)|(0 << PORTD0); // входы
PORTD |= (1 << PORTD2)|(1 << PORTD1)|(1 << PORTD0); // подключаем подтягивающие резисторы
TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0
TCCR0 |= (1 << CS00);
MCUCR |= (0 << ISC00)|(1 << ISC01);
GIFR |= (1 << INTF0);
GICR |= (1 << INT0);
#asm("sei")
while (1)
{
//Плавное включение RGB LED в течении 6,5 сек при вкл. питания
if (i<255)
{
R=i;
G=i;
B=i;
delay_ms(10);
i++;
}
// Присвоение выходам портов переменных значений для отображения
PORTB |= (1 << PORTB3);
PORTB |= (1 << PORTB4);
PORTB |= (1 << PORTB5);
}
}Вот код где дополнительно добавил выбор политры:
Код: Выделить всё
Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#include <delay.h>
volatile int pwm_counter,R,G,B,scena=1,i,button;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
//Обработка событий вращения экодера
delay_us(50);
if((PIND&(1 << PORTD2))==0)
{
delay_us(50);
if((PIND&(1 << PORTD0))==0)
{
//Уменьшение яркости LED RGB
R-=17;
if(R < 1)
R = 1;
G-=17;
if(G < 1)
G = 1;
B-=17;
if(B < 1)
B = 1;
if(button==0)
{
if (scena == 1) {if(G<255) G+=15; else scena = 2;}
if (scena == 2) {if(R>0) R-=15; else scena = 3;}
if (scena == 3) {if(B<255) B+=15; else scena = 4;}
if (scena == 4) {if(G>0) G-=17; else scena = 5;}
if (scena == 5) {if(R<255) R+=17; else scena = 6;}
if (scena == 6) {if(B>0) B-=17; else scena = 1;}
}
}
else
{
//Увеличение яркости LED RGB
R+=17;
if(R > 255)
R = 255;
G+=17;
if(G > 255)
G = 255;
B+=17;
if(B > 255)
B = 255;
if(button==1)
{
if (scena == 1) {if(G>0) G-=15; else scena = 6;}
if (scena == 2) {if(R<255) R+=15; else scena = 1;}
if (scena == 3) {if(B>0) B=R-15; else scena = 2;}
if (scena == 4) {if(G<255) G+=15; else scena = 3;}
if (scena == 5) {if(R>0) R-=15; else scena = 4;}
if (scena == 6) {if(B<255) B=R+15; else scena = 5;}
}
}
}
GIFR = (1<<INTF0); // очищаем флаг внешнего прерывания
return;
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// программный ШИМ
if (pwm_counter++ > 255)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > R)
PORTB |= (1 << PORTB0);
if (pwm_counter > G)
PORTB |= (1 << PORTB1);
if (pwm_counter > B)
PORTB |= (1 << PORTB2);
}
// Declare your global variables here
void main(void)
{
//Инициализация портов
DDRB |= (1 << PORTB5)|(1 << PORTB4)|(1 << PORTB3)|(1 << PORTB2)|(1 << PORTB1)|(1 << PORTB0);// выходы
PORTB = 0x00;
DDRD |= (0 << PORTD2)|(0 << PORTD1)|(0 << PORTD0); // входы
PORTD |= (1 << PORTD2)|(1 << PORTD1)|(1 << PORTD0); // подключаем подтягивающие резисторы
TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0
TCCR0 |= (1 << CS00);
MCUCR |= (0 << ISC00)|(1 << ISC01);
GIFR |= (1 << INTF0);
GICR |= (1 << INT0);
#asm("sei")
while (1)
{ //Плавное включение RGB LED при вкл. питания
if (i<255)
{
R=i;
G=i;
B=i;
delay_ms(10);
i++;
}
//Обработка события нажатия кнопки энкодера
if((PIND&(1 << PORTD1))==0) // если нажата кнопка
{ button=0;
while((PIND&(1 << PORTD1))==0){} // ждем отпускания кнопки
button++;
delay_ms(100);
if(button == 10)
button = 0;
}
//Выбор сцены цветовой политры
if((PIND&(1 << PORTD2)|(1 << PORTD0))==0)
{
scena++;
if (scena==6)
scena=1;
}
// Присвоение выходам портов переменных значений для отображения
PORTB |= (1 << PORTB3);
PORTB |= (1 << PORTB4);
PORTB |= (1 << PORTB5);
}
}За написание кода не ругайте. Как писал ранее я первый раз пишу программным языком, да ещё для мк. Я не электронщик и много в этой области не знаю, могу толко собрать готовую схему в DIP Trace развести для этого плату, да лутом её сделать, ну пару раз недавно прошил два мк. Да прошу к Datasheet не отсылать с англиским полный ноль, помогите с кодом или примерами кода, думую, что голова не совсем дурная, как нибуть разбирусь.
И ещё подскажите, как реализовать плавного гашение светодиодов при выключении питания и занесение данных в память при выключении питания при условии что были сделаны изменения в настроках политры и яркости и они отличаются от тех, что уже имеются в памяти мк. На форуме я уже читал по поводу отслеживания напряжения на порте AIN, но не совсем все понял, если можно пример кода на основе моего примера выше.

