RGB светодиод, INT0 прерывание и все это для ATtiny13
- Сообщения: 75
- Зарегистрирован: Сб апр 20, 2013 23:15:21
у нас же единственный таймер занят переполнением для изменения цвета....короче простите я ничего не понял(можно пожалуйста на примере?так проще разбираться...
- Реклама
- Сообщения: 75
- Зарегистрирован: Сб апр 20, 2013 23:15:21
ребят помогите пожалуйста кто может...стою на месте...(
в переменные добавляем:в код обработчика прерывания добавляем:в главном цикле пишем
Код: Выделить всё
volatile unsigned short timer;
#define MAX_TIMER 1000 /* 1000*26,6us = 26,6ms */Код: Выделить всё
if(timer<MAX_TIMER)
timer++;Код: Выделить всё
if(timer==MAX_TIMER){
timer=0; /* очередной запуск таймера на временной интервал MAX_TIMER */
compare_pwm(); /* функция для примера, тут пишется все, что нужно выполнять по таймеру */
}Ставим плюсы: )
- Сообщения: 75
- Зарегистрирован: Сб апр 20, 2013 23:15:21
извините я не понимаю, я не программист....ничего не получается(
может есть вариант уменьшить размер кода другим методом?
может есть вариант уменьшить размер кода другим методом?
так вам уже все расписали конкретно что и как сделать. Если не понятно что такое объявление переменных и код обработчика прерывания, то нужно книжки читать.
Код прерывания в студии и winavr всегда начинается с ISR()
главный цикл это то, что после while (1) идет.
Ну а объявление переменных это после #include <> сразу можно вставить.
Код прерывания в студии и winavr всегда начинается с ISR()
главный цикл это то, что после while (1) идет.
Ну а объявление переменных это после #include <> сразу можно вставить.
- Реклама
- Сообщения: 75
- Зарегистрирован: Сб апр 20, 2013 23:15:21
ладно что то не выходит ничего(
оставлю пока что этот код, он в принципе пашет удволетворительно)))сойдет пока что)
если что знаю куда обращаться)спасибо большое всем за помощь)
если кому какое содействие нужно, в германии,радиодетали, пишите)
оставлю пока что этот код, он в принципе пашет удволетворительно)))сойдет пока что)
если что знаю куда обращаться)спасибо большое всем за помощь)
если кому какое содействие нужно, в германии,радиодетали, пишите)
Код: Выделить всё
#define F_CPU 9600000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/sleep.h>
unsigned char e;
unsigned char state = 0;
void abc(unsigned char a, unsigned char b, unsigned char c, unsigned char status);
unsigned char pwm[3]={255,255,255};
unsigned char to[3]={255,255,255};
int main(void)
{
DDRB = 0b00011001;
PORTB = 0b00011011;
ACSR = (1<<ACD);
GIMSK = (1<<INT0);
TCCR0B = (1<<CS00);
TIMSK0 = (1<<TOIE0);
sei();
while(1){
if (pwm[0]<to[0]) pwm[0]++;
if (pwm[0]>to[0]) pwm[0]--;
if (pwm[1]<to[1]) pwm[1]++;
if (pwm[1]>to[1]) pwm[1]--;
if (pwm[2]<to[2]) pwm[2]++;
if (pwm[2]>to[2]) pwm[2]--;
if(pwm[0]==to[0]&&pwm[1]==to[1]&&pwm[2]==to[2]){
to[0]=rand()%255;
to[1]=rand()%255;
to[2]=rand()%255;
}
_delay_ms(25); //задержка для заметности изменения цвета или скорость изменения цвета
if (state == 0){
sleep_disable();
} else {
PORTB |= 0b00011001;
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
}
}
}
ISR(TIM0_OVF_vect)
{
if(++e == 0)
PORTB |= 0b00011001;
else {
if(pwm[0] == e)
PORTB &= ~(1<<3);
if(pwm[1] == e)
PORTB &= ~(1<<4);
if(pwm[2] == e)
PORTB &= ~(1<<0);
}
}
ISR(INT0_vect) {
state ^= 0x01;
PORTB |= 0b00011001;
_delay_ms(1000);
}


