| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| таймери и атмега8 http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=6924 |
Страница 1 от 2 |
| Автор: | michev [ Сря Юни 24, 2009 5:29 pm ] |
| Заглавие: | таймери и атмега8 |
Здравейте отново. Тия дни започнах да пиша едно програмче за атмега8.. но се оказа че ще трябва да ползвам 3 таймера. До тук нищо интересно.. но се чудя дали е възможно да се получи така че 2 или повече таймера да предизвикат прекъсване едновременно? Ако това е възможно, то има ли начин да им определя приоритети? Ако не е възможно.. кой ще се изпълни и какво ще се случи с другите? Поздрави, Мичев |
|
| Автор: | Nikola Kirov [ Сря Юни 24, 2009 6:26 pm ] |
| Заглавие: | |
Ако прекъсванията възникнат едновремменно първо ще се изпълни това което има по голям хардуерен приоритет. Хардуерния приоритет се определя от местоположението на вектора на прекъсването. Виж за подробности в документацията. Няма начин да задаваш приоритет на прекъсванията. Ако по време на изпълнение на едното прекъсване е възникнало друго то другото ще започне да се изпълнява след като се изпълни функцията на предишното. При влизане и преминаване към вектора му прекъсванията хардуерно се забраняват автоматично. Ако във функцията на прекъсването ги разрешиш това ще доведе до възможност за прекъсване на тази функция. Тоест ако има вече възникнало прекъсване или възникне следващо то да прекъсне тази функция и да се изпълни приоритетно. По този начин може да се прави софтуерна приоритизация на прекъсванията. Но имай пред вид че когато прекъснеш функция на прекъсване следващата функция си заделя стек също и максималния стек използван от прекъсванията е сумата от използваните стекове на вложените прекъсвания. Малко омотано се получи обяснението ама ако не ти стане ясно питай пак |
|
| Автор: | RM [ Сря Юни 24, 2009 7:26 pm ] | |||||||||
| Заглавие: | ||||||||||
Има една гадня , когато не прецениш времето за изпълнение на кода в прекъсванията (когато ги направиш много къси), Още не се е източил едното прекъсване , почва второ, второто не е свършило почва пак първото .....
Тук направо ме застреля. Мислех си че се забраняват само при писане на определени битова в Контролния регистър, и то няколко цикъла, или само при пипане на I-бита. Ще седна да попрочета малко , имам нужда. ДА ТАКА Е, погледнах някой неща на асемблер дето сам писал преи и съм разрешавал I бита, непосредствено в началото на прекъсванията за да ползвам вложени прекъсвания, иначе както се каза се чака свършването на текъщото най високо приоритетно и след това автоматично се вдига I бита и се изпълнява не следващото по време а по приоритет прекъсване. Тези прекъсвания дето нямат флаг, събитието стои докато го има и след това изчезва с отпадане на събитието, и може и да не се изпълни. |
||||||||||
| Автор: | sthx [ Сря Юни 24, 2009 11:15 pm ] | |||||||||
| Заглавие: | ||||||||||
Ако очакваш ситуация в която ще има чести прекъсвания, възможно е да минеш и ... без тях. Забраняваш прекъсванията и зацикляш една програмка, която следи флаговете за препълване на таймерите в случая. Възможно е това да е по-бръз вариант, защото избягваш записа и четенето от стека. Въпрос на сметки и преценка. |
||||||||||
| Автор: | bongo_x2 [ Сря Юни 24, 2009 11:28 pm ] | |||||||||
| Заглавие: | ||||||||||
А тази програмка на асемблер ли ще е написана? Щото последно ми се смяха като се чудих как се управлява в realtime с програма която не знаеш колко трае. Edit: за да си трая както ме посъветва Никола отдолу А написах горното по повод на тема в която се твърдеше, че нямало нужда да сепише на асемблер щото си имало к'ви ли не прекъсвания... |
||||||||||
| Автор: | Nikola Kirov [ Чет Юни 25, 2009 1:15 am ] |
| Заглавие: | |
Абе ти що се месиш в теми от които нямаш и понятие бе бОНГО ? Хайде да си траеш по често. "Ако очакваш ситуация в която ще има чести прекъсвания, възможно е да минеш и ... без тях. Забраняваш прекъсванията и зацикляш една програмка, която следи флаговете за препълване на таймерите в случая. Възможно е това да е по-бръз вариант, защото избягваш записа и четенето от стека. Въпрос на сметки и преценка." Да ако нямаш main цикъл на програмата в който да правиш постоянно нещо друго това е и начин и да си приоретизираш също обработката на прекъсванията |
|
| Автор: | michev [ Чет Юни 25, 2009 11:25 am ] |
| Заглавие: | |
Благодаря Ви за бързите и изчерпателни отговори. В крайна сметка работата ясна - няма такова "животно" като пренареждане на приоритетите. Програмката върху която се мъча е (използвам winavr) - PWM контролер управляван с потенциометър. На пръв поглед тъпо.. но изискванията са да няма резки промени на потенциометъра. Тъй като човек регулира PWM чрез потенциометъра може волно или неволно да го завърти рязко от едно крайно до друго крайно положение, а условиетно не позволява подобни неща. За целта пускам 1 таймер за PWM и един таймер чрез който намалявам или увеличавам през определено време последната стойност прочетена от ADC до моментната стойност на ADC (с цел постигане на плавно увеличаване/намаляне). Тъй като не искам да "прецаквам" PWM таймера с другия, възникна въпроса дали може да се пренаредят приоритетите.. но както стана ясно вече - ЦЪ Поздрави, Мичев |
|
| Автор: | BONGO [ Чет Юни 25, 2009 11:52 am ] |
| Заглавие: | |
Само като идея - няма ли да стане на входа на АЦП един резистор и един електролитен кондензатор.... |
|
| Автор: | ike [ Чет Юни 25, 2009 11:53 am ] |
| Заглавие: | |
Виж дали не може да замениш потенциометъра с нещо подобно на скролера на мишката. При сигнал си слагаш пауза от примерно 0.1 секунда така гарантирано не можеш да получиш повече от 10 сигнала в секунда. Проблема с потенциометъра е че с времето ще почне да се изтърква и ще получаваш на моменти максимално съпротивление. |
|
| Автор: | Cekins [ Чет Юни 25, 2009 2:57 pm ] |
| Заглавие: | |
А защо не прибегнеш до малко хардуерно решение - слагаш един интегратор на потенциометъра и си готов. Тогава и да почне да дава "лоши" сигнали потенциометъра, няма въобще да стигнат до проца. И като направиш това, си правиш и един ПВМ с ОУ-та и става чисто аналогово решение на проблема |
|
| Автор: | Реконструктор [ Чет Юни 25, 2009 4:17 pm ] | |||||||||
| Заглавие: | ||||||||||
Това сигурен ли си? Аз като идиот си ги забранявам в началото и ги пускам в края. |
||||||||||
| Автор: | Реконструктор [ Чет Юни 25, 2009 4:23 pm ] | |||||||||
| Заглавие: | ||||||||||
Точно същото си правя в момента. |
||||||||||
| Автор: | woody [ Чет Юни 25, 2009 5:54 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
RTFM Желязото ти забранява прекъсванията автоматично като влезе във вектор, иначе няма как да ти гарантира че няма да тресне друго (и после друго и т.н.). Ти като решиш че си готов да обработваш вложени (nested), ги разрешаваш. Обикновено самото прекъсване което си влязъл да отработваш си остава маскирано докато изрично не го потвърдиш (acknowledge). Излизането от прекъсване в масовите архитектури възстановява флаговете на прекъсване - демек пак ги разрешава. |
|||||||||||||||||||
| Автор: | Nikola Kirov [ Чет Юни 25, 2009 5:55 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Ти ме уби Направи си прост екесперимент. Зацикли си едно прекъсване и виж дали ще се прекъсне от друго А си беше и черно на бяло написано. Или си прочети I бита като влезеш в прекъсване. |
|||||||||||||||||||
| Автор: | woody [ Чет Юни 25, 2009 6:02 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
... и ако случайно все още са разрешени бързо ги забрани.
|
|||||||||||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|