| Автор |
Съобщение |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
 таймери и атмега8
Здравейте отново.
Тия дни започнах да пиша едно програмче за атмега8.. но се оказа че ще трябва да ползвам 3 таймера.
До тук нищо интересно.. но се чудя дали е възможно да се получи така че 2 или повече таймера да предизвикат прекъсване едновременно?
Ако това е възможно, то има ли начин да им определя приоритети?
Ако не е възможно.. кой ще се изпълни и какво ще се случи с другите?
Поздрави,
Мичев
|
| Сря Юни 24, 2009 5:29 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Ако прекъсванията възникнат едновремменно първо ще се изпълни това което има по голям хардуерен приоритет. Хардуерния приоритет се определя от местоположението на вектора на прекъсването. Виж за подробности в документацията. Няма начин да задаваш приоритет на прекъсванията. Ако по време на изпълнение на едното прекъсване е възникнало друго то другото ще започне да се изпълнява след като се изпълни функцията на предишното. При влизане и преминаване към вектора му прекъсванията хардуерно се забраняват автоматично. Ако във функцията на прекъсването ги разрешиш това ще доведе до възможност за прекъсване на тази функция. Тоест ако има вече възникнало прекъсване или възникне следващо то да прекъсне тази функция и да се изпълни приоритетно.
По този начин може да се прави софтуерна приоритизация на прекъсванията. Но имай пред вид че когато прекъснеш функция на прекъсване следващата функция си заделя стек също и максималния стек използван от прекъсванията е сумата от използваните стекове на вложените прекъсвания.
Малко омотано се получи обяснението ама ако не ти стане ясно питай пак  :):)
|
| Сря Юни 24, 2009 6:26 pm |
|
 |
|
RM
Ранг: Почетен член
Регистриран на: Нед Окт 19, 2008 7:26 pm Мнения: 673
|
Има една гадня , когато не прецениш времето за изпълнение на кода в прекъсванията (когато ги направиш много къси), Още не се е източил едното прекъсване , почва второ, второто не е свършило почва пак първото .....
Тук направо ме застреля. Мислех си че се забраняват само при писане на определени битова в Контролния регистър, и то няколко цикъла, или само при пипане на I-бита. Ще седна да попрочета малко , имам нужда.
ДА ТАКА Е, погледнах някой неща на асемблер дето сам писал преи и съм разрешавал I бита, непосредствено в началото на прекъсванията за да ползвам вложени прекъсвания, иначе както се каза се чака свършването на текъщото най високо приоритетно и след това автоматично се вдига I бита и се изпълнява не следващото по време а по приоритет прекъсване. Тези прекъсвания дето нямат флаг, събитието стои докато го има и след това изчезва с отпадане на събитието, и може и да не се изпълни.
|
| Сря Юни 24, 2009 7:26 pm |
|
 |
|
sthx
Ранг: Форумен бог
Регистриран на: Съб Юни 24, 2006 8:25 pm Мнения: 2292
|
Ако очакваш ситуация в която ще има чести прекъсвания, възможно е да минеш и ... без тях. Забраняваш прекъсванията и зацикляш една програмка, която следи флаговете за препълване на таймерите в случая. Възможно е това да е по-бръз вариант, защото избягваш записа и четенето от стека. Въпрос на сметки и преценка.
_________________ Две плюс две е приблизително равно на четири. Факт!
|
| Сря Юни 24, 2009 11:15 pm |
|
 |
|
bongo_x2
Ранг: Форумен бог
Регистриран на: Вто Яну 20, 2009 11:54 pm Мнения: 11338 Местоположение: "Занзибар"
|
А тази програмка на асемблер ли ще е написана? Щото последно ми се смяха като се чудих как се управлява в realtime с програма която не знаеш колко трае.
Edit: за да си трая както ме посъветва Никола отдолу  Че к'во има за разбиране, освен че и най-елементарната тема става повод за мерене на пишките. А аз като пишех програми за управление някои тука и пишки нямаха.
А написах горното по повод на тема в която се твърдеше, че нямало нужда да сепише на асемблер щото си имало к'ви ли не прекъсвания...
Последна промяна bongo_x2 на Чет Юни 25, 2009 6:37 pm, променена общо 1 път
|
| Сря Юни 24, 2009 11:28 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Абе ти що се месиш в теми от които нямаш и понятие бе бОНГО ? Хайде да си траеш по често.
"Ако очакваш ситуация в която ще има чести прекъсвания, възможно е да минеш и ... без тях. Забраняваш прекъсванията и зацикляш една програмка, която следи флаговете за препълване на таймерите в случая. Възможно е това да е по-бръз вариант, защото избягваш записа и четенето от стека. Въпрос на сметки и преценка."
Да ако нямаш main цикъл на програмата в който да правиш постоянно нещо друго това е и начин и да си приоретизираш също обработката на прекъсванията 
|
| Чет Юни 25, 2009 1:15 am |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
Благодаря Ви за бързите и изчерпателни отговори.
В крайна сметка работата ясна - няма такова "животно" като пренареждане на приоритетите.
Програмката върху която се мъча е (използвам winavr) - PWM контролер управляван с потенциометър.
На пръв поглед тъпо.. но изискванията са да няма резки промени на потенциометъра. Тъй като човек регулира PWM чрез потенциометъра може волно или неволно да го завърти рязко от едно крайно до друго крайно положение, а условиетно не позволява подобни неща. За целта пускам 1 таймер за PWM и един таймер чрез който намалявам или увеличавам през определено време последната стойност прочетена от ADC до моментната стойност на ADC (с цел постигане на плавно увеличаване/намаляне).
Тъй като не искам да "прецаквам" PWM таймера с другия, възникна въпроса дали може да се пренаредят приоритетите.. но както стана ясно вече - ЦЪ
Поздрави,
Мичев
|
| Чет Юни 25, 2009 11:25 am |
|
 |
|
BONGO
Ранг: Новодошъл
Регистриран на: Сря Ное 10, 2004 1:06 am Мнения: 161 Местоположение: Нова Загора
|
Само като идея - няма ли да стане на входа на АЦП един резистор и един електролитен кондензатор....
|
| Чет Юни 25, 2009 11:52 am |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
Виж дали не може да замениш потенциометъра с нещо подобно на скролера на мишката. При сигнал си слагаш пауза от примерно 0.1 секунда
така гарантирано не можеш да получиш повече от 10 сигнала в секунда. Проблема с потенциометъра е че с времето ще почне да се изтърква и ще получаваш на моменти максимално съпротивление.
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Чет Юни 25, 2009 11:53 am |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
А защо не прибегнеш до малко хардуерно решение - слагаш един интегратор на потенциометъра и си готов. Тогава и да почне да дава "лоши" сигнали потенциометъра, няма въобще да стигнат до проца.
И като направиш това, си правиш и един ПВМ с ОУ-та и става чисто аналогово решение на проблема 
|
| Чет Юни 25, 2009 2:57 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Това сигурен ли си? Аз като идиот си ги забранявам в началото и ги пускам в края. 
|
| Чет Юни 25, 2009 4:17 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
 |  |  |  | michev написа: Благодаря Ви за бързите и изчерпателни отговори. В крайна сметка работата ясна - няма такова "животно" като пренареждане на приоритетите. Програмката върху която се мъча е (използвам winavr) - PWM контролер управляван с потенциометър. На пръв поглед тъпо.. но изискванията са да няма резки промени на потенциометъра. Тъй като човек регулира PWM чрез потенциометъра може волно или неволно да го завърти рязко от едно крайно до друго крайно положение, а условиетно не позволява подобни неща. За целта пускам 1 таймер за PWM и един таймер чрез който намалявам или увеличавам през определено време последната стойност прочетена от ADC до моментната стойност на ADC (с цел постигане на плавно увеличаване/намаляне). Тъй като не искам да "прецаквам" PWM таймера с другия, възникна въпроса дали може да се пренаредят приоритетите.. но както стана ясно вече - ЦЪ  Поздрави, Мичев |  |  |  |  |
Точно същото си правя в момента.  С mega88 и WinAVR. И не знам защо трябва да ползваш прекъсване за намаляване/увеличаване на стойността - просто в основния цикъл на програмата си прочитай регистрите на PWM таймера (можеш да го правиш винаги) и действай.
|
| Чет Юни 25, 2009 4:23 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
RTFM
Желязото ти забранява прекъсванията автоматично като влезе във вектор, иначе няма как да ти гарантира че няма да тресне друго (и после друго и т.н.). Ти като решиш че си готов да обработваш вложени (nested), ги разрешаваш. Обикновено самото прекъсване което си влязъл да отработваш си остава маскирано докато изрично не го потвърдиш (acknowledge). Излизането от прекъсване в масовите архитектури възстановява флаговете на прекъсване - демек пак ги разрешава.
|
| Чет Юни 25, 2009 5:54 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Ти ме уби  :):)
Направи си прост екесперимент. Зацикли си едно прекъсване и виж дали ще се прекъсне от друго  :)
А си беше и черно на бяло написано.
Или си прочети I бита като влезеш в прекъсване.
|
| Чет Юни 25, 2009 5:55 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
... и ако случайно все още са разрешени бързо ги забрани.
|
| Чет Юни 25, 2009 6:02 pm |
|
|