Autor Tema: Una ayudita por favor.  (Leído 1608 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Una ayudita por favor.
« en: 05 de Noviembre de 2010, 15:17:56 »
Hola compañero, en primer lugar una saludo a todos y agradecer de antemano vuestra ayuda, estoy realizando un pequeño proyecto para reprogramar una tajeta receptora de mando a distancia, por lo que me tengo que adaptar el programa al hardware real que hay en la tarjeta, en fin, que aunque se encuentre un metodo mejor no puedo usar otros pines a los mostrados, tengo bastante avanzado el programa pero estoy "enrocado" en un punto que explico mas abajo en el programa y es que no se como volver a la función main desde otra función sin que la función main haya sido la de llamada a esta, en la ultima linea del codigo lo explico, gracias
#include <16F877.h>
#device adc=8
#FUSES NOWDT                      //Watch Dog Timer
#FUSES XT                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES RESERVED                 //Used to set the reserved FUSE bits
#use delay(clock=4000000)
#Byte PortA = 0x05              // Dirección del puerto A
#Byte PortB = 0x06              // Dirección del puerto B
#Byte PortC = 0x07              // Dirección del puerto C
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#zero_ram
int lectura();//funcion lectura
void detecta(void);//funcion detectar pulso bajo
void memo(int v);//funcion memo, en v se almacenara el valor de leido una vez pulsado memo
int codigo[3]; // Array de [3]Bytes, 24bits para la lectura del código boton1
void compara(int w);//función compara lectura con datos de eprom para identificar boton
int boton;
int boton1,boton2,boton3; //variable numero boton
int leido;
void main()
{
   set_tris_a(0b00000000);
   set_tris_b(0b00000000);
   set_tris_c(0b00000011);//bit 0 y 1 como entrada el resto salidas
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   set_timer1(0);
while(true)
{
if(bit_test(portc,1)==0) memo(leido);
else detecta();//llamada funcion lectura y almacena en leido el valor de y de la funcion lectura
}
}
void detecta(void)
{
star:
set_timer1(0);
while(bit_test(portc,0)==0) //cuando el pulso es bajo, leemos el timer1 para medir el ancho de pulso
{
if(get_timer1()>8000)//retardo para detectar primer pulso largo bajo del mando
{
leido=lectura();//llamamos funcion lectura y cargamos leido con valor y de lectura Return(y)
compara(leido);//llamamos a compara y le enviamos el valor de leido
}
}
goto star;///aqui vuelve*******************************y entra en bucle
}
int lectura()
{
int x; //para el for-next y lectura del array
int y;//almacenaremos codigo0+codigo1+codigo2
for(x=0;x<21;x++)//leemos 21bits, los 3 que faltan los obviamos con el retardo de 8000 de la linea 59.
{
delay_us(2929);//retardo para conincidir con el flanco tren de impulsos
shift_left(codigo,3,bit_test(portc,0));//registra lo que entra por portc,0 en los 2 bytes del array código
}
y=codigo[0]+codigo[1]+codigo[2];
output_high(pin_c2);
delay_ms(3000);
output_low(pin_c2);
set_timer1(0);
return(y);
}
void memo(int v)
{
boton++;//aunmenta una vez cada vez que entra en la funcion
if(boton>3) boton=1;
switch(boton)//depende las veces que se haya pulsado el boton de grabar se graba en una posición distinta
{
case 1:
write_eeprom(0x00,v);//grabamos leido(asignado a V) en la eprom
break;
case 2:
write_eeprom(0x01,v);
break;
case 3:
write_eeprom(0x02,v);
break;
}
{
output_high(pin_c2);
delay_ms(1000);
output_low(pin_c2);
delay_ms(1000);
output_high(pin_c2);
delay_ms(1000);
output_low(pin_c2);
}
}
void compara(int w)
{
boton1=read_eeprom(0x00);
boton2=read_eeprom(0x01);
boton3=read_eeprom(0x02);
output_low(pin_b0);
output_low(pin_b1);
output_low(pin_b2);
if(w==boton1) output_high(pin_b0);
else output_low((pin_b1,pin_b2));
if(w==boton2) output_high(pin_b1);
else output_low((pin_b0,pin_b2));
if(w==boton3) output_high(pin_b2);
else output_low((pin_b0,pin_b1));
}
//desde este punto me vuelve a la linea marcada con********* que es la siguiente
//a la funcion de llamada y claro me entra en bucle

Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
Re: Una ayudita por favor.
« Respuesta #1 en: 15 de Septiembre de 2011, 07:09:55 »
has probado a hacer la llamada de la funcion main dentro de la funcion void compara(int w) con eso deberia bastar y volver a empezar

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Una ayudita por favor.
« Respuesta #2 en: 15 de Septiembre de 2011, 10:04:26 »
Por favor que el titulo del post sea adecuado al problema. Leer las reglas del foro!
No contesto mensajes privados, las consultas en el foro


 

anything