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

Регистриран на: Пон Сеп 11, 2006 5:30 pm
Мнения: 39
Мнение Едно въпросче
Здр на всички !

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

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

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

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


Прикачени файлове:
Коментар на файл: схема
nova_pr_shema.jpg
nova_pr_shema.jpg [ 215.78 KiB | Прегледано 1929 пъти ]
Коментар на файл: сорс
obzor2.asm [3.72 KiB]
288 пъти
Пет Апр 27, 2007 10:19 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Сигурен ли си, че влизаш в прекъсването само 1 път? Не съм много запознат с външното прекъсване на Ппппик, но е възможно поради разтрептяване на контактите да се прекъснеш многократно и да си препълниш стека. Опитай след като влезеш в прекъсването, да забраниш прекъсванията по входа и едва тогава да излезеш от прекъсването.

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


Пет Апр 27, 2007 10:51 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Там няма влизане в прекъсване от прекъсване, т.е. не може така да препълни стека, но е напулно вузмозно да влиза отново от същото прекъсване.


Пет Апр 27, 2007 10:54 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

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

Регистриран на: Нед Окт 10, 2004 9:55 am
Мнения: 1718
Мнение 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


Съб Апр 28, 2007 9:34 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
Не съм преглеждал основно кода ти, но мога да ти дам един съвет, защото съм патил много от следното: провери си пак, като ползваш даден регистър, дали си установил правилните банки, защото една грешка и всичко отива по дяволите, процесора загърмява на неизвестно място, а компилатора не ти дава грешка при компилирането.


Съб Апр 28, 2007 8:28 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Сря Яну 25, 2006 12:47 pm
Мнения: 305
Местоположение: Varna
Мнение 
Zeus, разбира се че си прав, но в конкретния случай се вижда, че
момчето изобщо не се грижи за регистрите си при влизане в и излизане
от прекъсване. Искам да кажа, че проблема му е точно това.
Предполагам, че програмата му е малка и след излизането PC го праща
в NOP област и т.н. та по някое време вземе, че захапе софта отново. :)
Емо, ползвай кода който ти е дал plamenv и бъди сигурен, че
прекъсването ти ще е ок.
Ето ти и един съвет от мен: ако имаш няколко прекъсвания и си
забранил някое от тях, трябва да знаеш, че въпреки това неговия
флаг се установява, ето защо трябва да направиш логическо &
м/у бита за разрешение и флага на съответното прекъсване. В
противен случай ще обработиш забранено в конкретния момент
прекъсване.


Сря Май 02, 2007 2:34 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

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


Сря Май 02, 2007 11:36 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
Провери си също хардуера. Аз на една платка бях забравил да сложа 100nF на захранването след 7805 и няма да ти кажа как странно се държеше цялата схема.


Чет Май 03, 2007 2:37 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

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


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


Чет Май 03, 2007 3:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение Re: Mda
plameniv написа:
Винаги когато се влиза в прекъсване се запазва W, status , FSR и други регистри които може да се променят .
На излизане се възстановяват за да може основната ти програма (цикъл) да продължи без да забие :)


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


Чет Май 03, 2007 4:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Mda
Реконструктор написа:
plameniv написа:
Винаги когато се влиза в прекъсване се запазва W, status , FSR и други регистри които може да се променят .
На излизане се възстановяват за да може основната ти програма (цикъл) да продължи без да забие :)


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


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


Чет Май 03, 2007 7:45 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

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


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

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Не едва ли е от това, а ти като запазвасх регистрит после вузстановиавасх ли ги ? Не съм ти гледал още кода, след това сваляш ли флага на прекъсването, това тряба да го правиш ръчно.


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

Регистриран на: Пон Сеп 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
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 28 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

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


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

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