Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Едно въпросче
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=4118
Страница 1 от 2

Автор:  Emo [ Пет Апр 27, 2007 10:19 pm ]
Заглавие:  Едно въпросче

Здр на всички !

Имам едно въпросче . Направил съм една малка програмка. Като я вкарам в чипа (16ф84А) работи , Когато извърша прекъсване , заложеният код също работи. Обаче когато трябва да изляза от прекъсването чипа "увисва" и трябва да изчакам доста дълго за да се върне към нормалния режим на работа. Пробвах разни неща , като най-накрая за проба, оставих в прекъсването само следните команди :

---------------------------------
Int_Service

CLRF PORTB ; това само за да придобия визуална представа
BCF INTCON,INT
RETFIE
----------------------------------

Обаче пак имаше "увисване" макар и за по малко време. Та въпросчето ми е на какво се дължи това? Да не нещо при началната инициализация да съм объркал ? Иначе си бачка . По долу давам пълния сорс код и схемичката. На мястото на светодиодите ще има други работи... но там проблем нямам.
Предварително благодаря за вниманието

Прикачени файлове:
Коментар на файл: схема
nova_pr_shema.jpg
nova_pr_shema.jpg [ 215.78 KiB | Прегледано 1937 пъти ]
Коментар на файл: сорс
obzor2.asm [3.72 KiB]
289 пъти

Автор:  bateAz [ Пет Апр 27, 2007 10:51 pm ]
Заглавие: 

Сигурен ли си, че влизаш в прекъсването само 1 път? Не съм много запознат с външното прекъсване на Ппппик, но е възможно поради разтрептяване на контактите да се прекъснеш многократно и да си препълниш стека. Опитай след като влезеш в прекъсването, да забраниш прекъсванията по входа и едва тогава да излезеш от прекъсването.

ЕДИТ: Най-вероятно при нулирането на порта се подава и втора заявка за прекъсване.

Автор:  ToHu [ Пет Апр 27, 2007 10:54 pm ]
Заглавие: 

Там няма влизане в прекъсване от прекъсване, т.е. не може така да препълни стека, но е напулно вузмозно да влиза отново от същото прекъсване.

Автор:  Emo [ Съб Апр 28, 2007 7:31 am ]
Заглавие: 

за тази цел в пълния сорс (той е побликуван) има следните проверки

на входа :


Int_Service
BTFSS INTCON,INTF
GOTO IOI ; проверка вид прекъсването
BCF STATUS,RP0 ;при несъвпадение -изход (етикет IOI )
CLRF PORTB
PUSH_B
BCF STATUS,RP0 ;прверка натиснат бутон за прекъсването
BTFSC RESET4E ; бутон RESET4E (В0)
GOTO PUSH_B
CALL WAIT
BTFSC RESET4E
GOTO PUSH_B
PULL_B
BTFSS RESET4E ;прверка отпуснат бутон за прекъсването
GOTO PULL_B
CALL WAIT
BTFSS RESET4E
GOTO PULL_B

И на Изхода :

IOI
TY
BTFSS RESET4E ; проверка за отпуснат бутон на
GOTO TY ; прекъсването (В0)
CALL WAIT
BTFSS RESET4E
GOTO TY

BCF STATUS,RP0
CLRF PORTA
BCF INTCON,INTF
RETFIE

А може ле да е нещо Хардуеарно ?

Автор:  plameniv [ Съб Апр 28, 2007 9:34 am ]
Заглавие:  Mda

Emo написа:
за тази цел в пълния сорс (той е побликуван) има следните проверки

на входа :


Int_Service
BTFSS INTCON,INTF
GOTO IOI ; проверка вид прекъсването
BCF STATUS,RP0 ;при несъвпадение -изход (етикет IOI )
CLRF PORTB
PUSH_B
BCF STATUS,RP0 ;прверка натиснат бутон за прекъсването
BTFSC RESET4E ; бутон RESET4E (В0)
GOTO PUSH_B
CALL WAIT
BTFSC RESET4E
GOTO PUSH_B
PULL_B
BTFSS RESET4E ;прверка отпуснат бутон за прекъсването
GOTO PULL_B
CALL WAIT
BTFSS RESET4E
GOTO PULL_B

И на Изхода :

IOI
TY
BTFSS RESET4E ; проверка за отпуснат бутон на
GOTO TY ; прекъсването (В0)
CALL WAIT
BTFSS RESET4E
GOTO TY

BCF STATUS,RP0
CLRF PORTA
BCF INTCON,INTF
RETFIE

А може ле да е нещо Хардуеарно ?

Винаги когато се влиза в прекъсване се запазва W, status , FSR и други регистри които може да се променят .
На излизане се възстановяват за да може основната ти програма (цикъл) да продължи без да забие :)
Нещо такова :
;-------------------------------
WREGsave equ 0x40
STATUSsave equ 0x41
PCLATHsave equ 0x42
FSRsave equ 0x43
;=========================================================
org 0x000
GOTO Main

DATA 0x00
DATA 0x00

org 0x004
GOTO Prekysvane
....................................
....................................
....................................
Prekysvane
movwf WREGsave ; Save WREG
movf STATUS,W ; Get STATUS register
BCF STATUS,RP0
movwf STATUSsave ; Save the STATUS register
movf PCLATH,W ;
movwf PCLATHsave ; Save PCLATH
movf FSR,W ;
movwf FSRsave ; Save FSR

BTFSC INTCON, 1
GOTO PrIn

PrOut BCF INTCON, 1
movf FSRsave,W ;
movwf FSR ; Restore FSR
movf PCLATHsave,W ;
movwf PCLATH ; Restore PCLATH
movf STATUSsave,W ;
movwf STATUS ; Restore STATUS
swapf WREGsave,F ;
swapf WREGsave,W ; Restore WREG
RETFIE

PrIn ;Начало на обработка на прекъсване !!!!
GOTO PrOut

Автор:  Zeus [ Съб Апр 28, 2007 8:28 pm ]
Заглавие: 

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

Автор:  bkulev [ Сря Май 02, 2007 2:34 pm ]
Заглавие: 

Zeus, разбира се че си прав, но в конкретния случай се вижда, че
момчето изобщо не се грижи за регистрите си при влизане в и излизане
от прекъсване. Искам да кажа, че проблема му е точно това.
Предполагам, че програмата му е малка и след излизането PC го праща
в NOP област и т.н. та по някое време вземе, че захапе софта отново. :)
Емо, ползвай кода който ти е дал plamenv и бъди сигурен, че
прекъсването ти ще е ок.
Ето ти и един съвет от мен: ако имаш няколко прекъсвания и си
забранил някое от тях, трябва да знаеш, че въпреки това неговия
флаг се установява, ето защо трябва да направиш логическо &
м/у бита за разрешение и флага на съответното прекъсване. В
противен случай ще обработиш забранено в конкретния момент
прекъсване.

Автор:  Emo [ Сря Май 02, 2007 11:36 pm ]
Заглавие: 

Поставих допълнителния код в програмата , но не се промени с нищо работата на чипа. Аз преди също мислих че е нужно нещо подобно за запазване на данните но не знаех какво точно да запиша. Не зная защо авторите на книгата от Млад конструктор са пропуснали да опишат това съхраняване на регистрите . Аз просто следвах книгата. Между другото ако се изтрие съдържанието на прекъсването , т.е. след прекъсване следва директно изход , чипа увисва отново. Искам да кажа че не е нужно запаметявяне на регистри , щом не се извършва промяна. Правилно ли се изразих ? Избора на Банка огледах внимателно и мисля че нямам грешка . Нооо благодарим за вниманието :)

Автор:  Zeus [ Чет Май 03, 2007 2:37 pm ]
Заглавие: 

Провери си също хардуера. Аз на една платка бях забравил да сложа 100nF на захранването след 7805 и няма да ти кажа как странно се държеше цялата схема.

Автор:  Zeus [ Чет Май 03, 2007 3:07 pm ]
Заглавие: 

Emo написа:
Поставих допълнителния код в програмата , но не се промени с нищо работата на чипа. Аз преди също мислих че е нужно нещо подобно за запазване на данните но не знаех какво точно да запиша. Не зная защо авторите на книгата от Млад конструктор са пропуснали да опишат това съхраняване на регистрите . Аз просто следвах книгата. Между другото ако се изтрие съдържанието на прекъсването , т.е. след прекъсване следва директно изход , чипа увисва отново. Искам да кажа че не е нужно запаметявяне на регистри , щом не се извършва промяна. Правилно ли се изразих ? Избора на Банка огледах внимателно и мисля че нямам грешка . Нооо благодарим за вниманието :)


Авторите на книгата не са забравили: Справка - Част 1 - стр. 95 и 96. Има и пример.

Автор:  Реконструктор [ Чет Май 03, 2007 4:52 pm ]
Заглавие:  Re: Mda

plameniv написа:
Винаги когато се влиза в прекъсване се запазва W, status , FSR и други регистри които може да се променят .
На излизане се възстановяват за да може основната ти програма (цикъл) да продължи без да забие :)


Едно от предимствата да пишеш на C и да ползваш проц с истински хардуерен стек. :D

Автор:  ToHu [ Чет Май 03, 2007 7:45 pm ]
Заглавие:  Re: Mda

Реконструктор написа:
plameniv написа:
Винаги когато се влиза в прекъсване се запазва W, status , FSR и други регистри които може да се променят .
На излизане се възстановяват за да може основната ти програма (цикъл) да продължи без да забие :)


Едно от предимствата да пишеш на C и да ползваш проц с истински хардуерен стек. :D


Недостатъка да не знаеш какво пишеш и да не четеш описанието, та е проблема, нищо му няма на стека, не е единстения с такъв стек.

Автор:  Emo [ Пет Май 04, 2007 12:31 am ]
Заглавие: 

M дам грешката е в моят "телевизор" . По горните думи си ги връщам. Понеже тия микроконтролери са ми само хоби , не схванах напълно цялата книга когато я четох , хем даже доста от нещата съм препрочел. И чак сега схванах какво се има в предвид в въпросната 94.95 стр. Нооо дори със описаното от тях запазване на регистри не получих желания резултат, сложих и 100nF , но няма разлика . Ползвам един много прост програматор (4 резистора 2 диода и един конд.) който по принцип е за 16Ф84 и работи само с PiCProg , която е също само за него. Нещо от това може ли да е? ще взема да си купя от тия на МК

Автор:  ToHu [ Пет Май 04, 2007 7:13 am ]
Заглавие: 

Не едва ли е от това, а ти като запазвасх регистрит после вузстановиавасх ли ги ? Не съм ти гледал още кода, след това сваляш ли флага на прекъсването, това тряба да го правиш ръчно.

Автор:  Emo [ Пон Май 07, 2007 10:44 pm ]
Заглавие: 

след алгоритъма на програмата на прекъсването изпълнявам следното - BCF INTCON, 1 Това ли имаш предвид Тони ?Както посочи " plameniv " направих запазване на регистрите , но според описанието което е дадено в книгата , в смисъл не запазвам състоянието на PCLATH и FSR. Така или иначе пробвах и по неговия начин .

Значи ето как изглежда прекъсването :


Int_Service
movwf WREGsave ; Save WREG
swapf STATUS,W ; razmqna tetradi STATUS register
movwf STATUSsave ; Save the STATUS register
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
bsf INTCON,GIE ; tva go dobavih za vseki slu4ai
BCF INTCON, 1 ; izpolzvam prekasvane ot RB0
swapf STATUSsave,W ;
movwf STATUS ; Restore STATUS
swapf WREGsave,F ;
swapf WREGsave,W ; Restore WREG


RETFIE

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/