|
Форум РадиоКот :: Просмотр темы - pic12f675 не работают interrupt-on-change
Автор: |
pilot327 [ Сб авг 12, 2017 18:39:49 ] |
Заголовок сообщения: |
pic12f675 не работают interrupt-on-change |
Привет!
на вход 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
|
Автор: |
Родэрик [ Вс авг 13, 2017 00:46:39 ] |
Заголовок сообщения: |
Re: pic12f675 не работают interrupt-on-change |
При появлении в main прерывания запрещены (GIE). Читать gpio в коде не надо, поскольку ожидаете прерывания по изменению на ноге. Из wait_interrupt выбраться будет не просто, поскольку STATUS,3 всегда будет "1". Копируете в EEDATA без смены банка. В прерываниях если GPIO,1=0 выходите без очистки флага источника (GPIF)
И хорошо подумайте над алгоритмом записи в eeprom, с таким подходом износить его можно за пару минут.
|
Автор: |
Zhuk72 [ Вс авг 13, 2017 10:38:02 ] |
Заголовок сообщения: |
Re: pic12f675 не работают interrupt-on-change |
И еще один момент:
Цитата: 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 не пройдет.
|
Автор: |
Родэрик [ Вс авг 13, 2017 11:09:08 ] |
Заголовок сообщения: |
Re: pic12f675 не работают interrupt-on-change |
Zhuk72 Мне кажется этого "btfsc GPIO,1" достаточно, чтобы покончить с мисматч кондишн.
Думаю в данном случае ещё можно напомнить тс про дребезг контактов.
|
Автор: |
Zhuk72 [ Вс авг 13, 2017 13:29:15 ] |
Заголовок сообщения: |
Re: pic12f675 не работают interrupt-on-change |
Это еще под вопросом. А вот movf GPIO, f и последующий bcf INTCOM, GPIF точно сработают.
|
Автор: |
pilot327 [ Вт авг 22, 2017 14:49:39 ] |
Заголовок сообщения: |
Re: pic12f675 не работают interrupt-on-change |
[Родерик и все остальные,
Спасибо за ответ! Прошу прощения за позднюю реакцию -- нет возможности запротеусить и вообще подойти к компу сейчас. В близжайшую неделю все рекомендации проверю и отпишу о результатах!
Из wait_interrupt выбраться будет не просто, поскольку STATUS,3 всегда будет "1".
Почему будет всегда 1? В прерывании мы в STSRT_FLAG мы копируем число не ноль. В wait_interupt мы проверяем, равен ли нулю Z при вставке регистра в самое себя. Или не так?
|
Автор: |
Родэрик [ Вт авг 22, 2017 17:34:03 ] |
Заголовок сообщения: |
Re: pic12f675 не работают interrupt-on-change |
... Почему будет всегда 1? ... Потому что это _PD Z - это 2-ой бит
|
Автор: |
Zhuk72 [ Ср авг 23, 2017 06:53:03 ] |
Заголовок сообщения: |
Re: pic12f675 не работают interrupt-on-change |
Поэтому всегда нужно оперировать именами битов, а не их позицией. Так и с программой разбираться проще, и не ошибёшься.
|
Страница 1 из 1 |
Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|
|