atmega16 + цду

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 30
Зарегистрирован: Пн авг 31, 2009 21:53:48

Сообщение tager_ »

Доброго времени суток. Только начал осваивать язык СИ, чувствую сам не успею. А скоро новогодние праздники.
Ребята, может кто сможет накидайть код программы для 8-ми каналов (гирлянд из светодиодов).
Если такие найдутся, опишу подробно что желаю от программки.
Контактная информация:
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков

Сообщение Dr. Alex »

Так ты сразу опиши, такое каждый сможет)))
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Контактная информация:
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 30
Зарегистрирован: Пн авг 31, 2009 21:53:48

Сообщение tager_ »

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

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

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

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

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

На этом пока все. Спасибо за внимание.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Есть один проектик, но на асме, претерпевший уже не одну модификацию, там есть элементы управления прогрессбаром из 10 сегментов, так вот к нему можно довавлять эффекты, ну конечно все лишнее уберу, нужно только дописать алгоритм смены эффектов и сочинить еще какие нибудь, скорость меняется крутилкой потенциометром, так вот останется подключить гирлянды через ключи вместо прогрессбара.
Реклама
Эиком - электронные компоненты и радиодетали
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков

Сообщение Dr. Alex »

tager_ писал(а):Только начал осваивать язык СИ, чувствую сам не успею.
Ну по большому счёту ничего сложного нет в ваших пожеланиях. Достаточно записать все эффекты в массивы, а потом перебирать значения массивов.... Вот как-то так))))) Это подсилу даже начинающему программисту)
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Контактная информация:
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 30
Зарегистрирован: Пн авг 31, 2009 21:53:48

Сообщение tager_ »

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

На следующий год смотрю в сторону ленты на чипе WS2812 или подобной.
А пока буду довольствоваться тем что есть.
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Сообщения: 181
Зарегистрирован: Пн янв 14, 2013 15:06:57
Откуда: Д.Вс.

Сообщение takei »

Восемь каналов? Зачем мега 16 , планируйте на тини 2313.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 30
Зарегистрирован: Пн авг 31, 2009 21:53:48

Сообщение tager_ »

Просто мега 16 уже есть в наличии. Если есть готовые проекты на тини, выкладывайте рассмотрю как вариант.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 181
Зарегистрирован: Пн янв 14, 2013 15:06:57
Откуда: Д.Вс.

Сообщение 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); 
          };
}
Нашел транзистор. Понюхал.
Сообщения: 181
Зарегистрирован: Пн янв 14, 2013 15:06:57
Откуда: Д.Вс.

Сообщение 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); 
          };
}
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 30
Зарегистрирован: Пн авг 31, 2009 21:53:48

Сообщение 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); тоже нужно сделать случайной?
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 181
Зарегистрирован: Пн янв 14, 2013 15:06:57
Откуда: Д.Вс.

Сообщение 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); 
          };
}
Последний раз редактировалось takei Пт дек 20, 2013 23:22:51, всего редактировалось 1 раз.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 30
Зарегистрирован: Пн авг 31, 2009 21:53:48

Сообщение tager_ »

рандомный, вроде как случайный.
unstable++; это при каждом проходе скорость будет увеличиватся, так не пойдет.
Нужна случайная скорость при каждом проходе эффекта.
Тут мысль пришла, может записать в массив штук 30 - 50 случайных циферек, да и выбирать их от туда по очереди. Для _delay_ms , коли ей нужно точное значение.
Получится что у каждого эффекта своя скорость.
Только количество эффектов не должно совпадать с количеством циферек.
Что на это скажешь?
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 181
Зарегистрирован: Пн янв 14, 2013 15:06:57
Откуда: Д.Вс.

Сообщение takei »

Правильно, нужно использовать для этого случая массивы, просто начинаем с простого, и движемся далее, начинайте составлять первый массив для светодиодов (этих массивов далее сделаете несколько)
И один для чисел (_delay_ms) скорости.
Ответить

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