диммер attiny13

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

диммер attiny13

Сообщение 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 КБ) 984 скачивания
не ругайте за то что цикл в прерывании
делал и с флагами

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

Re: диммер attiny13

Сообщение Alkul »

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

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

Re: диммер attiny13

Сообщение sirha »

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

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

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

Re: диммер attiny13

Сообщение uk8amk »

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

Re: диммер attiny13

Сообщение Alkul »

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

Re: диммер attiny13

Сообщение sirha »

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

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

Re: диммер attiny13

Сообщение Jeka_M »

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

Re: диммер attiny13

Сообщение 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 раза.
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Re: диммер attiny13

Сообщение Alkul »

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

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

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

Re: диммер attiny13

Сообщение sirha »

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

Re: диммер attiny13

Сообщение ncp1400 »

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

Re: диммер attiny13

Сообщение 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.
Как можно по другому сделать ?
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: диммер attiny13

Сообщение 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);

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

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

Re: диммер attiny13

Сообщение 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
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: диммер attiny13

Сообщение ARV »

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

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

Re: диммер attiny13

Сообщение Serzh2000 »

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

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

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

Re: диммер attiny13

Сообщение ARV »

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

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

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

Re: диммер attiny13

Сообщение Dimon456 »

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

Re: диммер attiny13

Сообщение ARV »

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

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

Re: диммер attiny13

Сообщение Serzh2000 »

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

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

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