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

Прекъсване от RB0 на 16F873А
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=6549
Страница 1 от 1

Автор:  VladoG [ Пет Фев 13, 2009 10:38 pm ]
Заглавие:  Прекъсване от RB0 на 16F873А

Здравейте,

Нов съм във форума.
Правя и първи стъпки в програмирането.

Та проблема ми е следния:
Ползвам прекъсване от RB0. Поставил съм бутон. Първото прекъсване работи. Второ няма.
Преди излизане от програмата за обслужване на прекъсването нулирам INTCON,1.

Необходимо ли е да се прави още нещо?

Автор:  bobyper [ Пет Фев 13, 2009 11:01 pm ]
Заглавие: 

така едва ли някой ще помогне. Дай малко код да видиме, какво става в прекъсването

Автор:  VladoG [ Пет Фев 13, 2009 11:08 pm ]
Заглавие: 

Подпрограмата за обслужване на прекъсването:

org 0x04
INTR
movwf W_Temp ; Save W register
swapf STATUS,W ; Swap status to be saved into W
movwf STATUS_Temp ; Save STATUS register
movfw PCLATH
movwf PCLATH_Temp ; Save PCLATH

goto interupt

banksel INTCON
bcf INTCON,1 ; INTCON,INTF


INTX
movfw PCLATH_Temp
movwf PCLATH ; Restore PCLATH
swapf STATUS_Temp,W
movwf STATUS ; Restore STATUS register - restores bank
swapf W_Temp,F
swapf W_Temp,W ; Restore W register
retfie

И инициализациите на двата регистъра:

banksel INTCON
movlw B'11010000'
movwf INTCON
nop

banksel OPTION_REG
movlw B'10000000'
movwf OPTION_REG

Автор:  thegza [ Съб Фев 14, 2009 12:41 am ]
Заглавие: 

Струва ми се, че не смъкваш флага за прекъсването.

Автор:  bobyper [ Съб Фев 14, 2009 10:34 pm ]
Заглавие: 

Прексъсването не е наред с тези пипания по PCLATH

Това е достатъчно
Код:
                movwf   w_temp            ; save off current W register contents
      swapf   STATUS,w
                movwf   status_temp       ; save off contents of STATUS register
;--------------------------------------------------------------
      bcf   INTCON,RBIF   ; clear interrupt flag
      
              тук пишеш кода за прекъсването


;--------------------------------------------------------------
                swapf    status_temp,w     ; retrieve copy of STATUS register
                movwf   STATUS            ; restore pre-isr STATUS register contents
                swapf   w_temp,f
                swapf   w_temp,w          ; restore pre-isr W register contents
                retfie                    ; return from interrupt


Ама защо не ползваш някое C вместо assempler

Автор:  Popeye [ Нед Фев 15, 2009 6:13 pm ]
Заглавие: 

16F873А има една неприятна особеност, мястото на записа на W, STATUS и PCLATH регистрите при входа в обработването на прекъсването зависи от състоянието на бита RP0 в самия STATUS регистър. Тоест, ако W_Temp, STATUS_Temp и PCLATH_Temp са декларирани на адреси примерно 70h, 71h и 72h при RP0 = 0 ще се запишат точно там, обаче ако RP0 = 1 ще се запишат на F0h, F1h и F2h. Ако в прекъсването се променя стойността на RP0 резултатите са непредсказуеми, инструкцията banksel INTCON прави точно това. Тя нулира PR0 и W, STATUS и PCLATH ще се възстановят от адреси 70h, 71h и 72h, незаисимо, че са били записани в F0h, F1h и F2h ако RP0 е бил в 1. Между другото INTCON е достъпен във всички банки, така че banksel INTCON е излишна.
Заради тази особеност никога не съм ползвал PIC16F873A/874A, слагам 876A/877A, декларирам W_Temp, STATUS_Temp и PCLATH_Temp някъде между 70h и 7Fh и ми е мирна главата.

Бих предложил следния код:
; Възстановява STATUS както е бил при влизането в прекъсването
swapf STATUS_Temp,W
movwf STATUS ; Restore STATUS register - restores bank

;Регистрите се четат от банката, в която са били записани
movfw PCLATH_Temp
movwf PCLATH ; Restore PCLATH
swapf STATUS_Temp,W
movwf STATUS ; Restore STATUS register - restores bank
swapf W_Temp,F
swapf W_Temp,W ; Restore W register
retfie

Разбира се, ако W_Temp, STATUS_Temp и PCLATH_Temp са на адреси примерно 70h - 72h , адресите F0h - F2h в банка 1 не трябва да се ползват нито в главната програмат, нито в прекъсването.

Гаранции не давам, все пак никога не съм го проверявал :roll:

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