Autor Tema: Pregunta de interrupciones y cadena de caracteres  (Leído 1809 veces)

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

Desconectado demorales13

  • PIC10
  • *
  • Mensajes: 8
Pregunta de interrupciones y cadena de caracteres
« en: 15 de Marzo de 2006, 10:40:00 »
Alguien me puede ayudar con dos dudas que tengo,

la primera es si se puede hacer algo asi usando el compilador ccs

char texto[];


void mostrar_valores(void)
{
   lcd_putc(texto);
}


void main (void)
{

if (input(PIN_B1))
   texto = "Opcion 1";
if (input(PIN_B2))
   texto = "Opcion 2";

}



lo otro es que el compilador en el mplab me saca los siguientes warnings

>>> Warning 216 "I:PassflexTeclado.c" Line 505(0,1): Interrupts disabled during call to prevent re-entrancy:  (@delay_ms1)

>>> Warning 216 "I:PassflexTeclado.c" Line 505(0,1): Interrupts disabled during call to prevent re-entrancy:  (lcd_send_nibble)
>>> Warning 216 "I:PassflexTeclado.c" Line 505(0,1): Interrupts disabled during call to prevent re-entrancy:  (lcd_send_byte)
>>> Warning 216 "I:PassflexTeclado.c" Line 505(0,1): Interrupts disabled during call to prevent re-entrancy:  (mostrar_estado)
>>> Warning 216 "I:PassflexTeclado.c" Line 505(0,1): Interrupts disabled during call to prevent re-entrancy:  (mostrar_estado)
>>> Warning 216 "I:PassflexTeclado.c" Line 505(0,1): Interrupts disabled during call to prevent re-entrancy:  (mostrar_valores)


cuando se hace una interrupcion creo deshabilitar la bandera para prevenir reentradas pero no estoy seguro que lo este haciendo bien
el pedazo de codigo de interrupcion es el siguiente,

#INT_EXT
void IntRB0()
{
disable_interrupts(int_ext);
      if (!input(PIN_B1)&& !input(PIN_B2) && !input(PIN_B3))   //000
         {
         esperar_no_B0();
         programacion();
         }
      .
      .
      .
      .
      if (input(PIN_B1) && input(PIN_B2)&& !input(PIN_B3))   //110
         {
         esperar_no_B0();
         borrar_lcd();
         velocidad();
         }
enable_interrupts(int_ext);

}


#INT_RB
void IntRB()
{
disable_interrupts(int_rb);
      if (!input(PIN_B6))                              //010
         start();
enable_interrupts(int_rb);
}

Desconectado juanelete

  • PIC12
  • **
  • Mensajes: 74
RE: Pregunta de interrupciones y cadena de caracteres
« Respuesta #1 en: 25 de Marzo de 2006, 02:43:00 »
Hola

En C no existe el tipo de variable "string" como tal, sino que las cadenas se manejan como matrices de caracteres (char).

Para declarar este tipo de variables tienes que asignarles obligatoriamente un tamaño, que ademas tiene que ser 1 mas del tamaño maximo del texto. Esto es asi porque todas las cadenas tienen que terminar con el caracter "", que es el terminador nulo.

por ejemplo:

char texto[10]={"Hola"};

las 10 posiciones de memoria se verian asi:  "H", "o", "l", "a", "",x,x,x,x,x.

El motivo de este terminador nulo es bien sencillo, puesto que la cadena de caracteres que introducimos en la variable pude tener cualquier longitud (hasta el maximo declarado - 1), es la manera de saber donde termina realmente esta cadena. Osea en una intruccion printf por ejemplo, se imprimiran uno a uno todos los caracteres hasta llegar al caracter "".

Como no existe el tipo "string" tampoco se puede hacer esto:

texto = "Opcion 1";

En C existen una serie de funciones ( strcpy, strcat, strcmp...etc) que sirven para operar con cadenas. Lo correcto seria:

strcpy(texto, "Opcion 1") ;

Esta funcion cargara en la variable una cadena ( o el contenido de otra variable)

Tu ejemplo quedaria asi:

char texto[10];

void mostrar_valores(void) {
      lcd_putc(texto);
}


void main (void) {
      if (input(PIN_B1)) strcpy(texto, "Opcion 1");
      if (input(PIN_B2)) strcpy(texto, "Opcion 2");
}

En cuanto al otro problema con las interrupciones, no es necesario utilizar disable_interrupts() al entrar en una interrupcion, ya se ocupa el compilador de deshabilitar la interrupcion y de volver a habilitarla cuando sales de la funcion que maneja dicha interrupcion.

Y precisamente los warning te estan indicando eso, que se han desabilitado las interrupciones durante la llamada a la funcion de interrupcion, para prevenir que se produzca una segunda interrupcion ( lo cual es correcto ). Creo que el aviso es simplemente para indicarte esto y que no se puede producir otra interrupcion hasta que no salgas de esta.

Espero haberte ayudado en algo...

Saludos ;-)

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Pregunta de interrupciones y cadena de caracteres
« Respuesta #2 en: 03 de Marzo de 2010, 13:02:58 »
Citar
#INT_RB
void IntRB()
{
disable_interrupts(int_rb);
      if (!input(PIN_B6))                              //010
         start();
enable_interrupts(int_rb);
}


aqui esta deshabilitando la interrupcion sobre la cual se encuentra y despues la habilita, esto no tiene logica pues mientras se encuantra dentro de dicha rutina no se produce ninguna otra interrupcion. mmm que es lo que puede pasar con las intrucciones que le siguen despues que deshabilita la interrupcion sobre la cual se encuentra?.
mmm supongo que se ejecuta normalmente. y no pasa nada pues al final esta volviendo a habilitar la interrupcion.