RGB светодиод, INT0 прерывание и все это для ATtiny13

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 75
Зарегистрирован: Сб апр 20, 2013 23:15:21

Сообщение robototechnik »

у нас же единственный таймер занят переполнением для изменения цвета....короче простите я ничего не понял(можно пожалуйста на примере?так проще разбираться...
Реклама
Открыл глаза
Сообщения: 75
Зарегистрирован: Сб апр 20, 2013 23:15:21

Сообщение robototechnik »

ребят помогите пожалуйста кто может...стою на месте...(
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

в переменные добавляем:

Код: Выделить всё

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

Сообщение robototechnik »

извините я не понимаю, я не программист....ничего не получается(
может есть вариант уменьшить размер кода другим методом?
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

так вам уже все расписали конкретно что и как сделать. Если не понятно что такое объявление переменных и код обработчика прерывания, то нужно книжки читать.

Код прерывания в студии и winavr всегда начинается с ISR()
главный цикл это то, что после while (1) идет.
Ну а объявление переменных это после #include <> сразу можно вставить.
Контактная информация:
Реклама
Открыл глаза
Сообщения: 75
Зарегистрирован: Сб апр 20, 2013 23:15:21

Сообщение 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);
}
Реклама
Ответить

Вернуться в «AVR»