Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

SystemReset() в прекъсване на таймер !!!
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=17231
Страница 1 от 2

Автор:  RM [ Чет Апр 09, 2020 6:06 pm ]
Заглавие:  SystemReset() в прекъсване на таймер !!!

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

Автор:  stefan63 [ Чет Апр 09, 2020 6:31 pm ]
Заглавие:  Re: SystemReset() в прекъсване на таймер !!!

Цитат:
Инициализирах таймер и вкарах в прекъсването му SystemReset();
На 10-20 минути преинициализирам хардуера и таймера.

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

Автор:  miro_atc [ Чет Апр 09, 2020 6:33 pm ]
Заглавие:  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). Ако не се чисти си правя стек, пъха му се вътре адреса на същата процедура плюс статус да излезе едно ниво... и така завърта, докато се изчисти.

Автор:  RM [ Чет Апр 09, 2020 7:27 pm ]
Заглавие:  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.
Друго няма какво. Благодаря.

Автор:  itso.t [ Чет Апр 09, 2020 7:43 pm ]
Заглавие:  Re: SystemReset() в прекъсване на таймер !!!

А мислил ли си в посока решаване на проблема хардуерно?
Филтрация на сигнали, галванично разделяне, екраниране...

Автор:  RM [ Чет Апр 09, 2020 7:53 pm ]
Заглавие:  Re: SystemReset() в прекъсване на таймер !!!

itso.t написа:
А мислил ли си в посока решаване на проблема хардуерно?
Филтрация на сигнали, галванично разделяне, екраниране...

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

Автор:  lcr [ Чет Апр 09, 2020 7:59 pm ]
Заглавие:  Re: SystemReset() в прекъсване на таймер !!!

itso.t написа:
А мислил ли си в посока решаване на проблема хардуерно?
Филтрация на сигнали, галванично разделяне, екраниране...


+1000

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

Автор:  itso.t [ Чет Апр 09, 2020 8:40 pm ]
Заглавие:  Re: SystemReset() в прекъсване на таймер !!!

Като идея за кръпка - наслагай по кабелите от разглобяемите феритни сърцевини.
https://www.google.bg/search?q=ferrite+ ... 0%BD%D0%B5
Ако имаш възможност, раздели галванично уарта.

Автор:  syscop [ Чет Апр 09, 2020 9:38 pm ]
Заглавие:  Re: SystemReset() в прекъсване на таймер !!!

Какви ферити на това
RM написа:
...15 сантиметрови тънки кабелчета, много релета и индуктивности в непосредствена близост...

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

Автор:  Реконструктор [ Чет Апр 09, 2020 10:22 pm ]
Заглавие:  Re: SystemReset() в прекъсване на таймер !!!

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


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

Автор:  ToHu [ Пет Апр 10, 2020 12:51 am ]
Заглавие:  Re: SystemReset() в прекъсване на таймер !!!

пусни вачдога, с таймер няма никаква гаранция че ще се получи може да забиеш,и никога да не изпълниш прекъсването защото няма да стигнеш до него. Ако е толкова зле че подозираш промяна на регистри няма гаранция че ще остане активно прекъсване.
Кучето едва ли ще иска много повече чвтене от таймера, не знам каква ти е средата в повечето модерни и шарени среди пускането е сведено до един ред и след тов някъде викаш функция от тип wdt_reset()...

Автор:  RM [ Пет Апр 10, 2020 4:14 pm ]
Заглавие:  Re: SystemReset() в прекъсване на таймер !!!

Цитат:
Е, със сигурност WD е по-надежден,

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


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

Автор:  ToHu [ Пет Апр 10, 2020 4:40 pm ]
Заглавие:  Re: SystemReset() в прекъсване на таймер !!!

То за тия случаи най-сигурно е външно куче, щото и вътрешното може да се нулира от смущение, или пък да му се промени някой флаг ...

Автор:  RM [ Пет Апр 10, 2020 4:56 pm ]
Заглавие:  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


Автор:  RM [ Съб Апр 11, 2020 10:36 am ]
Заглавие:  Re: SystemReset() в прекъсване на таймер !!!

То лошото никога не идва само.
Точно включих IWDG - най добрия вариант, има си независим 40кHz клок , делител на 256, 12 битов регистър за обратен брояч ... Да ама не, за втори път ползвам компилатора на Микроелектроника :axe: Не са предвидили в техните библиотеки, никъде да се ресетва автоматично таймера, едно закъснение да пуснеш по голямо от времето на таймера, WD ще се ресетне. Нама достъп до техния код за да си вкараш сам ресетващата команда. Ползваш ли техните библиотеки не е възможно да включиш този таймер, по простата причина че няма как да го ресетнеш. Аз се зачудих първоначално защо в тяхната документация няма и дума за тези два таймера IWDG и WWDG. Ще търся друга среда.

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/