Виж темите без отговор | Виж активните теми
Дата и час: Сря Апр 24, 2024 1:56 am
SystemReset() в прекъсване на таймер !!!
Автор |
Съобщение |
RM
Ранг: Почетен член
Регистриран на: Нед Окт 19, 2008 6:26 pm Мнения: 609
|
SystemReset() в прекъсване на таймер !!!
Имам управление на едно реле, по приети байтове. Всичко е силно зашумено цъкат и други релета пуска се еднофазен асин. двигател с пускова и капацитет. Имам една платка с STM32F103 ( причината да е тя е че е по евтина от тази на Атмел ) . Има няма 25 реда код . Забива ми на 10 до 30 дена ... и причинява щети Инициализирах таймер и вкарах в прекъсването му SystemReset(); На 10-20 минути преинициализирам хардуера и таймера. Нямам време да пускам Watchdog Timer, щото ще трябва да попрочета как става. Конкретно въпроса ми е Има ли разлика в използването на WDT и ресетването му, и използванет на обикновен таймер като WD. Ако забие контролера пак и обикновенния таймер не го ресетне, WD-a по сигурен ли е.
_________________ Вниманиене съмвишист....ИЙ.
|
Чет Апр 09, 2020 5:06 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3078
|
Re: SystemReset() в прекъсване на таймер !!!
Направил си таймера на 20минути да ресетва? Пусни и WDT, а ако можеш- сложи и външно куче, щом ти прави бели.
|
Чет Апр 09, 2020 5:31 pm |
|
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 5:52 pm Мнения: 10370 Местоположение: Добрич
|
Re: SystemReset() в прекъсване на таймер !!!
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 |
|
|
RM
Ранг: Почетен член
Регистриран на: Нед Окт 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 |
|
|
itso.t
Ранг: Форумен бог
Регистриран на: Чет Фев 03, 2005 1:21 am Мнения: 10621 Местоположение: София
|
Re: SystemReset() в прекъсване на таймер !!!
А мислил ли си в посока решаване на проблема хардуерно? Филтрация на сигнали, галванично разделяне, екраниране...
|
Чет Апр 09, 2020 6:43 pm |
|
|
RM
Ранг: Почетен член
Регистриран на: Нед Окт 19, 2008 6:26 pm Мнения: 609
|
Re: SystemReset() в прекъсване на таймер !!!
Ефтина платка без едно кондензаторче, 15 сантиметрови тънки кабелчета, много релета и индуктивности в непосредствена близост. Платчицата съм я лепнал отстрани на един 450V 380uF кондензатор. Все условия дето изправят косите . Това ще го направя със сигурност.
_________________ Вниманиене съмвишист....ИЙ.
|
Чет Апр 09, 2020 6:53 pm |
|
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 10:49 pm Мнения: 4379 Местоположение: София
|
Re: SystemReset() в прекъсване на таймер !!!
+1000 Винаги е за предпочитане да бориш причините, отколкото следствията.
|
Чет Апр 09, 2020 6:59 pm |
|
|
itso.t
Ранг: Форумен бог
Регистриран на: Чет Фев 03, 2005 1:21 am Мнения: 10621 Местоположение: София
|
Re: SystemReset() в прекъсване на таймер !!!
Като идея за кръпка - наслагай по кабелите от разглобяемите феритни сърцевини. https://www.google.bg/search?q=ferrite+ ... 0%BD%D0%B5Ако имаш възможност, раздели галванично уарта.
|
Чет Апр 09, 2020 7:40 pm |
|
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 8:39 pm Мнения: 1971
|
Re: SystemReset() в прекъсване на таймер !!!
Какви ферити на това Дори някой от Хогуортс едва ли ще успее да помогне.
_________________ Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!
|
Чет Апр 09, 2020 8:38 pm |
|
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 11:32 am Мнения: 7895 Местоположение: София
|
Re: SystemReset() в прекъсване на таймер !!!
| | | | RM написа: Имам управление на едно реле, по приети байтове. Всичко е силно зашумено цъкат и други релета пуска се еднофазен асин. двигател с пускова и капацитет. Имам една платка с STM32F103 ( причината да е тя е че е по евтина от тази на Атмел ) . Има няма 25 реда код . Забива ми на 10 до 30 дена ... и причинява щети Инициализирах таймер и вкарах в прекъсването му SystemReset(); На 10-20 минути преинициализирам хардуера и таймера. Нямам време да пускам Watchdog Timer, щото ще трябва да попрочета как става. Конкретно въпроса ми е Има ли разлика в използването на WDT и ресетването му, и използванет на обикновен таймер като WD. Ако забие контролера пак и обикновенния таймер не го ресетне, WD-a по сигурен ли е. | | | | |
Е, със сигурност WD е по-надежден, все пак хардуерно е вързан за RESET жицата. Таймера си е част от кода, нищо не пречи да спре да се вика прекъсването.
|
Чет Апр 09, 2020 9:22 pm |
|
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 8:21 pm Мнения: 28019 Местоположение: София
|
Re: SystemReset() в прекъсване на таймер !!!
пусни вачдога, с таймер няма никаква гаранция че ще се получи може да забиеш,и никога да не изпълниш прекъсването защото няма да стигнеш до него. Ако е толкова зле че подозираш промяна на регистри няма гаранция че ще остане активно прекъсване. Кучето едва ли ще иска много повече чвтене от таймера, не знам каква ти е средата в повечето модерни и шарени среди пускането е сведено до един ред и след тов някъде викаш функция от тип wdt_reset()...
|
Чет Апр 09, 2020 11:51 pm |
|
|
RM
Ранг: Почетен член
Регистриран на: Нед Окт 19, 2008 6:26 pm Мнения: 609
|
Re: SystemReset() в прекъсване на таймер !!!
Благодаря ви Ето това ми трябваше.
_________________ Вниманиене съмвишист....ИЙ.
|
Пет Апр 10, 2020 3:14 pm |
|
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 8:21 pm Мнения: 28019 Местоположение: София
|
Re: SystemReset() в прекъсване на таймер !!!
То за тия случаи най-сигурно е външно куче, щото и вътрешното може да се нулира от смущение, или пък да му се промени някой флаг ...
|
Пет Апр 10, 2020 3:40 pm |
|
|
RM
Ранг: Почетен член
Регистриран на: Нед Окт 19, 2008 6:26 pm Мнения: 609
|
Re: SystemReset() в прекъсване на таймер !!!
То нещата щом опират до мен отдавна са изпуснати. Нормално машината работи така. Единия процесор казва на другия. "Ха сега пусни моторчето ... увеличи малко оборотите... ха така браво ... дръш така ... леко намали-нали сме зелени трябва да пестим енергия ... намали малко ... още малко ... дръш съвсем леки обороти ... балагодаря спри може да почиваш ... А при мен работи така " Ха пусни моторчето (Релето цъка и върти на макс) ... кво става много матрял идва ,дръш средни обороти... намали, намали .... съвсем леки обороти, че си ба мамата ... помощ спирай,спирай(релето цъка и спира мотора) ... Ба си майката едва се отървахме. Но най-вашното е че технологично няма проблем, и никой не може да се усети какво става. След малко предполагам ще се оправя с тоя WD намерих му описанието, само остав ада видя кой бит го ресетва.
_________________ Вниманиене съмвишист....ИЙ.
|
Пет Апр 10, 2020 3:56 pm |
|
|
RM
Ранг: Почетен член
Регистриран на: Нед Окт 19, 2008 6:26 pm Мнения: 609
|
Re: SystemReset() в прекъсване на таймер !!!
То лошото никога не идва само. Точно включих IWDG - най добрия вариант, има си независим 40кHz клок , делител на 256, 12 битов регистър за обратен брояч ... Да ама не, за втори път ползвам компилатора на Микроелектроника Не са предвидили в техните библиотеки, никъде да се ресетва автоматично таймера, едно закъснение да пуснеш по голямо от времето на таймера, WD ще се ресетне. Нама достъп до техния код за да си вкараш сам ресетващата команда. Ползваш ли техните библиотеки не е възможно да включиш този таймер, по простата причина че няма как да го ресетнеш. Аз се зачудих първоначално защо в тяхната документация няма и дума за тези два таймера IWDG и WWDG. Ще търся друга среда.
_________________ Вниманиене съмвишист....ИЙ.
|
Съб Апр 11, 2020 9:36 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 9 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|