Перейти к содержанию

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


carlogulliani

Рекомендуемые сообщения

Есть 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, но как посчитать ширину пульса, ведь захват по переднему фронту, а пульс заканчивается на заднем фронте, еще и период считать

Ссылка на комментарий
Поделиться на другие сайты

23.09.2020 в 11:59, carlogulliani сказал:

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

4 hours ago, ruhi said:

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

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

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

 

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

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

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

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

Изменено пользователем ruhi

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

Ссылка на комментарий
Поделиться на другие сайты

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;
}

 

Изменено пользователем carlogulliani
Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, carlogulliani сказал:

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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 в ДШ, перепроверил все настройки, ошибок не нашел - но почему-то не хочет работать

Изменено пользователем carlogulliani
Ссылка на комментарий
Поделиться на другие сайты

On 9/23/2020 at 11:59 AM, carlogulliani said:

ISR_TIM2_CC(TIM2_CAP_COM)

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

Компилю 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");
	}
  }
}

 

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

19 minutes ago, skripach said:

В SDCC

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • У тебя с чтением или пониманием плохо? перечитай предыдущий пост и приведи пример тиристора/симистора с указанными параметрами. ссылки на 800А тиристоры меня не интересуют. и да класс тиристора не определяется буквами.
    • С чего вы взяли что это бессмысленная  тема ???? . Ведь для чего нужен форум разве не для помощи ???? . Написал же выше что ошибка 56 без буквы . При включении в сеть беговой дорожки начинается загрузка и виснет она на надписи APP (приложение ).  Если вытащить ключ безопасность она на него реагирует как положено, но когда его ставишь обратно пишет ошибка 56.   Я создал эту тему для того может быть кого нибудь был опыт с ремонтом беговых дорожек . На плате управления стоит МК NUVOTON NUC126S4AE. Может быть у кого есть прошивка этого чуда. Part Number A1848C3.  До этого дорожка работала на ней побегали и выключили .
    • ""без соединения пытаться делать запись - некорректно и неразумно."" - это для разумных хомосапиенс, а для мартышек ...?! Конечно я не АВТОР, но если-бы меня спросили, я бы заблокировал нажатие кнопок "выбор файла", "запрограммировать" до нужного состояния соединения с МК (догадайся САМ какого...) А соединение не устанавливается, потому что я мухлюю, я жду больше положенного времени и жму кнопку соединиться, чтобы выявить нештатные ситуации. Я много писал для сторонних пользователей, и если инструкцию написать на лбу и поставить зеркало, все равно сделают неправильно, нужны коридоры действий, ... шаг влево, шаг вправо ... А по поводу смены скоростей, это просто особенность, не на что не влияющая, - не заморачивайся.  
    • И чем сотовая связь не устраивает? Недостаточно инновационная? Да и неужели нет таких решений?   А питаться она святым духом будет?
    • выложил новую версию загрузчика, архив BootLoader13.zip. в компьютерной программе добавлена блокировка от некорректных действий - без соединения МК с компьютером программа не будет пытаться делать запись.
    • осциллограф есть? стань на питание платы закрытым каналом и посмотри че у тебя там проистекает, это будет лучше долгой и ненужной писанины.
    • я и утверждаю - класс тиристора определяется не рабочим током, а обратным импульсным напряжением. например Т853 -500, класс по напряжению 46-65. Т853-800, класс по напряжению 28. вот ссылка на даташит: https://asenergi.ru/catalog/tiristory-silovye/t853.html внимание - 800Амперный тиристор -28 класса, 500 амперный, в зависимости от буквы - от 46 до 65 класса. эти именно я устанавливал не так давно. их много и других имеется.
×
×
  • Создать...