| Микроконтролери и електроника 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 ---------------------------------- Обаче пак имаше "увисване" макар и за по малко време. Та въпросчето ми е на какво се дължи това? Да не нещо при началната инициализация да съм объркал ? Иначе си бачка . По долу давам пълния сорс код и схемичката. На мястото на светодиодите ще има други работи... но там проблем нямам. Предварително благодаря за вниманието
|
||||
| Автор: | 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 | |||||||||
Винаги когато се влиза в прекъсване се запазва 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 ] | |||||||||
| Заглавие: | ||||||||||
Авторите на книгата не са забравили: Справка - Част 1 - стр. 95 и 96. Има и пример. |
||||||||||
| Автор: | Реконструктор [ Чет Май 03, 2007 4:52 pm ] | |||||||||
| Заглавие: | Re: Mda | |||||||||
Едно от предимствата да пишеш на C и да ползваш проц с истински хардуерен стек. |
||||||||||
| Автор: | ToHu [ Чет Май 03, 2007 7:45 pm ] | ||||||||||||||||||
| Заглавие: | Re: Mda | ||||||||||||||||||
Недостатъка да не знаеш какво пишеш и да не четеш описанието, та е проблема, нищо му няма на стека, не е единстения с такъв стек. |
|||||||||||||||||||
| Автор: | 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/ |
|