|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:10 am
| Автор |
Съобщение |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Абе чудо,
movwf WREGsave ; Save WREG swapf STATUS,W ; razmqna tetradi STATUS register при W=1 си прочети какво ти прави инструкцията ! movwf STATUSsave ; Save the STATUS register ....... //Тука липсва забрана на прекъсване ! BTFSS INTCON,INTF GOTO IOI ; izhod
.....
.....
.....
..... // връщаш съдържанието
...... // разрешаваш прекъсване
|
| Пон Май 07, 2007 11:35 pm |
|
 |
|
plameniv
Ранг: Форумен бог
Регистриран на: Нед Окт 10, 2004 9:55 am Мнения: 1718
|
 Хм
За какво му е да забранява прекъсвания при положение че е влязъл в прекъсване, в момента в които влезе в прекъсване главния флаг на прекъсване се сваля от 1 става 0, а когато RETFIE се изпълни се вдига автоматично 0--> 1, прочети упътването !!!
Int_Service
movwf WREGsave ; Save WREG --> внимавай къде ти се намира този регистър изпозвай такава РАМ която се вижда от всички банки
;И така става
swapf STATUS,W ; razmqna tetradi STATUS register
movwf STATUSsave ; Save the STATUS register ; И тук също изпозвай такава РАМ която се вижда от всички банки
BCF STATUS,RP0 ; това е сложено ако си в друга БАНКА да се върнеш към основната
BTFSS INTCON,INTF
GOTO IOI ; izhod
PUSH_B
BCF STATUS,RP0
BTFSC RESET4E
GOTO PUSH_B
CALL WAIT
BTFSC RESET4E
GOTO PUSH_B
PULL_B
BTFSS RESET4E
GOTO PULL_B
CALL WAIT
BTFSS RESET4E
GOTO PULL_B
;bcf INTCON,GIE ; tva go dobavih za vseki slu4ai няма смисъл от това !!!
Алгоритъм на прекъсването ; s nego nqma problem
IOI
TY
BTFSS RESET4E
GOTO TY
CALL WAIT
BTFSS RESET4E
GOTO TY
BCF STATUS,RP0
CLRF PORTA
BCF INTCON, 1 ; izpolzvam prekasvane ot RB0
;bsf INTCON,GIE ; (tva go dobavih za vseki slu4ai ) не му е мястото тук , защото може да се върне от прекъсване не когато трябва дори без да си възстановил регистрите !!!
swapf STATUSsave,W ;
movwf STATUS ; Restore STATUS --> внимавай че може да не се върнеш в банка 0 !!!
swapf WREGsave,F ;
swapf WREGsave,W ; Restore WREG
RETFIE ; когато RETFIE се изпълни флаг GIE се вдига автоматично 0 --> 1, прочети упътването (равносилно е на bsf INTCON,GIE ) !!!
|
| Вто Май 08, 2007 2:42 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Даа погледнах че става дума за 16Ф84 - за него съм съгласен,но като пишеш за проц със приоритетни прекъсвания каквито са някой от 18Ф има значение.Грешката е моя 
|
| Вто Май 08, 2007 3:51 pm |
|
 |
|
Emo
Ранг: Минаващ
Регистриран на: Пон Сеп 11, 2006 5:30 pm Мнения: 39
|
Ще цитирам абзаци от книгата :
" Както вече стана ясно , PIC 16F84А разполага с 68 клетки статична RAM , всяка от които е с дължина 8 бита. Тези клетки са разположени на адреси "OCh - 4Fh" и са известни още като регистри с общо предназначение(GPR) ............... .............. ........ . Важното е да се отбележи, че всеки от GPR-регистрите се "вижда " и от двете банки , което ще рече , че при съставяне на програмата не е необходимо потребителят да следи коя банка ще бъде избрана преди да се обърне за четене и запис към даден регистър с общо преднзначение . "
аз написах тия които ти си ми написал :
WREGsave equ 0x40
STATUSsave equ 0x41
за следващата забележка :
movwf STATUS ; Restore STATUS --> внимавай че може да не се върнеш в банка 0 !!!
В книгата има една схема с организацията на паметта където се вижда че STATUS го има в 2-те банки , така че защо да правя избор на банка ? Ако трябва коя трябва да бъде и защо ?
и за третата : нулирането и сетването на GIE го махнах
Тука има нещо което съм направил и може да бърка всичко : кода ми е написан така че , при Промяна на RBO се влиза в прекъсването (натискане на бутон) и при следваща промяна (повторно натискане) се излиза.
|
| Сря Май 09, 2007 12:05 am |
|
 |
|
plameniv
Ранг: Форумен бог
Регистриран на: Нед Окт 10, 2004 9:55 am Мнения: 1718
|
 Мда
Да при F84 е така, но утре ще решиш че може да ползваш този код например при F877, F88 или някои чип с доста повече памет , а там вече не е така
Не би трябвало да се обърка , но по добре би било да си сложиш един флаг за натиснат бутон , и при натискане този флаг просто го преобръщаш всеки път и така няма да има нужда да ти дреме програмата дълго време в прекъсване .
Нещо такова :
FlagA EQU 0x46
.......................................
.......................................
;Обработка на прекъсване от порта
MOVLW B'00000001'
Xorwf FlagA, F
..................
Като ако очакваш натискане на бутон в основния си цикъл може дори да си следиш този флаг .
|
| Сря Май 09, 2007 12:32 am |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
От една седмица я чета темата и все повече за чудя за какъв грездей се следи бутон в прекъсване. Един тактилен бутон има минимум 5-6 осцилации преди да се стабилизира. Още по неприятно че пак със същия бутон се излиза от прекъсването. Трябва още преди излизане от прекъсването да се забрани прекъсване от RB0 и след това в програмата да му се направи debounce - демек да се изчака малко преди да се разреши отново.
Прекъсването по RB0 става само за вход от друг чип дето няма разтрептяване. Сложи един оптрон след бутона и ще ти се изчистят всички боклуци от бутона.
|
| Сря Май 09, 2007 3:41 pm |
|
 |
|
VSU
Ранг: Напреднал
Регистриран на: Нед Авг 14, 2005 1:08 pm Мнения: 433 Местоположение: Казанлък
|
Или достатъчна RC група например 4.7к и 47нФ 
|
| Сря Май 09, 2007 6:59 pm |
|
 |
|
Emo
Ранг: Минаващ
Регистриран на: Пон Сеп 11, 2006 5:30 pm Мнения: 39
|
Ех... аз още не мога да се оправя с 84-та , та камоли да пиша други чипове. Някой беше написал назад в форума : "Ако начинаещия срещне някаква трудност (която обикновенно не е нещо голямо) при реализация на първите си схеми с микроконтролери и не намери решение - шанса да се откаже е много голям " . По принцип ме хваща яд че заради някой си смотан ред чипа ми не тръгва , а решението е някъде под носа ми...
Тва с кондензатора ще го сложа и ще пробвам с флага, Тю , само работа да нямаше толкова 
|
| Чет Май 10, 2007 12:52 am |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
Абе и аз чета и вс епо неясно ми става какъв е проблем, сигурно защото забравям какво съм чел до сега.
Когато ползваш прекъсвания, се старай кода във тях да е възможно най-кратък обработката се реализира в основната програма, това важи за всякакви процесори, и най-вече за такива от сорта на пик, където не може да обработваш няколко прекъсвания, по точно не може да получиш прекъсване в преъсване. Няма смисъл да чакаш бутона в прекъсването, вдигай си там флаг че имаш прекъсване от него и после си го обработвай в програмата, въпреки че когато става въпрос за един прост бутон, спокойно може и да е на полиране. За да избегнеш многократното му задействие си направи и алгоритъм който да отфилтрира трептенето.
p.s. катоостане време ще взема да ти прочета кода
п.с. 2 абе ти хубаво се знаимаваш, ак ти е настроен WDT, при начинаещи честа грека да го забравят, и той си рестартва процесор до безкрай.
|
| Чет Май 10, 2007 7:58 am |
|
 |
|
Emo
Ранг: Минаващ
Регистриран на: Пон Сеп 11, 2006 5:30 pm Мнения: 39
|
Тия командировки са безкрайни , не мога да стигна до компа , но и не съжелявам че малко ли градове обиколих...
Както и да е ....
1) Това ли трябва да е някъде за WDT :
list p=16F84A
#include <p16F84A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
2) До колкото разбирам ако използвам флаг , всъщност... мога въобще да не влизам в прекъсване поне в този случай ! В смисъл да си го свърши там някъде из програмата. То софтуер за претрепване на контактите - има.
Това е кода с някои промени след това, макар и не функциниращ отново
Идеите за съхраняването ги схванах , но както писах и преди , дори да махна цялото съдържание на сорса от прекъсването , и сложа единствено сваляне флага на прекъсването и нещо визуално. Чипа си увисва но за по-малко.
прекъсване
CLRF PORTB ;
BCF INTCON,INT
RETFIE
А как би изглеждало едно такова елементарно използване на флаг?
3) ето как изглежда увисването за което говоря. Ще прощавате за първобитната демонстрация 
|
| Съб Май 12, 2007 2:18 am |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
Emo ,това дето го питаш тука не е за форума а за МПлаб симулатора. Седни пред компа за 1-2 часа и си трасирай кода ред по ред - грешката сама ще се появи. Няма кой да ти се занимава с твоя код. На мен лично,като го погледнах в началото, мъка ми стана за тоя RP0 bit - буташ го на всеки 2-ри ред за щяло и нещяло. Освен това гледам ,че работиш с портБ в "смесен" режим - входове/изходи - имай в предвид че работата с порта изискава особено внимание и в някои случаи води до много "тънки" грешки които зависят от схемата и със симулатора не можеш да ги хванеш. Чети внимателно дейташитите!
|
| Съб Май 12, 2007 2:51 pm |
|
 |
|
Emo
Ранг: Минаващ
Регистриран на: Пон Сеп 11, 2006 5:30 pm Мнения: 39
|
 Пууу най-накрая. Намерих проблема оказа се една променлива която хем използвам в главната програма хем и в кода на прекъсването. Участва в една подпрограма за пауза. Чесно да си кажа от доста дълго време се бях застоял на този проблем. Много съм благодарен за вниманието което ми отделихте. Да постъпих с нея както при останалите регистри : записах я в началото и я възстанових накрая. Тоя RP0 bit го бутах навсякъде , щото по едно време незнаех какво друго да направя  .
Зная че на никой не му се занимава с кода, но пък виж колко неща научих  . Както е казано : почукай за да ти отворят ...
|
| Вто Май 15, 2007 1:21 am |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
Най-добре е в "тялото" на прекъсването въобще да не се ползват същите работни регистри както в основната програма. Или ако се ползват да се отварят очите на 4 кое какво бута и кога го бута. Иначе става миш-маш.
|
| Вто Май 15, 2007 10:35 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 5 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|