La interrupción externa nunca ocurre pic16f887

0

Estoy intentando conectar el sensor HC-SR04 y LCD16x2 con mi PIC16F887. Escribí el código y todo me parece bien. Luego hice algunas pruebas, primero probé el código en la simulación de Proteus y obtuve algunos errores, pero pensé que tal vez Proteus me está dando errores falsos, así que conecté todo en la placa para probar si era real y, por supuesto, obtuve un error Eso se mostró en Proteus. Revisé el código varias veces y no puedo ver dónde me equivoqué.

Entonces me di cuenta de que la interrupción externa en el puerto RB0 nunca ocurre, porque el programa se atasca en esta línea de código:

timer1 = timer1 + 1;

if(timer1 >= 2 && timer1 <= 400)
{
  sprintf(distance, "%.02d", timer1); 
  setCursor(0,0, "Distance = ");
  setCursor(0, 7, distance);
  LCDputstr(" cm.");
 }
 else
 {
   clearScreen();
   setCursor(0, 3, "Out of range!");
 }

Primero verifica la condición y muestra el mensaje "Fuera de rango", lo cual está bien por un momento, luego me da el nuevo mensaje "Distancia = cm", y pensé que esto funciona, pero yo no. Lo que hace es aumentar en 1 hasta que llega a 400 y no hace nada más. Y al final, simplemente vuelve a mostrar el mensaje "Fuera de rango" cuando el número supera los 400.

Mi pregunta es ¿por qué sucede esto y cómo puedo deshacerme de este error? Publiqué mi código completo a continuación.

#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = OFF 
#pragma config MCLRE = ON
#pragma config CP = OFF 
#pragma config CPD = OFF 
#pragma config BOREN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config LVP = OFF
#pragma config BOR4V = BOR40V 
#pragma config WRT = OFF

#define _XTAL_FREQ 10000000

#include <xc.h>
#include <pic16f887.h>
#include <stdio.h>

#define LCD_DATA_DIR TRISC
#define RS_DIR TRISD0
#define E_DIR TRISD1

#define LCD_DATA PORTC
#define RS PORTDbits.RD0
#define E PORTDbits.RD1

#define TRIG PORTBbits.RB0
#define ECHO PORTBbits.RB1
#define TRIG_DIR TRISB0
#define ECHO_DIR TRISB1

void initLCD();
void sendCommandLCD(char );
void sendCharLCD(char );
void clearScreen();
void LCDputstr(const char *);
void setCursor(char , char , const char *);

int timer1;
int distance[10];


void interrupt InterruptEcho_(void)
{
    if(RBIF == 1)
    {
       RBIE = 0;
       if(ECHO == 1)
       TMR1ON = 1;
       if(ECHO == 0) 
       {
          TMR1ON = 0;
          timer1 = (TMR1L | (TMR1H << 8))/58.82;
       }
     }
     RBIF = 0;
     RBIE = 1;
}

void main(void) 
{ 
  TRIG_DIR = 0;
  ECHO_DIR = 1;
  GIE = 1;  
  RBIF = 0; 
  RBIE = 1;


  setCursor(0, 0, "Hello msg");
  __delay_ms(2000);
  clearScreen();

  TMR1ON = 0;
  T1CON = 0x10; 

  while(1)
  {
    TMR1H = 0;
    TMR1L = 0;

    TRIG = 1;
    __delay_us(10);
    TRIG = 0;

    __delay_ms(100);
    timer1 = timer1 + 1;

    if(timer1 >= 2 && timer1 <= 400)
    {
      sprintf(distance, "%.02d", timer1); 
      setCursor(0,0, "Distance = ");
      setCursor(0, 7, distance);
      LCDputstr(" cm.");
    }
    else
    {
        clearScreen();
        setCursor(0, 3, "Out of range!");
    }
    __delay_ms(400);
  }  
}

void sendCommandLCD(char command)
{
  LCD_DATA = command;
  RS = 0;
  E = 1;
  NOP();
  E = 0;
  __delay_ms(3);
}

void sendCharLCD(char data)
{
  LCD_DATA = data;
  RS = 1;
  E = 1;
  NOP();
  E = 0;
  __delay_ms(1);
}

void initLCD(void)
{
  LCD_DATA_DIR = 0;
  RS_DIR = 0;
  E_DIR = 0; 
  __delay_ms(20);
  sendCommandLCD(0x38); 
  sendCommandLCD(0x01);
  sendCommandLCD(0x0c);
  sendCommandLCD(0x06);
}

void clearScreen()
{
  sendCommandLCD(0x01);
}

void LCDputstr(const char *str)
{
  while((*str) != 0)
    sendCharLCD(*str++);
}

void setCursor(char row, char col, const char *str)
{
  int position = 0;
  if(row < 1)
  {
    position = (0x80) | (col & 0x0f);
    sendCommandLCD(position);
  }
  else
  {
    position = (0xC0) | ((col) & 0x0f);
    sendCommandLCD(position);
  }
  LCDputstr(str);
}
    
pregunta A.F.

0 respuestas

Lea otras preguntas en las etiquetas