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

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

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

Сообщение vitalik_1984 »

Напиши по номерам, я лично не понял где там иммитатор энкодера
Шестиконтактная кнопка вообще для меня загадка что она там переключает то? Шило на мыло. И для энкодера обычно использовано три ноги ноги мк, а у на схеме всего два.
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

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

Сообщение Naman_S »

Подписал все кнопки
Вложения
01 (2)33.rar
(18.89 КБ) 206 скачиваний
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Если эти два генератора имитируют энкодер, тогда у второго задержку мало поставил, для 10 герц должно быть гдето 1/10/2/2 секунд - это 25 миллисекунд, а у тебя 400 микросекунд.

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

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

Сообщение Naman_S »

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

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

Сообщение vitalik_1984 »

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

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

Сообщение Naman_S »

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

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

Сообщение vitalik_1984 »

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

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

Сообщение Naman_S »

Вообщем опиш вопрос с которым я никак не могу разобраться конкретнее.
это циклы, все здесь только и пишут что циклы у меня не рабочие, и некоторые предложили пару примеров, но тут я опять сталкиваюсь с проблемой, как только не изголяюсь над циклами они не не работают более того примеры типа
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(); //глобально разрешаем прерывания


Сюда вставить циклы



}
titoFF
Встал на лапы
Сообщения: 100
Зарегистрирован: Пт авг 02, 2013 07:20:04

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

Сообщение titoFF »

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

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

Сообщение Naman_S »

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;
}
}
}

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

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

Сообщение Naman_S »

Вообщем добился переключения режимов только вот так
Спойлер

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

/*** 
Управляем светодиодом с помощью энкодера ***/

#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);


то программа просто перестает реагировать на энкодер и ничего не происходит, в чем здесь моя ошибка?
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

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

Сообщение Naman_S »

Вроде как разобрался со всеми проблемами, вот рабочий код, проверил в протеусе все работает как надо, единственное что запись переменной происходит не при нажатии кнопки а просто при переключении режима. На днях буду проверять уже на собранном устройстве
Спойлер

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

/*** 
Управляем светодиодом с помощью энкодера ***/

#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);


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

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

Сообщение Naman_S »

Алгоритм работы устройства такой, у устройства два режима работы, при подаче питания устройство включается в первом режиме где настраивается уровень яркости при помощи энкодера, далее при подаче 12в на контакт light включается второй режим где настраивается свой уровень яркости, уровния яркости записываютя в постоянную память автоматически при переключении режимов или выключении устройства. Шим управление производится через +. Всем спасибо за помощь.
Выкладываю архивчик со всеми файлами для данного устройства: файлы прошивки в хекс и в исходном коде, печатная плата в формате lay, и схемка проверки для протеуса.
Вложения
Шим управление.rar
(79.87 КБ) 223 скачивания
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

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

Сообщение Naman_S »

Немного переделал, теперь значения яркости записываются только если они отличаются от тех что уже сохранены, сделал это для продления срока службы епром, ну и переделал шим управление через минус, соотвественно размеры платы немного уменьшились
Вложения
шим.rar
(37.83 КБ) 215 скачиваний
grega1
Родился
Сообщения: 4
Зарегистрирован: Пн янв 27, 2014 16:58:43

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

Сообщение grega1 »

а на maega48 как будет выглядеть? :oops:
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

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

Сообщение Naman_S »

что конкретно тебя интересует схема или прошивка или то и другое?
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

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

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

Сообщение Naman_S »

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

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

Сообщение Naman_S »

добавил коментарии и попытался хоть немного привести в читабельный вид
Спойлер

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

/*** 
Управляем светодиодом с помощью энкодера ***/

#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);// Пишем измененное значение в память
      }
   }
}
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

d0,d1,d2,d3 - что есть что ?
Ответить

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