Шим регулятор яркости светодиодов на atmega8

Обсуждаем контроллеры компании Atmel.
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

транзистор можно любой, главное чтобы управлялось через плюс, и сразу поясню почему все так, шим будет управлять двумя цепочками диодов, каждая из которых состоит из трех последовательно включенных диодов, но это не диодная лента, диоды стоят на плате и минус там везде общий, поэтому и нет возможности управлять яркостью через минус, вот собственно почему изобретается такой велосипед с управлением через плюс.
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение vitalik_1984 »

Ну вот наконец конструктивный ответ :)) можно было сразу так ответить, может бы меньше ссылками закидывали.
Вот рабочий вариант
Номиналы примерные. Нужно учитывать характеристики транзисторов.
Вложения
Вот.rar
(11.22 КБ) 255 скачиваний
Реклама
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

vitalik_1984 спасибо помог, все работает, вопрос еще такой а как можно реализовать подобное но с полевиком, т.е. чтобы обычный транзюк управлял полевиком, где то на этом форуме находил подобное но там народ так и не пришел к конечному решению
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение vitalik_1984 »

Вопрос в том, какой бюджет проекта. Вообще есть специальные драйверы для полевиков, а есть и вовсе полевики с управлением от 5 вольт. TTL совместимые так сказать.
Вот можно такой схемой на худой конец.
Только нужно смотреть какое там максимальное напряжение на затворе. Если меньше 12,то ставить делитель на резисторах.
Вложения
P-channel.rar
(11.73 КБ) 195 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение 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);// ждем отпускания кнопки энкодера

}
}
}
}
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение vitalik_1984 »

Что это вообще?

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

 while(2)
 
Реклама
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

второй цикл который выполняется когда зажата кнопка, вообщем вот грубо говоря что я пытался сделать, у устройства два режима работы один когда кнопка поключенная на pd4 не нажата и второй когда она нажата, т.е. вот как я себе представляю все это дело пишем два цикла, у одного условие когда кнопка нажата у второго условие когда отпущена. далее когда цикл начинается он считывает значение из переменной и появляется наша сохранненная яркость, далее если мы изменили яркость нажимаем кнопку энкодера и яркость записалась в память.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение vitalik_1984 »

Так никто не делает. Цикл вечный и во второй никак не попадет, либо не выйдет.
Нужно пересмотреть логику и подумать как еще можно сделать.
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

почему не выйдет, кнопка не просто нажимается и отпускается а именно зажимается
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение YS »

почему не выйдет
Потому, что циклу плевать на кнопки, если только они не проверяются в его условии или при проверке в теле цикла не происходит выхода по break.

А вообще, код без форматирования ОЧЕНЬ трудно читать и анализировать. Но break, например, я там нигде не вижу.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

может так и есть, но что с чтением и записью значения переменной
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение YS »

В приведенном коде обращение к EEPROM вообще закомментировано...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

ну это я закоментировал пока эксперементировал
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение vitalik_1984 »

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

 while(1)
if((PIND&(1 << PD4))==0)// первый режим
{ 
Кошмар, где фигурная скобка бесконечного цикла? этот код вообще компилируется?
Приду домой проверю интересно посмотреть на маты компилятора :)))
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

{
while(1) думаю она все таки на месте, код компилируется без ошибок
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение YS »

где фигурная скобка бесконечного цикла? этот код вообще компилируется?
Все норм, код выглядит так:

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


while (1)
  if (...)
  {
    ...
  }
Соответственно, смысл в том, что if выполняется бесконечно. Если условие if неверно, получается цикл с проверкой if'а без выполнения его тела. А так все синтаксически корректно. :)
{
while(1) думаю она все таки на месте
Скобка должна стоять после цикла. Только в этом случае от нее будет ожидаемый эффект. А так-то в фигурные скобки конструкции можно заключать произвольно...

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

while (...)
{
}
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

ну так у кого какие варианты организации циклов
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение 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 в вечном цикле, но все же лучше ставить, чтобы не попасть потом в просак.
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

не совсем понял из твоего поста как организовать обо цикла, и зачем нужно это portb=0xFF?

И только пожалуйста разъясни попроще, я не программер, си учил только в инсте и то уже ничего не помню, поэтому и написал все так криво
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

break это насколько я могу понять вывод из цикла то есть когда условие не выполняется break прерывает цикл это я прваильно понял?
Ответить

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