реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> PIC16F84: Не срабатывает прерывание по заднему фронту на RB0/INT?
Dimchansky
сообщение Mar 27 2007, 13:13
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 10-07-05
Пользователь №: 6 685



Есть программа для PIC16F84, которая работает в Proteus и не пашет на практике.
Прерывание на RB0/INT по заднему фронту срабатывает только один раз.
Для теста вырезал код и переделал его немного.
На RB0/INT меняются уровни, по заднему фронту должны изменится на противоположное состояние уровни на RA0 и RB7. Я решил воспользоваться аппаратным прерыванием для этого (хотя програмная эмуляция того же самого работает на ура).
Чтобы было понятно, делаю вырезку кода на C, там много лишнего, но сути, надеюсь, не меняет..
Код
#include <pic.h>

// Setup the configuration word
#if defined (_16F84)
#warning PIC16F84 selected
__CONFIG(WDTDIS & XT & UNPROTECT); // 0x3FF9 for PIC16F84
#else
#error Unsupported PICmicro MCU selected
#endif

static volatile bit KEYPAD_DATA          @ PORTBIT(PORTA, 0);
static volatile bit KEYPAD_INT           @ PORTBIT(PORTB, 7);
static volatile bit KEYPAD_CLK           @ PORTBIT(PORTB, 0);
static volatile bit WORKINGBIT           @ PORTBIT(PORTB, 1);

//  Setup TMR0 to interrupt Mainline once every ~500 usecs
#define XTAL   (10000000)  // 10 MHZ
#define PRE    (8)         // prescaler
#define INT_HZ (2000)      // interrupt freq. is 2KHz
#define DIVIDE ((2*XTAL/4/PRE/INT_HZ+1)/2) // division ratio - must be < 256

#define KEYS_SAMPLING         (2*5)    // 5 ms
#define KEYS_PRE_REPEAT       (2*500)  // 500 ms
#define KEYS_REPEAT           (2*30)   // 30 ms
#define CONNECTION_TIMEOUT    (2*1)    // 1 ms
#define TIME_BEFORE_RECONNECT (2*1)    // 1 ms

#define MATRIXKEYPAD_ROWS      (3)

#if   PRE == 256
#define SET_PRESCALER { PS2 = 1; PS1 = 1; PS0 = 1; }
#elif PRE == 128
#define SET_PRESCALER { PS2 = 1; PS1 = 1; PS0 = 0; }
#elif PRE == 64
#define SET_PRESCALER { PS2 = 1; PS1 = 0; PS0 = 1; }
#elif PRE == 32
#define SET_PRESCALER { PS2 = 1; PS1 = 0; PS0 = 0; }
#elif PRE == 16
#define SET_PRESCALER { PS2 = 0; PS1 = 1; PS0 = 1; }
#elif PRE == 8
#define SET_PRESCALER { PS2 = 0; PS1 = 1; PS0 = 0; }
#elif PRE == 4
#define SET_PRESCALER { PS2 = 0; PS1 = 0; PS0 = 1; }
#elif PRE == 2
#define SET_PRESCALER { PS2 = 0; PS1 = 0; PS0 = 0; }
#else
#error Bad prescaler value.
#endif

//  Global Variables
volatile unsigned int RTC = 0;  //  Real Time Clock Counter

unsigned int idx = 0;  // index for cycles in interrupt handler
unsigned int keys = 0; // current keys pressed (each bit - is one key)
unsigned int keysLastSaved = 0;
unsigned char keys_column = 0; // keys pressed in current column (each bit - is one key)
unsigned int keysCount = 0;
unsigned int keysRepeat = 1;

volatile unsigned keysLastValid = 0;
volatile bit transferKeyPressing = 0;
volatile bit extInterruptOccured = 0;

//  Interrupt Handler
void interrupt isr(void)
{
  //  TMR0 Interrupt Handler
  if(T0IF)
  {  
    T0IF = 0;  //  Reset Interrupt Flag
    TMR0 = -DIVIDE;
  } // if(T0IF)
  
  //  Put Different Interrupt Handlers here
  if(INTF)
  {
    //  RB0/INT Pin Interrupt
    extInterruptOccured = 1;
    KEYPAD_DATA = !KEYPAD_DATA;
    KEYPAD_INT = !KEYPAD_INT;
    INTF = 0; //  Reset Interrupt
  }
}  //  End Interrupt Handler


//  Mainline
void main(void)       //  Template Mainline
{
//  unsigned char i;

  INTCON = 0;   // purpose of disabling the interrupts.

  RBPU = 0;     // enable internal pullups on PORTB
  PORTB = 0xFF; //
  TRISB = 0b00000001; // RB0 - inputs, RB1..RB7 - outputs

  PORTA = 0xFF;
  TRISA = 0b00011110; // RA0 - outputs, RA1-RA4 - inputs

  TMR0 = 0;     // Reset the TMR0 counter
  TMR0 = -DIVIDE;
  T0CS = 0;     // Enable timer to get the input from internal counter XTAL/4
  PSA = 0;     // Enable prescaler to divide the frequency
  SET_PRESCALER;
  T0IF = 0;     // Make Sure NO Pending Interrupt
  T0IE = 1;     // TMR0 overflow interrupt enable bit (1: enable TMR0)

  INTEDG = 0;   // Interrupt on Falling Edge of RB0
  INTF = 0;     // Make Sure NO Pending Interrupt
  INTE = 1;     // Enable RBO/INT Pin Interrupts

  GIE = 1;     // global interrupt enable bit (1: enable all)

  KEYPAD_DATA = KEYPAD_INT = KEYPAD_CLK;

  while(1)
  {
    WORKINGBIT = !WORKINGBIT;
  } // endwhile
} //  End of Mainline

собирал так:
picc -16F84 -ASMLIST -O -Zg -Etest.err -Otest.hex main.c
получил test.hex:
Код
:10000000830100308A001D288C0003088301A000B2
:100010000B1D0E280B1164308312810083128B1C80
:1000200018280D1401308506803086068B10831247
:10003000200883008C0E0C0E09000E3084001B304B
:1000400033200D3084000E303320830103309F00B5
:10005000FE309E001B3084001D3037208301CF2BE3
:1000600004068001840A0406031D302800349D0024
:1000700042208000840A04081D0603190034382831
:1000800083129E009F1B4B281F088A001E089E0A91
:1000900003199F0A820083131F1883171E089E0AE4
:0600A000840000080800C6
:10079E008B0183168113FF3083128600013083167E
:1007AE008600FF30831285001E308316850083126B
:1007BE00810164308100831681128111011181142F
:1007CE0001100B118B1601138B100B168B17831246
:1007DE00061CF32B8617F42B86138312861FF92B18
:1007EE000514FA2B0510831202308606FA2B0134FB
:0207FE000034C5
:02400E00F93F78
:00000001FF


На практике прерывание происходит ровно один раз. Потом ничего не меняется.
В Proteus всё работает, как задумывалось.
За нахождение граблей заранее благодарю.
Go to the top of the page
 
+Quote Post
Kolia
сообщение Mar 27 2007, 17:23
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762



Дорый день.

Цитата
На практике прерывание происходит ровно один раз. Потом ничего не меняется.


В datashet написано
Цитата
Flag bit INTF
must be cleared in software via the Interrupt Service
Routine before re-enabling this interrupt.


Попробуйте вместо
Цитата
if(INTF)
{
// RB0/INT Pin Interrupt
extInterruptOccured = 1;
KEYPAD_DATA = !KEYPAD_DATA;
KEYPAD_INT = !KEYPAD_INT;
INTF = 0; // Reset Interrupt
}


код
Код
if(INTF)
  {
    //  RB0/INT Pin Interrupt
    extInterruptOccured = 1;
    KEYPAD_DATA = !KEYPAD_DATA;
    KEYPAD_INT = !KEYPAD_INT;
    INTF = 0; //  Reset Interrupt
    INTE = 0;
    INTE = 1;
  }


Сообщение отредактировал Kolia - Mar 27 2007, 17:25
Go to the top of the page
 
+Quote Post
Dimchansky
сообщение Mar 27 2007, 18:20
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 10-07-05
Пользователь №: 6 685



Цитата(Kolia @ Mar 27 2007, 16:23) *
Попробуйте вместо
код
Код
if(INTF)
  {
    //  RB0/INT Pin Interrupt
    extInterruptOccured = 1;
    KEYPAD_DATA = !KEYPAD_DATA;
    KEYPAD_INT = !KEYPAD_INT;
    INTF = 0; //  Reset Interrupt
    INTE = 0;
    INTE = 1;
  }

Попробую конечно, но по datasheet нужно обнулять только INTF и это же я вижу во многих примерах. Т.е. код
Код
INTE=0;
INTE=1;
в обработчике прерывания смахивает на какой-то хак.
Сдаётся мне, что у меня что-то с сигналами на RB0/INT, может там вообще в третье состояние всё уходит.. cranky.gif
Go to the top of the page
 
+Quote Post
Algol
сообщение Mar 27 2007, 18:55
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 140
Регистрация: 7-04-05
Из: Россия, Владимир
Пользователь №: 3 941



Возможно у вас ошибка именно при выходе из прерывания. Например, при выходе из обработчика прерываний маскируются все прерывания. Посмотрите внимательнее асм. файл, или лучше листинг сюда киньте.
У меня вроде были пробемы, когда PICC8.02 на выходе обработчика прерываний ставил команду RETURN, вместо RETFIE, правил след. образом:

#define RETFIE() asm("retfie")

void interrupt int_main (void)
{
if (INTF) {
//.......
}
RETFIE();
}

Также в качестве отладки, можно диодиком поморгать при входе и выходе из прерываний. Должно проеснить картину.
Go to the top of the page
 
+Quote Post
Dimchansky
сообщение Mar 28 2007, 10:25
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 10-07-05
Пользователь №: 6 685



Цитата(Algol @ Mar 27 2007, 16:55) *
Возможно у вас ошибка именно при выходе из прерывания. Например, при выходе из обработчика прерываний маскируются все прерывания. Посмотрите внимательнее асм. файл, или лучше листинг сюда киньте.


Кидаю листинг.
Код
     1                               processor    16F84
     2                               opt    pw 79
     3                               psect    __Z44553RS_,global,delta=1
     4                               psect    text0,local,class=CODE,delta=2
     5                               psect    config,global,class=CONFIG,delta=2
     6                               psect    rdata_0,global,class=BANK0,space=1,delta
      +                          =1
     7                               psect    idata_0,global,class=CODE,delta=2
     8                               psect    intcode,global,class=CODE,delta=2
     9                               psect    intsave_0,global,ovrld,class=BANK0,space
      +                          =1,delta=1
    10                               psect    intret,global,class=CODE,delta=2
    11                               psect    intentry,global,class=CODE,delta=2
    12                               psect    intsave,global,class=BANK0,space=1,delta
      +                          =1
    13                               psect    text1,local,class=CODE,delta=2
    14                               psect    text2,local,class=CODE,delta=2
    15                               psect    rbit_0,global,bit,class=BANK0,space=1,de
      +                          lta=1
    16                               psect    rbss_0,global,class=BANK0,space=1,delta=
      +                          1
    17  0000                    
    18  0000                    
    19  0000                    
    20  0000                    
    21  0000                    
    22  0000                    
    23  0000                    
    24  0000                    
    25  0000                    
    26  0000                    
    27                          
    28                               psect    __Z44553RS_
    29  001E                    
    30  001E                     ;#
    31                          
    32                               psect    config
    33  2007  3FF9                   dw    16377;#
    34                          
    35                               psect    rdata_0
    36  001B                     _keysRepeat
    37  001B                         ds    2
    38                          
    39                               psect    idata_0
    40  03FE  3401                   retlw    1
    41  03FF  3400                   retlw    0
    42                          
    43                               psect    intcode
    44  0008                     _isr
    45  0008                     int_func
    46                          ;main.c: 69: if(T0IF)
    47  0008  1D0B                   btfss    11,2
    48  0009  280E                   goto    l2
    49                          ;main.c: 70: {
    50  000A  110B                   bcf    11,2
    51                          ;main.c: 72: TMR0 = -((2*(10000000)/4/(8)/(2000
      +                          )+1)/2);
    52  000B  3064                   movlw    100
    53  000C  1283                   bcf    3,5
    54  000D  0081                   movwf    1;volatile
    55  000E                     l2
    56                          ;main.c: 77: {
    57  000E  1283                   bcf    3,5
    58                          ;main.c: 73: }
    59  000F  1C8B                   btfss    11,1
    60  0010  2818                   goto    L1
    61  0011  140D                   bsf    _extInterruptOccured/(0+8),_extInterruptOc
      +                          cured& (0+7)
    62                          ;main.c: 80: KEYPAD_DATA = !KEYPAD_DATA;
    63  0012  3001                   movlw    1
    64  0013  0685                   xorwf    5
    65                          ;main.c: 81: KEYPAD_INT = !KEYPAD_INT;
    66  0014  3080                   movlw    128
    67  0015  0686                   xorwf    6
    68                          ;main.c: 82: INTF = 0;
    69  0016  108B                   bcf    11,1
    70                          ;main.c: 83: }
    71  0017  1283                   bcf    3,5
    72  0018                     L1
    73                          
    74                               psect    intsave_0
    75  000C                     saved_w
    76  000C                         ds    1
    77                          
    78                               psect    intret
    79  0018                     int_restore
    80  0018  0820                   movf    saved_status,w
    81  0019  0083                   movwf    3
    82  001A  0E8C                   swapf    saved_w
    83  001B  0E0C                   swapf    saved_w,w
    84  001C  0009                   retfie
    85                          
    86                               psect    intentry
    87  0004                     int_entry
    88  0004  008C                   movwf    saved_w
    89  0005  0803                   movf    3,w
    90  0006  0183                   clrf    3
    91  0007  00A0                   movwf    saved_status
    92                          
    93                               psect    intsave
    94  0020                     saved_status
    95  0020                         ds    1
    96                          
    97                               psect    text1
    98                          ;main.c: 88: void main(void)
    99                          ;main.c: 89: {
   100  03CF                     _main
   101                          ;main.c: 92: INTCON = 0;
   102  03CF  018B                   clrf    11;volatile
   103                          ;main.c: 94: RBPU = 0;
   104  03D0  1683                   bsf    3,5
   105  03D1  1381                   bcf    1,7
   106                          ;main.c: 95: PORTB = 0xFF;
   107  03D2  30FF                   movlw    -1
   108  03D3  1283                   bcf    3,5
   109  03D4  0086                   movwf    6;volatile
   110                          ;main.c: 96: TRISB = 0b00000001;
   111  03D5  3001                   movlw    1
   112  03D6  1683                   bsf    3,5
   113  03D7  0086                   movwf    6;volatile
   114                          ;main.c: 98: PORTA = 0xFF;
   115  03D8  30FF                   movlw    -1
   116  03D9  1283                   bcf    3,5
   117  03DA  0085                   movwf    5;volatile
   118                          ;main.c: 99: TRISA = 0b00011110;
   119  03DB  301E                   movlw    30
   120  03DC  1683                   bsf    3,5
   121  03DD  0085                   movwf    5;volatile
   122                          ;main.c: 101: TMR0 = 0;
   123  03DE  1283                   bcf    3,5
   124  03DF  0181                   clrf    1;volatile
   125                          ;main.c: 102: TMR0 = -((2*(10000000)/4/(8)/(200
      +                          0)+1)/2);
   126  03E0  3064                   movlw    100
   127  03E1  0081                   movwf    1;volatile
   128                          ;main.c: 103: T0CS = 0;
   129  03E2  1683                   bsf    3,5
   130  03E3  1281                   bcf    1,5
   131                          ;main.c: 104: PSA = 0;
   132  03E4  1181                   bcf    1,3
   133                          ;main.c: 105: { PS2 = 0; PS1 = 1; PS0 = 0; };
   134  03E5  1101                   bcf    1,2
   135  03E6  1481                   bsf    1,1
   136  03E7  1001                   bcf    1,0
   137                          ;main.c: 106: T0IF = 0;
   138  03E8  110B                   bcf    11,2
   139                          ;main.c: 107: T0IE = 1;
   140  03E9  168B                   bsf    11,5
   141                          ;main.c: 109: INTEDG = 0;
   142  03EA  1301                   bcf    1,6
   143                          ;main.c: 110: INTF = 0;
   144  03EB  108B                   bcf    11,1
   145                          ;main.c: 111: INTE = 1;
   146  03EC  160B                   bsf    11,4
   147                          ;main.c: 113: GIE = 1;
   148  03ED  178B                   bsf    11,7
   149                          ;main.c: 115: KEYPAD_DATA = KEYPAD_INT = KEYPAD
      +                          _CLK;
   150  03EE  1283                   bcf    3,5
   151  03EF  1C06                   btfss    6,0
   152  03F0  2BF3                   goto    u30
   153  03F1  1786                   bsf    6,7
   154  03F2  2BF4                   goto    u44
   155  03F3                     u30
   156  03F3  1386                   bcf    6,7
   157  03F4                     u44
   158  03F4  1283                   bcf    3,5
   159  03F5  1F86                   btfss    6,7
   160  03F6  2BF9                   goto    u40
   161  03F7  1405                   bsf    5,0
   162  03F8  2BFA                   goto    l6
   163  03F9                     u40
   164  03F9  1005                   bcf    5,0
   165  03FA                     l6
   166                          ;main.c: 117: while(1)
   167                          ;main.c: 118: {
   168  03FA  1283                   bcf    3,5
   169  03FB  3002                   movlw    2
   170  03FC  0686                   xorwf    6
   171                          ;main.c: 120: }
   172  03FD  2BFA                   goto    l6
   173                          
   174                               psect    text2
   175  0000                    
   176  0000                    
   177  0000                    
   178  0000                    
   179  0000                    
   180  0000                    
   181  0000                    
   182  0000                    
   183  0000                    
   184  0000                    
   185  0000                    
   186  0000                    
   187  0000                    
   188  0000                    
   189  0000                    
   190  0000                    
   191  0000                    
   192  0000                    
   193  0000                    
   194  0000                    
   195  0000                    
   196  0000                    
   197  0000                    
   198  0000                    
   199  0000                    
   200  0000                    
   201  0000                    
   202  0000                    
   203  0000                    
   204  0000                    
   205  0000                    
   206  0000                    
   207  0000                    
   208  0000                    
   209  0000                    
   210  0000                    
   211  0000                    
   212  0000                    
   213  0000                    
   214  0000                    
   215  0000                    
   216  0000                    
   217  0000                    
   218  0000                    
   219  0000                    
   220  0000                    
   221  0000                    
   222  0000                    
   223  0000                    
   224  0000                    
   225  0000                    
   226  0000                    
   227  0000                    
   228  0000                    
   229  0000                    
   230  0000                    
   231  0000                    
   232  0000                    
   233                          
   234                               psect    rbit_0
   235  0068                     _extInterruptOccured
   236  0068                         ds    1
   237  0069                     _transferKeyPressing
   238  0069                         ds    1
   239  0000                    
   240  0000                    
   241  0000                    
   242  0000                    
   243  0000                    
   244  0000                    
   245  0000                    
   246  0000                    
   247  0000                    
   248  0000                    
   249  0000                    
   250  0000                    
   251  0000                    
   252  0000                    
   253  0000                    
   254  0000                    
   255                          
   256                               psect    rbss_0
   257  000E                     _keys_column
   258  000E                         ds    1
   259  000F                     _RTC
   260  000F                         ds    2
   261  0011                     _idx
   262  0011                         ds    2
   263  0013                     _keys
   264  0013                         ds    2
   265  0015                     _keysCount
   266  0015                         ds    2
   267  0017                     _keysLastSaved
   268  0017                         ds    2
   269  0019                     _keysLastValid
   270  0019                         ds    2


HI-TECH Software PICC Macro Assembler V8.05PL2
Symbol Table                                          Tue Mar 27 15:31:45 2007

                  l2 000E                    l6 03FA  
                 u30 03F3                   u40 03F9  
                 u44 03F4        _keysLastSaved 0017  
      _keysLastValid 0019                  _RTC 000F  
                _idx 0011                  _isr 0008  
          _keysCount 0015                 _main 03CF  
               _keys 0013                 start 001D  
             saved_w 000C          _keys_column 000E  
          clear_bit0 0021  _extInterruptOccured 0068  
_transferKeyPressing 0069             int_entry 0004  
         _keysRepeat 001B          saved_status 0020  
              status 0003            copy_bank0 0025  
            int_func 0008           clear_bank0 001D  
         int_restore 0018
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 07:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.04095 секунд с 7
ELECTRONIX ©2004-2016