Uf tremendo gracias pero hay ciertas cosas que no entiendo todabía. No sé si podrías hacerme el favor de responderlas.
Si yo no poní la directiva #INT_RB luego de la variable global "variable" y antes de la función de interrupción no me tomaba la variable como global, es decir, el cambio que se producía en la función interrupción no era posible visualizarla en el main o en la función cuenta(). Como puedo hacer eso? es decir modificar el valor de la variable y mantener esa modificación externamente, ya que al parecer MPLAB no permite trabaajar con punteros y tampoco no sé como pasarselo a esa función.
Ahora el código quedó de la siguiente manera:
Pero sigo teniendo el mismo problema, es raro ya que cuando entra al while(1) asigna las distancias a l1 y a d1 con los valores obtenidos de la espera del eco pero hay veces que se prende el led y queda prendido, de manera que detecta distancias diferentes pero nada se interpone.
Después estás mezclando directivas de PIC C Compiler en XC8:
#INT_RB No es reconocido por el compilador XC8
Y la información de compilación lo indica con otra advertencia:
warning: (107) illegal # directive "INT_RB"
Si yo no poní la directiva #INT_RB luego de la variable global "variable" y antes de la función de interrupción no me tomaba la variable como global, es decir, el cambio que se producía en la función interrupción no era posible visualizarla en el main o en la función cuenta(). Como puedo hacer eso? es decir modificar el valor de la variable y mantener esa modificación externamente, ya que al parecer MPLAB no permite trabaajar con punteros y tampoco no sé como pasarselo a esa función.
Claro es RBIF, lo que pasa es que he cambiado tanto el código que ya no pensaba y decidí pedir ayuda.Ahora vamos al problema principal.
Dices que el eco lo recibes por cambio de estado en RB4, pero la configuración de registros en la rutina de servicio de interrupción, no es correcta.
El bit RBIE del registro INTCON, habilita o deshabilita la interrupción por cambio de estado en el los bits <RB7:RB4>
Pero tú lo estás usando para determinar si se incrementa la variable "variable" (Redundante, pero así la nombraste)
En C, es más simple escribir; variable ++; que variable = variable + 1;
Ahora el código quedó de la siguiente manera:
Código:
#include <xc.h>
// CONFIG
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (Power-up Timer is disabled)
#pragma config CP = OFF // Code Protection bit (Code protection disabled
#define _XTAL_FREQ 3582056
#define SALIDA PORTBbits.RB2
volatile int variable=0;
void interrupt isr(void)
{
INTCONbits.GIE=0;
if(INTCONbits.RBIF)
{
variable++;
}
INTCONbits.GIE=1;
INTCONbits.RBIF=0;
return;
}
int cuenta (void)
{
int i=0;
int c=1;
__delay_us(15);
PORTA=0xFF;
__delay_us(15);
PORTA=0x00;
while(c)
{
i++;
__delay_us(50);
if(variable>0)
{
c=0;
}
}
variable=0;
return (i);
}
void main(void) {
TRISB=0b11110000;
TRISA=0x00;
INTCON=0x98;
OPTION_REG=0x98;
int d1=0;
int l1=0;
d1=cuenta();
l1=d1;
while(1)
{
l1=cuenta();
if(l1!=d1)
{
SALIDA=1;
__delay_ms(1000);
}
variable=0;
}
}
Pero sigo teniendo el mismo problema, es raro ya que cuando entra al while(1) asigna las distancias a l1 y a d1 con los valores obtenidos de la espera del eco pero hay veces que se prende el led y queda prendido, de manera que detecta distancias diferentes pero nada se interpone.
Última edición: