Страница 3 из 3
Re: RGB светодиод, INT0 прерывание и все это для ATtiny13
Добавлено: Пт апр 26, 2013 23:28:04
robototechnik
у нас же единственный таймер занят переполнением для изменения цвета....короче простите я ничего не понял(можно пожалуйста на примере?так проще разбираться...
Re: RGB светодиод, INT0 прерывание и все это для ATtiny13
Добавлено: Пт апр 26, 2013 23:38:55
robototechnik
ребят помогите пожалуйста кто может...стою на месте...(
Re: RGB светодиод, INT0 прерывание и все это для ATtiny13
Добавлено: Сб апр 27, 2013 13:31:37
ibiza11
в переменные добавляем:
Код: Выделить всё
volatile unsigned short timer;
#define MAX_TIMER 1000 /* 1000*26,6us = 26,6ms */
в код обработчика прерывания добавляем:
в главном цикле пишем
Код: Выделить всё
if(timer==MAX_TIMER){
timer=0; /* очередной запуск таймера на временной интервал MAX_TIMER */
compare_pwm(); /* функция для примера, тут пишется все, что нужно выполнять по таймеру */
}
Re: RGB светодиод, INT0 прерывание и все это для ATtiny13
Добавлено: Вс апр 28, 2013 15:12:46
robototechnik
извините я не понимаю, я не программист....ничего не получается(
может есть вариант уменьшить размер кода другим методом?
Re: RGB светодиод, INT0 прерывание и все это для ATtiny13
Добавлено: Вс апр 28, 2013 18:49:02
vitalik_1984
так вам уже все расписали конкретно что и как сделать. Если не понятно что такое объявление переменных и код обработчика прерывания, то нужно книжки читать.
Код прерывания в студии и winavr всегда начинается с ISR()
главный цикл это то, что после while (1) идет.
Ну а объявление переменных это после #include <> сразу можно вставить.
Re: RGB светодиод, INT0 прерывание и все это для ATtiny13
Добавлено: Вт апр 30, 2013 18:18:45
robototechnik
ладно что то не выходит ничего(
оставлю пока что этот код, он в принципе пашет удволетворительно)))сойдет пока что)
если что знаю куда обращаться)спасибо большое всем за помощь)
если кому какое содействие нужно, в германии,радиодетали, пишите)
Код: Выделить всё
#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);
}