|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 4:04 am
| Автор |
Съобщение |
|
stojo
Ранг: Минаващ
Регистриран на: Чет Авг 18, 2011 3:44 pm Мнения: 27
|
 Re: Моля за малко помощ
Може ли малко разяснения относно "бекъп-а" и по точно какво представлява?
|
| Пон Авг 22, 2011 10:20 pm |
|
 |
|
itso.t
Ранг: Форумен бог
Регистриран на: Чет Фев 03, 2005 2:21 am Мнения: 12764 Местоположение: София
|
 Re: Моля за малко помощ
Това което Тони е кръстил бекъп е променлива. Като настъпи прекъсване, и присвояваш стойността на порта който те интересува или на бит от него.
|
| Пон Авг 22, 2011 10:55 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Моля за малко помощ
Да, при инициализация да речем си записвасш old_b=portb;
при влизане в прекъсване. new_b=portb; if(!bit_test(new_b,4)==bit_test(old_b,4)) {} if(!bit_test(new_b,4)==bit_test(old_b,4)) {} if(!bit_test(new_b,4)==bit_test(old_b,4)) {} if(!bit_test(new_b,4)==bit_test(old_b,4)) {} old_b=new_b;
Това за да ти стане ясно, този начин е неефективен от към ресурси.
int temp; temp=portb; new_b=old_b^portb; if(new_b&0x08) {} if(new_b&0x04) {} if(new_b&0x02) {} if(new_b&0x01) {} old_b=temp; това е доста по ефективен код, горе долу 4 пъти ако да речем всички са променени. Най-общо каква е идеята, temp запазва състоянието на порта в момента в който влезеш в прекъсване. new_b=old_b^temp така правиш XOR между старата стойност на порта и новата, в new_b имаш единици там където има разлика в старото и новото състояние. След това в if-а проверяваш къде има 1-ца като правиш and между резултата от XOR-а и число с 1-ца в бита който искаш да провериш. Накрая записваш новото състояние на порта като старо.
|
| Пон Авг 22, 2011 11:43 pm |
|
 |
|
stojo
Ранг: Минаващ
Регистриран на: Чет Авг 18, 2011 3:44 pm Мнения: 27
|
 Re: Моля за малко помощ
Не е ли също като if (PORTx.Bx == 1) {}
|
| Вто Авг 23, 2011 11:04 am |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
 Re: Моля за малко помощ
не е, защото по време на изпълнение на инструкцията порта може да се е променил
|
| Вто Авг 23, 2011 3:49 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Моля за малко помощ
Не можеш да го сравняваш с 1, защото не знаеш колко е бил, т.е. дали се епроменил или не. За да знаеш трябва да пазиш старото му състояние. Можеш да го пазиш побитово, в този случай можеш да правиш сравнение м-у битов апроменлива и състоянието на порта, или пък да направиш XOR между две битови, което обаче за процесора е все тая, той ще направи XOR м-у два байта, при което ще им присво стойности, катооперации не мисля ще е по малко.
|
| Вто Авг 23, 2011 8:01 pm |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
 Re: Моля за малко помощ
флага ти се вдига при първата промяна на произволен порт, оттам нататък кво става е твоя грижа
|
| Сря Авг 24, 2011 9:40 am |
|
 |
|
stojo
Ранг: Минаващ
Регистриран на: Чет Авг 18, 2011 3:44 pm Мнения: 27
|
 Re: Моля за малко помощ
А как да стои в прекъсването, докато бутонът не бъде освободен?
|
| Чет Авг 25, 2011 2:49 pm |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
 Re: Моля за малко помощ
Първо, какво за теб е стоене в прекъсване? Второ, като изключим претрепването на ключа, освобождаването му е условие за ново прекъсване
|
| Чет Авг 25, 2011 3:39 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
 Re: Моля за малко помощ
Вземете вече запомнете, че: бутони, клавиатури, дисплеи и разни тем подобни не се четат, пишат, опресняват или обработват в прекъсване!
|
| Чет Авг 25, 2011 3:46 pm |
|
 |
|
stojo
Ранг: Минаващ
Регистриран на: Чет Авг 18, 2011 3:44 pm Мнения: 27
|
 Re: Моля за малко помощ
didofen raif да си стои 1 докато бутонът не бъде освободен....
|
| Чет Авг 25, 2011 3:54 pm |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
 Re: Моля за малко помощ
stojo, флага ни за прекъсване, сиреч натиснат бутон не се нулира сам, така че като излезеш от прекъсване, пак ще се върнеш там, т.е. никога няма да излезеш
|
| Чет Авг 25, 2011 4:22 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Моля за малко помощ
Не знам какво точно ти създава проблем. Ако това е бутон, в тия ифове само си вдигай флаг кой е натиснатият бутон, ако искаш си вземай и тайм щамп, ако имаш пуснат таймер за целта. За да избегнеш проблема с трептенетона контактите трябва да сложиш времеви филтър, това е много пъти дискутирано, може да стане по много начини, вътре или вън от прекъсването без да ти отнема особенно време за изпълнението му. От там нататък,какво се случва след катооткриеш че бутона е натиснат е съвсем друг въпрос, и да както relays писа е по добре да се прави извън прекъсване. В прекъсване с естои възможно най-кратко, в твоя случай за д аопределиш кой бутон е натиснат, и венентуално някоя операция свързана с филтъра.
|
| Чет Авг 25, 2011 8:14 pm |
|
 |
|
stojo
Ранг: Минаващ
Регистриран на: Чет Авг 18, 2011 3:44 pm Мнения: 27
|
 Re: Моля за малко помощ
Ами ако имам входящ импулс, на който трябва да увелича периода с някакво време, не е ли това най удачния подход?
|
| Чет Авг 25, 2011 9:16 pm |
|
 |
|
itso.t
Ранг: Форумен бог
Регистриран на: Чет Фев 03, 2005 2:21 am Мнения: 12764 Местоположение: София
|
 Re: Моля за малко помощ
Провери за конкретния компилатор точния синтаксис за обработване на прекъсването. След обработването му, нулираш ли флага?
Ако не е секретен проекта, няма да е лошо да дадеш малко по-подробна информация, че за момента е доста разпокъсана и не става ясно какво трябва да се получи.
Също така може да изясниш и за себе си кое и как, като си начертаеш алгоритъма. По класическият начин - с ромбчета, квадратчета и стрелки.
|
| Пет Авг 26, 2011 12:38 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|