диммер attiny13

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

диммер для лампы
подскажите пожалуйста как сделать чтобы при коротком нажатии кнопки свет не горел ,а при длинном все работало(когда жму долго кнопку яркость начинает увеличиваться,когда дошла пика при долгом нажатии кнопки яркость начинает падать)
с увеличением и уменьшением яркости все работает нормально а во с коротким нажатием не знаю как сделать
:

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

#include <tiny13.h>
#include <delay.h>
    float i=43;
    float t=0;                                            
                         
int b,c;

//внешнее прерывание
interrupt [EXT_INT0] void TO (void)

{
//////////////////
  if (b)
{  
i=(float)(i+0.03);          //увеличиваем яркость
 } 
////////////////// 
  if (c)
{  
i=(float)(i-0.03);          //уменьшаем яркость
 } 
/////////////////
   while(t<i)
   {    
    t=(float)(t+0.1);        //цикл увеличения или уменьшения яркости
    delay_us(1);
    }  
    t=0; 
    PORTB.2=1;

}


void main(void)

{

#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_          //делитель частоты генератора
#pragma optsize+
#endif

PORTB=0b00001000;
DDRB=0x04;
GICR=0b01000000;         //вкл внешнее прерывание
MCUCR=0x01;                //вкл прерывание по спаду и по возраст
#asm ("sei")                    //разреш глоб прерывания

////////////////////////////////////////////////////////////


label0:  
while(1)

{   
  
     while(i<45)

 {  c=0;
    if((!PINB.3)&(i<44)){b=1;}
    else {b=0;}
    if ((!PINB.3)&(i>43))
    {goto label1;}
    
    PORTB.2=0; 
   }
 
    i=0;
  
}

///////////////////////////////////////////////

label1:  
while(1)

{  
     
     while(i<45)

 {  b=0;
    if((!PINB.3)&(i<44)&(i>2)){c=1;}
    else {c=0;}
    if ((!PINB.3)&(i<2))
    {goto label0;}
    
    PORTB.2=0; 
   }
 
    i=0;
  
}
}
123.jpg
(147.63 КБ) 988 скачиваний
не ругайте за то что цикл в прерывании
делал и с флагами

вот думал как правильно сделать эту кнопку чтобы уместить весь проект в attiny13
подскажите алгоритм
Реклама
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

sirha писал(а):уместить весь проект в attiny13
Ну конечно, такой простенький проект, как диммер вы пишете на Си, да еще используете плавающую точку... :facepalm:
sirha писал(а):подскажите алгоритм
1. Отказаться от Си, перейти на ассемблер.
2. Если отказаться от Си никак, то хотя бы плавающую точку не использовать.

А сам алгоритм такой:
1. Генерацию отпирающих симистор импульсов делать через аппаратный ШИМ таймера 0.
2. Кнопку "посадить" на INT0, детектор "0" на какой-нибудь вывод, допускающий обработку прерывания по PCINT.
Для распознавания короткого и длинного нажатия самое простое - сделать в начале обработчика циклический опрос кнопки в течение, допустим, 300 мс. Если по истечении этого времени кнопки отпущена - значит, было короткое нажатие, генерацию импульсов на ШИМ прекращать. Если по истечении этого времени кнопка все еще нажата, то зарегистрировано длинное нажатие, изменить параметр ШИМ и выйти. Но логичней сделать наоборот - короткое нажатие изменяет яркость, длинное - выключает свет.
При начальном запуске генерации синхронизировать ШИМ и переход фазы через "0". Можно еще через каждые 65535 тысяч отпирающих испульсов выполнять новую синхронизацию с переходом фазы через "0".
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Alkul писал(а): Ну конечно, такой простенький проект, как диммер вы пишете на Си, да еще используете плавающую точку... :facepalm:

1. Отказаться от Си, перейти на ассемблер.
2. Если отказаться от Си никак, то хотя бы плавающую точку не использовать.
спасибо))

скажите а без плавающей точки я разве смогу плавно перемещать шим в интервале 0.01 сек?
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Можно сделать и более короткий интервал без плавающей точки.
float нужен при работе со сложными алгоритмами и тригонометрическими функциями. И то во многих случаях можно обойтись fixed-point вычислениями. Во всяких мигалках типа этой его применение избыточно.
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

sirha писал(а):а без плавающей точки я разве смогу плавно перемещать шим в интервале 0.01 сек?
Что может этому помешать? Для ШИМ-генерации эти 0.01 секунды все равно условные "попугаи".
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Alkul писал(а):
sirha писал(а):Для ШИМ-генерации эти 0.01 секунды все равно условные "попугаи".
А причем тут ШИМ?

Я ведь буду токо генерировать ШИМ,а мне же его нужно не изменять по ширине а перемещать импульс относительно перехода через 0,
для этого нужно создавать цикл (тоесть делать паузу после прохождения 0)
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 101
Зарегистрирован: Пт окт 03, 2014 14:50:06

Сообщение Jeka_M »

Зачем привязываться к секундам? Работайте с миллисекундами (1 мс = 0,001 с) и микросекундами (1 мкс = 0,000001 с).
sirha писал(а): скажите а без плавающей точки я разве смогу плавно перемещать шим в интервале 0.01 сек?
А вы его перемещайте в интервале 10 мс, и не нужна плавающая точка.
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

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

#include <tiny13.h>
#include <delay.h>


interrupt [PCINT3] void TO (void)

{

    TCCR0B = (1 << CS00) ;
    OCR0A=10;
    
}


void main(void)

{

#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

PORTB=0b00000010;
DDRB= 0b00000001;
TCCR0A = (1 << COM0A0) | (1 << WGM00);
PCMSK=(1<<PCINT3);
GIMSK=(1<<PCIE);


#asm ("sei")

////////////////////////////////////////////////////////////

 
while(1)

{  
 delay_us(50);
 TCCR0B = 0x00 ;   
 }
   
  
  
}

Подскажите что не так,не привязать шим к детектору 0
Последний раз редактировалось sirha Сб апр 25, 2015 19:18:59, всего редактировалось 4 раза.
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

sirha писал(а):подскажите а почему переменная "a" не увеличивается на 1 если я держу копку (поставил return чтобы если держу кнопку меньше чем 100 то "a" не увеличивается)
Вот эта конструкция

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

while(a<100)                                                
{a++;return;}
вроде должна работать, но я на СИ для контроллеров не программирую, поэтому не могу сказать, верно ли Вы оформили сам обработчик прерывания.
И вообще мне непонятна ваша работа с переменной а. Вы делаете на ней антидребезг и её же используете для расчета ШИМ?
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Alkul писал(а): И вообще мне непонятна ваша работа с переменной а. Вы делаете на ней антидребезг и её же используете для расчета ШИМ?
Я хотел организовать не анти дребезг ,а опрос кнопки (отличить короткое от длинного нажатия) с помощью переменной a
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт янв 08, 2015 00:58:11

Сообщение ncp1400 »

2-канальный диммер на Attiny13 (подходит и для св.диодов, если симисторы заменить полевиками, и запитать от пост. напряжения):
sch.png
(16.42 КБ) 1144 скачивания
управление - резисторами или кнопками. Короткое нажатие - вкл/выкл, длительное - настройка яркости, есть антидребезг.
проект с исходниками (под AVR-GCC):
t13-dim.zip
(151.48 КБ) 515 скачиваний
фьюзы: Low = 0x2A , High = 0xFB
Открыл глаза
Сообщения: 79
Зарегистрирован: Пт июн 15, 2012 13:11:36

Сообщение yron »

Всем привет , играюсь с ШИМом на тини13 и зашел в тупик. Хочу сделать импульсный стабилизатор тока с измерением тока по АЦП. Пробовал так
float tok[5]={2,2.5,3,3.5,4};
char a=0;
if(a==0){
OCR0B=0x7f;
a=1;}
delay_us(100);
OCR0B=tok[0]/(((0.043*adc_data[1])/0.02)/OCR0B); // высчитываю ОСR0B для тока 2А

В таком виде не хватает памяти и есть риск умножения на 0.
Как можно по другому сделать ?
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

На подобных контроллерах лучше вообще не использовать float и деление.
Вычисления с нецелочисленными множителями можно получать умножением-сдвигом.
Например в вашем случае (0.043*adc_data[1])/0.02) упрощаем до
k=0.043/0.02=2.15
Чтобы получить близкое значение будем умножать на 275 и сдвигать вправо на 7 разрядов.
Т.е. 275/128=2,1484375 что очень близко к 2.15.
Таким образом выражение будет иметь вид:
OCR0B=tok[0]/((adc_data[1]*275)>>7)/OCR0B);

Дальше упростите сами.

ЗЫ. Умножение на ноль не так страшно как деление
Открыл глаза
Сообщения: 79
Зарегистрирован: Пт июн 15, 2012 13:11:36

Сообщение yron »

uk8amk писал(а):На подобных контроллерах лучше вообще не использовать float и деление.
Вычисления с нецелочисленными множителями можно получать умножением-сдвигом.
Например в вашем случае (0.043*adc_data[1])/0.02) упрощаем до
k=0.043/0.02=2.15
Чтобы получить близкое значение будем умножать на 275 и сдвигать вправо на 7 разрядов.
Т.е. 275/128=2,1484375 что очень близко к 2.15.
Таким образом выражение будет иметь вид:
OCR0B=tok[0]/((adc_data[1]*275)>>7)/OCR0B);

Дальше упростите сами.

ЗЫ. Умножение на ноль не так страшно как деление
Да деление на ноль ) Я перепутал )
Спасибо , про сдвиг я совсем забыл.
Еще я сделал так, но шим бегает от 0 до 255.
tok[5]={5,8,11,15,18} // 2 - 2.5 - 3 - 3.5 - 4 A
if(adc_data[1]>tok[0]+1){OCR0B=--;}
if(adc_data[1]<tok[0]-1){OCR0B=++;}
Ацп к опорным 1.1в , вход от 0.04В при 2 А , 0.08В при 4А, значения АЦП 5-20. Напряжение низкие на входе , может стоит использовать компаратор а не АЦП ?
Стабильность тока нужна в пределе +-0.2А, шунт 0.02 ома , нагрузка- спираль электронной сигареты 1-1.5 ом

Сделала так , протеус зависает ))))
if(adc_data[1]>0){
c=(275*adc_data[1])>>7;
OCR0B=tok/((c*10)/OCR0B);}
else{OCR0B=0xff;}
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Alkul писал(а):1. Отказаться от Си, перейти на ассемблер.
не пугайте начинающих!
Я делал на Си диммер на тини13 с дистанционным ИК-управлением с режимом обучения командам пульта, так что тупое кнопочное управление - это вообще фигня!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »

Я делал на Си диммер на тини13
очень интересно посмотреть на него, особенно в код заглянуть.
может он сохранился и вы любезно покажете его?

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

https://radiokot.ru/forum/viewtopic.php ... 5#p3900975
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Serzh2000 писал(а):в код заглянуть
заглядывайте - код прилагаю. там же проект протеуса, но сильно-сильно урезанный.
описание "схемы", т.е. распиновка, в файле dimmer.h
комментов много, думаю, все понятно.
в этом проекте ориентир на дистанционку стандарта RC5, как правило, вся техника PHILIPS управляется им, я использовал пульт от CD-балалайки-магнитолки.

Добавлено after 1 minute 29 seconds:
Serzh2000 писал(а):я тут для болгарки мастерю диммер
для болгарки лучше с МК не связываться, ибо замучаетесь бороться с помехами от её коллектора.
Вложения
RC5_DIMMER1.ZIP
(79.84 КБ) 370 скачиваний
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Давайте я еще пять капель добавлю:
Перепробовал кучу детекторов нуля, и самый лучший (помехозащищенный) оказался на ОУ
СпойлерИзображение
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

в случае применения AVR схема вырождается до 2 резисторов - на входы аналогового компаратора, встроенного в каждый AVR. а если идти чуть дальше, то хватит и одного резистора и любого входа, генерирующего запрос на прерывание при любой смене уровня.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »

Спасибо есть над чем подумать... :beer:

Добавлено after 15 minutes 7 seconds:
для болгарки лучше с МК не связываться, ибо замучаетесь бороться с помехами от её коллектора.
а что есть печальный опыт? и на чем же лучше сделать? потому как покупного не видел. или диммер или плавный пуск. :dont_know:
что посоветуете?
Ответить

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