pic12f675 не работают interrupt-on-change

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
pilot327
Родился
Сообщения: 9
Зарегистрирован: Пн июл 17, 2017 15:51:45

pic12f675 не работают interrupt-on-change

Сообщение pilot327 »

Привет!

на вход GP1 МК_2 подаю 0 либо долго (120мк), либо недолго(13мк).
этот ноль до мк доходит и изменяет напряжение на его ноге (запечетлено на рис.1)
Далее по плану срабатывает прерывание по изменению уровня на ноге, в зависимости от фронта в иср коде либо запускается таймер, либо читается с него значение (фронт определяем по рег. START_FLAG)
Далее с этим числом другие плюхи всякие творятся(не об них речь)..

Но прерывание не срабатывает => в иср код не заходит => не знаем сколько натикало => всяких плюх не будет и всё насмарку
Вроде все флаги очистила, разрешения дала.

Подскажите, в чём дело
Изображение
рис.1

Код: Выделить всё

 list	p=12f675
     #include <p12f675.inc> 
    __CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDTE_OFF & _INTRC_OSC_NOCLKOUT
    
W		equ		    0
F		equ		    1
varT		equ		    20h		
varTMR0_1	equ		    21h		
W_temp		equ		    22h
STATUS_temp	equ		    23h
TMR0_time	equ		    24h
time_on_TMR0	equ		    25h	
START_FLAG	equ		    26h
	
	
		org 0x0000
		goto INIT
		
		
;...............
;...............
		org 0x0004
		
		movwf       W_temp          ;saving key register values
		swapf       STATUS,W
		clrf        STATUS
		movwf       STATUS_temp
					    
					    
		;interrupt actions
		
		bcf	    STATUS,RP0
		btfsc	    GPIO,1		;LOW lvl on GPIO.1
		goto	    What_time_on_TMR0	;NO   => HIGH lvl => it was LOW lvl => end of pressed
						;YES  => it was HIGH lvl => START of pressed
		clrf	    TMR0
		clrf	    START_FLAG
		goto	    escape
		
		
What_time_on_TMR0		
		MOVF	    TMR0,W
		MOVWF	    time_on_TMR0
		clrf	    TMR0
		bcf	    INTCON,GPIF
		
		MOVWF	    START_FLAG
		
		goto	    escape
		
					
escape		swapf       STATUS_temp,W  
		movwf       STATUS
		swapf       W_temp,F
		swapf       W_temp,W
		retfie    		
			
		
;...............
;...............	
		
;===INIT=========
INIT	
	
	bsf	STATUS,RP0
	MOVLW	b'11111111'
	MOVWF	TRISIO		;all ports as inputs
	
	;==SET GP<5:0> to Digital IO
	bcf	STATUS,RP0;BANK 0
	clrf	GPIO		;LOW lvl http://avr.ru/beginer/understand/1wire ????????..... so to press data bus DO GPIO.1 as OUTPUT!!!
	MOVLW	H'1f'		;Set GP<5:0> to
	MOVWF	CMCON		    ;digital IO
	bsf	GPIO,0
	
	bsf	STATUS,RP0;BANK 1
	CLRF	ANSEL		;Digital I/O
	bsf	STATUS,RP0
	MOVLW	b'11111110'
	MOVWF	TRISIO		;all ports as inputs.  GP0 as output
	bsf	TRISIO,0
	;==
	
	
	bsf	    INTCON,T0IF
	bcf	    INTCON,T0IE
	bcf	    INTCON,GIE
	
	;
	banksel	OPTION_REG
	MOVLW	b'11010000'	; ~, ~, CLKOUT, ~, TMR0, prescaller 2
	MOVWF	OPTION_REG
	
	BCF	STATUS,RP0

	clrf	START_FLAG
	
    ;==Initializing CHANGE INTERRUPT
	;enable	change interrupt on GPIO.1
	MOVLW	    b'00000010'
	bsf	    STATUS,RP0
	MOVWF	    IOC
	;==clr	change interrupt flug
	bcf	    INTCON,GPIF
	;==enable Change interrut
	bsf	    INTCON,GPIE
	
    ;====Initializing CHANGE INTERRUPT END
	
	
		goto main
;==========
	
		
		
;============		
main	    bcf		STATUS,RP0						   
	    MOVF	GPIO,w	    ;reading GPIO
wait_interrupt
	    ;MOVF	GPIO,w
	    MOVF	START_FLAG,F
	    btfsc	STATUS,3    ;Z=0? flag <> 0 ?
	    goto wait_interrupt	    ;Z=1, flag	= 0
				    ;Z=0, flag	<> 0
	    
	    MOVF    time_on_TMR0,W
	    MOVWF   EEDATA
	    MOVLW   00h
	    MOVWF   EEADR
	    
	    
	    BSF	    STATUS,RP0	    ;Bank 1
	    BSF	    EECON1,WREN	    ;Enable write
	    BCF	    INTCON,GIE	    ;Disable INTs
	    MOVLW   55h		    ;Unlock write
	    MOVWF   EECON2	    ;
	    MOVLW   H'AA'		    ;
	    MOVWF   EECON2	    ;
	    BSF	    EECON1,WR	    ;Start the write
	    BSF	    INTCON,GIE	    ;Enable INTS
	    
	    goto main
	    
		
	end


Реклама
Аватара пользователя
Родэрик
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы
Контактная информация:

Re: pic12f675 не работают interrupt-on-change

Сообщение Родэрик »

При появлении в main прерывания запрещены (GIE).
Читать gpio в коде не надо, поскольку ожидаете прерывания по изменению на ноге.
Из wait_interrupt выбраться будет не просто, поскольку STATUS,3 всегда будет "1".
Копируете в EEDATA без смены банка.
В прерываниях если GPIO,1=0 выходите без очистки флага источника (GPIF)

И хорошо подумайте над алгоритмом записи в eeprom, с таким подходом износить его можно за пару минут.
Реклама
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: pic12f675 не работают interrupt-on-change

Сообщение Zhuk72 »

И еще один момент:
The user, in the Interrupt Service Routine, can clear the interrupt in the following manner:
a) Any read or write of GPIO. This will end the mismatch condition.
b) Clear the flag bit GPIF.
A mismatch condition will continue to set flag bit GPIF. Reading GPIO will end the mismatch condition and allow flag bit GPIF to be cleared.
Так что просто bcf INTCON, GPIF не пройдет.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
Родэрик
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы
Контактная информация:

Re: pic12f675 не работают interrupt-on-change

Сообщение Родэрик »

Zhuk72
Мне кажется этого "btfsc GPIO,1" достаточно, чтобы покончить с мисматч кондишн.

Думаю в данном случае ещё можно напомнить тс про дребезг контактов.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: pic12f675 не работают interrupt-on-change

Сообщение Zhuk72 »

Это еще под вопросом.
А вот movf GPIO, f и последующий bcf INTCOM, GPIF точно сработают.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Реклама
pilot327
Родился
Сообщения: 9
Зарегистрирован: Пн июл 17, 2017 15:51:45

Re: pic12f675 не работают interrupt-on-change

Сообщение pilot327 »

[Родерик и все остальные,

Спасибо за ответ!
Прошу прощения за позднюю реакцию -- нет возможности запротеусить и вообще подойти к компу сейчас. В близжайшую неделю все рекомендации проверю и отпишу о результатах!

[uquote="Родэрик",url="/forum/viewtopic.php?p=3161262#p3161262"]Из wait_interrupt выбраться будет не просто, поскольку STATUS,3 всегда будет "1".[/uquote]

Почему будет всегда 1?
В прерывании мы в STSRT_FLAG мы копируем число не ноль.
В wait_interupt мы проверяем, равен ли нулю Z при вставке регистра в самое себя. Или не так?
Реклама
Аватара пользователя
Родэрик
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы
Контактная информация:

Re: pic12f675 не работают interrupt-on-change

Сообщение Родэрик »

[uquote="pilot327",url="/forum/viewtopic.php?p=3167757#p3167757"]...
Почему будет всегда 1?
...[/uquote]
Потому что это _PD
Z - это 2-ой бит
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: pic12f675 не работают interrupt-on-change

Сообщение Zhuk72 »

Поэтому всегда нужно оперировать именами битов, а не их позицией. Так и с программой разбираться проще, и не ошибёшься.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Ответить

Вернуться в «PIC»