Отговори на тема  [ 23 мнения ]  Отиди на страница 1, 2  Следваща
таймери и атмега8 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение таймери и атмега8
Здравейте отново.
Тия дни започнах да пиша едно програмче за атмега8.. но се оказа че ще трябва да ползвам 3 таймера.
До тук нищо интересно.. но се чудя дали е възможно да се получи така че 2 или повече таймера да предизвикат прекъсване едновременно?
Ако това е възможно, то има ли начин да им определя приоритети?
Ако не е възможно.. кой ще се изпълни и какво ще се случи с другите?

Поздрави,
Мичев


Сря Юни 24, 2009 5:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Ако прекъсванията възникнат едновремменно първо ще се изпълни това което има по голям хардуерен приоритет. Хардуерния приоритет се определя от местоположението на вектора на прекъсването. Виж за подробности в документацията. Няма начин да задаваш приоритет на прекъсванията. Ако по време на изпълнение на едното прекъсване е възникнало друго то другото ще започне да се изпълнява след като се изпълни функцията на предишното. При влизане и преминаване към вектора му прекъсванията хардуерно се забраняват автоматично. Ако във функцията на прекъсването ги разрешиш това ще доведе до възможност за прекъсване на тази функция. Тоест ако има вече възникнало прекъсване или възникне следващо то да прекъсне тази функция и да се изпълни приоритетно.
По този начин може да се прави софтуерна приоритизация на прекъсванията. Но имай пред вид че когато прекъснеш функция на прекъсване следващата функция си заделя стек също и максималния стек използван от прекъсванията е сумата от използваните стекове на вложените прекъсвания.

Малко омотано се получи обяснението ама ако не ти стане ясно питай пак :):):)


Сря Юни 24, 2009 6:26 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 7:26 pm
Мнения: 673
Мнение 
Има една гадня , когато не прецениш времето за изпълнение на кода в прекъсванията (когато ги направиш много къси), Още не се е източил едното прекъсване , почва второ, второто не е свършило почва пак първото .....
Цитат:
При влизане и преминаване към вектора му прекъсванията хардуерно се забраняват автоматично

Тук направо ме застреля. Мислех си че се забраняват само при писане на определени битова в Контролния регистър, и то няколко цикъла, или само при пипане на I-бита. Ще седна да попрочета малко , имам нужда.
ДА ТАКА Е, погледнах някой неща на асемблер дето сам писал преи и съм разрешавал I бита, непосредствено в началото на прекъсванията за да ползвам вложени прекъсвания, иначе както се каза се чака свършването на текъщото най високо приоритетно и след това автоматично се вдига I бита и се изпълнява не следващото по време а по приоритет прекъсване. Тези прекъсвания дето нямат флаг, събитието стои докато го има и след това изчезва с отпадане на събитието, и може и да не се изпълни.


Сря Юни 24, 2009 7:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Съб Юни 24, 2006 8:25 pm
Мнения: 2292
Мнение 
RM написа:
Има една гадня , когато не прецениш времето за изпълнение на кода в прекъсванията (когато ги направиш много къси), Още не се е източил едното прекъсване , почва второ, второто не е свършило почва пак първото .....


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

_________________
Две плюс две е приблизително равно на четири. Факт!


Сря Юни 24, 2009 11:15 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Яну 20, 2009 11:54 pm
Мнения: 11338
Местоположение: "Занзибар"
Мнение 
sthx написа:
Ако очакваш ситуация в която ще има чести прекъсвания, възможно е да минеш и ... без тях. Забраняваш прекъсванията и зацикляш една програмка, която следи флаговете за препълване на таймерите в случая. Възможно е това да е по-бръз вариант, защото избягваш записа и четенето от стека. Въпрос на сметки и преценка.


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

Edit: за да си трая както ме посъветва Никола отдолу :) Че к'во има за разбиране, освен че и най-елементарната тема става повод за мерене на пишките. А аз като пишех програми за управление някои тука и пишки нямаха.
А написах горното по повод на тема в която се твърдеше, че нямало нужда да сепише на асемблер щото си имало к'ви ли не прекъсвания...


Последна промяна bongo_x2 на Чет Юни 25, 2009 6:37 pm, променена общо 1 път



Сря Юни 24, 2009 11:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Абе ти що се месиш в теми от които нямаш и понятие бе бОНГО ? Хайде да си траеш по често.

"Ако очакваш ситуация в която ще има чести прекъсвания, възможно е да минеш и ... без тях. Забраняваш прекъсванията и зацикляш една програмка, която следи флаговете за препълване на таймерите в случая. Възможно е това да е по-бръз вариант, защото избягваш записа и четенето от стека. Въпрос на сметки и преценка."

Да ако нямаш main цикъл на програмата в който да правиш постоянно нещо друго това е и начин и да си приоретизираш също обработката на прекъсванията ;)


Чет Юни 25, 2009 1:15 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение 
Благодаря Ви за бързите и изчерпателни отговори.
В крайна сметка работата ясна - няма такова "животно" като пренареждане на приоритетите.
Програмката върху която се мъча е (използвам winavr) - PWM контролер управляван с потенциометър.
На пръв поглед тъпо.. но изискванията са да няма резки промени на потенциометъра. Тъй като човек регулира PWM чрез потенциометъра може волно или неволно да го завърти рязко от едно крайно до друго крайно положение, а условиетно не позволява подобни неща. За целта пускам 1 таймер за PWM и един таймер чрез който намалявам или увеличавам през определено време последната стойност прочетена от ADC до моментната стойност на ADC (с цел постигане на плавно увеличаване/намаляне).
Тъй като не искам да "прецаквам" PWM таймера с другия, възникна въпроса дали може да се пренаредят приоритетите.. но както стана ясно вече - ЦЪ ;)

Поздрави,
Мичев


Чет Юни 25, 2009 11:25 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Сря Ное 10, 2004 1:06 am
Мнения: 161
Местоположение: Нова Загора
Мнение 
Само като идея - няма ли да стане на входа на АЦП един резистор и един електролитен кондензатор....


Чет Юни 25, 2009 11:52 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение 
Виж дали не може да замениш потенциометъра с нещо подобно на скролера на мишката. При сигнал си слагаш пауза от примерно 0.1 секунда
така гарантирано не можеш да получиш повече от 10 сигнала в секунда. Проблема с потенциометъра е че с времето ще почне да се изтърква и ще получаваш на моменти максимално съпротивление.

_________________
Warriors of the Night, ASSEMBLER!!!


Чет Юни 25, 2009 11:53 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
А защо не прибегнеш до малко хардуерно решение - слагаш един интегратор на потенциометъра и си готов. Тогава и да почне да дава "лоши" сигнали потенциометъра, няма въобще да стигнат до проца.
И като направиш това, си правиш и един ПВМ с ОУ-та и става чисто аналогово решение на проблема :)


Чет Юни 25, 2009 2:57 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Nikola Kirov написа:
При влизане и преминаване към вектора му прекъсванията хардуерно се забраняват автоматично.


Това сигурен ли си? Аз като идиот си ги забранявам в началото и ги пускам в края. :(


Чет Юни 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
Реконструктор написа:
Nikola Kirov написа:
При влизане и преминаване към вектора му прекъсванията хардуерно се забраняват автоматично.


Това сигурен ли си? Аз като идиот си ги забранявам в началото и ги пускам в края. :(


RTFM :)

Желязото ти забранява прекъсванията автоматично като влезе във вектор, иначе няма как да ти гарантира че няма да тресне друго (и после друго и т.н.). Ти като решиш че си готов да обработваш вложени (nested), ги разрешаваш. Обикновено самото прекъсване което си влязъл да отработваш си остава маскирано докато изрично не го потвърдиш (acknowledge). Излизането от прекъсване в масовите архитектури възстановява флаговете на прекъсване - демек пак ги разрешава.


Чет Юни 25, 2009 5:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Реконструктор написа:
Nikola Kirov написа:
При влизане и преминаване към вектора му прекъсванията хардуерно се забраняват автоматично.


Това сигурен ли си? Аз като идиот си ги забранявам в началото и ги пускам в края. :(


Ти ме уби :):):)
Направи си прост екесперимент. Зацикли си едно прекъсване и виж дали ще се прекъсне от друго :):)
А си беше и черно на бяло написано.
Или си прочети I бита като влезеш в прекъсване.


Чет Юни 25, 2009 5:55 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
Nikola Kirov написа:
Или си прочети I бита като влезеш в прекъсване.


... и ако случайно все още са разрешени бързо ги забрани. :twisted:

Код:
if (SREG & I)
  SREG &= ~I;


Чет Юни 25, 2009 6:02 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 23 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни