помогите разобратся с таймером 1 на tiny2313

Обсуждаем контроллеры компании Atmel.
Oleg7771
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб окт 13, 2012 12:26:43
Откуда: Харьков UA
Контактная информация:

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение Oleg7771 »

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

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение shads »

Наверное тебе лучше реализовать работу через прерывание и таймер...
Прерыванием ловить переход через 0, запускать таймер и по окончании счета давать управляющий импульс.

В моем примере полуволна делится на 100 частей, и т.к. счет внутреннего счетчика и фазы сигнала в сети не синхронизированы, вот и возникает иногда перескок значения регулировки на 1 значение.... Т.е. периодически будут колебания на 1\100 длины полупериода.
В этом грубоват мой метод....

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

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение shads »

Глянь тут еще, я как то одному иностранцу помогал, там на тини13 и как то по другому я делал что такого эффекта не було.....
http://radiokot.ru/forum/viewtopic.php?f=20&t=88022
Oleg7771
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб окт 13, 2012 12:26:43
Откуда: Харьков UA
Контактная информация:

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение Oleg7771 »

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

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение shads »

Не вопрос, но только уже завтра.....
Реклама
Oleg7771
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб окт 13, 2012 12:26:43
Откуда: Харьков UA
Контактная информация:

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение Oleg7771 »

я пытался сам написать программу управления через прерывания INT0 , всё заработало но старая проблема осталась, несколько раз в секунду есть мелкое мерцание. проект в прикреплении, если можешь проверь что там не так. мне кажется что я оставил старый алгоритм только изменил способ считывания импульсов перехода через 0.
Вложения
int_pwm_2313.zip
2313
(37.29 КБ) 163 скачивания
Реклама
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение shads »

От..... чего наваял я.....
Только на CVAVR сам перенеси, ато я в нем нуль.....

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

//-------------------------------------------------------------------------------------------------------
//контроллер ATtiny2313
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

//настройка порта
#define PORT             PORTB
#define PIN             PINB
#define DDR             DDRB
    #define    SINC_LINE        (1<<0)    
    #define PWM_LINE        (1<<1)    
    #define BTN_UP_LINE        (1<<6)
    #define BTN_DN_LINE        (1<<7)

//определения
#define    POWER_DFLT        50                    /*мощность при старте в процентах*/
#define POWER_MIN        10                    /*минимально допустимая мощность в процентах*/
#define IMP_LEN            10                    /*длина управляющего импульса в процентах от длины полупериода*/

//-------------------------------------------------------------------------------------------------------
//основной цикл
int main(void)
{
    //настройка портов и линий вв\выв
    DDR = PWM_LINE;                            //линия управления симистором на вывод
    PORT = BTN_UP_LINE | BTN_DN_LINE;        //подтяжка кнопок
    
    //Настройка внешнего прерывания
    GIMSK = (1<<PCIE);                        //включить внешнее прерывание с вывода PCINT
    PCMSK = (1<<PCINT0);                    //выбор входа внешнего прерывания

    //Настройка таймера T1
    TIMSK = (1<<OCIE1A)| (1<<OCIE1B);        //включаем прерывания по совпадению
    TCCR1A =(0<<WGM11)| (0<<WGM10);            //режим работы таймера счетчика (вместе с WGM12 и WGM13) NORMAL
    TCCR1B =(0<<WGM13)|    (0<<WGM12)|            //режим работы таймера счетчика (вместе с WGM11 и WGM10) NORMAL
            (1<<CS12)| (0<<CS11)| (0<<CS10);//источник тактирования таймера (100 = CLK \ 256)

    sei();
    uint8_t PowerVal = POWER_DFLT;            /*значение мощности в процентах при старте*/            
    while(1){
        uint16_t temp = (100-PowerVal) * 3 + ((100-PowerVal) / 10);
        cli ();
        OCR1A = temp;
        OCR1B = temp + (IMP_LEN * 3);
        sei ();

        if (! (PIN & BTN_UP_LINE)){
            if (PowerVal < 99)
                PowerVal++;        
        }
        if (! (PIN & BTN_DN_LINE)){
            if (PowerVal > POWER_MIN)
                PowerVal--;        
        }
        _delay_ms (50);
    }
}


///--------------------------------------------------------------------------------------------------------------------------
//Обработка внешнего прерывания PCINT0
ISR (PCINT_vect)
{
    GTCCR = PSR10;                            //сбросить предделитель    
    TCNT1 = 0;                                //сбросить счетчик TIMER1
    PORT &= ~PWM_LINE;                        //сбросить на всяк случай импульс управления
}


//--------------------------------------------------------------------------------------------------------------------------
//Обработка прерывания по совпадению A
ISR (TIMER1_COMPA_vect)
{
    PORT |= PWM_LINE;                        //старт импульса управления
}


//--------------------------------------------------------------------------------------------------------------------------
//Обработка прерывания по совпадению B
ISR (TIMER1_COMPB_vect)
{
    PORT &= ~PWM_LINE;                        //сброс импульса управления
}


//--------------------------------------------------------------------------------------------------------------------------
 
Oleg7771
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб окт 13, 2012 12:26:43
Откуда: Харьков UA
Контактная информация:

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение Oleg7771 »

на tiny2313 получается, работает! но есть проблема, хочу перенести проект на tiny13 , но не могу в ней настроить внешнее прерывание по изменению уровня на INT0, всё делаю правильно по datasheet.

GIMSK = 0x40; INT0=1
MCUCR = 0x01; // ISC01=0 ISC00=1 Any logical change on INT0 generates an interrupt reques
GIFR = 0x40; INTF0=1

в обработчике, просто для проверки работы прерывания пишу так (на tiny2313 работало)

interrupt [EXT_INT0] void ext_int0_isr(void)
{
PORTB.0 = 1;
delay_us(500);
PORTB.0 = 0;
}

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

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение shads »

Сделал точно так, на тини13, как ты описал, все работает.....


Вот проектик на tiny13:
Вложения
tiny13_proteus.7z
(21.13 КБ) 158 скачиваний
Oleg7771
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб окт 13, 2012 12:26:43
Откуда: Харьков UA
Контактная информация:

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение Oleg7771 »

есть ещё один вопрос, в чем ты работаешь и какой компилятор? в CAVR у меня так и не получилось завести tiny13, внешнее прерывания всё равно не видит.
Вложения
int0_pwm_t13.zip
tiny13
(53.42 КБ) 139 скачиваний
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение shads »

AVRStudio4 + WINAVR

или просто AVRStudio6, но она тяжеленная, огого.....
Oleg7771
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб окт 13, 2012 12:26:43
Откуда: Харьков UA
Контактная информация:

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение Oleg7771 »

долго мучился и тебя доставал вопросами, но всё получилось, сделал печатку в Spint Layout, собрал) Делал по тому варианту что ты давал с прерываниями, с дребезжанием проблема осталась, пришлось с ней смерится, т.к. регулировать придется нагревательные приборы, освещение уже почти всё на экономках. Прикрепляю проект, может что то можно лучше оптимизировать... и доделанную версию программы по расчету OCR1)
Вложения
project.zip
проект Proteus
(43.41 КБ) 161 скачивание
avrcalc.zip
avrcalc
(162.48 КБ) 18928 скачиваний
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение shads »

Гляну.....

Как тебе AVRStudio4 + GCC ?

Кстати.. если я тебе позже пару вопросов задам по WIN программированию.. можно? У меня стоит CPP BUILDER6.
Oleg7771
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб окт 13, 2012 12:26:43
Откуда: Харьков UA
Контактная информация:

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение Oleg7771 »

я и до этого работал с Avr Studio но в ассемблере, но не знал что он может работать с C+ ) WinAVR я тоже ставил, только не знал для чего он нужен.
теперь проекты пытаюсь перетянуть с CAVR на WinAVR, много работы, почти всё приходится переделывать )))
что касается программ под Win, я пишу на Delphi 7. Ну принцип похож с C++ только синтакс другой, если есть вопросы то спрашивай, если знаю то подскажу
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение shads »

Oleg7771 писал(а):может что то можно лучше оптимизировать...
Да вроде все ОК..... тем более размер менее 600 байт, из 2000 имеющихся... еще есть куда разгулятся.....
Oleg7771
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб окт 13, 2012 12:26:43
Откуда: Харьков UA
Контактная информация:

Re: помогите разобратся с таймером 1 на tiny2313

Сообщение Oleg7771 »

всё, разобрался с морганием, установил внешний кварц 8мГц, проблема ушла) иногда подмигивает, но это вместе с сетевым напряжением. ты говорил что вопросы по С++ будут, если что пиши, я тоже себе собираюсь установить CPP Builder 6, пишут что он вроде бы лучше, код получается на много меньше и быстрее чем в Delphi. кст что касается WinAVR перекомпилировал прошивку из CAVR на WinAVR код получился почти на 30% меньше чем в CAVR, перешел полностью на AvrStudio )
Ответить

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