Autor Tema: Programa para mover cinta transportadora 16f877a rs232  (Leído 9603 veces)

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

Desconectado qwmnzxpo

  • PIC10
  • *
  • Mensajes: 27
Programa para mover cinta transportadora 16f877a rs232
« en: 14 de Enero de 2008, 19:12:49 »
Hola a todos tengo el siguiente código:

Código: [Seleccionar]
#include <16f877a.h>

#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

unsigned int opcion = 7;

#int_RDA
void RDA_isr() {
opcion = getc();
}

void main()
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

while(true) {
switch (opcion){
case 1:
//Marcha atras velocidad 1
printf("1");
break;
case 2:
//Marcha atras velocidad 2
printf("2");
break;
case 3:
//Marcha atras velocidad 3
printf("3");
break;
case 4:
//Marcha delante velocidad 1
printf("4");
break;
case 5:
//Marcha delante velocidad 2
printf("5");
break;
case 6:
//Marcha delante velocidad 3
printf("6");
break;
case 7:
//PARADO
printf("7");
opcion = 0;
break;
default:
printf(opcion);
break;
} //switch
} //while
}

Lo que quiero es que este enviando datos continuamente. Al principio funciona bien siempre está parado, pero cuando salta la interrupcion deja de enviar datos y me gustaria que sino recive ninguna de las opciones expuestas que mandase codigo recivido.

Un saludo y gracias,

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #1 en: 15 de Enero de 2008, 11:25:38 »
¿Podrías explicarlo mejor? ... está un poco liao.

Desconectado qwmnzxpo

  • PIC10
  • *
  • Mensajes: 27
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #2 en: 15 de Enero de 2008, 15:00:26 »
Si lo voy a explicar mejor.

El programa que he puesto al principio es un programa que esta en el pic. El pic lo tengo montado en una placa con el max232 para poder comunicarlo con el puerto serie.

El programa del pic esta dentro de un while(true), es decir, infinito. Y me gustaria que lo fuese siempre. Cuando el programa inicia el valor es igual a "7" que representa a prado y siempre entra por esa opcion. Cuando le paso un dato para cambiar el valor de "opcion" deberia de saltar la interrupcion coger el valor y continuar en el while. Eso es lo que quiero que haga, pero lo que hace es que salta la interrupcion y deja de ejecutarse el programa. Se supone que aunque el dato que lea sea muy incorrecto deberia de mostrarlo continuamente ya que entraria por el default del switch en el programa principal.

Un saludo y gracias,

P.D.: Si se sigue sin entender no dudeis en comunicarmelo por favor.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #3 en: 15 de Enero de 2008, 15:28:52 »
Tén en cuenta que lo que recibes son caracteres y no enteros.

Desconectado qwmnzxpo

  • PIC10
  • *
  • Mensajes: 27
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #4 en: 15 de Enero de 2008, 15:42:21 »
Aunque en tu comentario tines razon respecto que no entrará por el camino que debe, deberia de entrar de todas formas por la rama de default continuamente.

Gracias.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #5 en: 15 de Enero de 2008, 15:57:29 »
Una pregunta ¿tú esto lo has compilado? ¿Seguro que no te dá error en el printf(opcion);?

Desconectado qwmnzxpo

  • PIC10
  • *
  • Mensajes: 27
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #6 en: 15 de Enero de 2008, 16:32:37 »
lo compile con el ccs c en el mplab, daba 0 warnings y 0 errors

De todos modos voy a cambiar esa linea por si acaso.

Desconectado qwmnzxpo

  • PIC10
  • *
  • Mensajes: 27
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #7 en: 15 de Enero de 2008, 16:41:08 »
Ese era el fallo, gracias.

¿Cómo podría hacer para mostrar el valor de opcion?


Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #8 en: 15 de Enero de 2008, 16:50:48 »
Estoy intentando no darte la solución, es muy sencillo ... a ver si lo sacas tú.

Más pistas:

- Si lo que recibes son caracteres (que lo son) opcion lo tendrás que declarar como char

- Si luego quieres tratar los números recibidos como int en el switch pues tendrás que pasarlos previamente a int ¿como?

- Para enviar números ó caracteres con el printf mírate el manual del compilador, allí pone como darles formato usando printf.

Un saludo

Desconectado qwmnzxpo

  • PIC10
  • *
  • Mensajes: 27
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #9 en: 15 de Enero de 2008, 17:44:02 »
Voy avanzando poco a poco en los pasos que me has puesto (de antemano muchas gracias, los dos sabemos que este sistema solo me beneficia a mi)

Respecto al manual de ccs el que he encontrado es este Manual ccs en castellano y auqnue me di de alta en la pagina no me deja descargarlo. ¿sabrias donde podria descargarlo?

Gracias por todo,

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #10 en: 15 de Enero de 2008, 18:03:57 »
No ahí no, ese era nuestro antiguo FORO y ya no funciona.

Tres opciones:

- Abre el Editor de CCS y pulsa en la ayuda (un interrogante a la derecha) , busca el printf en Build in funtions

- Bajate la última versión del manual en .pdf en CCS.com

- También en el FORO había un manual-tutorial

Desconectado qwmnzxpo

  • PIC10
  • *
  • Mensajes: 27
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #11 en: 15 de Enero de 2008, 22:53:26 »
Código: [Seleccionar]
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

unsigned char opcion = '7';

#INT_RDA
void rda_isr() {
opcion = getch();
}

void main()
{
enable_interrupts(INT_RDA); //Activación de la interrupción
enable_interrupts(GLOBAL);  //Necesario para activar la anterior

while(true) {
switch ((int)opcion - 48){
case 1:
//Marcha atras velocidad 1
printf("1");
break;
case 2:
//Marcha atras velocidad 2
printf("2");
break;
case 3:
//Marcha atras velocidad 3
printf("3");
break;
case 4:
//Marcha delante velocidad 1
printf("4");
break;
case 5:
//Marcha delante velocidad 2
printf("5");
break;
case 6:
//Marcha delante velocidad 3
printf("6");
break;
case 7:
//PARADO
printf("7");
break;
default:
printf("%c",opcion);
break;
} //switch
} //while
}

Bueno este es el codigo que por ahora he hecho y la verdad que me funciona a las mil maravillas el envio de datos hacia el PC pero me da la sensacion que no funciona la recepcion de datos, es decir, no salta la interrupcion.

¿Voy bien encaminado?

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #12 en: 15 de Enero de 2008, 23:04:10 »
No veo donde declaras el micro que utilizas...
Te falta el include del pic16f877, que dentro tiene la declaracion de getch... :mrgreen:

Citar
////////////////////////////////////////////////////////////////// Useful defines
#define FALSE 0
#define TRUE 1

#define BYTE int
#define BOOLEAN short int

#define getc getch
#define fgetc getch
#define getchar getch
#define putc putchar
#define fputc putchar
#define fgets gets
#define fputs puts
« Última modificación: 15 de Enero de 2008, 23:06:40 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #13 en: 16 de Enero de 2008, 04:13:35 »
Sí Marcos, arriba lo tiene bien, se le ha olvidado al copiar - pegar ... no tiene importancia.

Muy bien qwm... , ves como sí que eras capaz de sacarlo. Ya casi que lo tienes.

Ahora conforme está, tiene el defecto que nada más arrancar el programa empezará a mandar 7's como loco sin parar y eso no está bien.

Lo que debes hacer para parar la cinta (un 7) o realizar otros movimientos desde el PC (u otro PIC) es mandar desde el PC un 7 (o otros números), que el PIC la pare y luego que te informe que lo ha hecho devolviéndote el 7 (o cualquier otro mensaje). Inicialmente al arrancar el PIC la cinta debe de estar parada para lo cual lo tendrás que hacer desde el main mandando un 0 con una instrucción ¿cual?

Y por último para evitar que se esté investigando contínuamente el switch, debes hacer que solo lo haga cuando reciba un caracter, para lo cual dentro de la interrupción activa una variable (bandera=1) y añade un if antes del switch preguntando si bandera==1 ... borra la bandera una vez entre dentro del if.

Animo que ya lo tienes.

Desconectado qwmnzxpo

  • PIC10
  • *
  • Mensajes: 27
Re: Programa para mover cinta transportadora 16f877a rs232
« Respuesta #14 en: 16 de Enero de 2008, 19:09:36 »
Si me equivoque MGLSOFT voy a poner el codigo ahora que funciona.

Código: [Seleccionar]
#include <16f877a.h>

#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

unsigned char opcion = '7';
int bandera = 1;

#INT_RDA
void rda_isr() {
   opcion = getch();
   bandera = 1;
}

void main()
{
   enable_interrupts(INT_RDA); //Activación de la interrupción
   enable_interrupts(GLOBAL);  //Necesario para activar la anterior
   while(true) {
         if(bandera==1){
switch ((int)opcion - 48){
   case 1:
      //Marcha atras velocidad 1
      printf("1");
      break;
   case 2:
      //Marcha atras velocidad 2
      printf("2");
      break;
   case 3:
      //Marcha atras velocidad 3
      printf("3");
      break;
   case 4:
      //Marcha delante velocidad 1
      printf("4");
      break;
   case 5:
      //Marcha delante velocidad 2
      printf("5");
      break;
   case 6:
       //Marcha delante velocidad 3
       printf("6");
       break;
   case 7:
       //PARADO
      printf("7");
      break;
  default:
     printf("9");
     break;
} //switch
bandera = 0;
          } //if
   } //while
}

pocher muchas gracias, me has enseñado.