Страница 1 из 1

atmega16 + цду

Добавлено: Пн дек 16, 2013 18:05:02
tager_
Доброго времени суток. Только начал осваивать язык СИ, чувствую сам не успею. А скоро новогодние праздники.
Ребята, может кто сможет накидайть код программы для 8-ми каналов (гирлянд из светодиодов).
Если такие найдутся, опишу подробно что желаю от программки.

Re: atmega16 + цду

Добавлено: Пн дек 16, 2013 20:07:41
Dr. Alex
Так ты сразу опиши, такое каждый сможет)))

Re: atmega16 + цду

Добавлено: Пн дек 16, 2013 21:37:21
tager_
Есть 8 гирлянд из светодиодов. Сейчас всё это хозяйство работает на к155ир3 через тумблеры.
Как выставил тумблеры так она и бежит.
Задался целью обновить к новому году, а то лет за 10 как то уже приелась.

Программа должна создавать разные светоэффекты (бежать, моргать, сверкать, плавно гаснуть и загоратся и т. д. зависит от фантазии ). Должен быть реализован перебор и случайный выбор эффектов.
Можете предлагать свои варианты. Просто написал что сейчас пришло на ум.

Программу нужно составить таким образом, чтоб начинающему в программировании было несложно добавлять свои комбинации эффектов. Возможно это кому то еще пригодится.

Можно пару кнопок для перебора эффектов, и энкодер для регулировки скорости прикрутить.

В наличии имеется: 8 гирлянд, Atmega16, Программатор, Atmel Studio 6.1 и протеус.
Печатную плату нарисую сам. В дальнейшем возможно еще будут вопросы по схеме и программе.

На этом пока все. Спасибо за внимание.

Re: atmega16 + цду

Добавлено: Ср дек 18, 2013 18:48:06
zero648
Есть один проектик, но на асме, претерпевший уже не одну модификацию, там есть элементы управления прогрессбаром из 10 сегментов, так вот к нему можно довавлять эффекты, ну конечно все лишнее уберу, нужно только дописать алгоритм смены эффектов и сочинить еще какие нибудь, скорость меняется крутилкой потенциометром, так вот останется подключить гирлянды через ключи вместо прогрессбара.

Re: atmega16 + цду

Добавлено: Ср дек 18, 2013 20:32:28
Dr. Alex
tager_ писал(а):Только начал осваивать язык СИ, чувствую сам не успею.
Ну по большому счёту ничего сложного нет в ваших пожеланиях. Достаточно записать все эффекты в массивы, а потом перебирать значения массивов.... Вот как-то так))))) Это подсилу даже начинающему программисту)

Re: atmega16 + цду

Добавлено: Пт дек 20, 2013 12:30:23
tager_
zero648 Я в асме вообще не силён, но впринципе можно посмотреть.
Dr. Alex Если не трудно накидайте код. И пару эфектов. Желательно с коментариями.
Светодиоды к порту А прикручены.
Для интереса и проверки работаспособности, попробовал залил прошивку от сюда http://www.radiokot.ru/circuit/light/run/58/
Видео
Спойлер
Воде не плохо, даже в моём варианте. Правда у меня кварц на 16.384 стоит.

На следующий год смотрю в сторону ленты на чипе WS2812 или подобной.
А пока буду довольствоваться тем что есть.

Re: atmega16 + цду

Добавлено: Пт дек 20, 2013 13:22:50
takei
Восемь каналов? Зачем мега 16 , планируйте на тини 2313.

Re: atmega16 + цду

Добавлено: Пт дек 20, 2013 13:26:44
tager_
Просто мега 16 уже есть в наличии. Если есть готовые проекты на тини, выкладывайте рассмотрю как вариант.

Re: atmega16 + цду

Добавлено: Пт дек 20, 2013 13:48:05
takei
Жаль что в наличии только 16 , а у меня денег хватило только на 13.
Ну ладно, как говорит товарищ Dr. Alex , дело то "гавно , вопрос"
Вот вам первый эффект, если поймете что тут к чему, прибавите точно так второй эффект, многие скажут что это примитивно , а вы не слушайте никого, потому что ваша фантазия будет реализована на практике , а не останется в теории как у некоторых :beer:

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

 /*****************************************************
CodeWizardAVR V2.05.3 Standard: 
Date    : 20.12.2013
Chip type               : ATtiny2313
AVR Core Clock frequency: 4,000000 MHz
*****************************************************/
#include <tiny2313.h>
#include <delay.h>    
unsigned char clik;
void main(void)
{
//Port B initialization
PORTB=0x00;
DDRB=0x00;
//Port A initialization
PORTA=0xFF;
DDRA=0x00;
//Port D initialization
PORTD=0x00;
DDRD=0xFF;
          while(1){
                    switch(clik){                     //выводим последовательность  и кол. включенных светодиодов
                    case 0:{PORTD=0b11000000; break;} //0
                    case 1:{PORTD=0b11111001; break;}  //1
                    case 2:{PORTD=0b10100100; break;} //2
                    case 3:{PORTD=0b10110000; break;}  //3
                    case 4:{PORTD=0b10011001; break;}  //4
                    case 5:{PORTD=0b10010010; break;}  //5
                    case 6:{PORTD=0b10000010; break;}  //6
                    case 7:{PORTD=0b11111000; break;}  //7
                    case 8:{PORTD=0b10000000; break;}  //8
                    case 9:{PORTD=0b10010000; break;}  //9
                    }

               clik++;                                                   //прибавляем 1 к переменной
               if(clik>9)clik=0;                                   //не даём переменной быть больше 9
                  delay_ms(800); 
          };
}

Re: atmega16 + цду

Добавлено: Пт дек 20, 2013 14:11:59
takei
Или вот,
если для вас , код этой мигалки
будет понятен, тогда несложно будет сделать число clik массивом, и подставлять его в виде массива.

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

#include <tiny2313.h>
#include <delay.h>    
unsigned char clik;
void main(void)
{
//Port B initialization
PORTB=0x00;
DDRB=0x00;
//Port A initialization
PORTA=0xFF;
DDRA=0x00;
//Port D initialization
PORTD=0x00;
DDRD=0xFF;
          while(1){

                PORTD=clik;                  //выводим последовательность  и кол. включенных светодиодов
                   
                clik++;                        //прибавляем 1 к переменной
     
                delay_ms(800); 
          };
}

Re: atmega16 + цду

Добавлено: Пт дек 20, 2013 15:57:52
tager_
Спасибо takei. С масивоим пока не разобрался, а с первым вот что у меня получилось.
Спойлер

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

/*
 * tini.c
 *
 * Created: 20.12.2013 17:11:27
 *  Author: Serega
 */ 

#define F_CPU 16384000UL        
#include <avr/io.h>


#include <util/delay.h>
unsigned char clik;
// ************************ эффект 1
int eff_01()
{
    for (int i = 0; i < 16; i++)
    {
    
     switch(clik){                     //выводим последовательность  и кол. включенных светодиодов
         case 0:{PORTA=0b10000000; break;}  //0
         case 1:{PORTA=0b01000000; break;}  //1
         case 2:{PORTA=0b00100000; break;}  //2
         case 3:{PORTA=0b00010000; break;}  //3
         case 4:{PORTA=0b00001000; break;}  //4
         case 5:{PORTA=0b00000100; break;}  //5
         case 6:{PORTA=0b00000010; break;}  //6
         case 7:{PORTA=0b00000001; break;}  //7
                 }
     clik++;                                                   //прибавляем 1 к переменной
     if(clik>7)clik=0;                                   //не даём переменной быть больше 7
     _delay_ms(300);
     
     }
return 0;
}
// ************************ эффект 2
int eff_02()
{
    for (int i = 0; i < 16; i++)
    {
        
        switch(clik){                     //выводим последовательность  и кол. включенных светодиодов
            case 0:{PORTA=0b10000001; break;}  //0
            case 1:{PORTA=0b11000000; break;}  //1
            case 2:{PORTA=0b01100000; break;}  //2
            case 3:{PORTA=0b00110000; break;}  //3
            case 4:{PORTA=0b00011000; break;}  //4
            case 5:{PORTA=0b00001100; break;}  //5
            case 6:{PORTA=0b00000110; break;}  //6
            case 7:{PORTA=0b00000011; break;}  //7
        }
        clik++;                                                   //прибавляем 1 к переменной
        if(clik>7)clik=0;                                   //не даём переменной быть больше 7
        _delay_ms(800);
    }
return 0;    
}


int main(void)
{
    PORTA=0x00;
    DDRA=0xFF;
    
    while(1){
       
       // выбираем эффекты eff_01(); - eff_NN();
       eff_01();  //
       eff_02();
        
       
        
        
    }
}
Как сделать рандомный выбор эффектов? И задержку _delay_ms(300); тоже нужно сделать случайной?

Re: atmega16 + цду

Добавлено: Пт дек 20, 2013 22:42:45
takei
Как сделать рандомный выбор эффектов?
А что это такое, по русски?
задержку _delay_ms(300); тоже нужно сделать случайной?
Случайно проще сделать, просто играться числами и все.
Берем число unstable

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

#include <tiny2313.h>
#include <delay.h>    
unsigned char clik;
unsigned int  unstable=0;
void main(void)
{
PORTD=0x00;
DDRD=0xFF;
          while(1){

                PORTD=clik;                  //выводим последовательность  и кол. включенных светодиодов
                   
                clik++;                        //прибавляем 1 к переменной
                unstable++;
                delay_ms(unstable); 
          };
}

Re: atmega16 + цду

Добавлено: Пт дек 20, 2013 23:10:54
tager_
рандомный, вроде как случайный.
unstable++; это при каждом проходе скорость будет увеличиватся, так не пойдет.
Нужна случайная скорость при каждом проходе эффекта.
Тут мысль пришла, может записать в массив штук 30 - 50 случайных циферек, да и выбирать их от туда по очереди. Для _delay_ms , коли ей нужно точное значение.
Получится что у каждого эффекта своя скорость.
Только количество эффектов не должно совпадать с количеством циферек.
Что на это скажешь?

Re: atmega16 + цду

Добавлено: Сб дек 21, 2013 11:32:48
takei
Правильно, нужно использовать для этого случая массивы, просто начинаем с простого, и движемся далее, начинайте составлять первый массив для светодиодов (этих массивов далее сделаете несколько)
И один для чисел (_delay_ms) скорости.