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

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

4 hours ago, ruhi said:

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

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

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

 

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

Share this post


Link to post
Share on other sites

Высокая надежность SiC! Как они этого добились?

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

Подробнее

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

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

Share this post


Link to post
Share on other sites

Вебинар «Практическое использование TrustZone в STM32L5»(10.12.2020)

Приглашаем на вебинар, посвященный экосистеме безопасности и возможностях, которые появились у разработчиков благодаря новой технологии TrustZone в микроконтроллерах STM32L5. Программа рассчитана на технических специалистов и тех, кто уже знаком с основами защиты ПО в STM32.

Подробнее

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

Снижена цена на AC/DC и DC/DC преобразователи Mornsun в Компэл!

Компэл и компания Mornsun снизили цены на преобразователи AC/DC-преобразователи семейств LS и LDE. По привлекательной цене также предлагаются DC/DC-преобразователи изолированных семейств поколений R2 и R3 различного конструктивного исполнения.

Подробнее

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

  • Сообщения

    • @Beliy_voron Это гирлянда, а там без задержек никак или как ещё заставить светодиоды мигать да ещё в нужных мне алгоритмах? С таймерами это будет сделать полный гемор. И как уже для себя решил всё сводится к тому что мне стоит вместо кнопок установить галетный переключатель и проверять каждый его вывод как обычную кнопку и тогда всё встанет на своё место. Остаётся только найти его в магазине.
    • В данном светильнике , помимо белого ,  будут присутствовать еще четыре цвета и их необходимо все регулировать независимо
    • Походу, месье совсем не знает толка в извращения,  а другим таки советует!!! Да,  приведённая Вами  картинка - красивая, несомненно. ...Вот если б сами сделали и показали  Если кто попробует по совету Алебастра свить пружинку из скрепки, пожалуйста покажите результат, и оцените его характеристики  в качестве  пружинного контакта контрольной точки. Уже походил по подобным грабелькам!!  Свить  пружинку малого диаметра  из толстой жёсткой сталистой  проволоки - весьма проблематично, без спец оборудования ничего путного  не выйдет!. С уважением, Сергей  
    • Опыт прослушивания? Или измеренный? Ну и что ты там экономишь, накрутив лишние 50 мА? Радиаторы? Опять 25. Про сим поговорили, нужно железо. Есть данные? Не передергивай, Серег. Я не напираю на лучше/хуже, вопрос не в этом, а вопрос в ПРАВИЛЬНОМ токе для НОРМАЛЬНОЙ работы. Все. Конкретно тебя я ни в чем не убеждаю. В Никитине полевики. У них ток покоя ставится для того, чтобы не было переключательных или как их там искажений. А так им фиолетово,с какой скоростью переключать, пока емкость затвора не начнет влиять и ток драйверов. Потому, что не хочешь. Ясно. Смысл я тебе выше объяснил, как и по твоей логике заменить сомнительные транзисторы УН, чтобы двухполюсная коррекция, наконец-то, заработало как задумано. Но это если есть чем менять.    
    • @Kraftverk КРЕНка через диоды действует частично как снаббер, может на ключах сигнал затянутый прилично (особенно если баян из ключей), вот энергия выбросов и рассеивается прямо на них в виде тепла + трансформатор удачно получился с низкой Ls.

  • Острые кусачки

×
×
  • Create New...