Например TDA7294

 Форум РадиоКот • Просмотр темы - pic12f675 не работают interrupt-on-change
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Вс дек 17, 2017 16:44:24



Часовой пояс: UTC + 3 часа [ Летнее время ]


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: pic12f675 не работают interrupt-on-change
СообщениеДобавлено: Сб авг 12, 2017 19:39:49 
Родился

Зарегистрирован: Пн июл 17, 2017 16:51:45
Сообщений: 9
Рейтинг сообщения: 0
Привет!

на вход 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============================      
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 01:46:39 
Открыл глаза
Аватар пользователя

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

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


Вернуться наверх
 Профиль  
 
JLCPCB Prototype, Бесплатная доставка первого заказа + $2 на прототип ПП!

Крупнейший производитель печатных плат в Китае, 290,000+ заказчиков, 8,000+ он-лайн заказов в день.

Цена за 10 плат: $2 за 2-х слойную, $15 за 4-х слойную, $74 за 6-ти слойную.

LCSC Parts: Экономия до 50%, большой выбор компонентов в наличии, отправка заказа в день оплаты.

Не в сети
 Заголовок сообщения: Re: pic12f675 не работают interrupt-on-change
СообщениеДобавлено: Вс авг 13, 2017 11:38:02 
Электрический кот
Аватар пользователя

Карма: 16
Зарегистрирован: Ср янв 29, 2014 09:41:31
Сообщений: 1027
Откуда: Баку
Рейтинг сообщения: 0
И еще один момент:
Цитата:
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 лет смотрел черно-белый телевизор.


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: pic12f675 не работают interrupt-on-change
СообщениеДобавлено: Вс авг 13, 2017 12:09:08 
Открыл глаза
Аватар пользователя

Зарегистрирован: Пт ноя 27, 2015 00:22:35
Сообщений: 44
Рейтинг сообщения: 0
Zhuk72
Мне кажется этого "btfsc GPIO,1" достаточно, чтобы покончить с мисматч кондишн.

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


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: pic12f675 не работают interrupt-on-change
СообщениеДобавлено: Вс авг 13, 2017 14:29:15 
Электрический кот
Аватар пользователя

Карма: 16
Зарегистрирован: Ср янв 29, 2014 09:41:31
Сообщений: 1027
Откуда: Баку
Рейтинг сообщения: 0
Это еще под вопросом.
А вот movf GPIO, f и последующий bcf INTCOM, GPIF точно сработают.

_________________
Каждый имеет право на свое личное ошибочное мнение.

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


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: pic12f675 не работают interrupt-on-change
СообщениеДобавлено: Вт авг 22, 2017 15:49:39 
Родился

Зарегистрирован: Пн июл 17, 2017 16:51:45
Сообщений: 9
Рейтинг сообщения: 0
[Родерик и все остальные,

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

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


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


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: pic12f675 не работают interrupt-on-change
СообщениеДобавлено: Вт авг 22, 2017 18:34:03 
Открыл глаза
Аватар пользователя

Зарегистрирован: Пт ноя 27, 2015 00:22:35
Сообщений: 44
Рейтинг сообщения: 0
...
Почему будет всегда 1?
...

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


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: pic12f675 не работают interrupt-on-change
СообщениеДобавлено: Ср авг 23, 2017 07:53:03 
Электрический кот
Аватар пользователя

Карма: 16
Зарегистрирован: Ср янв 29, 2014 09:41:31
Сообщений: 1027
Откуда: Баку
Рейтинг сообщения: 0
Поэтому всегда нужно оперировать именами битов, а не их позицией. Так и с программой разбираться проще, и не ошибёшься.

_________________
Каждый имеет право на свое личное ошибочное мнение.

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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 



Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y