1

Тема: Двухканальный диммер Attiny13

Сгорел контроллер управления кольцевой светодиодной лампы.

Александр, можете помочь с реализацией на Аттини13?
Было 4 кнопки и два канала управления.
1. Вкл/выкл.
2. Режим(1 или 2 и 1+2).
3. Две кнопки яркости.

Хотелось бы получить тот же функционал.
Попадались схемы двухканальных диммеров, но регулировка была на переменных резисторах.

Думаю разработка была бы полезна и в других применениях.

2

Re: Двухканальный диммер Attiny13

Что за светодиодная лента? Чем управляется - ШИМ или цифра?
Кнопки 4 шт, зачем так много, что они делают, как подключены к контроллеру?

3 (2024-09-01 18:58:18 отредактировано Karl2233)

Re: Двухканальный диммер Attiny13

Не лента, лампа.
Круглая, там две ленты - теплая и холодная. Управление ШИМ.

Изначально четыре кнопки:
1. Вкл/выкл.
2. Режим (выбор типа освещения холодный, теплый два вместе).
3. Две кнопки регулировки яркости(+ и -).
Подключено так:
Из восьми ног сгоревшего контроллера: 1.две питание, 1 и 8.
2.две выход на полевые транзисторы, 2и 3.
3.одна на светодиод индикации ON/OFF и этот светодиод мигает при нажатии кнопок(режим и яркость),
4. кнопки висят на двух ногах,
5. ещё с одной ноги через резисторы сигнал идёт на затворы полевиков, 5 нога.
Вот фото платы, один в один как у меня.
http://forum.rcl-radio.ru/uploads/images/2024/09/4d16fe8d17618c1553849ce348e3e7e3.jpg


Думаю что такой огород городить нет смысла,  выключение можно сделать на кнопке "-" а включение на "+", и одна кнопка выбор режима(холодный, теплый и оба сразу).
Ну можно одну ногу на светодиод индикации - вкл/выкл и мигание при нажатии кнопки режима и яркости.

4

Re: Двухканальный диммер Attiny13

+5V --- 10кОм --- PB5  /// +5 V через резистор на PB5
индикатор индикации - нет свободного пина
eeprom яркости и режимов
кнопки - нажатие == замыкание на gnd

// PB3 PB4 === +-
// PB2 === SET
// PB0 PB1 === PWM

#include <avr/io.h>
#include <util/delay.h>

int a=0,set=0;
unsigned long milliss,times;
bool w;

int main(void) {
  cli();
  DDRB |= (1<<PB0)|(1<<PB1); 
  PORTB |= (1<<PB3)|(1<<PB4)|(1<<PB2); 
  TCCR0A = 0;
  TCCR0B = 0;
  TCNT0 = 0;
  TCCR0A |= (1<<COM0B1)|(1<<COM0A1);
  TCCR0A |= (1<<WGM01) | (1<<WGM00);
  TCCR0B |= (1 << CS01) | (1 << CS00); 
  a=EEPROM_read(0);
  set=EEPROM_read(1);
  OCR0B = a; 
  OCR0A = a;
  sei();  
  
while(1) { 
  if(((PINB >> PB3) & 1)==LOW){a++;if(a>255){a=255;}OCR0A=a;OCR0B=a;times=milliss;w=1;}
  if(((PINB >> PB4) & 1)==LOW){a--;if(a<0){a=0;}OCR0A=a;OCR0B=a;times=milliss;w=1;}
  if(((PINB >> PB2) & 1)==LOW){set++;if(set>3){set=0;}_delay_ms(300);EEPROM_write(1,set);
  }
  switch(set){
    case 0: TCCR0A &=~ (1<<COM0B1);TCCR0A |=(1<<COM0A1);break;
    case 1: TCCR0A &=~ (1<<COM0A1);TCCR0A |=(1<<COM0B1);break;
    case 2: TCCR0A |= (1<<COM0B1);TCCR0A |=(1<<COM0A1);break;
    case 3: TCCR0A &=~ (1<<COM0B1);TCCR0A &=~(1<<COM0A1);break;
    }
  milliss++;
  _delay_ms(20);
  if(milliss-times>20&&w==1){w=0;EEPROM_write(0,a);}
}}

unsigned char EEPROM_read(unsigned int uiAddress){
  while(EECR & (1<<EEPE));  // проверка готовности EEPROM 
    EEAR = uiAddress; // регистр адреса
    EECR |= (1<<EERE);// чтение EEPROM
    return EEDR; // вывод значения
}
 
void EEPROM_write(unsigned int uiAddress, unsigned char ucData){
  while(EECR & (1<<EEPE)); // проверка готовности EEPROM 
      EEAR = uiAddress; // регистр адреса
      EEDR = ucData; // регистр данных 
      EECR |= (1<<EEMPE);// Разрешение записи в EEPROM
      EECR |= (1<<EEPE); // Запись в EEPROM
} 
 

5

Re: Двухканальный диммер Attiny13

http://forum.rcl-radio.ru/uploads/images/2024/09/d73541b421419d44b55e52536c2287d4.png

6 (2024-09-02 20:33:09 отредактировано Karl2233)

Re: Двухканальный диммер Attiny13

Александр спасибо!
Только кнопка SET(PB2) странно работает - включает 1 порт или два вместе, но 2 порт отдельно не включает. Получается что из четырех режимов - два это выкл.
И ещё - фьюзы заводские?

7

Re: Двухканальный диммер Attiny13

http://forum.rcl-radio.ru/uploads/images/2024/09/4f50b2aff71fa4f3bbd2b4588476ac75.png
Нажать записать загрузчик (сделать один раз для записи фьюзов)

Только кнопка SET(PB2) странно работает - включает 1 порт или два вместе, но 2 порт отдельно не включает. Получается что из четырех режимов - два это выкл.

У меня работало верно, сначала один канал, потом второй, далее оба и 4 режим отключено оба.

Завтра посмотрю еще раз, перепроверю.


Вот код выбора режима работы

    case 0: TCCR0A &=~ (1<<COM0B1);TCCR0A |=(1<<COM0A1);break;//  канал А активен , канал  B не активен
    case 1: TCCR0A &=~ (1<<COM0A1);TCCR0A |=(1<<COM0B1);break;// канал А не активен , канал  B активен
    case 2: TCCR0A |= (1<<COM0B1);TCCR0A |=(1<<COM0A1);break;// оба канала активны
    case 3: TCCR0A &=~ (1<<COM0B1);TCCR0A &=~(1<<COM0A1);break;// каналы не активные в биты регистра (TCCR0A) COM0B1 и COM0A1 записаны нули

8 (2024-09-03 05:15:30 отредактировано Karl2233)

Re: Двухканальный диммер Attiny13

Спасибо!
Ага, про назначение этого куска кода я догадался, даже попробовал менять... Но бестолку.

Правда Ваши комментарии к коду немного запутали - после загрузки, как я понимаю, case 0, но включены оба канала.

9

Re: Двухканальный диммер Attiny13

Все еще раз проверил, все работает как надо, шим регуируется, каналы переключаются. К выходам шим подключал светодиоды.

10

Re: Двухканальный диммер Attiny13

http://forum.rcl-radio.ru/uploads/images/2024/09/e11fd2dd42c125a97d78c3727ba505ac.jpg

http://forum.rcl-radio.ru/uploads/images/2024/09/da5b918c46bf9b9504c818189940741b.jpg

http://forum.rcl-radio.ru/uploads/images/2024/09/934e31c9db74188c1920c354beb09b3e.jpg

http://forum.rcl-radio.ru/uploads/images/2024/09/c0bd47d113d52324f13b5e4fd7c8ecf5.jpg

11 (2024-09-03 21:20:55 отредактировано Karl2233)

Re: Двухканальный диммер Attiny13

Всё работает как надо, спасибо Александр!
Проблема была в светодиодах - зеленый и красный.
Зеленый отказывался работать без красного, хотя вместе зажигались.
Когда поставил оба красных, всё заработало!
Ещё раз - спасибо!
Бутылка рома с меня.

P. S. Про индикацию режима вкл и мигание светодиодом при нажатии кнопок - есть же вывод reset  или можно было б на аналоговый вывод кнопки "+/-" подцепить?
Но то такое, и так всё отлично работает.

12

Re: Двухканальный диммер Attiny13

Завтра попробую поработать с пином reset, пока не знаю как его переназначить, при подачи на него GND всегда происходит перезагрузка контроллера. Буду думать.

13

Re: Двухканальный диммер Attiny13

Нашел информацию:

Первый состоит в том, что у МК есть специальный флаг (fuse) RSTDISBL, который, будучи запрограммированным (установленным в «0») превращает вывод RESET в обычный порт ввода-вывода, который можно использовать наряду с другими. Этот способ прост, но имеет один существенный недостаток: после такого переключения МК невозможно будет запрограммировать с помощью низковольтного программатора, обычно самого распространенного типа устройств. Если вы вдруг захотите зашить в МК новую программу, потребуется программатор, использующий напряжение 12Вольт на выводе RESET.

14

Re: Двухканальный диммер Attiny13

Есть вариант использовать только 2 кнопки

10 - нажата первая +++
01 - нажата вторая ---
11 - нажаты обе === как нажатие кнопки SET

15

Re: Двухканальный диммер Attiny13

liman324 пишет:

Есть вариант использовать только 2 кнопки

10 - нажата первая +++
01 - нажата вторая ---
11 - нажаты обе === как нажатие кнопки SET

Вполне себе годный вариант.
Про reset  знаю, собрал себе доктора на такой случай.

16

Re: Двухканальный диммер Attiny13

10 - нажата первая +++
01 - нажата вторая ---
11 - нажаты обе === как нажатие кнопки SET

индикатор на pb2

// PB3 PB4 === +-|set
// PB2 === led

#include <avr/io.h>
#include <util/delay.h>

int a=0,set=0;
unsigned long milliss,times;
bool w;

int main(void) {
  cli();
  DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2);
  PORTB |= (1<<PB3)|(1<<PB4);
  TCCR0A = 0;
  TCCR0B = 0;
  TCNT0 = 0;
  TCCR0A |= (1<<COM0B1)|(1<<COM0A1);
  TCCR0A |= (1<<WGM01) | (1<<WGM00);
  TCCR0B |= (1 << CS01) | (1 << CS00); 
  a=EEPROM_read(0);
  set=EEPROM_read(1);
  OCR0B = a; 
  OCR0A = a;
  sei();  
  
while(1) { 
  if(((PINB >> PB3) & 1)==LOW && ((PINB >> PB4) & 1)==HIGH){a++;if(a>255){a=255;}OCR0A=a;OCR0B=a;times=milliss;w=1;PORTB |= (1<<PB2);}
  if(((PINB >> PB4) & 1)==LOW && ((PINB >> PB3) & 1)==HIGH){a--;if(a<0){a=0;}OCR0A=a;OCR0B=a;times=milliss;w=1;PORTB |= (1<<PB2);}
  
  if(((PINB >> PB4) & 1)==LOW && ((PINB >> PB3) & 1)==LOW){set++;if(set>3){set=0;}PORTB |= (1<<PB2);_delay_ms(300);EEPROM_write(1,set);
  }
  switch(set){
    case 0: TCCR0A &=~ (1<<COM0B1);TCCR0A |=(1<<COM0A1);break;
    case 1: TCCR0A &=~ (1<<COM0A1);TCCR0A |=(1<<COM0B1);break;
    case 2: TCCR0A |= (1<<COM0B1);TCCR0A |=(1<<COM0A1);break;
    case 3: TCCR0A &=~ (1<<COM0B1);TCCR0A &=~(1<<COM0A1);break;
    }
  milliss++;
  _delay_ms(20);
  PORTB &=~ (1<<PB2);
  if(milliss-times>20&&w==1){w=0;EEPROM_write(0,a);}
}}

unsigned char EEPROM_read(unsigned int uiAddress){
  while(EECR & (1<<EEPE));  // проверка готовности EEPROM 
    EEAR = uiAddress; // регистр адреса
    EECR |= (1<<EERE);// чтение EEPROM
    return EEDR; // вывод значения
}
 
void EEPROM_write(unsigned int uiAddress, unsigned char ucData){
  while(EECR & (1<<EEPE)); // проверка готовности EEPROM 
      EEAR = uiAddress; // регистр адреса
      EEDR = ucData; // регистр данных 
      EECR |= (1<<EEMPE);// Разрешение записи в EEPROM
      EECR |= (1<<EEPE); // Запись в EEPROM
} 
 

17 (2024-09-04 18:50:56 отредактировано Karl2233)

Re: Двухканальный диммер Attiny13

Вау!
Класс!
Всё работает как надо!
Данке, Александр!
А можно, что б светодиод в режиме "выкл" не светился, а во всех остальных - светился и при нажатии кнопок не загорался как сейчас, а наоборот происходило б гашение(нажал=погас) ?

18

Re: Двухканальный диммер Attiny13

Подключил chat GPT  для комментариев к коду.
Пока нифига не понятно: как сделать работу светодиода индикации hmm

19

Re: Двухканальный диммер Attiny13

Вам нужно инвертировать работу светодиода, что бы он всегда горел, а при нажатии кнопок происходило гашение. Но при переходе в режим OFF светодиод гас?
Я верно все понял?

20

Re: Двухканальный диммер Attiny13

Да, всё верно.
Режим 0,1,2 - светодиод светит, при нажатии(во время нажатия) гаснет.
Режим 3 - не светит.

21

Re: Двухканальный диммер Attiny13

// PB3 PB4 === +-
// PB2 === led

#include <avr/io.h>
#include <util/delay.h>

int a=0,set=0;
unsigned long milliss,times;
bool w;

int main(void) {
  cli();
  DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2);
  PORTB |= (1<<PB3)|(1<<PB4);
   
  TCCR0A = 0;
  TCCR0B = 0;
  TCNT0 = 0;
  TCCR0A |= (1<<COM0B1)|(1<<COM0A1);
  TCCR0A |= (1<<WGM01) | (1<<WGM00);
  TCCR0B |= (1 << CS01) | (1 << CS00); 
  a=EEPROM_read(0);
  set=EEPROM_read(1);
  OCR0B = a; 
  OCR0A = a;
  sei();  
  
while(1) { 
  if(((PINB >> PB3) & 1)==LOW && ((PINB >> PB4) & 1)==HIGH){a++;if(a>255){a=255;}OCR0A=a;OCR0B=a;times=milliss;w=1;PORTB &=~ (1<<PB2);}
  if(((PINB >> PB4) & 1)==LOW && ((PINB >> PB3) & 1)==HIGH){a--;if(a<0){a=0;}OCR0A=a;OCR0B=a;times=milliss;w=1;PORTB &=~ (1<<PB2);}
  
  if(((PINB >> PB4) & 1)==LOW && ((PINB >> PB3) & 1)==LOW){set++;if(set>3){set=0;}PORTB &=~ (1<<PB2);_delay_ms(300);EEPROM_write(1,set);
  }
  switch(set){
    case 0: TCCR0A &=~ (1<<COM0B1);TCCR0A |=(1<<COM0A1);break;
    case 1: TCCR0A &=~ (1<<COM0A1);TCCR0A |=(1<<COM0B1);break;
    case 2: TCCR0A |= (1<<COM0B1);TCCR0A |=(1<<COM0A1);break;
    case 3: TCCR0A &=~ (1<<COM0B1);TCCR0A &=~(1<<COM0A1);break;
    }
  milliss++;
  _delay_ms(20);
 if(set<3){PORTB |= (1<<PB2);} else{PORTB &=~ (1<<PB2);}
  if(milliss-times>20&&w==1){w=0;EEPROM_write(0,a);}
}}

unsigned char EEPROM_read(unsigned int uiAddress){
  while(EECR & (1<<EEPE));  // проверка готовности EEPROM 
    EEAR = uiAddress; // регистр адреса
    EECR |= (1<<EERE);// чтение EEPROM
    return EEDR; // вывод значения
}
 
void EEPROM_write(unsigned int uiAddress, unsigned char ucData){
  while(EECR & (1<<EEPE)); // проверка готовности EEPROM 
      EEAR = uiAddress; // регистр адреса
      EEDR = ucData; // регистр данных 
      EECR |= (1<<EEMPE);// Разрешение записи в EEPROM
      EECR |= (1<<EEPE); // Запись в EEPROM
} 
 

22

Re: Двухканальный диммер Attiny13

Спасибо Александр!
Всё как надо у Вас получилось smile