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

Вебинар «STM32L5. Секреты оценки энергопотребления» (05.11.2020)

Компания КОМПЭЛ приглашает 5 ноября принять участие в вебинаре, посвященном первому семейству МК STM32L5 на ядре Cortex-M33. На вебинаре будет рассказано об ошибках при расчете энергопотребления МК с помощью отладки STM32L562E-DK. Отладки STM32L562E-DK будут разыгрываться среди участников. Информация об условиях участия будет озвучена на вебинаре.

Подробнее

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

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

Share this post


Link to post
Share on other sites

Как снизить потери мощности на 30%? Транзисторы SiC MOSFET.

Прогресс в области широкозонных полупроводниковых материалов позволил создать карбид-кремниевые полевые транзисторы (SiC MOSFET) с повышенной рабочей частотой, обеспечивающие меньшие потери на переключение. Усовершенствованные корпуса с малой паразитной индуктивностью, в которых выпускаются такие транзисторы, позволяют разработчикам в полной мере использовать возможности этих компонентов для увеличения КПД силовых преобразователей.

Подробнее

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

Нейросети в STM32G4 - пошаговое руководство!

Наличие программного пакета X-CUBE-AI, расширяющего функционал STM32CubeMX, поможет разработчику построить искусственную нейросеть на базе микроконтроллера из линейки STM32G4 производства STMicroelectronics. Статья включает пошаговое описание реализации такой нейросети.

Подробнее

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...

  • Сообщения

    • В отличие от других я внимательный. В советской школе нас учили внимать информацию с пониманием её сути. Если прослеживать сюжетную линию нестыковки выявляются сами.
    • Отдохните, "дорогой", а то своей слюной уже всех забразгали, даже модератора ... А ещё спрашиваете - "где злой умысел" ...?
    • Уважаемый master90 разработал малогабаритную (45х65 мм) печатную плату для радиоприёмника с питанием микроконтроллера и дисплея ST7735 от источника +3,3 В. Кнопки любой конструкции распологаются на дополнительной плате и соединяются шлейфом с платой приёмника. Такой конструктивный подход позволит без проблем установить плату практически в любой корпус. Элементы и их номиналы на рисунке печатной промаркированы и отображаются при наведении на них курсора. Печатная плата опробована в работе. Я составил полную схему радиоприёмника в соответствии с этой печатной платой.   FM M328 ST7735 scan 3.3.lay6 SCHEMATIC1 _ FM_M328_ST7735_3,3.pdf
    • То, что Вы называете срачем и флудом характерно для обоих ников. Это можно легко обнаружить по наказаниям. А вот то, что забанен оказался ник, от имени которого были опубликованы технические разработки, говорит о предпочтении модератором срача и флуда техническим материалам. Из чего следует, что не имеет смысла размещать на этом форуме технические разработки. Здесь следует срать и флудить. Это ваш выбор. Вы пляшете под ссученного, ниже падать уже некуда. Ха! А ники ссученного случаем не Вам принадлежат? Логически очень даже укладывается.
    • Резисторы зависят от опорного напряжения, а не от питания. Поэтому те номиналы,что на схеме, пойдут в широком диапазоне питающих напряжений. Можно уточнить балластники для тока через опорные свкетодиоды 4 -5 мА.

  • Нагрузочные сопротивления 5...100 Вт

×
×
  • Create New...