Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем с комбинация от 2 прекъсвания при pic16f
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=5738
Страница 1 от 1

Автор:  dan [ Пет Апр 25, 2008 7:01 pm ]
Заглавие:  Проблем с комбинация от 2 прекъсвания при pic16f

Здравейте!
Имам следния странен проблем:
Имплементирал съм софуерно предаване и приемане по RS-232 при pic16f684. Когато е разрешено прекъсването при промяна на PORTA, предаването работи без грешка. Когато обаче разреша и прекъсването при падащ фронт на RA2, предаването не сработва.
Предполагам, че проблема идва от неправилно съвместяване на две прекъсвания на един порт. Не мога да си обяся обаче защо става така, при условие, че прекъсването при промяна на състоянието на RA2 не е разрешено.
Ето откъс от конфигурацията на прекъсванията:
Код:
      BCF   OPTION_REG,6;INTERRUPT ON FALLING EDGE

      BSF   INTCON,7
      BSF   INTCON,6
      BSF   INTCON,4
      BSF   INTCON,3


      BSF   IOCA,0;ON-CHANGE INTERRUPT ENABLED
      BSF IOCA,1

И откъс от програмата за обработка на прекъсвания:
Код:
ORG   H'04'
   BCF   INTCON,7;DISABLE GLOBAL INTERRUPTS
   BCF INTCON,3;DISABLE PORTA ON-CHANGE INTRRUPT
   BCF   INTCON,4;DISABLE RA2/INT INTERRUPT

   BTFSC   INTCON,0;INTERRUPT FROM PORTA CHANGE?
   CALL   DETECT_BUTTON
   
   BTFSC   INTCON,1;INTERRUPT FROM RA2/INT?
   CALL   RECEIVE

   BSF INTCON,3;ENABLE PORTA ON-CHANGE INTRRUPT
   BSF   INTCON,4;ENABLE RA2/INT INTERRUPT
   
   RETFIE

Ще бъда много благодарен на съвет или предположение. :)

Автор:  dan [ Чет Май 01, 2008 7:19 pm ]
Заглавие:  Проблема е решен

Това го пиша за ползата на тези, които някога биха се сблъскали с подобен проблем.
Поиграх си малко и забелязах, че когато сложа реда
Код:
      BSF   INTCON,4
в коментар, другото разрешено прекъсване се обработва. А когато махна коментара, въобще не се стига до функцията за обработка на прекъсванията. Това, което ми оправи проблема беше, че вместо всяко прекъсване да го разрешавам със сетване на съответния бит по отделно, целия INTCON го записвам на веднъж. Ето така:
вместо
Код:
      BSF   INTCON,7
      BSF   INTCON,6
      BSF   INTCON,4
      BSF   INTCON,3
Изполвам:
Код:
      MOVLW B'1001100'
      MOVWF INTCON

Програмката вече си работи идеално. Явно това е някакъв бъг за този процесор.

Автор:  plameniv [ Пет Май 02, 2008 12:44 am ]
Заглавие:  Re: Проблема е решен

dan написа:
Това го пиша за ползата на тези, които някога биха се сблъскали с подобен проблем.
Поиграх си малко и забелязах, че когато сложа реда
Код:
      BSF   INTCON,4
в коментар, другото разрешено прекъсване се обработва. А когато махна коментара, въобще не се стига до функцията за обработка на прекъсванията. Това, което ми оправи проблема беше, че вместо всяко прекъсване да го разрешавам със сетване на съответния бит по отделно, целия INTCON го записвам на веднъж. Ето така:
вместо
Код:
      BSF   INTCON,7
      BSF   INTCON,6
      BSF   INTCON,4
      BSF   INTCON,3
Изполвам:
Код:
      MOVLW B'1001100'
      MOVWF INTCON

Програмката вече си работи идеално. Явно това е някакъв бъг за този процесор.

Защо реши че е бъг?
Не си ли се замислял че може да прекъсне докато го обработваш прекъсването ?

Автор:  dan [ Пет Май 02, 2008 2:57 pm ]
Заглавие: 

Ами просто започнах последователно да сетвам един пин на различни места в програмата. И така след няколко опита просто видях, че процесора не продължава нататък след тези команди:
Код:
      BSF   INTCON,7
      BSF   INTCON,6
      BSF   INTCON,4
      BSF   INTCON,3

Автор:  Gogo [ Пет Май 02, 2008 5:43 pm ]
Заглавие: 

Ами просто помисли по написаното от plameniv. С какъвто и да е контролер, по твоя начин все може да го има тоя "бъг".
Освен това, ако този откъс от подпрограмата за обработка на прекъсванията не е откъс, то май "Програмката вече си работи идеално" на магия...

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/