Шим регулятор яркости светодиодов на atmega8
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Шим регулятор яркости светодиодов на atmega8
Напиши по номерам, я лично не понял где там иммитатор энкодера
Шестиконтактная кнопка вообще для меня загадка что она там переключает то? Шило на мыло. И для энкодера обычно использовано три ноги ноги мк, а у на схеме всего два.
Шестиконтактная кнопка вообще для меня загадка что она там переключает то? Шило на мыло. И для энкодера обычно использовано три ноги ноги мк, а у на схеме всего два.
Re: Шим регулятор яркости светодиодов на atmega8
Подписал все кнопки
- Вложения
-
- 01 (2)33.rar
- (18.89 КБ) 206 скачиваний
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Шим регулятор яркости светодиодов на atmega8
Если эти два генератора имитируют энкодер, тогда у второго задержку мало поставил, для 10 герц должно быть гдето 1/10/2/2 секунд - это 25 миллисекунд, а у тебя 400 микросекунд.
p.s. перепутал не у второго, а у первого
p.s. перепутал не у второго, а у первого
Re: Шим регулятор яркости светодиодов на atmega8
Да это не суть, главную свою функцию схемка выполняет
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Шим регулятор яркости светодиодов на atmega8
Ну ладно примерно понятно. А где алгоритм, исходник прошивка? В проекте прошивка обозначена, а в архиве не вижу.
Re: Шим регулятор яркости светодиодов на atmega8
на предыдущей странице выкладывал код, больше ничего с ним не делал
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Шим регулятор яркости светодиодов на atmega8
На предыдущей никакого кода нет.
Если про вот этот код в сообщении, то он работать не будет.
Если про вот этот код в сообщении, то он работать не будет.
Re: Шим регулятор яркости светодиодов на atmega8
Вообщем опиш вопрос с которым я никак не могу разобраться конкретнее.
это циклы, все здесь только и пишут что циклы у меня не рабочие, и некоторые предложили пару примеров, но тут я опять сталкиваюсь с проблемой, как только не изголяюсь над циклами они не не работают более того примеры типа
while (условие)
{
тело цикла
}
даже не компилируются, еще было предложение с использованием break, пробовал и с ним но тоже вылазиет ошибка при компилировании, вообщем циклы так и ни как не организую. Если кто может написать пару рабочих строк с циклами, буду очень благодарен. Только пожалуйста напишите все как есть цикл 1 и цикл 2 с условием что первый выполняется при появлении на входе pd4 нуля и второй при появлении на pd4 единицы
это циклы, все здесь только и пишут что циклы у меня не рабочие, и некоторые предложили пару примеров, но тут я опять сталкиваюсь с проблемой, как только не изголяюсь над циклами они не не работают более того примеры типа
while (условие)
{
тело цикла
}
даже не компилируются, еще было предложение с использованием break, пробовал и с ним но тоже вылазиет ошибка при компилировании, вообщем циклы так и ни как не организую. Если кто может написать пару рабочих строк с циклами, буду очень благодарен. Только пожалуйста напишите все как есть цикл 1 и цикл 2 с условием что первый выполняется при появлении на входе pd4 нуля и второй при появлении на pd4 единицы
Спойлер
Код: Выделить всё
/***
Управляем светодиодом с помощью энкодера ***/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
unsigned char ee_zn EEMEM, ee_zns 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++ > 100)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_y)
PORTB |= (1 << PB0);
}
}
{
if (button == 1)
{
if (pwm_counter++ > 100)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_b)
PORTB |= (1 << PB1);
}
}
}
// Главная функция
int main (void)
{
DDRB |= (1 << PB0)|(1 << PB1); // выходы
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(); //глобально разрешаем прерывания
Сюда вставить циклы
}Re: Шим регулятор яркости светодиодов на atmega8
while(1) //постоянный цикл
{
while(1) //первый цикл, будет выполняться, пока не появится 0 на PD.4
{
if(PD.4==0) break;
}
while(1) //второй цикл, выполняется пока не появится 1 на PD.4
{
if(PD.4==1) break;
}
}
В каждый цикл можно добавлять нужные операции, проверку пина не убирать. Ах да, в таком виде не заработает, нужно (PD.4==0) и (PD.4==1) заменить на нормальную проверку, это я для наглядности так написал.
{
while(1) //первый цикл, будет выполняться, пока не появится 0 на PD.4
{
if(PD.4==0) break;
}
while(1) //второй цикл, выполняется пока не появится 1 на PD.4
{
if(PD.4==1) break;
}
}
В каждый цикл можно добавлять нужные операции, проверку пина не убирать. Ах да, в таком виде не заработает, нужно (PD.4==0) и (PD.4==1) заменить на нормальную проверку, это я для наглядности так написал.
Re: Шим регулятор яркости светодиодов на atmega8
titoFF вообщем если я все правильно понял то код будет таким
не работает, по прежнему выполняется только один цикл
Спойлер
Код: Выделить всё
/***
Управляем светодиодом с помощью энкодера ***/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
unsigned char ee_zn EEMEM, ee_zns 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++ > 100)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_y)
PORTB |= (1 << PB0);
}
}
{
if (button == 1)
{
if (pwm_counter++ > 100)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_b)
PORTB |= (1 << PB1);
}
}
}
// Главная функция
int main (void)
{
DDRB |= (1 << PB0)|(1 << PB1); // выходы
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)
{
while(2)
{
if
((PIND & (1 << PD4))==1) break;
button = 0;
}
while(3)
{
if
((PIND & (1 << PD4))==0) break;
button = 1;
}
}
}
не работает, по прежнему выполняется только один цикл
Re: Шим регулятор яркости светодиодов на atmega8
Вообщем добился переключения режимов только вот так
Теперь вопрос с памятью, не получается работать с епром, как только вставляю такие строки
то программа просто перестает реагировать на энкодер и ничего не происходит, в чем здесь моя ошибка?
Спойлер
Код: Выделить всё
/***
Управляем светодиодом с помощью энкодера ***/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
unsigned char ee_zn EEMEM, ee_zns EEMEM;//* переменная размером в 2 байта в EEPROM
volatile char pwm_counter, my_y,my_b, button ;
// Обработчик прерывания 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++ > 100)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_y)
PORTB |= (1 << PB0);
}
}
{
if (button == 1)
{
if (pwm_counter++ > 100)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_b)
PORTB |= (1 << PB1);
}
}
}
// Главная функция
int main (void)
{
DDRB |= (1 << PB0)|(1 << PB1); // выходы
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)
{
while(4)
{
if
((PIND & (1 << PD4))==0) break;
button = 0;
}
button = 1;
}
}Теперь вопрос с памятью, не получается работать с епром, как только вставляю такие строки
Код: Выделить всё
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);то программа просто перестает реагировать на энкодер и ничего не происходит, в чем здесь моя ошибка?
Re: Шим регулятор яркости светодиодов на atmega8
Вроде как разобрался со всеми проблемами, вот рабочий код, проверил в протеусе все работает как надо, единственное что запись переменной происходит не при нажатии кнопки а просто при переключении режима. На днях буду проверять уже на собранном устройстве
Спойлер
Код: Выделить всё
/***
Управляем светодиодом с помощью энкодера ***/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
EEMEM uint8_t ee_zn, ee_zc;
unsigned char my_y,my_b;//* переменная размером в 2 байта в EEPROM
volatile char pwm_counter, button ;
// Обработчик прерывания 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++ > 100)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_y)
PORTB |= (1 << PB0);
}
}
{
if (button == 1)
{
if (pwm_counter++ > 100)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_b)
PORTB |= (1 << PB0);
}
}
}
// Главная функция
int main (void)
{
DDRB |= (1 << PB0)|(1 << PB1); // выходы
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)
{
while(4)
{
if
((PIND & (1 << PD4))==0) break;
button = 0;
my_y = eeprom_read_byte(&ee_zn);
_delay_ms(1000);
eeprom_write_byte(&ee_zn, my_y);
}
button = 1;
my_b = eeprom_read_byte(&ee_zc);
_delay_ms(1000);
eeprom_write_byte(&ee_zc, my_b);
}
}Re: Шим регулятор яркости светодиодов на atmega8
Алгоритм работы устройства такой, у устройства два режима работы, при подаче питания устройство включается в первом режиме где настраивается уровень яркости при помощи энкодера, далее при подаче 12в на контакт light включается второй режим где настраивается свой уровень яркости, уровния яркости записываютя в постоянную память автоматически при переключении режимов или выключении устройства. Шим управление производится через +. Всем спасибо за помощь.
Выкладываю архивчик со всеми файлами для данного устройства: файлы прошивки в хекс и в исходном коде, печатная плата в формате lay, и схемка проверки для протеуса.
Выкладываю архивчик со всеми файлами для данного устройства: файлы прошивки в хекс и в исходном коде, печатная плата в формате lay, и схемка проверки для протеуса.
- Вложения
-
- Шим управление.rar
- (79.87 КБ) 223 скачивания
Re: Шим регулятор яркости светодиодов на atmega8
Немного переделал, теперь значения яркости записываются только если они отличаются от тех что уже сохранены, сделал это для продления срока службы епром, ну и переделал шим управление через минус, соотвественно размеры платы немного уменьшились
- Вложения
-
- шим.rar
- (37.83 КБ) 216 скачиваний
Re: Шим регулятор яркости светодиодов на atmega8
а на maega48 как будет выглядеть? 
Re: Шим регулятор яркости светодиодов на atmega8
что конкретно тебя интересует схема или прошивка или то и другое?
Re: Шим регулятор яркости светодиодов на atmega8
Naman_S что за стиль у вас без форматирования?..... Мозги сломать можно...
Re: Шим регулятор яркости светодиодов на atmega8
shads просто все по 50 раз изменял, вот и забил на форматирование, поправлю и выложу что имею сейчас
Re: Шим регулятор яркости светодиодов на atmega8
добавил коментарии и попытался хоть немного привести в читабельный вид
Спойлер
Код: Выделить всё
/***
Управляем светодиодом с помощью энкодера ***/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
EEMEM uint8_t ee_zn, ee_zc;//* переменная размером в 2 байта в EEPROM
unsigned char my_y,my_b,test;
volatile char pwm_counter, button ;
// Обработчик прерывания 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(my_y < 1) my_y = 0; //уменьшение яркости
}
if(button == 1) // второй режим
{
my_b--; if(my_b < 1) my_b = 0;//уменьшение яркости
}
}
else
{
if(button == 0) // первый режим
{
my_y++; if(my_y > 64) my_y = 64;//прибавляем яркость
}
if(button == 1) // второй режим
{
my_b++; if(my_b > 64) my_b = 64; //прибавляем яркость
}
}
}
GIFR = (1<<INTF0);
return;
}
ISR (TIMER0_OVF_vect)
{
{
if (button == 0)
{
if (pwm_counter++ > 63)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_y)
PORTB |= (1 << PB6);
}
}
{
if (button == 1)
{
if (pwm_counter++ > 63)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_b)
PORTB |= (1 << PB6);
}
}
}
// Главная функция
int main (void)
{
DDRB |= (0 << PB6); // выходы
PORTB = 0x40;
DDRD |= (1 << PD5)|(0 << PD2)|(0 << PD1)|(0 << PD0); // входы
PORTD |= (1 << PD2)|(1 << PD1)|(1 << PD0)|(0 << PD5); // подключаем подтягивающие резисторы
TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0
TCCR0 |= (1 << CS00);
MCUCR |= (0 << ISC00)|(1 << ISC01); // прерывание по заднему фронту INT0(по спаду импульса)
GIFR |= (1 << INTF0); // очищаем флаг внешнего прерывания
GICR |= (1 << INT0); // разрешаем внешние прерывания INT0
sei(); //глобально разрешаем прерывания
while(1) //бесконечный цикл
{
while(2)
{
if
((PIND & (1 << PD5))==0) break; //условие перехода от одного режима к другому
button = 0;//указатель режима для регулировки энкодером
test = eeprom_read_byte(&ee_zn);
my_y = eeprom_read_byte(&ee_zn);//чтение переменной
_delay_ms(1000);//задержка
if(test != my_y)// сравниваем текущий уровень с записанным
{
eeprom_write_byte(&ee_zn, my_y);// Пишем измененное значение в память
}
}
button = 1;//указатель режима для регулировки
test = eeprom_read_byte(&ee_zc);
my_b = eeprom_read_byte(&ee_zc);
_delay_ms(1000);
if(test != my_b) // сравнение
{
eeprom_write_byte(&ee_zc, my_b);// Пишем измененное значение в память
}
}
}Re: Шим регулятор яркости светодиодов на atmega8
d0,d1,d2,d3 - что есть что ?