| Автор |
Съобщение |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
Точно така и направих. Интеръпт процедурата проверява флаговете и на двата интеръпта.
Колкото до другото - винаги може да се толерира единия интеръпт за сметка на другия - просто по време на обработка на по-нисшестоящия интеръпт, още в началото (вместо в края) разрешаваш интеръптите от GIE флага. Да, за критични ще има малка грешка, но малка. Ако не - 18 ката си има 2 вектора, с приоритет на единия.
Тия неща ги съобразих, горе-долу. 
|
| Съб Юли 11, 2009 10:01 pm |
|
 |
|
Ники
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 11:19 pm Мнения: 609
|
не изчетох цялата тема, но ми стана интересно.
Искаш да кажеш че за пик16 в интеръпт частта разрешаваш прекъсванията, докато си в обработка на прекъсване?
и как успяваш да съхраниш важните регистри при входа на прекъсването, без да се препокриват с предходно прекъсване?
|
| Нед Юли 12, 2009 1:25 am |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Не си прави експерименти да разрешаваш GIE - това е предпоставка за гювеч. Най добре въобще не го пипай на първо време. RETFIE си го прави това нещо.
|
| Нед Юли 12, 2009 10:59 am |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
Е, нали си има стек. Сега, евентуалния риск е от препълване на стека, ама това е въпрос на преценка. В случая не съм го направил. Не се налага.
|
| Нед Юли 12, 2009 10:54 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
За кое има стек ? Има стек само за адреса за връщане и то той е с 8 нива. Стека за регистрите е с едно ниво (имам предвид хардуерения) а ако ще се прави софтуерен на 16-ка - то ще отиде половината ресурс на 16-ката само за стека 
|
| Нед Юли 12, 2009 11:11 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
Е, това явно ми е убягнало.
Ама, какво? Софтуерен ще вземе толкова памет, колкото ти е нужна. Или нещо бъркам?
...и в крайна сметка, за тия заигравки, най-лесно е да се вземе правилния порцесор, щом ще се стига чак до там.
|
| Нед Юли 12, 2009 11:34 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Ми май има нещо такова.
Като казвам ресурс нямам предвид само памет. Още повече, че има ситуации в които трябва да се запазят 7-8 регистъра. И като ги умножиш по 8 примерно, и като добавиш софтуера дето да работи със стека и става една ... Най-често гювеч ставa с регистрите за индиректно адресиране, а те и без това не се пазят в буфер при прекъсване.
|
| Пон Юли 13, 2009 5:07 pm |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
Според мен приемането по серийния бит си прави с полинг, а не с прекъсване, като при приет бит просто си нулирваш таймера. а пък при прекъсване от него значи че нямаш приемане и тогава си нулирваш брояча за приетите битове. именно защото дефакто прекъсването при 16ките е с едно ниво и няма хардуерен стек за регистрите, а само за адреса на връщане, по възможност се прави всичко по силите да се избегнат приоритетни и вложени прекъсвания. иначе се пълни 8 нивовия стек и става рестарт все едно. пълна каша
|
| Сря Юли 15, 2009 6:21 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
Няма вложени прекъсвания, а по друг начин не мога са следя порта, защото в останалото време някой трябва да рефрешва дисплея. Тоест може, но трябва да го набутам докато чакам между рефреша на всяка цифра. С прекъсвания обаче е най-просто. Приемането и таймаута са ми в интеръпт процедурата, а рефреша - в най-обикновен безкраен цикъл. Няма презастъпване на интеръпти, понеже в случая не е нужно.
|
| Сря Юли 15, 2009 10:46 pm |
|
 |
|
optron
Ранг: Ориентиран
Регистриран на: Чет Ное 20, 2008 1:49 pm Мнения: 276 Местоположение: Бургас
|
Най-добре според мен е процедурата за обслужването на прекъсванията да се оформи като цикъл, при който условието за изход е да няма повече вдигнати флагове. Извиква се процедурата, тя прави проверка на флаговете, като веднага след проверка на даден флаг, го нулира, изпълнява обслужването на конкретното прекъсване и чак тогава преминава към проверката на следващия флаг. Ако след всички проверки и изпълнения се случи така, че някой флаг е вдигнат, значи е настъпило прекъсване, докато е било обслужвано друго и тогава цикълът се завърта пак.
А ако се случи така, че настъпва прекъсване от същия вид, който се обслужва в момента, значи просто програмата или процесорът са твърде бавни за конкретното приложение. Има и изключения от това правило, разбира се.
Трик: Флаговете, освен че могат да се нулират, могат и да се вдигат. Така можеш принудително да предизвикваш прекъсвания. 
_________________ Digitally yours: Optron
|
| Вто Авг 11, 2009 11:49 am |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
Да, добра идея. Това може би е максимума, който може да се извлече, без особени главоболия.
А аз конкретното приложение вече го направих, и работи безгрижно. В случая беше честотомер 0.1 - 999Hz от една страна, и LED дисплей, от друга.За LED дисплея ползвам отделен PICльо - който се грижи за приемането на данните и рефреша. Рефреша е на около 120 херца. Приемането на данните по серийна шина, с интеръпт за всеки clock импулс - интеръпт по промяна на на порт.
Работи, дори дава учудваща стабилност и точност. Пък и тръгна от първия път. Направо да не повярваш. 
|
| Вто Авг 11, 2009 12:12 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Е понякога се налага да се ползват няколко чипа .... ама не те ли сърби сърбела да го напишеш само за един.
|
| Вто Авг 11, 2009 12:55 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
optron, знаеш ли какво се случва след командата retfie? Това дето си го написал е напълно безсмислено и е загуба на код. Значи след тази пуста команфда проца си вдига GIE, и ако има някой вдигнат флаг от прекъсване пак се връща на вектора за прекъсване. И със сигурност ще изпълни прекъсването по-бързо отколкото ако сканираш в обслужването на прекъсвания за настъпило ново. Модула генериращ прекъсване не е някаква магия а е чисто и просто няколко навързани един след друг AND-а
|
| Вто Авг 11, 2009 1:00 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
Може. Дори съм го измислил. Тогава обаче ще трябва да ползвам някакви буфери за LED дисплея, иначе ще премигва. Изчислявам честотата по периода и. Там има едно гнусно делене на 32 битови числа.
В случая използвах втори проц, понеже се получи най-компактно. Троен 7-сегментен LED дисплей, от най-малките, дето намерих - 9мм. Трябваше да сбера всичко на възможно най-малката платчица. Наложи се да ползвам 2 платки една върху друга. На едната е проца ("PIC16F627A), 11 резистора, 3 транзистора и 2 кондензатора, а на другата дисплеите, опроводени до 11 извода. Двете платки - вързани с рейка помежду си.
Ей го:

|
| Вто Авг 11, 2009 1:15 pm |
|
 |
|
bobyper
Ранг: Ориентиран
Регистриран на: Вто Яну 31, 2006 11:11 pm Мнения: 295 Местоположение: София
|
Машинката изглежда добре. А пък и щом работи, значи много добре 
|
| Вто Авг 11, 2009 1:29 pm |
|
|