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

Вебинар «Новинки и решения Traco для промышленных и отраслевых приложений» (28.10.2021)

Компэл 28 октября приглашает всех желающих принять участие в вебинаре, где будет рассмотрена новая и перспективная продукция компании Traco. Мы подробно рассмотрим сильные стороны и преимущества продукции Traco, а также коснемся практических вопросов, связанных с измерением уровня шумов, промывкой изделий после пайки и отдельно разберем, как отличить поддельный ИП Traco от оригинала.
Подробнее

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

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

Share this post


Link to post
Share on other sites

LM – семейство недорогих источников питания в кожухе от Mornsun

Компания Mornsun разработала и серийно производит новый вид продукции – источники питания в перфорированном кожухе, монтируемые на шасси. Новое семейство AC/DC-преобразователей LM выпускается в диапазоне мощности 15…350 Вт на стандартные выходные напряжения 3,3…48 В, в зависимости от серии. Источники питания характеризуются невысокой стоимостью и при этом имеют компактные размеры, хорошие показатели КПД и ЭМС, устойчивы ко входному напряжению до 305 В и обладают изоляцией «вход-выход» 3000/4000 В.

Подробнее

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

Bourns – надежное решение для защиты блоков питания базовых станций

Телекоммуникационные базовые станции часто подвергаются ударам молний и выходят из строя из-за короткого замыкания. Компания Bourns предлагает решение, позволяющее обеспечить надежную защиту от перенапряжения и перегрузки по току с помощью гибридного компонента GMOV™, PTVS-диодов PTVS1-380C-TH и плавких предохранителей SF-3812F-T. Рассмотрим это решение
Подробнее

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

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

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

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

Edited by ruhi

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

Share this post


Link to post
Share on other sites

Будущее сегодня с TE Connectivity: мезонинные соединители высокой плотности COM Express со скоростью 16G+

Компания TE Connectivity выпустила на рынок серию 16G 0.5mm FH с поддержкой стандарта COM Express – самые миниатюрные соединители в портфеле TE Connectivity на сегодняшний день, обеспечивающие скорость передачи данных более 16 Гбит/с. По сравнению с более ранней версией, рассчитанной на 8 Гбит/с, версию 16G отличают улучшенные показатели качества передаваемого сигнала.
Подробнее

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

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

  • Сообщения

    • Странный вопрос. Ограничение получить и настраивать.
    • Мда... столько дурак -травы не выкурить, явно он потреблял что-то позабористее. 
    • У меня такой эффект от чтения Булгакова
    • Господа-товарисчи @Soundoverlord , @O5-14, @finn32, вы три оба - негодяи. Из-за вас из меня с утра завтрак едва не выскочил.Так никакой красной икры не хватит, даже сделанной на Алтае из морской капусты. 
    • Это которые в армейских сухпайках для разогрева подобной гадости  , сделанной таджиками-маргиналами в подмосковной деревушке, в качестве топлива используется? Не, такое вспоминать - лучше уж сразу мордой в унитаз. 
    • Ну знаете, как по мне,  то КСС С800 чем то там обладает, так себе идея. Это такой же псевдовазелин из провинции Ли Ху Ань.   218, 223, 559, UV 10, UV 80  - эти флюсы имеют в составе модифицированную канифоль по дефолту, по крайней мере обязаны иметь. Но при этом, что в них можно или нельзя найти - это дело неблагодарное. В любом случае все эти флюсы вместе с S800 обязаны быть удаленными из под компонентов тщательным образом. По этому применять их в BGA и подобной пайке - запрещено и себе дороже.  Когда есть этиловый чистейший спирт ( а не изопропил, как сейчас ) и хорошая канифоль ( смычковая, например ) + правильно соотношение и способ приготовления = залог отличного нейтрального флюса. А если добавить нейтральный активатор\загуститель\ингибитор то получится отличный и дорогой флюс или гель-флюс. Но что бы такое сейчас сделать, нужны исключительно качественные компоненты и технолог во главе, а не манагер. Когда то качество ЛТИ 120 было другим, как и Ф3.
    • В Мурманске у молодой пары чуть не сорвалась роспись в ЗАГСе. За два часа до события собака изорвала паспорт невесты https://www.vesti.ru/article/2631761 Вопрос что знал собакин 

  • Набор односторонних макетных плат, 5 шт.

×
×
  • Create New...