Отговори на тема  [ 193 мнения ]  Отиди на страница 1, 2, 3, 4, 5 ... 13  Следваща
Закачки 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение Закачки
А какво се пише в прекъсването? :)


Вто Юли 10, 2018 5:05 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Юни 05, 2006 1:48 pm
Мнения: 4906
Местоположение: където небето среща земята, ракията е Jameson, а бирата Guinness
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
relsys написа:
Абе кой е тоя "даскал", де то Ви учи да пишете код в прекъсване?
Че и while(..)... 8O 8O 8O

ЗАПОМНИ:

Цитат:
:idea: КОД НЕ СЕ ПИШЕ В ПРЕКЪСВАНЕ!!! :idea:



Сега ми обясни, какво очакваш да правят двата if-a в прекъсването, че май си посещавал лекции по Pascal, пък после си се появил за домашното по C....?


то на мене ми е трудно да накарам проца да пише код в прекъсване - виж да изпълнява код в прекъсване постоянно го правя :)

_________________
... ако трети ден не ти се работи... това означава, че е сряда !


Вто Юли 10, 2018 5:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 2:21 am
Мнения: 12765
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
И аз още сричам на тема програмиране, ама да се пробвам...
Съвсем без код в прекъсването не може, но е хубаво да е максимално кратък.
В прекъсването сетни някаква променлива, че е имало такова. Например, направи я TRUE. Ако трябва да се изчисти бит в някой регистър, че е имало прекъсване, го изчисти. И толкова.
Останалото го изнеси в основния цикъл. Проверяваш дали променливата за прекъсване е TRUE. Ако е, правиш каквото имаш да правиш. Като приключиш, я клирваш (FALSE).
Съответно, когато пак стане TRUE, цялата история се повтаря.

Хубаво е когато четеш входове, особено ако на тях има свързан бутон, да направиш някаква обработка на сигнала, за да избегнеш разтрептяването на контактите - тъй наречения дебоунс.
Съвсем примерно - следиш състоянието на входа през 1 - 5ms. Ако при ХХ броя последователни проверки, състоянието е било устойчиво в 1, приемаш че е 1. Ако по време на тия ХХ проверки се е променяло, ресетираш брояча за ХХ и започваш отначало.


Вто Юли 10, 2018 5:32 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
А ако дойде пак прекъсвене докато си правиш там нещо си, ко праим? :)


Вто Юли 10, 2018 6:06 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 2:21 am
Мнения: 12765
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Реконструктор написа:
А ако дойде пак прекъсвене докато си правиш там нещо си, ко праим? :)

Ако докато изпълняваш тоя код дойде ново прекъсване:
1 - коригираш времената на таймера
2 - ако 1 е неприложимо, вземаш по-бърз контролер :D


Вто Юли 10, 2018 6:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Юни 05, 2006 1:48 pm
Мнения: 4906
Местоположение: където небето среща земята, ракията е Jameson, а бирата Guinness
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Реконструктор написа:
А ако дойде пак прекъсвене докато си правиш там нещо си, ко праим? :)

pending interrupt :)

_________________
... ако трети ден не ти се работи... това означава, че е сряда !


Вто Юли 10, 2018 6:45 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Интересно тогава защо са измислили приоритетни прекъсвания. То ако всички се отбележат като пендинг няма да има смисъл. Хептен без код в прекъсване няма как да се мине. Там обикновено пада голямо оптимизиране.

Сега, while-а в прекъсването вече е друга бира. Даже ми е интересно как въобще генерира нещо. То реално за да угасне светодиода трябва да има куче или нещо подобно. Бутон в прекъсване също е нежелателно.


Вто Юли 10, 2018 9:08 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Реконструктор написа:
А ако дойде пак прекъсвене докато си правиш там нещо си, ко праим? :)


В прекъсването: нищо не сетваш на TRUE, а увеличваш някой особено важен байт с 1. Толкоз.

В основния луп: СТЪПКА с левия крак: Четеш байта с особената важност. Ако не е 0, правиш, каквото по устав пише да се прави след прекъсване.
Забраняваш прекъсванията. Намаляваш 'оня' байт с 1. Разрешаваш прекъсванията. Отиваш на СТЪПКА с левия крак.

Измиваш си И десния крак.
Ако по някое време 'оня' байт превърти ( то хора превъртат, че байтове ли няма да могат ), смени конценцията, че явно има проблем с контрацепцията.


Сря Юли 11, 2018 2:34 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
bateAz написа:
Забраняваш прекъсванията.


Сакън! Ако те види relsys ще те набие :D

Прекъсванията НЕ се забраняват току-така... В случая няма и нужда, прекъсването може да си увеличава един байт колкото си иска. А пък основният цикъл си увеличава друг байт всеки път когато байтовете са различни.... Желателно е байта на прекъсването да е volatile и да не се кешира ;-)


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

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
miro_atc написа:
...


Вярно, и така става. С един байт РАМ в повече, но не е болка за умиргане.
ЕДИТ: ако процесорът ( и компилаторът ) поддържа атомарен декремент, дори и без забраняване на прекъсванията и без втори байт ще стане.


Сря Юли 11, 2018 2:54 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
bateAz написа:
Реконструктор написа:
А ако дойде пак прекъсвене докато си правиш там нещо си, ко праим? :)


В прекъсването: нищо не сетваш на TRUE, а увеличваш някой особено важен байт с 1. Толкоз.

В основния луп: СТЪПКА с левия крак: Четеш байта с особената важност. Ако не е 0, правиш, каквото по устав пише да се прави след прекъсване.
Забраняваш прекъсванията. Намаляваш 'оня' байт с 1. Разрешаваш прекъсванията. Отиваш на СТЪПКА с левия крак.

Измиваш си И десния крак.
Ако по някое време 'оня' байт превърти ( то хора превъртат, че байтове ли няма да могат ), смени конценцията, че явно има проблем с контрацепцията.


Класически пример - в прекъсването трябва да прочетеш стойност от АЦП-то и да действаш спрямо нея (примерно 10 много сложни сценария).
Ко праим? :)


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

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Реконструктор написа:
...
Класически пример - в прекъсването трябва да прочетеш стойност от АЦП-то и да действаш спрямо нея (примерно 10 много сложни сценария).
Ко праим? :)


Зависи от много неща. Първо - от архитектурата на фърмуера ти - ползваш ли ОС или само някакъв таск свич, или просто един тред плюс интеръпт хендлъри.
Второ - колко "реал тайм" трябва да ти бъде реакцията. Това може да наложи промяна на архитектурата и т.н.
Има и "бързи" решения - в прекъсването от АЦП да направиш сметките, да синхронизираш с Лунния цикъл ( повечето жени го правят ), и накрая да изкараш на бял свят реакцията. Те така бих го направил само ако няма как иначе.


Сря Юли 11, 2018 4:04 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение Re: Закачки
Окей, прецезираме задачата - имаме някво странно явление, примерно радиация, което е пълен хаос като закономерност, но трябва да се мери и да се прави нещо си там в зависимост от квото е измерено. Не се хващайте да го нищите това, формализирано представлява следната задача:
Събитията настъпват изцяло случайно, може примерно 3 много бързо едно след друго след това да няма нищо 2 дена. На всяко регистрирано събитие трябва да се прави нещо много бавно. :) Проца няма проблем да се справи с 3 събития на 2 дена, но 3 събития много бързо едно след друго - не. Ако пропуснеш събитие, реактора гърми (не съвсем веднага) и всички умират.


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

Регистриран на: Чет Фев 03, 2005 2:21 am
Мнения: 12765
Местоположение: София
Мнение Re: Закачки
Така, измерването от АЦП е на равни интервали или се задейства при някакво външно условие.
Разглеждаме първия случай. Ако некой го заболи корем от смях, аз не съм виновен. Толкова си мога. :D
Та, един то многото възможни варианти:

Код:
#define FALSE   0
#define TRUE    1

while (1)
{
    if (NewDataFromADC)
    {
        if (ADC_result == реактор_ще_гръмне)
        {
            бегай_бързо = TRUE;
        }

        else
        {
            бегай_бързо = FALSE;
        }
       
      NewDataFromADC = FALSE;
    }
}

void ISR (void)
if (ADCinterrupt)
{
    ADC_result = ADC_currentValue;
    clearInterruptBit;
    NewDataFromADC = TRUE;
}



Сря Юли 11, 2018 5:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Закачки
Няма значениекога настъпват събитията. Ако е обработка от сорта на 2+ 3,т.е. проста сметка, прост инкремент може да го направиш в прекъсване, ако не просто си четеш АЦП, вдигаш един флаг и вече в основния цикъл си ги проверяваш флаговте по прекъсваният и изпълняваш каквото има да се изпълни. Всичко зависи от времената, то при микроконтролерите, не разбирам тук арм-9 с повече мозък от мен, е много важно да си структурираш целия алгоритъм на работа съобразно задачата която изпълняваш, и сигурно Миро ще ме разпне, ама не мисля че при подобен тип задачи е добра идея да спазваш добрите практики, освне ако не си презапасен във всичко, и в изчислителен ресурс, и в бързодействие по I/O и всичко останало.
Аз подобен род задачи ги виждам повече като хардуерни задачи, и за мен кода трябва да е има мнооого "храдуерна логика".
Ако въпроса е какво правим със задача при която трябва да се реагира толкова бързо че не позволява излизане от прекъсване и завъртане на цикъл логично ако не може да направиш нищо по тия две условия , е да я обработиш в прекъсването. Обаче те нещата малко се самоизключват, ако е задачата е да промениш състояние на порт, да сетнеш някаква променлива и д.р от сорта, то тя по подразбиране е подходяща за изпълнени в прекъсване и обикновено там се и изпълнява, обраното увеличава кода и те държи повече време в безсмислен код.
Ако е задача която изисква смекти, като изчисляване на Пи до 365-тия знак, самата задача отнема много повече време от нужното да излезеш от прекъсване и да полираш флага, т.е. това, че ще я изнесеш извън прекъсването няма никакво значение тъй като няма да рефлектира на времето за нейното изпълнение.
Забраната на прекъсване при влизане в прекъсване не е добра идея.
Но while в прекъсване, това за мен е недопустимо, изобщо използването на while ми се вижда доста неразумно, ако се използва, задължително трябва да имаш някакъв гарантиран изход от този while. Аз рядк имам друг while освен тоя на основния цикъл. Ако имаш някакъв OS или диспечър на задачи, това вече е по-друго,но и тогава според мен while трябва да се избягва. Сега ако го използваш за цикъл е друго нещо, т.е. манипулираш променливата в самия while и няма начин да не излезеш от него.


Сря Юли 11, 2018 5:35 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 193 мнения ]  Отиди на страница 1, 2, 3, 4, 5 ... 13  Следваща

Кой е на линия

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


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

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