Отговори на тема  [ 28 мнения ]  Отиди на страница Предишна  1, 2
Едно въпросче 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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

Регистриран на: Нед Окт 10, 2004 9:55 am
Мнения: 1718
Мнение Хм
Ки4о написа:
Абе чудо,
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

.....
.....
.....
..... // връщаш съдържанието
...... // разрешаваш прекъсване

За какво му е да забранява прекъсвания при положение че е влязъл в прекъсване, в момента в които влезе в прекъсване главния флаг на прекъсване се сваля от 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Даа погледнах че става дума за 16Ф84 - за него съм съгласен,но като пишеш за проц със приоритетни прекъсвания каквито са някой от 18Ф има значение.Грешката е моя :oops:


Вто Май 08, 2007 3:51 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Окт 10, 2004 9:55 am
Мнения: 1718
Мнение Мда
Emo написа:
Ще цитирам абзаци от книгата :

" Както вече стана ясно , PIC 16F84А разполага с 68 клетки статична RAM , всяка от които е с дължина 8 бита. Тези клетки са разположени на адреси "OCh - 4Fh" и са известни още като регистри с общо предназначение(GPR) ............... .............. ........ . Важното е да се отбележи, че всеки от GPR-регистрите се "вижда " и от двете банки , което ще рече , че при съставяне на програмата не е необходимо потребителят да следи коя банка ще бъде избрана преди да се обърне за четене и запис към даден регистър с общо преднзначение . "

аз написах тия които ти си ми написал :

WREGsave equ 0x40
STATUSsave equ 0x41

за следващата забележка :

movwf STATUS ; Restore STATUS --> внимавай че може да не се върнеш в банка 0 !!!

В книгата има една схема с организацията на паметта където се вижда че STATUS го има в 2-те банки , така че защо да правя избор на банка ? Ако трябва коя трябва да бъде и защо ?

и за третата : нулирането и сетването на GIE го махнах

Тука има нещо което съм направил и може да бърка всичко : кода ми е написан така че , при Промяна на RBO се влиза в прекъсването (натискане на бутон) и при следваща промяна (повторно натискане) се излиза.


Да при F84 е така, но утре ще решиш че може да ползваш този код например при F877, F88 или някои чип с доста повече памет , а там вече не е така :)
Не би трябвало да се обърка , но по добре би било да си сложиш един флаг за натиснат бутон , и при натискане този флаг просто го преобръщаш всеки път и така няма да има нужда да ти дреме програмата дълго време в прекъсване . :)
Нещо такова :

FlagA EQU 0x46
.......................................
.......................................

;Обработка на прекъсване от порта
MOVLW B'00000001'
Xorwf FlagA, F
..................

Като ако очакваш натискане на бутон в основния си цикъл може дори да си следиш този флаг .


Сря Май 09, 2007 12:32 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
От една седмица я чета темата и все повече за чудя за какъв грездей се следи бутон в прекъсване. Един тактилен бутон има минимум 5-6 осцилации преди да се стабилизира. Още по неприятно че пак със същия бутон се излиза от прекъсването. Трябва още преди излизане от прекъсването да се забрани прекъсване от RB0 и след това в програмата да му се направи debounce - демек да се изчака малко преди да се разреши отново.
Прекъсването по RB0 става само за вход от друг чип дето няма разтрептяване. Сложи един оптрон след бутона и ще ти се изчистят всички боклуци от бутона.


Сря Май 09, 2007 3:41 pm
Профил ICQ
Ранг: Напреднал
Ранг: Напреднал

Регистриран на: Нед Авг 14, 2005 1:08 pm
Мнения: 433
Местоположение: Казанлък
Мнение 
Или достатъчна RC група например 4.7к и 47нФ :)


Прикачени файлове:
Untitled-2 copy.jpg
Untitled-2 copy.jpg [ 31.32 KiB | Прегледано 1384 пъти ]
Сря Май 09, 2007 6:59 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 11, 2006 5:30 pm
Мнения: 39
Мнение 
Ех... аз още не мога да се оправя с 84-та , та камоли да пиша други чипове. Някой беше написал назад в форума : "Ако начинаещия срещне някаква трудност (която обикновенно не е нещо голямо) при реализация на първите си схеми с микроконтролери и не намери решение - шанса да се откаже е много голям " . По принцип ме хваща яд че заради някой си смотан ред чипа ми не тръгва , а решението е някъде под носа ми...
Тва с кондензатора ще го сложа и ще пробвам с флага, Тю , само работа да нямаше толкова :)


Чет Май 10, 2007 12:52 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Абе и аз чета и вс епо неясно ми става какъв е проблем, сигурно защото забравям какво съм чел до сега.
Когато ползваш прекъсвания, се старай кода във тях да е възможно най-кратък обработката се реализира в основната програма, това важи за всякакви процесори, и най-вече за такива от сорта на пик, където не може да обработваш няколко прекъсвания, по точно не може да получиш прекъсване в преъсване. Няма смисъл да чакаш бутона в прекъсването, вдигай си там флаг че имаш прекъсване от него и после си го обработвай в програмата, въпреки че когато става въпрос за един прост бутон, спокойно може и да е на полиране. За да избегнеш многократното му задействие си направи и алгоритъм който да отфилтрира трептенето.
p.s. катоостане време ще взема да ти прочета кода :)

п.с. 2 абе ти хубаво се знаимаваш, ак ти е настроен WDT, при начинаещи честа грека да го забравят, и той си рестартва процесор до безкрай.


Чет Май 10, 2007 7:58 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 11, 2006 5:30 pm
Мнения: 39
Мнение 
Тия командировки са безкрайни , не мога да стигна до компа , но и не съжелявам че малко ли градове обиколих...
Както и да е ....

1) Това ли трябва да е някъде за WDT :

list p=16F84A
#include <p16F84A.inc>

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

2) До колкото разбирам ако използвам флаг , всъщност... мога въобще да не влизам в прекъсване поне в този случай ! В смисъл да си го свърши там някъде из програмата. То софтуер за претрепване на контактите - има.

Това е кода с някои промени след това, макар и не функциниращ отново :D
Идеите за съхраняването ги схванах , но както писах и преди , дори да махна цялото съдържание на сорса от прекъсването , и сложа единствено сваляне флага на прекъсването и нещо визуално. Чипа си увисва но за по-малко.

прекъсване
CLRF PORTB ;
BCF INTCON,INT
RETFIE

А как би изглеждало едно такова елементарно използване на флаг?

3) ето как изглежда увисването за което говоря. Ще прощавате за първобитната демонстрация :)


Прикачени файлове:
Коментар на файл: клип
1.rar [2.46 MiB]
165 пъти
Коментар на файл: сорс
obzor2.asm [3.87 KiB]
188 пъти
Съб Май 12, 2007 2:18 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
Emo ,това дето го питаш тука не е за форума а за МПлаб симулатора. Седни пред компа за 1-2 часа и си трасирай кода ред по ред - грешката сама ще се появи. Няма кой да ти се занимава с твоя код. На мен лично,като го погледнах в началото, мъка ми стана за тоя RP0 bit - буташ го на всеки 2-ри ред за щяло и нещяло. Освен това гледам ,че работиш с портБ в "смесен" режим - входове/изходи - имай в предвид че работата с порта изискава особено внимание и в някои случаи води до много "тънки" грешки които зависят от схемата и със симулатора не можеш да ги хванеш. Чети внимателно дейташитите!


Съб Май 12, 2007 2:51 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 11, 2006 5:30 pm
Мнения: 39
Мнение 
:idea: Пууу най-накрая. Намерих проблема оказа се една променлива която хем използвам в главната програма хем и в кода на прекъсването. Участва в една подпрограма за пауза. Чесно да си кажа от доста дълго време се бях застоял на този проблем. Много съм благодарен за вниманието което ми отделихте. Да постъпих с нея както при останалите регистри : записах я в началото и я възстанових накрая. Тоя RP0 bit го бутах навсякъде , щото по едно време незнаех какво друго да направя :) .
Зная че на никой не му се занимава с кода, но пък виж колко неща научих ;). Както е казано : почукай за да ти отворят ...


Вто Май 15, 2007 1:21 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
Най-добре е в "тялото" на прекъсването въобще да не се ползват същите работни регистри както в основната програма. Или ако се ползват да се отварят очите на 4 кое какво бута и кога го бута. Иначе става миш-маш.


Вто Май 15, 2007 10:35 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 28 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

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


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

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