# Instrucción "GOTO" en CCS



## decoymech (Feb 11, 2010)

Hola, tengo problema con el CCS ya que no estoy muy familiarizado con él, necesito leer los registros de una tarjeta por medio de I2C; desde la PC tengo que enviar un caracter y dependiendo del caracter es el registro que debo leer.

Lo que quiero hacer es por ejemplo, envío una "a" y debo leer el registro con la direccion "0" de la tarjeta I2C, estoy usando la interrupción INT_RDA recibo el caracter y hago un "if", si es "a" debo leer el registro "0", como lo único que tengo que cambiar es la direccion de lectura dependiendo del caracter y todo lo demas es lo mismo quiero llamar a una subrutina algo así como un "GO TO" en ensamblador pero no sé como hacerlo en CCS.

Le agradezco su ayuda de antemano.

PD: Espero me hayan entendido y anexo codigo.


```
#include <16F887.h>
#fuses HS, NOWDT, NOPUT, MCLR, NOPROTECT, NOCPD, NOBROWNOUT, NOIESO, NOFCMEN, LVP, BORV40, NOWRT
#use delay(clock=20000000)
#use i2c(Master, sda=PIN_C4, scl=PIN_C3)                                         //Configuración de I2C
#use RS232(baud=9600, xmit=pin_C6, rcv=pin_C7, bits=8, PARITY=N)                 //Configuración RS232

//Definición de variables//
char ch;
int dato;
long int registro;

#int_rda
rda_service()                                                                    //Servicio de interrupcion por RS232
{
   ch = getchar();
   if(ch=='a')                                                                   //Leer velocidad motor 1
   {
      registro=0;
      dato=read_md23(registro); AQUI ME APARECE EL ERROR 12 UNDEFINED IDENTIFIER -- read_md23
   }
   if(ch=='b')                                                                   //Leer velocidad motor 2
   {
      registro=1;
      //goto
   }
   if(ch=='i')                                                                   //Leer corriente motor 1
   {
      registro=11;
      //goto
   }
   if(ch=='y')                                                                   //Leer corriente motor 2
   {
      registro=12;
      //goto
   }
   if(ch=='s')                                                                   //Leer aceleración
   {
      registro=14;
      //goto
   }
   if(ch=='m')                                                                   //Leer modo tarjeta
   {
      registro=15;
      //goto
   }
   if(ch=='c')                                                                   //Leer dirección de la tarjeta
   {
      registro=16;
      //goto
   }
   if(ch=='A')                                                                   //Escribir velocidad motor 1
   {
      registro=0;
      //goto
   }
   if(ch=='B')                                                                   //Escribir velocidad motor 2
   {
      registro=1;
      //goto
   }
   if(ch=='S')                                                                   //Escribir aceleración
   {
      registro=14;
      //goto
   }
   if(ch=='M')                                                                   //Escribir modo tarjeta
   {
      registro=15;
      //goto
   }
   if(ch=='C')                                                                   //Escribir dirección tarjeta
   {
      registro=16;
      //goto
   }
}

void write_md23(long int registro, BYTE data)                                    //Instrucción para escribir en la tarjeta MD23
{
   short int status;                                                             //Variable status
   i2c_start();                                                                  //Inicializa la transmisión
   i2c_write(0xB0);                                                              //Escrie la palabra de control
                                                                                 //(dirección 0h + 0 para escritura)
   i2c_write(registro>>16);                                                      //Parte alta del registro a escribir en la MD23
   i2c_write(registro);                                                          //Parte baja del registro a escribir en la MD23
   i2c_write(data);                                                              //Dato a escribir
   i2c_stop();                                                                   //Finaliza la transmision
   i2c_start();                                                                  //Reinicio
   status=i2c_write(0xB0);                                                       //Lectura del bit ACK, para evitar escrituras incorrectas
   while (status==1)                                                             //Espera a que el slave responda
   {
      i2c_start();
      status=i2c_write(0xB0);
   }
}

BYTE read_md23(long int registro)                                                //Instrucción para leer la tarjeta MD23
{
   BYTE data;                                                                    //Variable (dato a leer)
   i2c_start();                                                                  //Inicializa la transmision
   i2c_write(0xB0);                                                              //Escribe la palabra de control
                                                                                 //(dirección 0h + 0 para escritura)
   i2c_write(registro>>8);                                                       //Parte alta del registro a escribir en la MD23
   i2c_write(registro);                                                          //Parte baja del registro a escribir en la MD23
   i2c_start();                                                                  //Reinicio
   i2c_write(0xB1);                                                              //Escribe la palabra de control
                                                                                 //(direccion 0h + 1 para lectura)
   data=i2c_read(0);                                                             //Lectura del dato
   i2c_stop();                                                                   //Finalizacion de la transmision
   return(data);
}

void main()                                                                      //PROGRAMA PRINCIPAL
{
   enable_interrupts(int_rda);                                                   //Habilita interrupción por recepción RS232
   enable_interrupts(global);                                                    //Habilita interrupcion global
   while(1)
   {
      delay_ms(500);
      registro = 0;
      dato=read_md23(registro);
      registro = 1;
      dato=read_md23(registro);
   }
}
```


----------



## El nombre (Feb 11, 2010)

utiliza la intruccion switch() .

Recuerda que el goto no es recomendable usarlo en C´
Lo que haces es llamar a una rutina (como el call).
Saludos


----------



## dragondgold (Feb 11, 2010)

Yo uso las funciones como las subrutinas en ASM:

VOID nombre_de_la_funcion(){
}

El VOID va porque la subrutina no devuelve ningun valor

suerte y saludos...


----------



## StrySG (Feb 12, 2010)

ME parece mucho mejor crear funciones en lugar de subrutinas, cuando usas CCS...

pero me pregunto cómo hacer un GOTO, en lenguaje C, dado que al usar funciones estariamos haciendo algo similar al CALL que se hace en Assembler...

para los que estamos comenzando a utilizar microcontroladores, el código para hacerlo nos sería de gran ayuda.


----------



## decoymech (Feb 16, 2010)

Gracias por las respuestas.
Ya resolvi el problema, lo que hce fue declarar el metodo antes de llamarlo y ya no me genero ningún error.


----------



## lcrs11 (Ene 20, 2015)

Tengo el siguiente código. No sé dónde está mi error porque no realiza el retorno de la función GOTO.
Para demostración puse en la salida del puerto A unos leds y no cambia, ya que debería ir incrementandose de 1 en 1 pero nada, se queda pegado en 2.
Realizando un cálculo manual al parecer no realiza lo que está resaltado en negrita.

```
x1=((int16)numx2*256)+numx1;
               y1=((int16)numy2*256)+numy1;
               
               x0=1378;
               y0=1111;
               
               mecanizar:
               if(x1!=x0){xi=abs(x1-x0);}
               if(y1!=y0){yi=abs(y1-y0);}
               
               if(xi>yi)
               {
                  dx=1;
                  dy=yi/xi;
               }
               if(xi<yi)
               {
                  dx=xi/yi;
                  dy=1;
               }
               if(xi==yi)
               {
                  dx=1;
                  dy=1;
               }
               
               [B]if(x0<x1){x0=x0+dx;}
               if(x0>x1){x0=x0-dx;}
               if(y0<y1){y0=y0+dy;}
               if(y0>y1){y0=y0-dy;}[/B]
               
               bitx=x0%8;   
               bity=y0%8;
               
               output_a(bitx); // aca el valor siempre me sale 2
               delay_ms(600);
               
               if (x0!=x1)
               {
               goto mecanizar;
               }
```
Por si acaso: x1 =2461, y1 = 1111


----------

