помогите разобратся с таймером 1 на tiny2313
-
Oleg7771
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Сб окт 13, 2012 12:26:43
- Откуда: Харьков UA
- Контактная информация:
Re: помогите разобратся с таймером 1 на tiny2313
схема работает нормально, но есть одна мелкая проблема, несколько раз в секунду замечается небольшое моргание (особенно при мощности чуть меньше половины) похожее на помеху, пробовал на импульсный вход ставить емкость 10...120пФ не помогло. Переделал проект и схему под tiny13, работает но проблема осталась. не подскажешь где копать?
- Реклама
Re: помогите разобратся с таймером 1 на tiny2313
Наверное тебе лучше реализовать работу через прерывание и таймер...
Прерыванием ловить переход через 0, запускать таймер и по окончании счета давать управляющий импульс.
В моем примере полуволна делится на 100 частей, и т.к. счет внутреннего счетчика и фазы сигнала в сети не синхронизированы, вот и возникает иногда перескок значения регулировки на 1 значение.... Т.е. периодически будут колебания на 1\100 длины полупериода.
В этом грубоват мой метод....
Надо будет попробовать с помощью прерывания и таймера.....
Прерыванием ловить переход через 0, запускать таймер и по окончании счета давать управляющий импульс.
В моем примере полуволна делится на 100 частей, и т.к. счет внутреннего счетчика и фазы сигнала в сети не синхронизированы, вот и возникает иногда перескок значения регулировки на 1 значение.... Т.е. периодически будут колебания на 1\100 длины полупериода.
В этом грубоват мой метод....
Надо будет попробовать с помощью прерывания и таймера.....
Re: помогите разобратся с таймером 1 на tiny2313
Глянь тут еще, я как то одному иностранцу помогал, там на тини13 и как то по другому я делал что такого эффекта не було.....
http://radiokot.ru/forum/viewtopic.php?f=20&t=88022
http://radiokot.ru/forum/viewtopic.php?f=20&t=88022
-
Oleg7771
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Сб окт 13, 2012 12:26:43
- Откуда: Харьков UA
- Контактная информация:
Re: помогите разобратся с таймером 1 на tiny2313
с внешними прерываниями пока дело не имел) я так понял при приходе импульса формируется прерывание, в прерывании запускать таймер, количество отсчета и есть угол открытия, после этого выдавать импульс на выход, и останавливать таймер до следующего импульса? если не трудно и будет свободное время можешь хотя бы примерно объяснить в коде как это реализовать?
Re: помогите разобратся с таймером 1 на tiny2313
Не вопрос, но только уже завтра.....
- Реклама
-
Oleg7771
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Сб окт 13, 2012 12:26:43
- Откуда: Харьков UA
- Контактная информация:
Re: помогите разобратся с таймером 1 на tiny2313
я пытался сам написать программу управления через прерывания INT0 , всё заработало но старая проблема осталась, несколько раз в секунду есть мелкое мерцание. проект в прикреплении, если можешь проверь что там не так. мне кажется что я оставил старый алгоритм только изменил способ считывания импульсов перехода через 0.
- Вложения
-
- int_pwm_2313.zip
- 2313
- (37.29 КБ) 163 скачивания
Re: помогите разобратся с таймером 1 на tiny2313
От..... чего наваял я.....
Только на CVAVR сам перенеси, ато я в нем нуль.....
Только на 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
на 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. не подскажешь в чем причина?
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. не подскажешь в чем причина?
Re: помогите разобратся с таймером 1 на tiny2313
Сделал точно так, на тини13, как ты описал, все работает.....
Вот проектик на tiny13:
Вот проектик на tiny13:
- Вложения
-
- tiny13_proteus.7z
- (21.13 КБ) 158 скачиваний
-
Oleg7771
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Сб окт 13, 2012 12:26:43
- Откуда: Харьков UA
- Контактная информация:
Re: помогите разобратся с таймером 1 на tiny2313
есть ещё один вопрос, в чем ты работаешь и какой компилятор? в CAVR у меня так и не получилось завести tiny13, внешнее прерывания всё равно не видит.
- Вложения
-
- int0_pwm_t13.zip
- tiny13
- (53.42 КБ) 139 скачиваний
Re: помогите разобратся с таймером 1 на tiny2313
AVRStudio4 + WINAVR
или просто AVRStudio6, но она тяжеленная, огого.....
или просто AVRStudio6, но она тяжеленная, огого.....
-
Oleg7771
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Сб окт 13, 2012 12:26:43
- Откуда: Харьков UA
- Контактная информация:
Re: помогите разобратся с таймером 1 на tiny2313
долго мучился и тебя доставал вопросами, но всё получилось, сделал печатку в Spint Layout, собрал) Делал по тому варианту что ты давал с прерываниями, с дребезжанием проблема осталась, пришлось с ней смерится, т.к. регулировать придется нагревательные приборы, освещение уже почти всё на экономках. Прикрепляю проект, может что то можно лучше оптимизировать... и доделанную версию программы по расчету OCR1)
- Вложения
-
- project.zip
- проект Proteus
- (43.41 КБ) 161 скачивание
-
- avrcalc.zip
- avrcalc
- (162.48 КБ) 18928 скачиваний
Re: помогите разобратся с таймером 1 на tiny2313
Гляну.....
Как тебе AVRStudio4 + GCC ?
Кстати.. если я тебе позже пару вопросов задам по WIN программированию.. можно? У меня стоит CPP BUILDER6.
Как тебе AVRStudio4 + GCC ?
Кстати.. если я тебе позже пару вопросов задам по WIN программированию.. можно? У меня стоит CPP BUILDER6.
-
Oleg7771
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Сб окт 13, 2012 12:26:43
- Откуда: Харьков UA
- Контактная информация:
Re: помогите разобратся с таймером 1 на tiny2313
я и до этого работал с Avr Studio но в ассемблере, но не знал что он может работать с C+ ) WinAVR я тоже ставил, только не знал для чего он нужен.
теперь проекты пытаюсь перетянуть с CAVR на WinAVR, много работы, почти всё приходится переделывать )))
что касается программ под Win, я пишу на Delphi 7. Ну принцип похож с C++ только синтакс другой, если есть вопросы то спрашивай, если знаю то подскажу
теперь проекты пытаюсь перетянуть с CAVR на WinAVR, много работы, почти всё приходится переделывать )))
что касается программ под Win, я пишу на Delphi 7. Ну принцип похож с C++ только синтакс другой, если есть вопросы то спрашивай, если знаю то подскажу
Re: помогите разобратся с таймером 1 на tiny2313
Да вроде все ОК..... тем более размер менее 600 байт, из 2000 имеющихся... еще есть куда разгулятся.....Oleg7771 писал(а):может что то можно лучше оптимизировать...
-
Oleg7771
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Сб окт 13, 2012 12:26:43
- Откуда: Харьков UA
- Контактная информация:
Re: помогите разобратся с таймером 1 на tiny2313
всё, разобрался с морганием, установил внешний кварц 8мГц, проблема ушла) иногда подмигивает, но это вместе с сетевым напряжением. ты говорил что вопросы по С++ будут, если что пиши, я тоже себе собираюсь установить CPP Builder 6, пишут что он вроде бы лучше, код получается на много меньше и быстрее чем в Delphi. кст что касается WinAVR перекомпилировал прошивку из CAVR на WinAVR код получился почти на 30% меньше чем в CAVR, перешел полностью на AvrStudio )


