Проблема с выводом PWM-сигналом на ATtiny45

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Eirin, 30 май 2013.

  1. ИгорьК

    ИгорьК Оракул Модератор

    Честно говоря, мне то со стороны не ясна суть задачи, поэтому не могу Вам не поверить.
    Замечу лишь, что изменение яркости и изменение скважности для светодиодов не находятся в линейной зависимости. Есть такой проект BlinkM - они с этим разбирались. Он, кстати, и работает на 45 микросхеме.
     
  2. fr0ster

    fr0ster Гик

    Поскольку изменение яркости делалось для глаза, точность "два лаптя по карте" достаточна.
    Главное относительное изменение яркости, примерно в два раза. И на глаз все плавно и синхронно.
    Попробую сделать ролик работы схемы.

    А BlinkM это сильно больше, чем аппаратный ШИМ для трех светодиодов :)

    А задача была как раз запустить аппаратный ШИМ на двух таймерах с выводом на три канала сразу.
     
  3. ИгорьК

    ИгорьК Оракул Модератор

    Вот когда-то развлекался с аппаратным ШИМ на ATtiny85. На ATtiny45 тоже будет работать, просто под рукой ее тогда не было. Это "лампа настроения", если не ошибаюсь.
    Код (C):
    #include <tiny85.h>
    //#include <tiny45.h>
    #include <delay.h>
    #include <stdlib.h>
    #include <math.h>

    unsigned char sred, sgreen, sblue;            //showing colors


    int red, green, blue;                        //now colors
    unsigned int tred, tgreen, tblue;            //tagert colors
    int delta_red, delta_green, delta_blue;      //величина прибавки за шаг
    unsigned int time = 1;                        //длительность шага

    void delay(unsigned int delayt)              //задержка delay_ms() на вход принимает только константу(
    {
        while (delayt != 0)
        {
            delay_ms(1);
            delayt--;
        };
    };



    void main(void)
    {
        // Declare your local variables here
    unsigned int temp1, temp2, temp3, temp4;
     
        // Crystal Oscillator division factor: 1
        #pragma optsize-
        CLKPR=(1<<CLKPCE);
        CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
        #ifdef _OPTIMIZE_SIZE_
        #pragma optsize+
        #endif

        // Input/Output Ports initialization
        // Port B initialization
        // Function: Bit5=In Bit4=Out Bit3=In Bit2=In Bit1=Out Bit0=Out
        DDRB=(0<<DDB5) | (1<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (1<<DDB0);
        // State: Bit5=T Bit4=0 Bit3=T Bit2=T Bit1=0 Bit0=0
        PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: 125,000 kHz
        // Mode: Phase correct PWM top=0xFF
        // OC0A output: Non-Inverted PWM
        // OC0B output: Non-Inverted PWM
        // Timer Period: 4,08 ms
        // Output Pulse(s):
        // OC0A Period: 4,08 ms Width: 0 us
        // OC0B Period: 4,08 ms Width: 0 us
        TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00);
        TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
        TCNT0=0x00;
        OCR0A=0x00;
        OCR0B=0x00;

        // Timer/Counter 1 initialization
        // Clock source: System Clock
        // Clock value: 125,000 kHz
        // Mode: PWMB top=OCR1C
        // OC1A output: Disconnected
        // OC1B output: OC1B=PWM, /OC1B=/PWM
        // Timer Period: 8 us
        // Output Pulse(s):
        // OC1B Period: 8 us
        // Timer1 Overflow Interrupt: Off
        // Compare A Match Interrupt: Off
        // Compare B Match Interrupt: Off
        PLLCSR=(0<<PCKE) | (0<<PLLE) | (0<<PLOCK);

        TCCR1=(0<<CTC1) | (0<<PWM1A) | (0<<COM1A1) | (0<<COM1A0) | (0<<CS13) | (1<<CS12) | (1<<CS11) | (1<<CS10);
        GTCCR=(0<<TSM) | (1<<PWM1B) | (0<<COM1B1) | (1<<COM1B0) | (0<<PSR1) | (0<<PSR0);
        TCNT1=0x00;
        OCR1A=0x00;
        OCR1B=0x00;
        OCR1C=255;

        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=(0<<OCIE1A) | (0<<OCIE1B) | (0<<OCIE0A) | (0<<OCIE0B) | (0<<TOIE1) | (0<<TOIE0);

    srand(1);            //инициализируем рандомайзер этим значением

    while (1)
          {
        do
        {
            tred = rand()&0xFF;
            tgreen = rand()&0xFF;
            tblue = rand()& 0xFF;
         
            temp1 = (abs(tred - tgreen));
            temp2 = (abs(tred - tblue));
            temp3 = (abs(tgreen - tblue));
        }
        while (( temp1 < 150 ) && (temp2 < 150) && (temp3 < 150));    //если все цвета будут примерно равные то будет белый что не интересно

     
        if (rand() < 13100)                                            //c вероятностью 0,4 (32767) вышибаем один цвет
        {
            do
            {
                temp4 = rand() & 0x000F ;
            }
            while ((temp4 == 0) || (temp4 > 3));
         
            if (temp4 == 1)                                            //не повезло красному
            {                                                          //гасим до 0 - 20% от исходного
                do
                {
                    temp4 = rand() & 0x0FFF;
                }
                while ((temp4 == 0) || (temp4 > 3276));
             
                tred = ceil ((float) (temp4 / 32767) * tred);
            };
         
            if (temp4 == 2)
            {
                do
                {
                    temp4 = rand() & 0x0FFF;
                }
                while ((temp4 == 0) || (temp4 > 3276));
             
                tgreen = ceil ((float) (temp4 / 32767) * tgreen);
            };
         
            if (temp4 == 3)
            {
                do
                {
                    temp4 = rand() & 0x0FFF;
                }
                while ((temp4 == 0) || (temp4 > 3276));
             
                tblue = ceil ((float) (temp4 / 32767) * tblue);
            };
         
        };

        delta_red = (tred - sred);
        delta_green = (tgreen - sgreen);
        delta_blue =  (tblue - sblue);
     
     

        do
        {
            sred=((red&0xFF00)/256);
            sgreen=((green&0xFF00)/256);
            sblue=((blue&0xFF00)/256);
         
            if ((tred) != (sred))
            red = red + delta_red;
         
            if ((tgreen) != (sgreen))
            green = green + delta_green;
         
            if ((tblue) != (sblue))
            blue = blue + delta_blue;


            //OCR1B = sred;
            //OCR1A = sgreen;
            //OCR0A = sblue;
         
            OCR0A=sred;
            OCR0B=sgreen;
            OCR1B=sblue;
         
         
            delay(time);
         
        }
        while ((tred != (sred)) || (tgreen != (sgreen)) || (tblue != (sblue)));


        delay(time * 255);                                    //стремились к этому цвету, задержим его
     
     
        time = 1 + rand()&0x0F;                                // 1 до 16 варьируется задержка, числа подобраны экспериментально
                                                            //делаем после что бы включалось плавно и быстро

          }
    }
     
     
    Последнее редактирование: 8 ноя 2013
  4. fr0ster

    fr0ster Гик

    Вы CodeVisionAvr используете вижу. Чем то удобнее AVR Studio или CodeBlocks с Eclipse?
     
  5. ИгорьК

    ИгорьК Оракул Модератор

    Я использую связку AVR Studio и в ней CodeVisionAvr. Кстати, с AVR Studio я использую еще и плагин для Arduino.
    AVR Studio мне нравится как среда - цвета, автоокончание, снипеты, возможность сворачивать функции, CodeVisionAvr имеет стартовый визард для инициализации процессора, чтобы не углубляться в детали. Я же любитель, а не гик.
    Ну и с Ардуино можно работать из AVR Studio. Как-то так сложилось само по себе.
    То есть визард CodeVisionAvr запускается из AVR Studio.
    Плюс CodeVisionAvr имеет тучу библиотек и, главное, с хорошим их описанием, чего нет в AVR Studio.
    А вот еще что - последняя версия CodeVisionAvr позволяет грузить код в Ардуино! То есть пишем на С++ с библиотеками CodeVision и грузим это все в Ардуино, обходя ограничения его IDE.
     
    Megakoteyka нравится это.
  6. fr0ster

    fr0ster Гик

    Это к AVR Studio 6 уже такие плагины?
    Мне 5ая и 6ая версии показались излишне тяжелыми.
     
  7. ИгорьК

    ИгорьК Оракул Модератор

    Я тоже сначала мучился... Но потом привык и даже нравится. Ардуиновской IDE вообще не пользуюсь.
    Вот для Ардуино расширение. А здесь пояснения по интеграции CodeVision последней версии.
     
    Megakoteyka нравится это.
  8. fr0ster

    fr0ster Гик

    Мне код надо на МК через программатор заливать.
    А вот с 6ой студией AVRISPv2 не дружит.
    Потому пока на 4ой сижу.
     
  9. ИгорьК

    ИгорьК Оракул Модератор

    AVRISPv2 не поддерживает JTAG, кажется (судя по названию)? Тогда в чем проблема заливать прошивки через сторонние решения, ту же SinaProg? Поступаю именно так. Есть смысл сидеть на старой AVR Studio только тогда, когда у вас есть JTAG программатор, который не поддерживается шестеркой. В противном случае смысла в ней я не вижу. Да и официально не поддерживаемые программаторы "прикурчиваются" к шестерке - где-то видел заметку на эту тему. Но для меня это не актуально в силу как раз заливки через SinaProg.
    А так, есть такая приблуда, которую шестерка поддерживает и она, вроде стоит 50 баксов, не у нас, конечно.
     
    Последнее редактирование: 8 ноя 2013
  10. fr0ster

    fr0ster Гик

    Думаю JTAG отладчик (не mkII а клон старого) завести, плюс в АВРСтудийном программаторе мне нравится калькулятор фьюзов и вообще нравится мне программатор там :)

    А так Eclipse или CodeBlocks использую.
    А вот SinaProg чего то на фьюзах глючит и с USBasp`ом и с AVRISPv2
    Хотя прочие программы и АВР Студия и Eclipse и AVRDUDEPROG все нормально пишут и читают
     
    Последнее редактирование: 8 ноя 2013
  11. Deliaz

    Deliaz Нуб

    Здравствуйте. Как раз искал руководство по RGB+Attiny; вот попал сюда.
    Подскажите, в итоге есть мануал, как подключить трехцветный диод к атини? К сожалению пока ардуинка не у меня на руках, не могу проверить.
    Мне надо менять все три составляющие R+G+B через pwm. Смогу ли я это сделать не утопая в регистрах?

    И еще, подскажите, критично ли различаются Attiny13 -45 -85 ?

    Спасибо.
     
  12. ИгорьК

    ИгорьК Оракул Модератор

    Подключается диод просто - три сопротивления и три ножки. Задача то в чем заключается?
    [​IMG]
    Утопать придется или в регистрах или еще в чем-нибудь. Просто не получится.
    Между 45 и 85 разница только в размере памяти. А что касается 13 - надо читать мануал. Мне лень, а Вам?
     
  13. Deliaz

    Deliaz Нуб

    ИгорьК, задача плавно менять цвета всех трех диодов. Вроде как еще называют "Лампа настроения".
    Видел мануалы, но код слишком трудоемок, т к там работа с регистрами МК (для меня пока трудно), хотелось бы ардуиновскими analogWrite для трех PWM выводов.

    Про память видел. В остальном не силен: "нуб" как говориться.
    Нашел сравнение
     
  14. ИгорьК

    ИгорьК Оракул Модератор

    Есть такое. Смотрите. Если Вы будете работать с Ардуино, то Вам АТтини не нужна. И наоборот.
    Но АТтини надо будет суметь прошить.
    Теперь, что Вы хотите? Сделать лампу или разобраться в теме больше.
    Если сделать лампу и забить на все, то найду я Вам код, где-то есть.
     
  15. Deliaz

    Deliaz Нуб

    ИгорьК, Спасибо за Ваши ответы.
    Я любительски работаю с Arduino UNO и Arduino Mega, поэтому они у меня в любом случаем есть, просто в данный момент не в моих рука. Уно и хотел использовать как программатор.
    С помощью Атини хочу сделать подарок своими руками.
    Просить Вас написать мне код я не имею право :)
    Думаю если сработает такое:
    Код (Text):
    ..
    analogWrite(pinRed,255);
    analogWrite(pinGreen,175);
    analogWrite(pinBlue,200);
    ...
    То отлично — в понедельник поеду покупать атини.

    Но не получится ли так, что третий ШИМ придется делать программным ?
     
  16. ИгорьК

    ИгорьК Оракул Модератор

    Аттини не будет работать с этими командами. Это команды для ардуино Хотя не утверждаю на 100 процентов. Вроде есть какие-то приблуды, превращающие 85 тиньку в подобие ардуино.
    Честно говоря, проще всего делать железный ШИМ для этой микросхемы.
     
  17. Deliaz

    Deliaz Нуб

    Да, я нашел какие-то библиотеки для аттини13/45/85
    И даже код компилируется без ошибок (видимо проверка на namespace проходит), но проверить смогу на будущей.неделе...
     
  18. ИгорьК

    ИгорьК Оракул Модератор

    А в чем Вы компилируете этот код, что за IDE?
     
  19. Deliaz

    Deliaz Нуб

    Arduino IDE
    Бегло посмотрел Этот пример
     
  20. ИгорьК

    ИгорьК Оракул Модератор

    Ясно. Это пример использования Ардуино как программатора. Что касается АТтини как программируемого устройства, то для нее надо будет писать программу. И не в среде Ардуино .
    В 23 посте и есть код для лампы настроения. Сейчас с маленького планшета мне его трудно разглядеть, но с большой вероятностью это он.