Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

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

Сб авг 12, 2017 18:39:49

Привет!

на вход 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


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

Вс авг 13, 2017 00:46:39

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

И хорошо подумайте над алгоритмом записи в eeprom, с таким подходом износить его можно за пару минут.

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

Вс авг 13, 2017 10:38:02

И еще один момент:
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 не пройдет.

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

Вс авг 13, 2017 11:09:08

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

Думаю в данном случае ещё можно напомнить тс про дребезг контактов.

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

Вс авг 13, 2017 13:29:15

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

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

Вт авг 22, 2017 14:49:39

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

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

Из wait_interrupt выбраться будет не просто, поскольку STATUS,3 всегда будет "1".


Почему будет всегда 1?
В прерывании мы в STSRT_FLAG мы копируем число не ноль.
В wait_interupt мы проверяем, равен ли нулю Z при вставке регистра в самое себя. Или не так?

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

Вт авг 22, 2017 17:34:03

...
Почему будет всегда 1?
...

Потому что это _PD
Z - это 2-ой бит

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

Ср авг 23, 2017 06:53:03

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