Захват импульсного сигнала с определением времени следования

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Захват импульсного сигнала с определением времени следования

Сообщение ВитГо »

есть устройство с контроллером мега64, с тактовой частотой 16 мгц

на вывод icp3/int7 приходят импульсы сигнала PPM например такие:

Изображение

это сигналы для управления моделями по радиоканалу, само устройство тоже генерирует подобный сигнал в прерывании interrupt [TIM1_COMPA] void timer1_compa_isr(void)

цель получить значения длительностей между двумя соседними импульсами - на схеме это длительности с числами 1,2,3,4,5....
размеры импульсов с 800 до 2200 мкс, общий размер пачки 20 мс, размер паузы всегда более 3000 мкс


генерация собственных импульсов и захват приходящих должны осуществляться одновременно - это разные сигналы уходяще-приходящие на разные ноги (то есть захватывать нужно не свой сигнал).

аппаратную структуру железки менять не могу.

с мегами дела до недавнего времени не имел, прошу оценки алгоритма который я придумал - будет ли он работать или может быть есть другое решение?

хочу задать тактовую частоту генератора timer3 в 2 мгц, генератор не должен генерировать никаких прерываний

по выводу int5 настроить прерывание на положительный 0->1 или на отрицательный 1->0 фронты импульса (на рисунке отрицательный, но сигнал может иметь и положительную полярность)

при генерации прерывания:
1. считываем значение счетчика, делим его на 2 (получаем как раз значение в мкс)

2. если значение длительности меньше 2200 мкс
- помещаем значение длительности в номер соответствующего канала,
- канальный счетчик (который определяет какой канал захватили) увеличиваем на единицу
3. если значение длительности больше 3000 мкс - то значит это пауза - сбрасываем счетчик каналов (чтобы считывать каналы с первого)

4. счетчик таймера устанавливаем в ноль для начала отсчета длительности нового промежутка


теперь вопросы - никому ничего глаза не режет ?

timer3 может увеличивать значение собственного счетчика сам и не генерить при этом прерываний ?

далее - как настроить приоритеты чтобы захват и генерация сигналов происходили одновременно ?

если я запрещу прерывания при захвате импульса и разрешу при выходе из захвата - и при этом прерывание timer1 будет в этом запрещенном промежутке времени - после разрешения прерывания - timer1 сделает прерывание ?

не бросайте котенка в воду, помогите !

p.s. предполагаю что многие вещи написаны в даташите - но с английским у меня туго - и хотелось бы сначала чтобы ктото сказал рабочий ли я алгоритм придумал - дальше начну курить даташит

p.s. ссылка на мой проект (не реклама, просто может кому то будет понятнее) http://forum.rcdesign.ru/blogs/50021/blog9239.html#comments

вот документация на то что уже получилось. http://narod.ru/disk/23022923000/vcoder.zip.html
Последний раз редактировалось ВитГо Ср июл 28, 2010 16:35:14, всего редактировалось 3 раза.
Елисей
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт мар 05, 2009 23:21:53

Re: Захват импульсного сигнала с определением времени следов

Сообщение Елисей »

Алгоритм неплохой, вот только я не понял - а почему нельзя таймером делать прерывания? Прервался, сделал +1 переменной быстро и все. Хотя у меги должен быть таймер с двухбайтовым TCNT. Он может и без прерывания посчитать.

Кстати, а что за железка такая? Приемник от модели? А зачем ему свой ppm делать?
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Захват импульсного сигнала с определением времени следов

Сообщение ВитГо »

в смысле таймером прерывания делать?

железка - передатчик.. вот такой -> http://www.hobbycity.com/hobbyking/stor ... er_(Mode_1)_(v2_Firmware) (у него много аналогов)

ту функцию что нужно написать - это захват ppm сигнала управления, внесение в него изменений, и выдача на модель...
нужно например для реализации функций тренера - к передатчику тренера подключается передатчик ученика - в одном положении выключателя передатчика тренера - пакеты ученика уходят на модель, в другом (например когда ученик зарулился) моделью управляет тренер...

вот захват и нужно написать

к сожалению с аппаратными наворотами меги я не знаком...
поэтому и прошу помощи...с захватом
Елисей
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт мар 05, 2009 23:21:53

Re: Захват импульсного сигнала с определением времени следов

Сообщение Елисей »

да... избаловала меня шеститысячная санва.... даже не знал что передатчики без всего этого бывают. хотя столько каналов и за такие деньги - стоит и повозиться.


захват я бы сделал так :
настроил таймер на прерывание каждую микросекунду, (тактовая частота МК и прерывание каждые 16 срабатываий) в прерывании - всего одна строчка tim ++; где tim - глобальная переменная типа int
в обработке внешнего прерывания, реагирующего на нисходящий фронт :

if(f==0){ //если f =0

TCCR3=1; // включаем таймер 3
f=1; // ставим f еденицей
tim=0; обнуляем счетчик

}
if(f==1) { // если f еденица
TCCR3=0; // выключаем таймер
f=0;

и здесь код, который и припишет полученную длительность из переменной tim в то место где она нужна.

}


что получается - каждый нисходящий фронт будет то включать, то выключать таймер, попутно сохраняя то, что он насчитал.


в принципе у таймера есть свой счетчик - регистр TCNT про который я раньше писал, и им можно заменить переменную tim но с двухбайтовыми TCNT я никогда не работал, так что советовать не буду. а в однобайтовый длительность импульса просто не влезет.
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Захват импульсного сигнала с определением времени следов

Сообщение ВитГо »

нее..в оригинальной прошивке эта функция есть..

для передатчика прошивку писал по другим причинам (функционал можете глянуть в доке - ссылка выше)
сейчас появилась необходимость подключить к аппе хедтрекер - и для этого нужны функции захвата и селекции отдельных каналов... и отправки их в пакете аппы в качестве части каналов
например 1-6 каналы управления ЛА
а каналы 7-8 - каналы управления идущие с хедтрекера

опять таки иногда нужна возможность изменения данных с хедтрекера (например уменьшения размаха сигнала)

все это моя прошивка может (оперирует 16ю логическими каналами, есть выключаемые микшеры, микшеры с регулируемым коэфф. микширования, и т.д.) - осталось только достать значения каналов PPM на входе....

прерывание на каждую микросекунду - однозначно нет... слишком мало времени на остальные функции останется... мне же еще нужно отдавать.. и еще расчитывать. и еще интерфейс отрабатывать...
Елисей
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт мар 05, 2009 23:21:53

Re: Захват импульсного сигнала с определением времени следов

Сообщение Елисей »

ну значит тогда двухбайтовым регистром TCNT пользоваться. оно в принципе должно быть несложно из двух регистров ( TCNTL и TCNTH) засунуть данные в одну переменную но у меня от жары московской башка совсем думать отказывается.

в сей регистр таймер будет сам прибавлять еденичку с заданной частотой. гдавное после считывания данных его бнулять.
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Захват импульсного сигнала с определением времени следов

Сообщение ВитГо »

Прошу прощение за наверное глупый вопрос:

после вот такой инициализации

// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: 2000,000 kHz
// Mode: Normal top=FFFFh
// Noise Canceler: Off
// Input Capture on Falling Edge
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Timer 3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x02;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;

счетчик начинает считать сам ? больше ничего не нужно ?

и из TCNT3 можно брать число до которого досчитали ?
Елисей
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт мар 05, 2009 23:21:53

Re: Захват импульсного сигнала с определением времени следов

Сообщение Елисей »

начнет. только TCNT у него два. L и H . младший и старший. вот из них двоих надо вытащить число и в одной INT переменной его собрать и потом уже использовать. ну и вовремя обнулять регистры.
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Захват импульсного сигнала с определением времени следов

Сообщение ВитГо »

гм.. почему то виснет у меня все..

прерывание от первого таймера не работает... :-(

как инициализацию третьего таймера убираю - начинает работать...

что за фигня ?
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Захват импульсного сигнала с определением времени следов

Сообщение ВитГо »

вообще инициализация выглядит вот так

// ---------- Конфигурация портов ввода-вывода процессора

// Port A - используется для управления дисплеем
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTA=0x00;
DDRA=0xFF;

// Port B - кнопки меню и выход сигнала PPM
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=0
// none left right up down exit menu ppm_out
PORTB=0xFE;
DDRB=0x01;

// Port C - управление дисплеем
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=In
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=P
// none none disp disp disp disp disp none
//PORTC=0x01; // Проверенная конфигурация но на выход работают 6 и 7 биты которые
//DDRC=0xFE; // не подключены и скорее всего разумно их перевести на ввод

PORTC=0xC1; // Помоему так должно быть.................!!!
DDRC=0x3E;

// Port D - Триммеры
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P
// RuddTrDN RuddTrUP ThroTrDN ThroTrUP ElevTrDN ElevTrUP AileTrDN AileTrUP
PORTD=0xFF;
DDRD=0x00;

// Port E - выключатели и пищалка
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=P State6=P State5=P State4=P State3=0 State2=P State1=P State0=P
// ppm_in id2 trainer gear buzzer elevDr aileDr throCut
PORTE=0xF7;
DDRE=0x08;

// Port F - Аналого-цифровой преобразователь
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
// batt pit_trim hov_thr hov_pit rudd_st thro_st elev_st aile_st
PORTF=0x00;
DDRF=0x00;

// Port G - выключатели и вход "ppm-ученик"
// Func4=In Func3=In Func2=In Func1=In Func0=In
// State4=P State3=P State2=P State1=P State0=P
// simcontrol id1 none verRfPow ruddDR
PORTG=0x1F;
DDRG=0x00;

// Timer/Counter 1 initialization - передача пачки PPM
// Clock source: System Clock
// Clock value: 2000,000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Non-Inv.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x02; // 02-disconnect c2-invert 82-no_invert
TCCR1B=0x1A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x17;
ICR1L=0x70;
OCR1AH=0x02;
OCR1AL=0x68;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

/** вот это убираю и работает.. добавляю (убираю комментарии) и не работает
// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: 2000,000 kHz
// Mode: Normal top=FFFFh
// Noise Canceler: Off
// Input Capture on Falling Edge
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Timer 3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x02;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;
**/
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;


// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
ETIMSK=0x10;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;


// ADC initialization
// ADC Clock frequency: 187,500 kHz
// ADC Voltage Reference: AREF pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x87;
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Захват импульсного сигнала с определением времени следов

Сообщение ВитГо »

ну и все это добро запускаю кодом

#asm("sei")

TIMSK|=0x10; // Разрешаем прерывание таймера
Елисей
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт мар 05, 2009 23:21:53

Re: Захват импульсного сигнала с определением времени следов

Сообщение Елисей »

странно... а что именно перестает работать? третий таймер точно нигде больше не используется? по идее все верно инициализировалось...
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Захват импульсного сигнала с определением времени следов

Сообщение ВитГо »

такое ощущение что все прекращает работать - на экран ничего не выводиться...

вот эта строчка чтото меня напрягает в описании инициализации
// Input Capture on Falling Edge

мне ничего захватывать не нужно....
да и в параметрах вроде ничего нет....
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Захват импульсного сигнала с определением времени следов

Сообщение ВитГо »

а как еще может использоваться третий таймер ?

я удаляю его инициализацию и все начинает работать..

в прерывании первого таймера - он точно не используется..

больше никаких секретов у таймера этого нет ?

может быть еще что нить в TIMSK или ETIMSK ставить нужно ? (гм.. хотя мне от него прерывания не нужны... просто пусть бы считал..)
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Захват импульсного сигнала с определением времени следов

Сообщение ВитГо »

а нет такого что перед тем как использовать 3ий таймер- нужно второй проинитить или запретить его работу?

а то у меня в ините ровно то что я написал - сначала порты, потом первый таймер, потом сразу третий..
Елисей
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт мар 05, 2009 23:21:53

Re: Захват импульсного сигнала с определением времени следов

Сообщение Елисей »

ну я вижу что все input capture выключены у третьего.... порядок инициализации значения не имеет. единствееное что сделали - мы его просто включили.

а откуда строчка после после #asm("sei") взялась? это значение TIMSK как и для чего расчитывалось?
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Захват импульсного сигнала с определением времени следов

Сообщение ВитГо »

это включение прерывания для первого таймера...

сейчас еще раз гляну...
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Захват импульсного сигнала с определением времени следов

Сообщение ВитГо »

да, bit 4 OCIE1A Timer Counter 1 Output Compare A match Interrupt Enable

может ее до разрешения прерываний вставить?

но в таком порядке все работает
Елисей
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт мар 05, 2009 23:21:53

Re: Захват импульсного сигнала с определением времени следов

Сообщение Елисей »

напрягает что дважды значение в TIMSK записывается, причем второй раз - через |

может что то одно убрать? щас напрягу генератор кода - посмотрю какое же всетаки там значение должно быть
Елисей
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт мар 05, 2009 23:21:53

Re: Захват импульсного сигнала с определением времени следов

Сообщение Елисей »

при условии прерывания только таймера 1 по compare a в timsk должно быть 0x10 значит первое , там где туда 0x01 попадает можно попробовать убрать. откуда оно взялось непонятно. и etimsk - за что он отвечает? первый раз с ним сталкиваюсь... я бы и туда попробовал ноль посадить для эксперимента.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»