Отговори на тема  [ 19 мнения ]  Отиди на страница 1, 2  Следваща
SystemReset() в прекъсване на таймер !!! 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 609
Мнение SystemReset() в прекъсване на таймер !!!
Имам управление на едно реле, по приети байтове.
Всичко е силно зашумено цъкат и други релета пуска се еднофазен асин. двигател с пускова и капацитет.
Имам една платка с STM32F103 ( причината да е тя е че е по евтина от тази на Атмел ) .
Има няма 25 реда код . Забива ми на 10 до 30 дена ... и причинява щети :oops:
Инициализирах таймер и вкарах в прекъсването му SystemReset();
На 10-20 минути преинициализирам хардуера и таймера.
Нямам време да пускам Watchdog Timer, щото ще трябва да попрочета как става.
Конкретно въпроса ми е
Има ли разлика в използването на WDT и ресетването му, и използванет на обикновен таймер като WD.
Ако забие контролера пак и обикновенния таймер не го ресетне, WD-a по сигурен ли е.

_________________
Вниманиене съмвишист....ИЙ.


Чет Апр 09, 2020 5:06 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3078
Мнение Re: SystemReset() в прекъсване на таймер !!!
Цитат:
Инициализирах таймер и вкарах в прекъсването му SystemReset();
На 10-20 минути преинициализирам хардуера и таймера.

Направил си таймера на 20минути да ресетва?
Пусни и WDT, а ако можеш- сложи и външно куче, щом ти прави бели.


Чет Апр 09, 2020 5:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10370
Местоположение: Добрич
Мнение Re: SystemReset() в прекъсване на таймер !!!
RM написа:
Конкретно въпроса ми е
Има ли разлика в използването на WDT и ресетването му, и използванет на обикновен таймер като WD.
Ако забие контролера пак и обикновенния таймер не го ресетне, WD-a по сигурен ли е.


WDT прави ресет на кура, таймерите обикновено не. Сега не помня как беше при СТМ32Ф1, при някои имаше опция ако не нахраниш веднъж кучето ти прави прекъсване. Ако се забавиш пак да го нахраниш на следващото превъртане хапи и прави ресет.

Сега със сигурност има вариант и софтуерно да се ресетнеш. Не знам твоя SystemReset() какво и как прави, но принципно каквото трябва да се направи е първо всички периферии да се ресетнат и после самия кур. Като при ресета на кура има една особеност, че има хардуерен стек с вложените прекъсвания, който трябва да изчистиш, преди да скочиш към ресет вектора.
При мен това е на асемблер и изглежда така:
Код:
FUNC(   LowLevelReboot_asm   )
             mov.w      r3, #0x3800
             movt      r3, #0x4002      // r3 = 0x4002 3800 BASE_RCC
             movw      r2, #0xe010
             movt      r2, #0xe000      // r2 = e000 e010 SysTick
             movs      r0, #0
             subs      r1, r0, #1

                // reset peripherals
                str         r1, [r3, #REG_RCC_AHB1RSTR - BASE_RCC] //RCC->RCC_AHB1RSTR = -1;
                str         r1, [r3, #REG_RCC_AHB2RSTR - BASE_RCC] //RCC->RCC_AHB2RSTR = -1;
                str         r1, [r3, #REG_RCC_AHB3RSTR - BASE_RCC] //RCC->RCC_AHB3RSTR = -1;
                str         r1, [r3, #REG_RCC_APB1RSTR - BASE_RCC] //RCC->RCC_APB1RSTR = -1;
                str         r1, [r3, #REG_RCC_APB2RSTR - BASE_RCC] //RCC->RCC_APB2RSTR = -1;

            //SysTick->CTRL = 0;   // stop systick
             str         r0, [r2, #0]

                // reset peripherals
                str         r0, [r3, #REG_RCC_AHB1RSTR - BASE_RCC] //RCC->RCC_AHB1RSTR = 0;
                str         r0, [r3, #REG_RCC_AHB2RSTR - BASE_RCC] //RCC->RCC_AHB2RSTR = 0;
                str         r0, [r3, #REG_RCC_AHB3RSTR - BASE_RCC] //RCC->RCC_AHB3RSTR = 0;
                str         r0, [r3, #REG_RCC_APB1RSTR - BASE_RCC] //RCC->RCC_APB1RSTR = 0;
                str         r0, [r3, #REG_RCC_APB2RSTR - BASE_RCC] //RCC->RCC_APB2RSTR = 0;


            ldr         r1, =__stack_svc_end
            msr         MSP, r1
            msr         PSP, r1
            mov.w      r3, #0x1000000
             mrs         r0, PSR
             lsls      r0, #23
             beq         9f
             ldr         r2, =   LowLevelReboot_asm
            stmia       r1, {r2-r3}      // PC, xPSR
             subs      r1, #6*4      //r0-r3,r12, r14
            msr         PSP, r1
            mov         r1, #0xFFFFFFFD
             bx         r1


9:
            // Restart
            cpsie      i
            msr         EAPSR_nzcvq, r3
                movs        r2, #0
                ldr         sp, [r2]
                ldr         r2, [r2, #4]
                bx          r2


ENDF(   LowLevelReboot_asm   )

Обърни внимание на пасажа където проверява младшите битове на PSR, които показват откъде съм дошъл. Ако са чисти значи не е прекъсване и отива на рестарт (9). Ако не се чисти си правя стек, пъха му се вътре адреса на същата процедура плюс статус да излезе едно ниво... и така завърта, докато се изчисти.


Чет Апр 09, 2020 5:33 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 609
Мнение Re: SystemReset() в прекъсване на таймер !!!
Функцията напълно ресетва софтуера, с изключение на reset bit-а
Настройл съм таймера на 2,5 секунди , байтовете ми са пакет по два на секунда. Отделно при всяко включване на двигателя средно през 10 до30 минути когат контролера няма друга работа наново инициализирам уарта и таймера. Ще го теставам така ... и ще търся начин да ползвам WD-a.
miro_atc Благодаря , но същинския код е 10-12 реда, един Delay_ms ... и един if (UART1_Data_Ready()) receive = UART1_Read();
Няма какво да объркам в моя код. Вероятно шум може да обърква инициализациата на уарта, или забиват циклите на закъснението. Програмата се превърта стотици хиляди пъти докато забие. Индицирал съм едно диодче , да ми показва кога се ресетва от таймера, и като че ли имам повече възможности да се опитам да открия проблема, чрез възможност да вкарам код в прекъсването. Когато имам повече яснота ще пусна WD-a.
Друго няма какво. Благодаря.

_________________
Вниманиене съмвишист....ИЙ.


Чет Апр 09, 2020 6:27 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 1:21 am
Мнения: 10621
Местоположение: София
Мнение Re: SystemReset() в прекъсване на таймер !!!
А мислил ли си в посока решаване на проблема хардуерно?
Филтрация на сигнали, галванично разделяне, екраниране...


Чет Апр 09, 2020 6:43 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 609
Мнение Re: SystemReset() в прекъсване на таймер !!!
itso.t написа:
А мислил ли си в посока решаване на проблема хардуерно?
Филтрация на сигнали, галванично разделяне, екраниране...

Ефтина платка без едно кондензаторче, 15 сантиметрови тънки кабелчета, много релета и индуктивности в непосредствена близост. Платчицата съм я лепнал отстрани на един 450V 380uF кондензатор. Все условия дето изправят косите . Това ще го направя със сигурност.

_________________
Вниманиене съмвишист....ИЙ.


Чет Апр 09, 2020 6:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 10:49 pm
Мнения: 4379
Местоположение: София
Мнение Re: SystemReset() в прекъсване на таймер !!!
itso.t написа:
А мислил ли си в посока решаване на проблема хардуерно?
Филтрация на сигнали, галванично разделяне, екраниране...


+1000

Винаги е за предпочитане да бориш причините, отколкото следствията.


Чет Апр 09, 2020 6:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 1:21 am
Мнения: 10621
Местоположение: София
Мнение Re: SystemReset() в прекъсване на таймер !!!
Като идея за кръпка - наслагай по кабелите от разглобяемите феритни сърцевини.
https://www.google.bg/search?q=ferrite+ ... 0%BD%D0%B5
Ако имаш възможност, раздели галванично уарта.


Чет Апр 09, 2020 7:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1971
Мнение Re: SystemReset() в прекъсване на таймер !!!
Какви ферити на това
RM написа:
...15 сантиметрови тънки кабелчета, много релета и индуктивности в непосредствена близост...

Дори някой от Хогуортс едва ли ще успее да помогне.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Чет Апр 09, 2020 8:38 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 11:32 am
Мнения: 7895
Местоположение: София
Мнение Re: SystemReset() в прекъсване на таймер !!!
RM написа:
Имам управление на едно реле, по приети байтове.
Всичко е силно зашумено цъкат и други релета пуска се еднофазен асин. двигател с пускова и капацитет.
Имам една платка с STM32F103 ( причината да е тя е че е по евтина от тази на Атмел ) .
Има няма 25 реда код . Забива ми на 10 до 30 дена ... и причинява щети :oops:
Инициализирах таймер и вкарах в прекъсването му SystemReset();
На 10-20 минути преинициализирам хардуера и таймера.
Нямам време да пускам Watchdog Timer, щото ще трябва да попрочета как става.
Конкретно въпроса ми е
Има ли разлика в използването на WDT и ресетването му, и използванет на обикновен таймер като WD.
Ако забие контролера пак и обикновенния таймер не го ресетне, WD-a по сигурен ли е.


Е, със сигурност WD е по-надежден, все пак хардуерно е вързан за RESET жицата. :) Таймера си е част от кода, нищо не пречи да спре да се вика прекъсването.


Чет Апр 09, 2020 9:22 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 28019
Местоположение: София
Мнение Re: SystemReset() в прекъсване на таймер !!!
пусни вачдога, с таймер няма никаква гаранция че ще се получи може да забиеш,и никога да не изпълниш прекъсването защото няма да стигнеш до него. Ако е толкова зле че подозираш промяна на регистри няма гаранция че ще остане активно прекъсване.
Кучето едва ли ще иска много повече чвтене от таймера, не знам каква ти е средата в повечето модерни и шарени среди пускането е сведено до един ред и след тов някъде викаш функция от тип wdt_reset()...


Чет Апр 09, 2020 11:51 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 609
Мнение Re: SystemReset() в прекъсване на таймер !!!
Цитат:
Е, със сигурност WD е по-надежден,

Цитат:
пусни вачдога, с таймер няма никаква гаранция че ще се получи може да забиеш,и никога да не изпълниш прекъсването


Благодаря ви
Ето това ми трябваше.

_________________
Вниманиене съмвишист....ИЙ.


Пет Апр 10, 2020 3:14 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 28019
Местоположение: София
Мнение Re: SystemReset() в прекъсване на таймер !!!
То за тия случаи най-сигурно е външно куче, щото и вътрешното може да се нулира от смущение, или пък да му се промени някой флаг ...


Пет Апр 10, 2020 3:40 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 609
Мнение Re: SystemReset() в прекъсване на таймер !!!
То нещата щом опират до мен отдавна са изпуснати. Нормално машината работи така. Единия процесор казва на другия.
"Ха сега пусни моторчето ... увеличи малко оборотите... ха така браво ... дръш така ... леко намали-нали сме зелени трябва да пестим енергия ... намали малко ... още малко ... дръш съвсем леки обороти ... балагодаря спри може да почиваш ...
А при мен работи така " Ха пусни моторчето (Релето цъка и върти на макс) ... кво става много матрял идва ,дръш средни обороти... намали, намали .... съвсем леки обороти, че си ба мамата ... помощ спирай,спирай(релето цъка и спира мотора) ... Ба си майката едва се отървахме.
Но най-вашното е че технологично няма проблем, и никой не може да се усети какво става.

След малко предполагам ще се оправя с тоя WD
намерих му описанието, само остав ада видя кой бит го ресетва.
Код:
RCC_APB1ENR.B11 = 1;            // Enable clock gating for Watchdog Timer 0 module

  WWDG_CFR = 1;                   // Write window value to be compared to the downcounter
  WWDG_CR = 0b10000000;           // Enable the watchdog


_________________
Вниманиене съмвишист....ИЙ.


Пет Апр 10, 2020 3:56 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 609
Мнение Re: SystemReset() в прекъсване на таймер !!!
То лошото никога не идва само.
Точно включих IWDG - най добрия вариант, има си независим 40кHz клок , делител на 256, 12 битов регистър за обратен брояч ... Да ама не, за втори път ползвам компилатора на Микроелектроника :axe: Не са предвидили в техните библиотеки, никъде да се ресетва автоматично таймера, едно закъснение да пуснеш по голямо от времето на таймера, WD ще се ресетне. Нама достъп до техния код за да си вкараш сам ресетващата команда. Ползваш ли техните библиотеки не е възможно да включиш този таймер, по простата причина че няма как да го ресетнеш. Аз се зачудих първоначално защо в тяхната документация няма и дума за тези два таймера IWDG и WWDG. Ще търся друга среда.

_________________
Вниманиене съмвишист....ИЙ.


Съб Апр 11, 2020 9:36 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 19 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 9 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни