2016-02-05 7 views
0

Только что начал изучать микроконтроллеры PIC. По какой-то причине PORTB остается 0x00, и прерывание никогда не возникает.PIC16F84_A Прерывание не работает

;*** COUNTER WITH INTERRUPT *** 
;***** PIC16FA4_A ************* 

ORG  0H 

STATUS EQU 03H 
PORTA EQU 05H 
PORTB EQU 06H 
TRISA EQU 85H 
TRISB EQU 86H 
INTCON EQU 0BH 
COUNT EQU 0CH 
COUNT1 EQU 08H 
COUNT2 EQU 09H 

GOTO MAIN 

;** INTERRUP ROUTINE ** 

ORG  04H 
INCF COUNT,1 
CLRF PORTB ; CLEAR RBO 
MOVLW 0AH 
SUBWF COUNT 
BTFSS STATUS,0 ;TEST FOR CARRY FLAG 
GOTO GO_ON 
GOTO CLEAR 

GO_ON 
BCF  INTCON,1 
RETFIE 

CLEAR 
CLRF COUNT 
BCF  INTCON,1 
RETFIE 
;** END OF INERRUPT ROUTINE ** 

MAIN 
BSF  INTCON,7; GLOBAL INTERRUPT ENABLE 
BSF  INTCON,4; RB0 INTERRUPT ENABLE 
BCF  INTCON,1; CLEAR INTERRUPT FLAG JUST IN CASE IT IS ON 

BSF  STATUS,5 
MOVLW 00H  ;ALL RA PINS AS OUTPUT PINS 
MOVWF TRISA 
MOVLW 01H  ;RB0 PIN AS INPUT PIN 
MOVWF TRISB 
BCF  STATUS,5 

LOOP 
MOVFW COUNT 
MOVWF PORTA ;PUT COUNT IN PORTA 
CALL DELAY ;DELAY 
MOVLW 01H  
MOVWF PORTB ;SET RB0 
;EXPECT PROGRAM CONTROL TO GO TO 04H (ORG) BUT IT DOESN'T 
;ALSO, USING THE WATCH OPTION IN DEBUGGER, PORTB STAYS 0H 
;CAN ANYONE HELP? 

GOTO LOOP 

DELAY 
LOOP1 
DECFSZ COUNT1,1 
GOTO LOOP1 
LOOP2 
DECFSZ COUNT2 
GOTO LOOP2 
RETURN  

END 

Circuit:
enter image description here

+1

Какой эффект вы ожидаете писать порт зарегистрироваться, чтобы иметь после настройки RB0 в качестве входа? Какой фактический сигнал вы используете на штыре? – doynax

+0

@doynax Я хочу подключить кнопку «push» или «switch» к RB0, которую я ожидаю, когда прерывание будет запущено, когда переключатель или кнопка будет 1. Я делаю это программно для целей отладки. –

+0

@doynax, я отредактировал вопрос –

ответ

0

Кажется, что вы хотите, чтобы вызвать программно внешнее прерывание на контакте RB0/INT. Для этого вам нужно установить вывод RB0 в качестве выхода.

Если вы посмотрите на рисунок 4-4 на стр. 17 из PIC16F84A datasheet, вы можете увидеть блок-схему для контактов RB3:RB0. Сигнал RB0/INT подключается непосредственно к аппаратной шине через буфер запуска Шмитта. Это означает, что любой сигнал присутствует на этом контакте, что будет управлять прерыванием.

При установке TRISB0 бит в 1, 3-состояние выходного буфера будет высоким импедансом, а это означает, что единственное, что может управлять RB0/INT сигнал представляет собой внешний электрический сигнал подключен к контакту.

Если вы только что установили бит TRISB0 в 0, логический уровень, который вы пишете на RB0, должен иметь возможность инициировать прерывание.

+0

В попытке программного запуска внешнего прерывания я настраиваю 'TrisB' как вывод. Но когда я устанавливаю 'portB' в' 01H', выполнение программы не переходит в '04H', хотя' RB0' равно 1. –

+0

Вы используете это на симуляторе или на реальном оборудовании? Симулятор, возможно, не был разработан с учетом этого уровня детализации. –

+0

Еще одна вещь, которую я заметил, это то, что вы не сохраняете/не восстанавливаете контекст внутри вашей процедуры прерывания. Если выполнение прервано, например, сразу после инструкции 'BSF STATUS, 5', вы запустите свой ISR, который будет использовать банк 1 вместо банка 0. Вы должны сохранить регистр' STATUS' в начале ISR (например, переместите его в регистр 'W' и восстановите его до' RETFIE'. –

0

Вам необходимо подключить штырек RB0/INT к земле с помощью разомкнутого резистора в вашей цепи, иначе напряжение штифта не будет определено при отпускании кнопки. Вы должны сделать это:

RBO/INT --- Button --- VDD 
     | 
     Resistor (e.g. 10k) 
     | 
     GND 

С помощью этой схемы, у вас есть:

  • Кнопка нажата: RB0 = 1
  • Кнопка выпущен: RB0 = 0

В качестве альтернативы, вы можете подключить кнопку как это:

RBO/INT --- Button --- GND 

Чтобы использовать схему выше, вам необходимо включить внутренние подтягивающие резисторы , очистив бит RBPU в регистре OPTION. Они похожи на внутренние резисторы внутри чипа, соединяющего контакты с VDD, но по умолчанию они отключены. После включения их, вы по существу схема становится похожим на это:

 VDD 
     | 
     Resistor 
     | 
RBO/INT --- Button --- GND 

Вы также можете добавить резистор к вашей схеме вместо использования внутренних. Имейте в виду, что для этих двух последних схем полярность будет обратным, то есть:

  • Кнопка нажата: RB0 = 0
  • Кнопка выпущен: RB0 = 1
+0

В другом примечании, 'CLRF PORTB' в процедуре прерывания не имеет никакого эффекта, поскольку' RB0' настроен как вход. –