| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Zilog - Z8 Encore! F083A Series http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=16225 |
Страница 1 от 4 |
| Автор: | Metyyy [ Пон Ное 19, 2018 5:45 pm ] | ||||||||||||||||||
| Заглавие: | Zilog - Z8 Encore! F083A Series | ||||||||||||||||||
Здравейте ! Бих искал да помоля за помощ, относно начините за измерване на период (честота) на правоъгълен входен сигнал с помощта на таймер. Таймерите в Z8F083A имат три режими на прехващане – режим „прехващане/сравнение”, режим ”прехващане с рестартиране” и класически режим „прехващане”. До колкото разбирам, при capture/compare - таймерът започва да брои едва след като на изводът постъпи активен фронт и при постъпване на следващия активен фронт => прехващане, докато при capture/restart - таймерът започва да брои веднага след като е разрешен и разликата е, че още първият активен фронт на сигнала ще предизвика прекъсване, но изчислената стойност няма да бъде вярна, тъй като все още нямаме изтекъл цял период. Така, имам 2 въпроса:
И вторият ми въпрос е свързан със capture/compare: Дали кодът по-долу е правилен, а той трябва да игнорира първото прекъсване по нарастващия фронт на таймера. Прилагам само interrupt-а, тъй като изменението на кодът би следвало да е само тук, а не и в основната програма. Всъщност имам и 3-ти въпрос, дали трябва да получа една и съща честота при capture/compare и capture/restart.
Благодаря ! |
|||||||||||||||||||
| Автор: | Zdrav [ Вто Ное 20, 2018 4:33 am ] |
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series |
И в двата режима (CAPTURE и CAPTURE RESTART) таймера започва да брои след запис в контролния регистър. И в двата режима трябва да изчакаш минимум две кепчър събития за да измериш времето между тях. Разликата между двата режима е само в рестартирането при кепчър събитие при CAPTURE RESTART режима. В определени случаи това ще ти спестява операцията по изваждане на двете "прихванати" таймщампи. |
|
| Автор: | Metyyy [ Вто Ное 20, 2018 3:51 pm ] |
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series |
Благодаря ! Аз като цяло съм прочел документацията и имам представа как работят режимите, но въпросите ми са малко по-различни от това, кой режим, как работи и т.н. |
|
| Автор: | Zdrav [ Сря Ное 21, 2018 12:57 am ] | |||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series | |||||||||
Дааа, пропуснал съм CAPTURE/COMPARE режима. Но като гледам не ти помага кой знае колко. Ако нулираш j при старт на програмата, в прекъсването просто го установявай в '1'. Това ще ти е флаг че си получил поне едно прехващане. Съответно при влизане в прекъсване от прехващане проверяваш дали (0 != j) и само тогава изчисляваш периода. Но проверката не я влагай в блока от проверката за препълване. Например така:
Но този код има няколко други проблема. 1. Възможно е основната нишка да бъде прекъсната точно в момента на "ползване" на променливата Т и да се случи така че за момент да ползва няколко байта от старата стойност и няколко байта от новата. С други думи трябва да защитиш в основната нишка прочитането на Т за да осигуриш atomic операция. 2. Това четене на T0RH и T0RL в прекъсването боде очите. Ако не променяш тази стойност и ако е известна "on build time" защо не я дефинираш като константа? Още повече може да си избереш по-удобна стойност, която да оптимизира умножението. 3. Това процесорче има ли инструкция за умножение? Но дори и да има, умножението в прекъсване може да замениш с по-прости операции. 4. Бих ти препоръчал COMPARE режима, но тогава нищо няма да остане от тръпката да използваш решение до което си стигнал сам. Кодът би трябвало да работи и в COMPARE/RESTART но вътъка ми стига до тук |
||||||||||
| Автор: | itso.t [ Сря Ное 21, 2018 5:06 pm ] | |||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series | |||||||||
Тая част определено е интересна, и би било полезно да се спомене какви са "добрите практики" за избягване на проблема. |
||||||||||
| Автор: | Zdrav [ Сря Ное 21, 2018 9:40 pm ] | |||||||||||||||||||||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series | |||||||||||||||||||||||||||
Добрите практики изискват отделна тема. В тази тема за да се използват "добрите практики" ще трябва да се пренапише кода и то не само обработчика на прекъсването но и останалата част, която в случая излиза извън темата. С така написания код и с този подход, две от възможните решения са:
|
||||||||||||||||||||||||||||
| Автор: | Metyyy [ Сря Ное 21, 2018 9:47 pm ] |
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series |
Много ти благодаря за съветите и кодът (интелигентно написан, не като моя - лишен от всякаква мисъл). Все още се уча (сам) и ми е доста трудно. А и със сигурност не искам да оставя някой с впечатление, че този код съм го написал аз. Чета една книга и се опитвам да разбера идеята, да правя упражненията и т.н. Относно проблемите, които спомена: 1. Въобще си нямам идея за какво говориш (atomic операция). До колко прочетох, това се отнася за всяко нещо, което се изпълнява без прекъсване. Ако е възможно, както спомена itso.t да ми покажеш какво точно имаш в предвид и "добрите практики". 2 - 3. Имаш в предвид - Това : Tov = (((uint16)T0RH << Съжалявам, ако питам/пиша пълни глупости и елементарни неща |
|
| Автор: | Zdrav [ Сря Ное 21, 2018 10:43 pm ] | ||||||||||||||||||||||||||||||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series | ||||||||||||||||||||||||||||||||||||
Това не го казвай повече, че пречи на мотивацията на тези които биха ти отговорили. atomic просто означава неделим. Когато 8 битов процесор го натовариш със задачата да обработва 32 битови числа той ще използва последователност от операции(машинни инструкции) и грубо казано ще прочете тази 32 битова променлива на части. По време на изпълнение на отделните операции може да се вмъкне прекъсването от таймера и да обнови стойността на Т. Разбира се това е въпрос на нацелване на точния момент, но се случва доста често Какъв е ефекта? Ето пример със псевдо код
Така изпратената 32 битова стойност е: 0х12344321 вместо 0х12345678 или 0х87654321 ако процесора е 32 битов той ще прочете от паметта и зареди в регистър на ядрото цялата 32 битова променлива с една atomic операция(инструкция). И понеже това не се вижда явно когато четеш С код трябва да ползваш "добри практики". 2-3 може да стане и така:
но по-добре да се пипне малко кода и да се избегне умножението. например:
За 8 битово ядро може и да не е оптимално, но поне илюстрира идеята. А ако е необходимо може да се пипне малко и да се оптимизира и за Z8 Encore, но сорс кода ще стане малко по-нечитаем. |
|||||||||||||||||||||||||||||||||||||
| Автор: | Metyyy [ Чет Ное 22, 2018 9:56 pm ] | ||||||||||||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series | ||||||||||||||||||
Благодаря за подробното обяснение ! Наистина е адски полезно Финални 2 въпроса:
Благодаря ! |
|||||||||||||||||||
| Автор: | Zdrav [ Пет Ное 23, 2018 12:32 am ] | ||||||||||||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series | ||||||||||||||||||
На този ред се прочита записаната в (PWMH, PWML) стойност и се присвоява на променливата T0_cnt. Прехвърля се от едно място на друго за да може да си готов за следващото прехващане. "Прехващача" на таймера копира (T0H,T0L) в (PWMH, PWML). Т.е. пак прехвърляне от едно място на друго за да имаш стойността на брояча на таймера (T0H,T0L) в момента на прехващането.
да, ти си я избираш. Защо F излиза на дисплея със закъснение, когато я увеличиш, е блондински въпрос. |
|||||||||||||||||||
| Автор: | Metyyy [ Съб Ное 24, 2018 1:54 am ] |
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series |
Благодаря, отново ! Всъщност изречението "Правих си опити и ако я сложа по-голямо число, стойността на F излиза малко със закъснение на дисплея ?" е съобщително, просто съзнателно или не съм сложил въпросителен знак Мисля, че темата може да бъде затворена |
|
| Автор: | Zdrav [ Съб Ное 24, 2018 12:21 pm ] | |||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series | |||||||||
Рано е да ми благодариш. И... в този форум затворена тема не съм видял. Ако освен мерене на честота с тази програмка решиш да правиш и нещо друго ще ти се наложи да помислиш и за други неща. Погледни промените тук:
|
||||||||||
| Автор: | Metyyy [ Съб Ное 24, 2018 11:22 pm ] | |||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series | |||||||||
Прав си, сега искам да измеря коефициента на запълване, обаче нищо не става. С лог. анализатора, получавам едни стойности, а на дисплея съвсем други...какво се случва не знам. Имам закачен потенциометър, с който намалявам и увеличавам "к", но като пусна анализатора, той ми показва съвсем други стойности. Пак ли трябва да забранявам първото прекъсване на таймера...? Вече имам в предвид, твоите забележки относно atomic-a и константата...да, не съм ги приложил, но не мисля, че на това се дължи проблема ми в момента
Many thanks ! |
||||||||||
| Автор: | Zdrav [ Съб Ное 24, 2018 11:50 pm ] |
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series |
В какъв режим е конфигуриран таймера? |
|
| Автор: | Metyyy [ Нед Ное 25, 2018 12:18 am ] |
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series |
Capture/compare |
|
| Страница 1 от 4 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|