rgb led attiny13

Модератор: boogyman

Ответить
Аватара пользователя
netman13
Новичок
Сообщения: 6
Зарегистрирован: 25 янв 2013, 05:26

rgb led attiny13

#1

Сообщение netman13 »

Здравствуйте!
этот код написан в WinAVR для attiny13
скажите почему игнорируется, не работает кнопка на PB3?
алгоритм должен быть следующим:


1. При подаче питания (включении) цвета плавно медленно перетекают,
2. Одно быстрое нажатие на кнопку ставит цвет на паузу
3. Одно быстрое нажатие на кнопку в режиме паузы: цвета плавно медленно перетекают
4. Одно долгое (удерживаемое) нажатие: цвета быстро перетекают (типа перемотка) во время нажатия,
5. Отпустили кнопку и цвета перетекают в обычном режиме

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

#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 1200000UL
#define output_low(port,pin) port &= ~(1<<pin)
#define output_high(port,pin) port |= (1<<pin)
#define set_output(portdir,pin) portdir |= (1<<pin)

#define RED PB0
#define GREEN PB1
#define BLUE PB2
#define BUTTON PB3  // if you shorted to ground

volatile int SPEED = 15;
volatile int count = 0;

typedef struct {
   int red;
   int green;
   int blue;
} rgb;
rgb channels = { 0x00, 0x00, 0x00 };

#define DEBUG_MODE 0
#define RAINBOW_MODE 1
#define SOLID_MODE 2

int lighting_mode;

// overflow interrupt timer
ISR(TIM0_OVF_vect) { 
  TCNT0  = 230;
  if ((PINB & (1 << BUTTON)) !== 1) {     // pressed, there was a bounce
    count++;                             
	if (count>2) {                       // made sure that the button is actually pressed
	  lighting_mode = SOLID_MODE;        // stopped changing colors
	}
	
	if (count>70) {                      // if you hold the button for over 1.5 seconds
	  lighting_mode = RAINBOW_MODE;
	  SPEED = 3;                         // rewind
	}
  }
  else {
    count = 0;
	SPEED = 15;
    lighting_mode = RAINBOW_MODE;
  } 
}

void rainbow_step(void) {

   if(channels.blue > 0x00 && channels.red == 0xFF && channels.green == 0x00) {
      channels.blue--;
   }
   if(channels.blue == 0xFF && channels.red < 0xFF && channels.green == 0x00) {
      channels.red++;
   }
   
   if(channels.green > 0x00 && channels.blue == 0xFF && channels.red == 0x00) {
      channels.green--;
   }
   if(channels.green == 0xFF && channels.blue < 0xFF && channels.red == 0x00) {
      channels.blue++;
   }

   if(channels.red > 0x00 && channels.green == 0xFF && channels.blue == 0x00) {
      channels.red--;
   }
   if(channels.red == 0xFF && channels.green < 0xFF && channels.blue == 0x00) {
      channels.green++;
   }
}


void solid_step(void) {
}

void do_pwm(int r_duty, int g_duty, int b_duty, int rate) {
   int i;

   while (rate != 0) {

      PORTB |= (1<<RED) | (1<<GREEN) | (1<<BLUE);
      
      for (i=0; i < 255; i++) {
         if (i == r_duty)
            output_low(PORTB, RED);
         if (i == g_duty)
            output_low(PORTB, GREEN);
         if (i == b_duty)
            output_low(PORTB, BLUE);
      }
      rate--;
   }
}

void init(void) {
   channels.red = 0xFF;
   lighting_mode = RAINBOW_MODE;
   
   DDRB &= ~(1<<PB3);    // PB3 configure the input
   PORTB |= (1 << PB3);  // Pullup Power
 
   set_output(DDRB, RED); 
   set_output(DDRB, GREEN);
   set_output(DDRB, BLUE);
}
                       
int main(void)
{
  init();

  // timer
  TCCR0A = 0;
  TCCR0B = 0b00000101; //divider
  TCNT0  = 230;
  TIMSK0 = 0b00000010; // Resolution overflow interrupt
       
  sei();
  while (1) {
  switch (lighting_mode) {
         case DEBUG_MODE:
            break;
         case RAINBOW_MODE:
            rainbow_step();
            break;
         case SOLID_MODE:
            solid_step();
            break;
         default:
            lighting_mode = RAINBOW_MODE;
      }
      do_pwm(channels.red, channels.green, channels.blue, SPEED);
  }
  return 0;
}
Аватара пользователя
AntonChip
Администратор
Сообщения: 265
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: rgb led attiny13

#2

Сообщение AntonChip »

Сразу видна ошибка

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

if ((PINB & (1 << BUTTON)) !== 1)
Должно быть

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

if ((PINB & (1 << BUTTON)) != 1)
Аватара пользователя
netman13
Новичок
Сообщения: 6
Зарегистрирован: 25 янв 2013, 05:26

Re: rgb led attiny13

#3

Сообщение netman13 »

все равно не работает
Аватара пользователя
AntonChip
Администратор
Сообщения: 265
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: rgb led attiny13

#4

Сообщение AntonChip »

При коротком нажатии вызывается функция void solid_step(void) {}, а она пустая, пауза работать не будет. Длинное нажатие работает, происходит быстрое перетекание цветов.
Аватара пользователя
netman13
Новичок
Сообщения: 6
Зарегистрирован: 25 янв 2013, 05:26

Re: rgb led attiny13

#5

Сообщение netman13 »

покажите пожалуйста какой Makefile должен быть
Аватара пользователя
AntonChip
Администратор
Сообщения: 265
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: rgb led attiny13

#6

Сообщение AntonChip »

netman13 писал(а):покажите пожалуйста какой Makefile должен быть

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

###############################################################################
# Makefile for the project rgb_attiny13
###############################################################################

## General Flags
PROJECT = rgb_attiny13
MCU = attiny13
TARGET = rgb_attiny13.elf
CC = avr-gcc

CPP = avr-g++

## Options common to compile, link and assembly rules
COMMON = -mmcu=$(MCU)

## Compile options common for all C compilation units.
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d 

## Assembly specific flags
ASMFLAGS = $(COMMON)
ASMFLAGS += $(CFLAGS)
ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2

## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS +=  -Wl,-Map=rgb_attiny13.map


## Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom -R .fuse -R .lock -R .signature

HEX_EEPROM_FLAGS = -j .eeprom
HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings


## Objects that must be built in order to link
OBJECTS = rgb_attiny13.o 

## Objects explicitly added by the user
LINKONLYOBJECTS = 

## Build
all: $(TARGET) rgb_attiny13.hex rgb_attiny13.eep rgb_attiny13.lss size

## Compile
rgb_attiny13.o: ../rgb_attiny13.c
	$(CC) $(INCLUDES) $(CFLAGS) -c  $<

##Link
$(TARGET): $(OBJECTS)
	 $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)

%.hex: $(TARGET)
	avr-objcopy -O ihex $(HEX_FLASH_FLAGS)  $< $@

%.eep: $(TARGET)
	-avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0

%.lss: $(TARGET)
	avr-objdump -h -S $< > $@

size: ${TARGET}
	@echo
	@avr-size -C --mcu=${MCU} ${TARGET}

## Clean target
.PHONY: clean
clean:
	-rm -rf $(OBJECTS) rgb_attiny13.elf dep/* rgb_attiny13.hex rgb_attiny13.eep rgb_attiny13.lss rgb_attiny13.map


## Other dependencies
-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)

Аватара пользователя
netman13
Новичок
Сообщения: 6
Зарегистрирован: 25 янв 2013, 05:26

Re: rgb led attiny13

#7

Сообщение netman13 »

при компиляции вылетает ошибка:
> "make.exe" all
makefile:50: *** missing separator. Stop.

> Process Exit Code: 2
> Time Taken: 00:00

50ая строка это: $(CC) $(INCLUDES) $(CFLAGS) -c $<
где тут что пропущено?
Аватара пользователя
AntonChip
Администратор
Сообщения: 265
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: rgb led attiny13

#8

Сообщение AntonChip »

У меня все нормально скомпилировалось, оставляю проект AVRStudio4
Вложения
rgb_attiny13.rar
Проект AVRStudio4
(25.8 КБ) 1938 скачиваний
Аватара пользователя
netman13
Новичок
Сообщения: 6
Зарегистрирован: 25 янв 2013, 05:26

Re: rgb led attiny13

#9

Сообщение netman13 »

Все отлично работает! Цвета перематываются! Подскажите как паузу грамотно реализовать.
Покажите код пофиксеный с паузой рабочей
Аватара пользователя
netman13
Новичок
Сообщения: 6
Зарегистрирован: 25 янв 2013, 05:26

Re: rgb led attiny13

#10

Сообщение netman13 »

неужели никто не подскажет?
Аватара пользователя
garik816
Новичок
Сообщения: 2
Зарегистрирован: 04 фев 2015, 19:52

Re: rgb led attiny13

#11

Сообщение garik816 »

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

ISR(TIM0_OVF_vect) { 
  TCNT0  = 230;
  if ((PINB & (1 << BUTTON)) !== 1) {     // pressed, there was a bounce
    count++;                             
   if (count>2) {                       // made sure that the button is actually pressed
     lighting_mode = SOLID_MODE;        // stopped changing colors
   }
   
   if (count>70) {                      // if you hold the button for over 1.5 seconds
     lighting_mode = RAINBOW_MODE;
     SPEED = 3;                         // rewind
   }
  }
  else {
    count = 0;
   SPEED = 15;
  } 
}
здесь убрал "lighting_mode = RAINBOW_MODE;" в else
и подредактировал count
теперь распознает быстрое и медленное нажатие
Аватара пользователя
garik816
Новичок
Сообщения: 2
Зарегистрирован: 04 фев 2015, 19:52

Re: rgb led attiny13

#12

Сообщение garik816 »

что прописать здесь, чтобы текущий цвет пульсировал?

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

    void solid_step(void) {

    }
Ответить