|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 2:01 am
| Автор |
Съобщение |
|
Emo
Ранг: Минаващ
Регистриран на: Пон Сеп 11, 2006 5:30 pm Мнения: 39
|
 Едно въпросче
Здр на всички !
Имам едно въпросче . Направил съм една малка програмка. Като я вкарам в чипа (16ф84А) работи , Когато извърша прекъсване , заложеният код също работи. Обаче когато трябва да изляза от прекъсването чипа "увисва" и трябва да изчакам доста дълго за да се върне към нормалния режим на работа. Пробвах разни неща , като най-накрая за проба, оставих в прекъсването само следните команди :
---------------------------------
Int_Service
CLRF PORTB ; това само за да придобия визуална представа
BCF INTCON,INT
RETFIE
----------------------------------
Обаче пак имаше "увисване" макар и за по малко време. Та въпросчето ми е на какво се дължи това? Да не нещо при началната инициализация да съм объркал ? Иначе си бачка . По долу давам пълния сорс код и схемичката. На мястото на светодиодите ще има други работи... но там проблем нямам.
Предварително благодаря за вниманието
|
| Пет Апр 27, 2007 10:19 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Сигурен ли си, че влизаш в прекъсването само 1 път? Не съм много запознат с външното прекъсване на Ппппик, но е възможно поради разтрептяване на контактите да се прекъснеш многократно и да си препълниш стека. Опитай след като влезеш в прекъсването, да забраниш прекъсванията по входа и едва тогава да излезеш от прекъсването.
ЕДИТ: Най-вероятно при нулирането на порта се подава и втора заявка за прекъсване.
|
| Пет Апр 27, 2007 10:51 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
Там няма влизане в прекъсване от прекъсване, т.е. не може така да препълни стека, но е напулно вузмозно да влиза отново от същото прекъсване.
|
| Пет Апр 27, 2007 10:54 pm |
|
 |
|
Emo
Ранг: Минаващ
Регистриран на: Пон Сеп 11, 2006 5:30 pm Мнения: 39
|
за тази цел в пълния сорс (той е побликуван) има следните проверки
на входа :
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
А може ле да е нещо Хардуеарно ?
|
| Съб Апр 28, 2007 7:31 am |
|
 |
|
plameniv
Ранг: Форумен бог
Регистриран на: Нед Окт 10, 2004 9:55 am Мнения: 1718
|
 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
|
| Съб Апр 28, 2007 9:34 am |
|
 |
|
Zeus
Ранг: Почетен член
Регистриран на: Вто Окт 03, 2006 11:58 am Мнения: 924 Местоположение: Ботевград
|
Не съм преглеждал основно кода ти, но мога да ти дам един съвет, защото съм патил много от следното: провери си пак, като ползваш даден регистър, дали си установил правилните банки, защото една грешка и всичко отива по дяволите, процесора загърмява на неизвестно място, а компилатора не ти дава грешка при компилирането.
|
| Съб Апр 28, 2007 8:28 pm |
|
 |
|
bkulev
Ранг: Популярен
Регистриран на: Сря Яну 25, 2006 12:47 pm Мнения: 305 Местоположение: Varna
|
Zeus, разбира се че си прав, но в конкретния случай се вижда, че
момчето изобщо не се грижи за регистрите си при влизане в и излизане
от прекъсване. Искам да кажа, че проблема му е точно това.
Предполагам, че програмата му е малка и след излизането PC го праща
в NOP област и т.н. та по някое време вземе, че захапе софта отново.
Емо, ползвай кода който ти е дал plamenv и бъди сигурен, че
прекъсването ти ще е ок.
Ето ти и един съвет от мен: ако имаш няколко прекъсвания и си
забранил някое от тях, трябва да знаеш, че въпреки това неговия
флаг се установява, ето защо трябва да направиш логическо &
м/у бита за разрешение и флага на съответното прекъсване. В
противен случай ще обработиш забранено в конкретния момент
прекъсване.
|
| Сря Май 02, 2007 2:34 pm |
|
 |
|
Emo
Ранг: Минаващ
Регистриран на: Пон Сеп 11, 2006 5:30 pm Мнения: 39
|
Поставих допълнителния код в програмата , но не се промени с нищо работата на чипа. Аз преди също мислих че е нужно нещо подобно за запазване на данните но не знаех какво точно да запиша. Не зная защо авторите на книгата от Млад конструктор са пропуснали да опишат това съхраняване на регистрите . Аз просто следвах книгата. Между другото ако се изтрие съдържанието на прекъсването , т.е. след прекъсване следва директно изход , чипа увисва отново. Искам да кажа че не е нужно запаметявяне на регистри , щом не се извършва промяна. Правилно ли се изразих ? Избора на Банка огледах внимателно и мисля че нямам грешка . Нооо благодарим за вниманието 
|
| Сря Май 02, 2007 11:36 pm |
|
 |
|
Zeus
Ранг: Почетен член
Регистриран на: Вто Окт 03, 2006 11:58 am Мнения: 924 Местоположение: Ботевград
|
Провери си също хардуера. Аз на една платка бях забравил да сложа 100nF на захранването след 7805 и няма да ти кажа как странно се държеше цялата схема.
|
| Чет Май 03, 2007 2:37 pm |
|
 |
|
Zeus
Ранг: Почетен член
Регистриран на: Вто Окт 03, 2006 11:58 am Мнения: 924 Местоположение: Ботевград
|
Авторите на книгата не са забравили: Справка - Част 1 - стр. 95 и 96. Има и пример.
|
| Чет Май 03, 2007 3:07 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
 Re: Mda
Едно от предимствата да пишеш на C и да ползваш проц с истински хардуерен стек. 
|
| Чет Май 03, 2007 4:52 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 Re: Mda
Недостатъка да не знаеш какво пишеш и да не четеш описанието, та е проблема, нищо му няма на стека, не е единстения с такъв стек.
|
| Чет Май 03, 2007 7:45 pm |
|
 |
|
Emo
Ранг: Минаващ
Регистриран на: Пон Сеп 11, 2006 5:30 pm Мнения: 39
|
M дам грешката е в моят "телевизор" . По горните думи си ги връщам. Понеже тия микроконтролери са ми само хоби , не схванах напълно цялата книга когато я четох , хем даже доста от нещата съм препрочел. И чак сега схванах какво се има в предвид в въпросната 94.95 стр. Нооо дори със описаното от тях запазване на регистри не получих желания резултат, сложих и 100nF , но няма разлика . Ползвам един много прост програматор (4 резистора 2 диода и един конд.) който по принцип е за 16Ф84 и работи само с PiCProg , която е също само за него. Нещо от това може ли да е? ще взема да си купя от тия на МК
|
| Пет Май 04, 2007 12:31 am |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
Не едва ли е от това, а ти като запазвасх регистрит после вузстановиавасх ли ги ? Не съм ти гледал още кода, след това сваляш ли флага на прекъсването, това тряба да го правиш ръчно.
|
| Пет Май 04, 2007 7:13 am |
|
 |
|
Emo
Ранг: Минаващ
Регистриран на: Пон Сеп 11, 2006 5:30 pm Мнения: 39
|
след алгоритъма на програмата на прекъсването изпълнявам следното - 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
|
| Пон Май 07, 2007 10:44 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|