Страница 3 из 6
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Вт сен 24, 2013 12:58:59
Naman_S
транзистор можно любой, главное чтобы управлялось через плюс, и сразу поясню почему все так, шим будет управлять двумя цепочками диодов, каждая из которых состоит из трех последовательно включенных диодов, но это не диодная лента, диоды стоят на плате и минус там везде общий, поэтому и нет возможности управлять яркостью через минус, вот собственно почему изобретается такой велосипед с управлением через плюс.
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Вт сен 24, 2013 20:35:36
vitalik_1984
Ну вот наконец конструктивный ответ

можно было сразу так ответить, может бы меньше ссылками закидывали.
Вот рабочий вариант
Номиналы примерные. Нужно учитывать характеристики транзисторов.
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Ср сен 25, 2013 11:10:27
Naman_S
vitalik_1984 спасибо помог, все работает, вопрос еще такой а как можно реализовать подобное но с полевиком, т.е. чтобы обычный транзюк управлял полевиком, где то на этом форуме находил подобное но там народ так и не пришел к конечному решению
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Ср сен 25, 2013 23:28:04
vitalik_1984
Вопрос в том, какой бюджет проекта. Вообще есть специальные драйверы для полевиков, а есть и вовсе полевики с управлением от 5 вольт. TTL совместимые так сказать.
Вот можно такой схемой на худой конец.
Только нужно смотреть какое там максимальное напряжение на затворе. Если меньше 12,то ставить делитель на резисторах.
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Чт сен 26, 2013 23:49:03
Naman_S
схему собрал, но с прошивкой так до конца никак не разберусь, как только пишу строки для работы с eeprom так прошивка начинает вести себя не пойми как, ни одно значение яркости не запоминается и энкодер во втором режиме вообще ничего не делает, как только убираю эти строки работают оба режима и энкодер в обоих режимах и прибавляет и убавляет. Пролез уже все темы где люди работают с памятью, вроде все делаю так но не работает, кто понимает как правильно это организовать поделитесь информацией
Спойлер
Код: Выделить всё
/***
Управляем светодиодом с помощью энкодера ***/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
unsigned char ee_zn EEMEM;//* переменная размером в 2 байта в EEPROM
volatile char pwm_counter, my_y,my_b, button = 0;
// Обработчик прерывания int0
ISR(SIG_INTERRUPT0)
{
_delay_us(50);
if((PIND & (1 << PD2))==0)
{
_delay_us(50);
if((PIND & (1 << PD0))==0)
{
if(button == 0) //
{
my_y--;
}
if(button == 1) //
{
my_b--;
}
}
else
{
if(button == 0) //
{
my_y++;
}
if(button == 1) //
{
my_b++;
}
}
}
GIFR = (1<<INTF0);
return;
}
ISR (TIMER0_OVF_vect)
{
{
if (button == 0)
{
if (pwm_counter++ > 128)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_y)
PORTB |= (1 << PB0);
}
}
{
if (button == 1)
{
if (pwm_counter++ > 128)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_b)
PORTB |= (1 << PB0);
}
}
}
// Главная функция
int main (void)
{
DDRB |= (1 << PB0); // выходы
PORTB = 0x00;
DDRD |= (0 << PD4)|(0 << PD2)|(0 << PD1)|(0 << PD0); // входы
PORTD |= (1 << PD2)|(1 << PD1)|(1 << PD0)|(1 << PD4); // подключаем подтягивающие резисторы
TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0
TCCR0 |= (1 << CS00);
MCUCR |= (0 << ISC00)|(1 << ISC01); // прерывание по заднему фронту INT0(по спаду импульса)
GIFR |= (1 << INTF0); // очищаем флаг внешнего прерывания
GICR |= (1 << INT0); // разрешаем внешние прерывания INT0
sei(); //глобально разрешаем прерывания
{
while(1)
if((PIND&(1 << PD4))==0)// первый режим
{
button = 0;
_delay_ms(10);
//my_y = eeprom_read_byte(&ee_zn); // считали значение из EEPROM
_delay_ms(100);
if((PIND & (1 << PD1))==1) // если нажата кнопка энкодера
{
while((PIND&(1 << PD1))==0){} //ждем отпускания кнопки
//eeprom_write_byte(&ee_zn, my_y ); // записываем 1 значение в EEPROM;
_delay_ms(100);
}
}
}
{
while(2)
if((PIND&(1 << PD4))==1) //второй режим пока нажата кнопка
{
button = 1;
_delay_ms(10);
//my_b = eeprom_read_byte(&ee_zns);
_delay_ms(100);// считали 2 значение из EEPROM
if((PIND & (1 << PD1))==1) // если нажата кнопка энкодера
{
while((PIND&(1 << PD1))==0){} // ждем отпускания кнопки
//eeprom_write_byte(&ee_zns, my_b );// записываем 2 значение в EEPROM;
_delay_ms(100);// ждем отпускания кнопки энкодера
}
}
}
}
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 00:37:36
vitalik_1984
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 07:38:53
Naman_S
второй цикл который выполняется когда зажата кнопка, вообщем вот грубо говоря что я пытался сделать, у устройства два режима работы один когда кнопка поключенная на pd4 не нажата и второй когда она нажата, т.е. вот как я себе представляю все это дело пишем два цикла, у одного условие когда кнопка нажата у второго условие когда отпущена. далее когда цикл начинается он считывает значение из переменной и появляется наша сохранненная яркость, далее если мы изменили яркость нажимаем кнопку энкодера и яркость записалась в память.
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 10:36:11
vitalik_1984
Так никто не делает. Цикл вечный и во второй никак не попадет, либо не выйдет.
Нужно пересмотреть логику и подумать как еще можно сделать.
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 11:03:20
Naman_S
почему не выйдет, кнопка не просто нажимается и отпускается а именно зажимается
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 11:19:16
YS
почему не выйдет
Потому, что циклу плевать на кнопки, если только они не проверяются в его условии или при проверке в теле цикла не происходит выхода по break.
А вообще, код без форматирования ОЧЕНЬ трудно читать и анализировать. Но break, например, я там нигде не вижу.
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 11:27:39
Naman_S
может так и есть, но что с чтением и записью значения переменной
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 12:34:22
YS
В приведенном коде обращение к EEPROM вообще закомментировано...
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 12:36:43
Naman_S
ну это я закоментировал пока эксперементировал
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 14:43:32
vitalik_1984
Код: Выделить всё
while(1)
if((PIND&(1 << PD4))==0)// первый режим
{
Кошмар, где фигурная скобка бесконечного цикла? этот код вообще компилируется?
Приду домой проверю интересно посмотреть на маты компилятора

Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 15:46:48
Naman_S
{
while(1) думаю она все таки на месте, код компилируется без ошибок
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 16:41:12
YS
где фигурная скобка бесконечного цикла? этот код вообще компилируется?
Все норм, код выглядит так:
Соответственно, смысл в том, что if выполняется бесконечно. Если условие if неверно, получается цикл с проверкой if'а без выполнения его тела. А так все синтаксически корректно.
{
while(1) думаю она все таки на месте
Скобка должна стоять после цикла. Только в этом случае от нее будет ожидаемый эффект. А так-то в фигурные скобки конструкции можно заключать произвольно...
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 19:02:27
Naman_S
ну так у кого какие варианты организации циклов
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 19:46:32
vitalik_1984
Это не у кого какие, а как работать будет
Если предположим записать так:
Код: Выделить всё
{
while (1)
if ((PIND&(1 << PD4))==0)
{
...
}
portb=0xFF;//Сюда никогда не попадем
}
Порт Б никогда не поменяет свое состояние
Зато если цикл организовать ПРАВИЛЬНО
Вот так :
Код: Выделить всё
while ((PIND&(1 << PD4))==0)
{
...
portb=0xFF;
}
То будет гут
Либо вариант с выходом из вечности.
Код: Выделить всё
while (1)
{
...
if ((PIND&(1 << PD4))==0){break;}
}
portb=0xFF;//Сюда попадем сразу после выхода из условно бесконечного цикла
YS писал(а):Все норм, код выглядит так:
Да я то понимаю как код выглядит. Это я решил проверить как молодой кот осознает зачем какая скобка нужна.
И мой совет почитать хотя бы азы
Керниган и Риччи для начала.
В данном случае, конечно ошибок не будет, так как всего один оператор if в вечном цикле, но все же лучше ставить, чтобы не попасть потом в просак.
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 19:57:29
Naman_S
не совсем понял из твоего поста как организовать обо цикла, и зачем нужно это portb=0xFF?
И только пожалуйста разъясни попроще, я не программер, си учил только в инсте и то уже ничего не помню, поэтому и написал все так криво
Re: Шим регулятор яркости светодиодов на atmega8
Добавлено: Пт сен 27, 2013 20:03:00
Naman_S
break это насколько я могу понять вывод из цикла то есть когда условие не выполняется break прерывает цикл это я прваильно понял?