Gracias por su interes aqui les envio el programa es de un vehiculo movil que racoge datos de posicion en su recorrido y los almacena como una estructura, cuando queremos recupera algun dato las banderas colocadas se bajan y es como si el programa se inizializara perdiendo el resto de informacion. Espero que me puedan ayudar GRACIAS
#define ON 1
#define OFF 0
#define Derecha 1
#define Izquierda 0
#define Back 1
#define Forward 0
#define __dsPIC30F3013_
#include <p30f3013.h>
#include <ports.h>
/****************************************/
/* FUSES */
/****************************************/
_FOSC( CSW_FSCM_OFF & XT_PLL8);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & PWRT_OFF & MCLR_EN);
/****************************************/
/* DEFINICIONES Y DECLARACIONES */
/****************************************/
#define MIPS 78125 // 20 Cristal De 20M
/******** VARIABLES PARA SENSORES*****/
#define sensor_delantero PORTBbits.RB0
#define ON_OFF PORTBbits.RB3
#define Tris_sensor_delantero TRISBbits.TRISB0
#define Tris_ON_OFF TRISBbits.TRISB3
/******** LEDS *****************************/
#define Led_R PORTBbits.RB7
#define Led_V PORTBbits.RB8
#define Led_ON_OFF PORTBbits.RB6
#define Tris_Led_R TRISBbits.TRISB7
#define Tris_Led_V TRISBbits.TRISB8
#define Tris_Led_ON_OFF TRISBbits.TRISB6
/****************************************/
/* ESTRUCTURAS */
/****************************************/
struct Camino{
int Distancia;
unsigned int Recta;
unsigned char IDdir;
};
volatile struct Camino Matriz[30];
/****************************************/
/* VARIABLES DE ÁMBITO GLOBAL */
/****************************************/
unsigned int i=0;
int CuentoRecta=0X0000;
int CuentoArco=0;
unsigned char Accion_Busqueda=0;
unsigned char Accion_Curva=0;
unsigned char Accion_Freno=0;
unsigned char Accion_Normal=0;
unsigned char SensorFrontal=0;
unsigned char SensorIzquierda=0;
unsigned char SensorDerecha=0;
unsigned char ON_OFF_FLAG=0;
int CaminoNumero=0;
/****************************************/
/* FUNCIONES */
/****************************************/
void LEDS(void);
/****************************************/
/* Interrupcion INT0 */
/****************************************/
void __attribute__((__interrupt__)) _INT0Interrupt(void)
{
SensorDerecha=ON;
IFS0bits.INT0IF = 0;
}
/****************************************/
/* Interrupción INT1 */
/****************************************/
void __attribute__((__interrupt__)) _INT1Interrupt(void)
{
SensorIzquierda=ON;
IFS1bits.INT1IF = 0;
}
/****************************************/
/* Interrupción INT2 */
/****************************************/
void __attribute__((__interrupt__)) _INT2Interrupt(void)
{
CuentoRecta++;
IFS1bits.INT2IF = 0;
}
/****************************************/
/* Configuracion Interrupcion INT0 INT1 */
/****************************************/
void interConfig(void)
{
int config0;
int config1;
int config2;
config0 = FALLING_EDGE_INT &
EXT_INT_PRI_5;
ConfigINT0(config0);
config1 = FALLING_EDGE_INT &
EXT_INT_PRI_6;
ConfigINT1(config1);
config2 = RISING_EDGE_INT &
EXT_INT_PRI_7;
ConfigINT2(config2);
EnableINT0;
EnableINT1;
EnableINT2;
}
/****************************************/
/* Configuracion ENTRADAS SALIDAS */
/****************************************/
int portb_config()
{
ADPCFG = 0XFFFF; // Configura el puerto B como I/O digital
/******** ENTRADAS *****/
Tris_sensor_delantero=1;
Tris_ON_OFF=1;
TRISDbits.TRISD8=1;
TRISDbits.TRISD9=1;
TRISFbits.TRISF6=1;
/******** SALIDAS *****/
Tris_Led_ON_OFF=0;
Tris_Led_R=0;
Tris_Led_V=0;
}
/****************************************/
/* Realiza una pausa de v microsegundos (1us) */
/****************************************/
void DelayUs(unsigned int v) // 20 MIPS
{
while(v != 0){
asm("nop"
;asm("nop"
;
asm("nop"
;asm("nop"
;
asm("nop"
;asm("nop"
;
asm("nop"
;asm("nop"
;
asm("nop"
;asm("nop"
;
asm("nop"
;asm("nop"
;
asm("nop"
;asm("nop"
;
asm("nop"
;asm("nop"
;
v--;
}
}
/****************************************/
/* Realiza una pausa de v milisegundos (1ms) */
/****************************************/
void DelayMs(unsigned int v)
{
while (v != 0 ){
DelayUs(1000);
v--;
}
}
/************************************************/
void Inicializacion(void)
/************************************************/
{
portb_config();
interConfig();
LEDS();
}
/****************************************/
void Guardo_Info (Distancia,Recta, IDdir)
/****************************************/
{
Matriz[CaminoNumero].Distancia=Distancia;
Matriz[CaminoNumero].Recta=Recta;
Matriz[CaminoNumero].IDdir=IDdir;
CaminoNumero++;
}
/****************************************/
void LEDS(void)
/****************************************/
{
if (SensorDerecha)
{
Led_R = ON;
}
else
{
Led_R = OFF;
}
if (SensorIzquierda)
{
Led_V = ON;
}
else
{
Led_V = OFF;
}
Led_ON_OFF = ON_OFF_FLAG;
;
}
/****************************************/
/* PROGRAMA PRINCIPAL */
/****************************************/
int main()
{
Inicializacion();
LEDS();
PP:
if (!ON_OFF_FLAG & !ON_OFF>0)
{
DelayMs(1500);
ON_OFF_FLAG=ON;
LEDS();
}
else if (ON_OFF_FLAG & !ON_OFF>0)
{
DelayMs(1000);
ON_OFF_FLAG=OFF;
LEDS();
}
else if (Accion_Normal & sensor_delantero != 0)
{
Accion_Busqueda= !Accion_Busqueda;
LEDS();
}
else if(SensorDerecha & !Accion_Busqueda & !Accion_Curva){
Guardo_Info (CuentoRecta,0,Derecha);
LEDS();
SensorDerecha =OFF;
}
else if(SensorIzquierda & !Accion_Busqueda & !Accion_Curva){
Guardo_Info (CuentoRecta,0,Izquierda);
LEDS();
SensorIzquierda=OFF;
}
else
{
}
goto PP;
}