Jump to content
carlogulliani

Помогите настройить таймер на stm8s для захвата сравнения

Recommended Posts

Есть stm8s003 с подключенной к ноге PD3 периферией, которая генерирует ШИМ сигнал с +- одинаковым периодом, но с разной шириной пульса, где ширина пульса < половины периода - это 0, а ширина пульса > Т/2 - это 1. Для решения данной задачи хочу настроить таймер на режим захват/сравнение. Так как сигнал на ноге D3, то беру таймер 2 со 2 каналом

image.png.cbf6b00c1dc651a5aaa1129b247961ce.png

 

Частоту контроллера ставлю 16МГц, а таймера 1МГц

CLK_CKDIVR = 0; // 16MHz
CLK_PCKENR1 = 0xFF; // Тактирование периферии
CLK_PCKENR2 = 0;

 

А далее инициирую таймер, запускаю и слушаю прерывания

ISR_TIM2_CC(TIM2_CAP_COM) {
    // как считать ширину пульса и период?
}

void tim2_DeInit(void)
{
    TIM2_CR1 = 0;
    TIM2_IER = 0;
    TIM2_SR1 = 0;
    TIM2_SR2 = 0;
    TIM2_EGR = 0;
    TIM2_CCMR1 = 0;
    TIM2_CCMR2 = 0;
    TIM2_CCMR3 = 0;
    TIM2_CCER1 = 0;
    TIM2_CCER2 = 0;
    TIM2_CNTRH = 0;
    TIM2_CNTRL = 0;
    TIM2_PSCR = 0;
    TIM2_ARRH = 0xFF;
    TIM2_ARRL = 0xFF;
    TIM2_CCR1H = 0;
    TIM2_CCR1L = 0;
    TIM2_CCR2H = 0;
    TIM2_CCR2L = 0;
    TIM2_CCR3H = 0;
    TIM2_CCR3L = 0;
}

void tim2_init(void) {
    tim2_DeInit();

    TIM2_PSCR = 0x04;// 16/2^4 = 1MHz

    // Настройка режима захвата сравнения
    TIM2_CCMR2 = 0x01;
    TIM2_CCER2 = 0x20 | 0x11;
    
    // Прерывание и включение
    TIM2_IER |= (1 << 2); // канал 2 для захвата/сравнения
    TIM2_CR1 = TIM2_CR1_ARPE | TIM2_CR1_CEN;
}

Есть неуверенность в настройке захвата и я так понимаю, что прерывание срабатывает по каждому переднему фронту, и чтобы посчитать ширину пульса, мне надо ввести некий флаг, если flag = 0, но как посчитать ширину пульса, ведь захват по переднему фронту, а пульс заканчивается на заднем фронте, еще и период считать

Share this post


Link to post
Share on other sites
23.09.2020 в 11:59, carlogulliani сказал:

Есть stm8s003 с подключенной к ноге

Вы какую то малоизвестную микросхему выбрали для экспериментов. Хоть таймеры везде примерно одинаковый - тут надо в детали описания влезать, в других микросхемах можно настроить захват по обоим фронтам, в этой не знаю, вообще первый раз вижу упоминание 8-битного СТМ-а применительно к таким экспериментам!

И еще главная проблема не посчитать период, а куда вы его собрались выводить-показывать!


Можно сделать все! Но чем больше можно, тем больше нельзя!

Share this post


Link to post
Share on other sites
4 hours ago, ruhi said:

Вы какую то малоизвестную микросхему выбрали для экспериментов. Хоть таймеры везде примерно одинаковый - тут надо в детали описания влезать, в других микросхемах можно настроить захват по обоим фронтам, в этой не знаю, вообще первый раз вижу упоминание 8-битного СТМ-а применительно к таким экспериментам!

И еще главная проблема не посчитать период, а куда вы его собрались выводить-показывать!

К сожалению, пришлось с данным контроллером разбираться, тк китайская плата с радиочипом работает с этой схемой. Период, а вернее скваженость собираюсь декодировать, зная длину пакета. Посмотрел в референсы, захват здесь тоже можно настроить по обоим фронтам, например, так image.png.7e0a157658ebca5bfe09927b2a4c076a.png

 

Но пока не могу понять, как мне определить, прерывание вызвало передний или задний фронт

Share this post


Link to post
Share on other sites

Вебинар «МЭМС-датчики ST для работы со звуком – новые возможности» (28.10.2020)

28 октября все желающие приглашаются для участия в вебинаре, посвященном семейству МЭМС-датчиков STMicroelectronics для акустических приложений. Предметом детального рассмотрения на вебинаре станут микрофоны, их топологии применения и возможности. Вы услышите о новых мультирежимных широкодиапазонных микрофонах с нижним портом и PDM-интерфейсом для систем с батарейным питанием.

Подробнее

В мануале есть описание как определить параметры ШИМ сигнала. Описание для таймера 1, но для таймера 2 оно тоже подходит.

PWM input signal measurement - на странице 168.

Share this post


Link to post
Share on other sites

STM32L562E-DK – первая отладочная платформа ST на ядре ARM Cortex-M33

STMicroelectronics представляет демонстрационно-отладочную платформу на базе ядра Cortex-M33 – STM32L562E-DK. Данная платформа основана на микроконтроллере нового семейства – STM32L5. STM32L562E-DK позволяет разработчику в полной мере раскрыть и опробовать новые возможности микроконтроллеров STM32L5 с тщательно проработанным функционалом для обеспечения высокого уровня безопасности и защиты.

Подробнее

1 hour ago, snn_krs said:

В мануале есть описание как определить параметры ШИМ сигнала. Описание для таймера 1, но для таймера 2 оно тоже подходит.

PWM input signal measurement - на странице 168.

Вот его как раз и смотрю,

получается, что если у меня пришел передний фронт, то надо смотреть на вход IC1, задний - IC2. Соответственно, на прерывании проверяю регистр TIM2_SR1

if (TIM2_SR1 & 0x02){} // передний фронт
if (TIM2_SR1 & 0x04){} // задний фронт

image.png.f5b08b21b49c1b0c4a20d4a5f71d917d.png

image.png.c68f765e044ef3001997e6c9e86f8c91.png

Share this post


Link to post
Share on other sites

Тест уровня кондуктивной помехи электронного устройства

Электромагнитная совместимость (ЭМС) является важным параметром электронных устройств, особенно это актуально в современном мире, насыщенном разнообразными гаджетами. Специалисты компании Mornsun подготовили видеоролик по тестированию одной из составляющих ЭМС – кондуктивной помехи.

Подробнее

6 часов назад, carlogulliani сказал:

получается, что если у меня пришел передний фронт, то надо смотреть на вход IC1, задний - IC2.

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

В любом случае надо проверять свое понимание описания микросхемы в таких деталях, по крайней мере на этапе первого знакомства с любой конкретной микросхемой.

Edited by ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

Share this post


Link to post
Share on other sites
2 hours ago, ruhi said:

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

В любом случае надо проверять свое понимание описания микросхемы в таких деталях, по крайней мере на этапе первого знакомства с любой конкретной микросхемой.

Да, так и хочу сделать, но схема постоянное ребутится и даже до прерывания не доходит. Вот так настроил прерывание, нога настроена на вход

 

void tim2_init(void) {
    tim2_DeInit();

    TIM2_PSCR = 0x04;// 16/2^4 = 1MHz

    // set up capture compare

    //(N=4 samples filter, input for CH1=TI2FP1)
    TIM2_CCMR1 |= (1 << 1); // CC1 channel is configured as input, IC1 is mapped on TI2FP1
    TIM2_CCMR1 |= (1 << 5); // Input capture 1 filter, N = 4
    
    //(N=4 samples filter, input for CH2=TI2FP2)
    TIM2_CCMR2 |= (1 << 0); // CC2 channel is configured as input, IC2 is mapped on TI2FP2
    TIM2_CCMR2 |= (1 << 5); // Input capture 2 filter, N = 4

    TIM2_CCER1 |= (1 << 4); // Capture enable for CC2IE
    TIM2_CCER1 |= (1 << 0); // Capture enable for CC1IE
    
    // Enable interruption and start timer
    TIM2_IER |= (1 << 0);   // set bit CC2IE
    TIM2_IER |= (1 << 1);   // set bit CC1IE
    TIM2_IER |= (1 << 2);   // set bit UIE

    // start timer
    TIM2_CR1 = 0x01;
}

 

Edited by carlogulliani

Share this post


Link to post
Share on other sites
4 часа назад, carlogulliani сказал:

но схема постоянное ребутится и даже до прерывания не доходит

К чему тогда этот код? надо разбираться сначала почему она ребутится и сделать чтоб не ребутилась!


Можно сделать все! Но чем больше можно, тем больше нельзя!

Share this post


Link to post
Share on other sites
On 9/25/2020 at 3:01 PM, ruhi said:

К чему тогда этот код? надо разбираться сначала почему она ребутится и сделать чтоб не ребутилась!

Ребутится из-за таймера, как только не включаю его, то все ок (еще были проблемы с проводами, контакт отходил). По таймеру не входит в прерывание по захвату, в ДШ написано, что флаг прерывания стирается при чтении младших битов регистра CCR2, закомментил все в прерывании и оставил две строчки

TIM2_SR1 = 0; // еще пробовал так uint16_t r = (TIM2_CCR2H << 8) | TIM2_CCR2L;
printf("|\r\n");

Но так и не увидел printf, сигнал на ноге есть (вижу логическим анализатором), да и тупо подавал на пин контроллера высокий и низкий сигнал с питания 3.3v

Вообще перечитал несколько раз блок про TIM2 в ДШ, перепроверил все настройки, ошибок не нашел - но почему-то не хочет работать

Edited by carlogulliani

Share this post


Link to post
Share on other sites
On 9/23/2020 at 11:59 AM, carlogulliani said:

ISR_TIM2_CC(TIM2_CAP_COM)

Если обработчик прерывания объявлен не правильно, контроллер будет перегружаться. Проверьте как объявляются обработчики прерываний. Возможно компилятор выдает предупреждение типа - Функция ISR_TIM2_CC не используется.

Share this post


Link to post
Share on other sites
6 часов назад, carlogulliani сказал:

Ребутится из-за таймера, как только не включаю его

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


Можно сделать все! Но чем больше можно, тем больше нельзя!

Share this post


Link to post
Share on other sites

Компилю SDCC, первая ошибка была, что прототип обработчика прерываний должен быть в файле с main функцией, иначе он ее не линкует. В итоге вынес сам обработчик в main.c. Теперь смотрю ассемблер код (таблицу векторов) и доташит, вектор совпадает, но результат все тот же. Убрал из обработчика все лишнее, вывожу только printf, в последовательном порту ничего, ну кроме того, что не ребутится больше. Упростил еще больше, в обработчике оставил только одну строчку, которая переключает флаг и в main функции в цикле, если флаг true, то печатаю printf , тоже ничего (поднял приоритет прерывание до High)

 

Таблица векторов прерывания (первый столбик - номер прерывания, последний адрес)

 

image.png.9b29e23eba45cf533fff46319f43a915.png

 

;--------------------------------------------------------
; interrupt vector 
;--------------------------------------------------------
	.area HOME
__interrupt_vect:
	int s_GSINIT ; reset
	int 0x000000 ; trap
	int 0x000000 ; int0
	int 0x000000 ; int1
	int 0x000000 ; int2
	int 0x000000 ; int3
	int 0x000000 ; int4
	int 0x000000 ; int5
	int 0x000000 ; int6
	int 0x000000 ; int7
	int 0x000000 ; int8
	int 0x000000 ; int9
	int 0x000000 ; int10
	int 0x000000 ; int11
	int 0x000000 ; int12
	int 0x000000 ; int13
	int _TIM2_CAP_COM ; int14
ISR_TIM2_CC(TIM2_CAP_COM) {
  TIM2_CC_FLAG = 1;
}

void main(void) {
  ...
  while(1){
	if(TIM2_CC_FLAG) {
		TIM2_CC_FLAG = 0;
		printf("/\r\n");
	}
  }
}

 

Share this post


Link to post
Share on other sites

В обработчике прерывания вставьте сброс флага прерывания.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

В SDCC

функцию прерывания объяви так

void TIMER_2(void) __interrupt(14)
{
   .........................

.............................;
}

Share this post


Link to post
Share on other sites
19 minutes ago, skripach said:

В SDCC

функцию прерывания объяви так

void TIMER_2(void) __interrupt(14)
{
   .........................

.............................;
}

Да и так объявлял и через дефайны, в main.asm видно, что в таблице векторов данное прерывание есть - только толку от этого 0, как писал выше из прерываний все убрал, оставил только сброс флага (и установкой 0 в SR1, SR2, и чтением CC1L) печать символа, чтобы протестить, что срабатывает. 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Один в один 5гдш-4, только у моих на магните 3 клёпочки, и гофр другой, 5гдш-4 довольно давно выпускались, года с 84-85 их так обозвали точно, возможно в Ваш маг позднего выпуска их и заложили... А у меня телевизор был, Берёзка вроде 2-го класса цветной, так вот там он стоял, и играл довольно хорошо, если б ещё не К174УН7 , вообще б сказка была. Я у отца спросил что за динамик так играет, открываем паспорт там частотка 80-15000 Гц, Отец говорит, так у нас динамик Японский, наш так играть не может!  Позже, разобрав Уставший телевизор я тоже удивился этому маленькому чуду, но тут чудо не только в динамике, а ещё и в огромном, да ещё и фанерном корпусе телевизора, удачно он туда по объёму подошёл! Он и в задней полке Авто будет отлично петь, особенно если по паре штук в канал - проверено! но бумага тонкая, долго он там не протянет...
    • Вы мне еще расскажите про тонкое и сверхтонкое расщепление спектральных линий в атоме водорода. Не хочу все это вспоминать, в реальной жизни не пригодилось. По образованию я радиофизик. Длина волны излучаемого  света зависит от того, с какого на какой энергетический уровень перешел электрон. А вот наличие этих уровней у веществ разное. И способы "накачки", т.е заброса электронов на верхние уровни разные (нагрев, облучение и т.д.)
    • DIP-версии если только у "гурманов".  И не факт что версия печатки будет годной. Вы вспомните эпопею с Тройкой: то, банально, косяки по трассировке, то шумы по питанию, вследствие некоторые обвешивали микры дросселями.  Пробуйте smd. Печатки проверены. К хорошему бысро привыкнете.
    • Американский геофизический союз (American Geophysical Union, AGU) отказался принимать к рассмотрению для публикации статью российских ученых из Института прикладной физики Российской академии наук (ИПФ РАН) из-за того, что Россия находится под международными санкциями. Об этом пишет ТАСС со ссылкой на письмо ИПФ РАН в адрес президента РАН Александра Сергеева. «Американский геофизический союз отказался принять к рассмотрению статью „Новая связь между Эль-Ниньо — Южным Колебанием и атмосферным электричеством“, подготовленную к публикации в журнале Geophysical Research Letters. Свой отказ AGU мотивировал невозможностью рассмотрения научных работ, финансируемых правительством РФ и министерством науки и высшего образования как части правительства РФ», — говорится в письме.  Под эгидой AGU издаются научный журнал Geophysical Research Letters и серия журналов Journal of Geophysical Research, являющиеся основными высокорейтинговыми изданиями, признанными ведущими специалистами в области геофизики. https://www.znak.com/2020-10-23/v_ssha_statyu_rossiyskih_fizikov_otkazalis_publikovat_iz_za_sankciy
    • Обычный джек. Но что туда могут подать, хрен его знает. Вы невнимательно читаете. Я же указал - "сделать и забыть".
    • И вправду, возьму схему оттуда. Но есть два вопроса. Корректна ли замена ne5532 на opa2277 и зачем подтяжка ИОН через резистор R53 к 5-ти вольтам? Схема.
    • Не надо мне тыкать, вас где воспитывали? Я сюда пришел не платить вам зарплаты что вы мне озвучили в ЛС, как и основная масса пользователей на этом форуме, а обратился за схемой возможно она уже где то есть. Я готов заплатить денег каких то но не больше 1000$ что вы мне примерно озвучили, мне такой итог не нужен и есть предложения в 10 раз меньше. Я все больше склоняюсь к тому что это все таки будет китайский контроллер а напряжение будет постоянным без регулировки, и не надо будет выслушивать хамовитых пользователей которые тыкают тебе как гопота и остальгые упреки, как будто я пришел на форум "Ищу схему" а прошу тут денег на автомобиль или дом. ПДФки для примера. Шаг 0.1 это не десятое а первое. Хотелоссь что бы как у китайцев все на одном контроллере было.

  • Модуль камеры OV7670 640x480

×
×
  • Create New...