Autor Tema: ayuda comunicacion rs232 pic -pc pic 877a en ccs  (Leído 7947 veces)

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

Desconectado kovian

  • PIC10
  • *
  • Mensajes: 1
ayuda comunicacion rs232 pic -pc pic 877a en ccs
« en: 10 de Noviembre de 2013, 14:23:29 »
Hola buenos dias,soy nuevo en este foro y en la programacion de pic en lenguaje c,tengo un problema con un programa y que no puedo hacer que se comunique pic con pc, ya que quiero que mediante la pc mandar un numero de 1 a 3 y segun el numero , encender una salida del pic un led...pero al simularlo no envia nada..al precionar la tecla...este programa me lo pasaron en el trabajo ya hecho pero no funciona...lo hizo otra persona y no funcona y estoy tratando de hecharlo a funcionar...pero tengo dudas de como cacha los valores que le envio de pc...se que con getc se la asigno a una variable pero como los recibe o loas cacho del pc?...envio copia de programa...

#if defined( __PCM__ )
   #include <16f877A.h>
   #fuses HS, NOWDT,NOPROTECT,NOLVP
   #use delay(clock=4000000,RESTART_WDT)
#endif

#include <string.h>

#define SALIDA1 PIN_D0
#define SALIDA2 PIN_D1
#define SALIDA3 PIN_D2
#define SALIDA4 PIN_D3
#define SALIDA5 PIN_D4

//====================PINES DE COMUNICACION==================
//----- PINES PARA COMUNICACION CON EL CONTROL              |
#define RX_EXT PIN_C7                                    // |
#define TX_EXT PIN_C6                                    // |
//===========================================================

// COMANDO A MODULOS


//=================== DECLARACION DE LOS PUERTOS DE COMUNICACION ==================================
#use rs232(baud=4800, xmit=TX_EXT, rcv=RX_EXT, ERRORS, RESTART_WDT)

char buffer[64];
char salida;
int1 datoRS232;

void apagaSalidas()
{
   output_low(SALIDA1);
   output_low(SALIDA2);
   output_low(SALIDA3);
   output_low(SALIDA4);
   output_low(SALIDA5);
}

#INT_RDA
void serial()
{
int i;
   i=0;
   do
   {
      buffer = getc();
      i++;
   }while(buffer[i-1] != 0x0C);
   buffer = '\0';

   disable_interrupts(INT_RDA);
   apagaSalidas();
   //printf("%s",buffer);
   datoRS232 = TRUE;
}

//===============================================================================
// FUNCION main() ***************************************************************
void main() {
int16 tiempo;
char salida;
int i;

   for(i=1;i<=2;i++)
   {
      output_high(SALIDA1);
      delay_ms(160);
      output_low(SALIDA1);
      output_high(SALIDA2);
      delay_ms(160);
      output_low(SALIDA2);
      output_high(SALIDA3);
      delay_ms(160);
      output_low(SALIDA3);
      output_high(SALIDA4);
      delay_ms(160);
      output_low(SALIDA4);
      output_high(SALIDA3);
      delay_ms(160);
      output_low(SALIDA3);
      output_high(SALIDA2);
      delay_ms(160);
      output_low(SALIDA2);
   }
   output_high(SALIDA1);
   delay_ms(160);
   output_low(SALIDA1);

   datoRS232 = FALSE;
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RDA);

   printf("Empaque V1.0 \n\r Listo!");
 

   while(1)
   {
      if(datoRS232 == TRUE)
      {
         salida = 0;
         for(i=0;i<strlen(buffer);i++)
         {
            if(isdigit(buffer)) salida = buffer;
         }

         if(salida >= 0x31 && salida <= 0x35)
         {
            printf("\r\nSalida: %c", salida);
                 if(salida == '1' ) output_high(SALIDA1);
            else if(salida == '2' ) output_high(SALIDA2);
            else if(salida == '3' ) output_high(SALIDA3);
            else if(salida == '4' ) output_high(SALIDA4);
            else if(salida == '5' ) output_high(SALIDA5);
         }
         else
         {
            printf("\r\nValor no valido");
         }
         datoRS232 = FALSE;
         tiempo = 0;
         delay_ms(2000);

         while(kbhit())
         {
            salida = getc();
         }
         for(i=0;i<64;i++)
         {
            buffer = '\0';
         }
         enable_interrupts(INT_RDA);
      }

      if(tiempo < 30000)
      {
         tiempo++;
      }
      else if(tiempo == 30000)
      {
         tiempo++;
         apagaSalidas();
      }
      delay_ms(10);

   }
}


Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #1 en: 11 de Noviembre de 2013, 03:06:25 »
Hola kovain

Bueno no se si esto te ayude pero.... a simple vista en tus fuses de configuracion yo observo algunos detalles, yo realizaria los siguientes cambios para empezar:

1.- declaras el bit de configuracion HS que es para trabajar con frecuencias mayores a 4Mhz, por cual yo lo cambiaria a XT
2.- usas NOWDT y sin embargo colocas RESTART_WDT, que segun leo en la ayuda de CCS, se usa cuando habilitamos el WDT, yo quitaria la instruccion RESTART_WDT, tanto en #use delay, como en #use rs232

eso en caso de que desees usar ese codigo, yo realmente considero que en muchos casos es mejor empezar de 0, que querer adivinar que hizo alguien mas, ese es mi muy particular punto de vista, consideralo y si deseas empezar de 0, no creo que sea tan complicado por lo que pones que quieres que haga tu programa y seguro encontraras mucha ayuda en este genial foro.

otra sugerencia, lee en los post que estan en el foro lo de la recepcion de los datos, o revisa la ayuda de CCS que vienen algunos ejemplos.

saludos y suerte.

Nunca se deja de aprender

Desconectado diegocipo

  • PIC10
  • *
  • Mensajes: 23
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #2 en: 10 de Enero de 2014, 16:27:40 »
Pregunta:

yo estoy utilizando este código:

 #include <16f887.h>

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #use delay(clock=4000000)
 #use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7, bits=8, parity=N)
 #BYTE TRISA=0x85
 #BYTE PORTA=0x05
 #BYTE TRISB=0x86
 #BYTE PORTB=0x06
 #BYTE TRISE=0x89
 #BYTE PORTE=0x09
#BYTE ANSEL=0x188
#define LED PIN_C0
#define SW1 PIN_B0
#define SW2 PIN_B1
#define LED1 PIN_C1
char recep;

#int_RDA
void  RDA_isr(void)
{
recep=getchar();
output_high(LED);
delay_ms(300);
printf("llego");
output_low(LED);
delay_ms(300);
if(recep==0x61){
output_high(LED1);
delay_ms(1000);
puts("recibido");
}
else {
output_low(LED1);
delay_ms(50);
}

disable_interrupts(global);
delay_ms(30);
putc(recep);
enable_interrupts(global);
}
 void main(void)
{
int valor;
valor=0;
TRISB=0xFF;
ANSEL=0x00;
setup_oscillator(OSC_4MHZ);
setup_adc_ports(NO_ANALOGS); //Selecciona terminales
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
while(1)// ciclo for infinito
if(input(SW1))   //lee entrada
{
output_high(LED);
delay_ms(1000);
output_high(LED1);
delay_ms(2000);
}
else {
output_low(LED);
delay_ms(300);
output_low(LED1);
delay_ms(300);
}


}

cuando lo simulo anda de 10 en el proteus, pero cuando lo pruebo en el circuito con el SIOW de CCS no hace la parte del if de la comunicación rs232, o sea, yo quiero que compare la letra que envio y si es correcta que encienda un led y responda con un "recibido" pero no lo hace, y en la simulacion si, es más los puts y los printf no los veo con el SIOW, cual puede ser el problema?
Saludos

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #3 en: 10 de Enero de 2014, 17:08:33 »
Creo que el problema es que no estas poniendo fuses para configurar el micro, entonces no le espécificas si usar el cristal interno o el externo, eso podria explicar porque en proteus si funcion y en hardware no
"Nada es imposible, no si puedes imaginarlo"

Desconectado diegocipo

  • PIC10
  • *
  • Mensajes: 23
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #4 en: 10 de Enero de 2014, 17:33:46 »
Ahhhhhh, tenes razón! lo voy a probar y te digo!

Desconectado diegocipo

  • PIC10
  • *
  • Mensajes: 23
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #5 en: 10 de Enero de 2014, 17:44:32 »
No es ese el problema :-( no devuelve nada de lo de printf o puts, si devuelve putc, alguna otra recomendación?

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #6 en: 10 de Enero de 2014, 17:53:47 »
tu while no abarca nada, no le pusiste las llaves, tienes un if inmediatamente despues, tal vez sea eso
"Nada es imposible, no si puedes imaginarlo"

Desconectado diegocipo

  • PIC10
  • *
  • Mensajes: 23
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #7 en: 10 de Enero de 2014, 18:37:37 »
Nop, tampoco es eso!  :( , lo raro es que el putc si lo toma

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #8 en: 10 de Enero de 2014, 18:40:07 »
Nop, tampoco es eso!  :( , lo raro es que el putc si lo toma

Código: C
  1. #int_RDA
  2. void  RDA_isr(void)
  3. {
  4. recep=getchar();
  5. output_high(LED);
  6. delay_ms(300);
  7. printf("llego");
  8. output_low(LED);
  9. delay_ms(300);
  10. if(recep==0x61){
  11. output_high(LED1);
  12. delay_ms(1000);
  13. puts("recibido");
  14. }
  15. else {
  16. output_low(LED1);
  17. delay_ms(50);
  18. }
  19.  
  20. disable_interrupts(global);
  21. delay_ms(30);
  22. putc(recep);
  23. enable_interrupts(global);
  24. }
de esta parte lo unico que te imprime es la variable recep?
« Última modificación: 10 de Enero de 2014, 18:42:28 por rivale »
"Nada es imposible, no si puedes imaginarlo"

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #9 en: 10 de Enero de 2014, 18:45:24 »
como comentario adicional, no debes poner delays o printf dentro de una interrupcion, mejor solo activa una bandera y la verificas dentro del main y ahí imprimes lo que quieras y pones retardos
"Nada es imposible, no si puedes imaginarlo"

Desconectado diegocipo

  • PIC10
  • *
  • Mensajes: 23
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #10 en: 10 de Enero de 2014, 23:03:30 »
Si, lo unico es la variable recep que muestra. Tambien probe lo del printf en el main (antes) y nada, me extraña, modifique la configuracion del puerto com y es lo mismo. Revise y estan iguales los parametros de configurscion del pic y de configuracion del puerto

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #11 en: 11 de Enero de 2014, 20:47:00 »
de que manera estas leyendo los datos, como tienes programada tu hiperterminal
"Nada es imposible, no si puedes imaginarlo"

Desconectado diegocipo

  • PIC10
  • *
  • Mensajes: 23
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #12 en: 13 de Enero de 2014, 16:34:10 »
Estoy usando el SIOW de ccs

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #13 en: 13 de Enero de 2014, 17:12:05 »
porque no intentas usando otra hiperterminal, se me hace muy extraño que el putc si funcione y los otros 2 no lo hagan

podrías probar con la que hizo el amigo labmouse

http://www.todopic.com.ar/foros/index.php?topic=35482.0
"Nada es imposible, no si puedes imaginarlo"

Desconectado diegocipo

  • PIC10
  • *
  • Mensajes: 23
Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
« Respuesta #14 en: 13 de Enero de 2014, 19:23:31 »
yo tambien pienso que puede ser el soft, voy a probar con este y te digo, muchas gracias


 

anything