Страница 1 из 1
диммер attiny13
Добавлено: Сб апр 25, 2015 09:41:01
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;
}
}
не ругайте за то что цикл в прерывании
делал и с флагами
вот думал как правильно сделать эту кнопку чтобы уместить весь проект в attiny13
подскажите алгоритм
Re: диммер attiny13
Добавлено: Сб апр 25, 2015 11:33:45
Alkul
sirha писал(а):уместить весь проект в attiny13
Ну конечно, такой простенький проект, как диммер вы пишете на Си, да еще используете плавающую точку...
sirha писал(а):подскажите алгоритм
1. Отказаться от Си, перейти на ассемблер.
2. Если отказаться от Си никак, то хотя бы плавающую точку не использовать.
А сам алгоритм такой:
1. Генерацию отпирающих симистор импульсов делать через аппаратный ШИМ таймера 0.
2. Кнопку "посадить" на INT0, детектор "0" на какой-нибудь вывод, допускающий обработку прерывания по PCINT.
Для распознавания короткого и длинного нажатия самое простое - сделать в начале обработчика циклический опрос кнопки в течение, допустим, 300 мс. Если по истечении этого времени кнопки отпущена - значит, было короткое нажатие, генерацию импульсов на ШИМ прекращать. Если по истечении этого времени кнопка все еще нажата, то зарегистрировано длинное нажатие, изменить параметр ШИМ и выйти. Но логичней сделать наоборот - короткое нажатие изменяет яркость, длинное - выключает свет.
При начальном запуске генерации синхронизировать ШИМ и переход фазы через "0". Можно еще через каждые 65535 тысяч отпирающих испульсов выполнять новую синхронизацию с переходом фазы через "0".
Re: диммер attiny13
Добавлено: Сб апр 25, 2015 12:28:03
sirha
Alkul писал(а):
Ну конечно, такой простенький проект, как диммер вы пишете на Си, да еще используете плавающую точку...
1. Отказаться от Си, перейти на ассемблер.
2. Если отказаться от Си никак, то хотя бы плавающую точку не использовать.
спасибо))
скажите а без плавающей точки я разве смогу плавно перемещать шим в интервале 0.01 сек?
Re: диммер attiny13
Добавлено: Сб апр 25, 2015 13:11:59
uk8amk
Можно сделать и более короткий интервал без плавающей точки.
float нужен при работе со сложными алгоритмами и тригонометрическими функциями. И то во многих случаях можно обойтись fixed-point вычислениями. Во всяких мигалках типа этой его применение избыточно.
Re: диммер attiny13
Добавлено: Сб апр 25, 2015 13:15:12
Alkul
sirha писал(а):а без плавающей точки я разве смогу плавно перемещать шим в интервале 0.01 сек?
Что может этому помешать? Для ШИМ-генерации эти 0.01 секунды все равно условные "попугаи".
Re: диммер attiny13
Добавлено: Сб апр 25, 2015 14:02:29
sirha
Alkul писал(а):sirha писал(а):Для ШИМ-генерации эти 0.01 секунды все равно условные "попугаи".
А причем тут ШИМ?
Я ведь буду токо генерировать ШИМ,а мне же его нужно не изменять по ширине а перемещать импульс относительно перехода через 0,
для этого нужно создавать цикл (тоесть делать паузу после прохождения 0)
Re: диммер attiny13
Добавлено: Сб апр 25, 2015 15:14:52
Jeka_M
Зачем привязываться к секундам? Работайте с миллисекундами (1 мс = 0,001 с) и микросекундами (1 мкс = 0,000001 с).
sirha писал(а):
скажите а без плавающей точки я разве смогу плавно перемещать шим в интервале 0.01 сек?
А вы его перемещайте в интервале 10 мс, и не нужна плавающая точка.
Re: диммер attiny13
Добавлено: Сб апр 25, 2015 15:46:16
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
Re: диммер attiny13
Добавлено: Сб апр 25, 2015 19:12:40
Alkul
sirha писал(а):подскажите а почему переменная "a" не увеличивается на 1 если я держу копку (поставил return чтобы если держу кнопку меньше чем 100 то "a" не увеличивается)
Вот эта конструкция
вроде должна работать, но я на СИ для контроллеров не программирую, поэтому не могу сказать, верно ли Вы оформили сам обработчик прерывания.
И вообще мне непонятна ваша работа с переменной а. Вы делаете на ней антидребезг и её же используете для расчета ШИМ?
Re: диммер attiny13
Добавлено: Сб апр 25, 2015 19:42:49
sirha
Alkul писал(а):
И вообще мне непонятна ваша работа с переменной а. Вы делаете на ней антидребезг и её же используете для расчета ШИМ?
Я хотел организовать не анти дребезг ,а опрос кнопки (отличить короткое от длинного нажатия) с помощью переменной a
Re: диммер attiny13
Добавлено: Сб май 16, 2015 17:02:29
ncp1400
2-канальный диммер на Attiny13 (подходит и для св.диодов, если симисторы заменить полевиками, и запитать от пост. напряжения):
управление - резисторами или кнопками. Короткое нажатие - вкл/выкл, длительное - настройка яркости, есть антидребезг.
проект с исходниками (под AVR-GCC):
фьюзы: Low = 0x2A , High = 0xFB
Re: диммер attiny13
Добавлено: Ср янв 27, 2016 14:33:42
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.
Как можно по другому сделать ?
Re: диммер attiny13
Добавлено: Ср янв 27, 2016 15:21:05
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);
Дальше упростите сами.
ЗЫ. Умножение на ноль не так страшно как деление
Re: диммер attiny13
Добавлено: Ср янв 27, 2016 16:01:33
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;}
Re: диммер attiny13
Добавлено: Ср янв 27, 2016 17:45:20
ARV
Alkul писал(а):1. Отказаться от Си, перейти на ассемблер.
не пугайте начинающих!
Я делал на Си диммер на тини13 с дистанционным ИК-управлением с режимом обучения командам пульта, так что тупое кнопочное управление - это вообще фигня!
Re: диммер attiny13
Добавлено: Сб окт 03, 2020 09:32:16
Serzh2000
Я делал на Си диммер на тини13
очень интересно посмотреть на него, особенно в код заглянуть.
может он сохранился и вы любезно покажете его?
я тут для болгарки мастерю диммер, но он не получается...
понятно, что Вы человек занятой, но может поможете...
https://radiokot.ru/forum/viewtopic.php ... 5#p3900975
Re: диммер attiny13
Добавлено: Вс окт 04, 2020 17:48:16
ARV
Serzh2000 писал(а):в код заглянуть
заглядывайте - код прилагаю. там же проект протеуса, но сильно-сильно урезанный.
описание "схемы", т.е. распиновка, в файле dimmer.h
комментов много, думаю, все понятно.
в этом проекте ориентир на дистанционку стандарта RC5, как правило, вся техника PHILIPS управляется им, я использовал пульт от CD-балалайки-магнитолки.
Добавлено after 1 minute 29 seconds:
Serzh2000 писал(а):я тут для болгарки мастерю диммер
для болгарки лучше с МК не связываться, ибо замучаетесь бороться с помехами от её коллектора.
Re: диммер attiny13
Добавлено: Вс окт 04, 2020 20:36:45
Dimon456
Давайте я еще пять капель добавлю:
Перепробовал кучу детекторов нуля, и самый лучший (помехозащищенный) оказался на ОУ
Спойлер

Re: диммер attiny13
Добавлено: Вс окт 04, 2020 20:44:10
ARV
в случае применения AVR схема вырождается до 2 резисторов - на входы аналогового компаратора, встроенного в каждый AVR. а если идти чуть дальше, то хватит и одного резистора и любого входа, генерирующего запрос на прерывание при любой смене уровня.
Re: диммер attiny13
Добавлено: Вс окт 04, 2020 21:27:01
Serzh2000
Спасибо есть над чем подумать...
Добавлено after 15 minutes 7 seconds:
для болгарки лучше с МК не связываться, ибо замучаетесь бороться с помехами от её коллектора.
а что есть печальный опыт? и на чем же лучше сделать? потому как покупного не видел. или диммер или плавный пуск.
что посоветуете?