Шим регулятор яркости светодиодов на atmega8
Re: Шим регулятор яркости светодиодов на atmega8
транзистор можно любой, главное чтобы управлялось через плюс, и сразу поясню почему все так, шим будет управлять двумя цепочками диодов, каждая из которых состоит из трех последовательно включенных диодов, но это не диодная лента, диоды стоят на плате и минус там везде общий, поэтому и нет возможности управлять яркостью через минус, вот собственно почему изобретается такой велосипед с управлением через плюс.
- Реклама
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Шим регулятор яркости светодиодов на atmega8
Ну вот наконец конструктивный ответ
можно было сразу так ответить, может бы меньше ссылками закидывали.
Вот рабочий вариант
Номиналы примерные. Нужно учитывать характеристики транзисторов.
Вот рабочий вариант
Номиналы примерные. Нужно учитывать характеристики транзисторов.
- Вложения
-
- Вот.rar
- (11.22 КБ) 255 скачиваний
Re: Шим регулятор яркости светодиодов на atmega8
vitalik_1984 спасибо помог, все работает, вопрос еще такой а как можно реализовать подобное но с полевиком, т.е. чтобы обычный транзюк управлял полевиком, где то на этом форуме находил подобное но там народ так и не пришел к конечному решению
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Шим регулятор яркости светодиодов на atmega8
Вопрос в том, какой бюджет проекта. Вообще есть специальные драйверы для полевиков, а есть и вовсе полевики с управлением от 5 вольт. TTL совместимые так сказать.
Вот можно такой схемой на худой конец.
Только нужно смотреть какое там максимальное напряжение на затворе. Если меньше 12,то ставить делитель на резисторах.
Вот можно такой схемой на худой конец.
Только нужно смотреть какое там максимальное напряжение на затворе. Если меньше 12,то ставить делитель на резисторах.
- Вложения
-
- P-channel.rar
- (11.73 КБ) 195 скачиваний
Re: Шим регулятор яркости светодиодов на atmega8
схему собрал, но с прошивкой так до конца никак не разберусь, как только пишу строки для работы с 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);// ждем отпускания кнопки энкодера
}
}
}
}- Реклама
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Шим регулятор яркости светодиодов на atmega8
Что это вообще?
Код: Выделить всё
while(2)
Re: Шим регулятор яркости светодиодов на atmega8
второй цикл который выполняется когда зажата кнопка, вообщем вот грубо говоря что я пытался сделать, у устройства два режима работы один когда кнопка поключенная на pd4 не нажата и второй когда она нажата, т.е. вот как я себе представляю все это дело пишем два цикла, у одного условие когда кнопка нажата у второго условие когда отпущена. далее когда цикл начинается он считывает значение из переменной и появляется наша сохранненная яркость, далее если мы изменили яркость нажимаем кнопку энкодера и яркость записалась в память.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Шим регулятор яркости светодиодов на atmega8
Так никто не делает. Цикл вечный и во второй никак не попадет, либо не выйдет.
Нужно пересмотреть логику и подумать как еще можно сделать.
Нужно пересмотреть логику и подумать как еще можно сделать.
Re: Шим регулятор яркости светодиодов на atmega8
почему не выйдет, кнопка не просто нажимается и отпускается а именно зажимается
Re: Шим регулятор яркости светодиодов на atmega8
Потому, что циклу плевать на кнопки, если только они не проверяются в его условии или при проверке в теле цикла не происходит выхода по break.почему не выйдет
А вообще, код без форматирования ОЧЕНЬ трудно читать и анализировать. Но break, например, я там нигде не вижу.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Шим регулятор яркости светодиодов на atmega8
может так и есть, но что с чтением и записью значения переменной
Re: Шим регулятор яркости светодиодов на atmega8
В приведенном коде обращение к EEPROM вообще закомментировано...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Шим регулятор яркости светодиодов на atmega8
ну это я закоментировал пока эксперементировал
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Шим регулятор яркости светодиодов на atmega8
Код: Выделить всё
while(1)
if((PIND&(1 << PD4))==0)// первый режим
{ Приду домой проверю интересно посмотреть на маты компилятора
Re: Шим регулятор яркости светодиодов на atmega8
{
while(1) думаю она все таки на месте, код компилируется без ошибок
while(1) думаю она все таки на месте, код компилируется без ошибок
Re: Шим регулятор яркости светодиодов на atmega8
Все норм, код выглядит так:где фигурная скобка бесконечного цикла? этот код вообще компилируется?
Код: Выделить всё
while (1)
if (...)
{
...
}
Скобка должна стоять после цикла. Только в этом случае от нее будет ожидаемый эффект. А так-то в фигурные скобки конструкции можно заключать произвольно...{
while(1) думаю она все таки на месте
Код: Выделить всё
while (...)
{
}
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Шим регулятор яркости светодиодов на atmega8
ну так у кого какие варианты организации циклов
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Шим регулятор яркости светодиодов на atmega8
Это не у кого какие, а как работать будет
Если предположим записать так:
Порт Б никогда не поменяет свое состояние
Зато если цикл организовать ПРАВИЛЬНО
Вот так :
То будет гут
Либо вариант с выходом из вечности.
И мой совет почитать хотя бы азы Керниган и Риччи для начала.
В данном случае, конечно ошибок не будет, так как всего один оператор if в вечном цикле, но все же лучше ставить, чтобы не попасть потом в просак.
Если предположим записать так:
Код: Выделить всё
{
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
не совсем понял из твоего поста как организовать обо цикла, и зачем нужно это portb=0xFF?
И только пожалуйста разъясни попроще, я не программер, си учил только в инсте и то уже ничего не помню, поэтому и написал все так криво
И только пожалуйста разъясни попроще, я не программер, си учил только в инсте и то уже ничего не помню, поэтому и написал все так криво
Re: Шим регулятор яркости светодиодов на atmega8
break это насколько я могу понять вывод из цикла то есть когда условие не выполняется break прерывает цикл это я прваильно понял?


