Autor Tema: Ayuda con comunicación RS232  (Leído 2473 veces)

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

Desconectado Tomás Godino

  • PIC10
  • *
  • Mensajes: 16
Ayuda con comunicación RS232
« en: 01 de Agosto de 2015, 11:23:34 »
Hola amigos del foro...
hace días que intento comunicar un pic16f873a (maestro)y un 12f629 (esclavo), el pic maestro funciona correctamente pero no logro hacer que el pic esclavo decodifique e interprete el mensaje, el cual se trata de una variable de 8 bits.

espero su ayuda y desde ya muchas gracias.
Tomás Godino

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: Ayuda con comunicación RS232
« Respuesta #1 en: 01 de Agosto de 2015, 11:58:53 »
Comprueba tus programas
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado Tomás Godino

  • PIC10
  • *
  • Mensajes: 16
Re: Ayuda con comunicación RS232
« Respuesta #2 en: 01 de Agosto de 2015, 12:48:33 »
este es el código que llevo echo:

Citar
#include <12f629.h>
#fuses HS,NOWDT
#use delay(clock = 20MHz)
#use rs232(baud=9600, xmit=pin_A0, rcv=pin_A1)

void timer();
int8 dato;

#int_rda
void recepcion_serial (void)
{
   dato = getc();
}

void main (void)
{
   enable_interrupts(int_rda);
   enable_interrupts(global);
   while (true)
   {
    if (dato != 0){
     timer();
     }
   }
}

void timer(){
again:;
output_high(PIN_A2);
if(dato==0){
 output_low(PIN_A2);
 goto fin;
 }
 else{
 dato--;
 delay_ms(1000);
 }
goto again;
fin:;
}
Tomás Godino

Desconectado delirio

  • PIC12
  • **
  • Mensajes: 64
Re: Ayuda con comunicación RS232
« Respuesta #3 en: 01 de Agosto de 2015, 12:55:38 »
Hola Tomás, no soy muy habilidoso con C, pero que intentas hacer con el again y luego con el goto again?

Desconectado Tomás Godino

  • PIC10
  • *
  • Mensajes: 16
Re: Ayuda con comunicación RS232
« Respuesta #4 en: 01 de Agosto de 2015, 13:41:20 »
hola, el again es una etiqueta y el goto again hace que el programa vuelva a ese punto para repetir el ciclo, esa parte ya esta probada y se que funciona correctamente, mi problema es en cuanto a la recepción de datos por el rs232.
Tomás Godino

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con comunicación RS232
« Respuesta #5 en: 01 de Agosto de 2015, 14:44:37 »
A pesar que CCS lo permite... olvidate de los goto y las etiquetas (dejaselo para ASM a eso).
Utiliza

while() {}
o
do { }while()

para eso, y

break;

si queres salir de ese while(), do..while o for().
Utilizar una identacion, asi es mas facil leerlo.
Y Si explicas masomenos que queres que realize tu codigo seria mas facil de encontrar una solucion, aunque creo entender el codigo.

Todo tu programa:
Código: C
  1. int8 dato,buff;
  2.  
  3. #int_rda
  4. void recepcion_serial (void)
  5. {
  6.    buff = getc();
  7. }
  8.  
  9. void main (void)
  10. {
  11.         enable_interrupts(int_rda);
  12.         enable_interrupts(global);
  13.         while (true)
  14.         {
  15.                 dato=buff;
  16.                 while(dato!=0)
  17.                 {
  18.                         output_high(PIN_A2);
  19.                         dato--;
  20.                         delay_ms(1000);
  21.                 }
  22.                 output_low(PIN_A2);
  23.                 buff=0;
  24.         }
  25. }

Le agregue ese buff, para que a si esta corriendo el programa haciendo una demora de 20 segundos y le llega otro dato, no varie el tiempo de espera. Sino ocurria que si enviabas un 0x10, y luego enviabas un 0x20 mientras estaba haciendo esa "espera", dato pasaba a valor 0x20 y comenzaba todo de vuelta.

Pongo a 0 buff al final para que cualquier dato que llego no sea tomado en cuenta mientras se esperaba el tiempo. Sino por ejemplo mientras hace la animacion de 0x10, y llega un 0x20, apenas termine el de 0x10, va a seguir con el de 0x20.

Se que estas usando 2 PIC, pero ojo si estas mandando un '1' ( es decir un caracter y no un numero 0x01 ) en la UART, ya que un '1' en ASCII equivale a 49 o 0x30, y va a ser mucho mas tiempo del necesario.

Y espero que sea un UART por HW como esta implementado.
« Última modificación: 01 de Agosto de 2015, 15:01:35 por KILLERJC »

Desconectado delirio

  • PIC12
  • **
  • Mensajes: 64
Re: Ayuda con comunicación RS232
« Respuesta #6 en: 01 de Agosto de 2015, 15:01:01 »
Y como sabes que no estás recibiendo nada?
No veo nada mal en la rutina de recepción... lo único es que yo siempre he usado variables del tipo char para recibir los datos x la USART, no estoy seguro si eso esta mal...
Pero si veo raro el void timer()... No se que pueda pasar al introducir saltos de programas en ccs, nunca lo he hecho, lo mas lógico sería hacerlo con un while...
para descartar primero la recepción de RS232, te recomiendo hacer solo una transmición de lo recibido, tipo eco.
Código: [Seleccionar]
#include <12f629.h>
#fuses HS,NOWDT
#use delay(clock = 20MHz)
#use rs232(baud=9600, xmit=pin_A0, rcv=pin_A1)

void timer();
char dato;

#int_rda
void recepcion_serial (void)
{
   dato = getc();
}

void main (void)
{
   enable_interrupts(int_rda);
   enable_interrupts(global);
   while (true){
   printf("%c\r",dato);   //Imprime valor
   }
}

Desconectado Tomás Godino

  • PIC10
  • *
  • Mensajes: 16
Re: Ayuda con comunicación RS232
« Respuesta #7 en: 01 de Agosto de 2015, 19:34:18 »
Muchas Gracias por sus respuestas, me fuero muy útiles los consejos para remover los goto.
el problema con este programa es que al intentar compilarlo me saltan los siguientes errores:

Error 7 "receptor.c" Line 9(0,1): Invalid Pre-Processor directive
Error 12 "receptor.c" Line 17(22,29): Undefined identifier int_rda

pero en otras pruebas que realice el led simplemente prendía y nunca se apagaba.

mientras que la función que debería cumplir el programa cuando este terminado es la de un timer programable:
recibe los datos de otro pic en el cual se escriben por medio de un teclado y un display, este los envia al segundo pic el cual graba los datos en la eeprom para que al volver a encender el circuito continue con la demora previamente programada.
« Última modificación: 01 de Agosto de 2015, 19:39:10 por Tomás Godino »
Tomás Godino

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con comunicación RS232
« Respuesta #8 en: 01 de Agosto de 2015, 20:07:44 »
Debe ser por que int_rda es INT_RDA en la linea 17 y tambien probar la 9 de la misma forma. Podes usar tu archivo y cambiar el main poniendo el mio.

Citar
recibe los datos de otro pic en el cual se escriben por medio de un teclado y un display, este los envia al segundo pic el cual graba los datos en la eeprom para que al volver a encender el circuito continue con la demora previamente programada.

Ya estoy previendo que vas a reventar la EEPROM de tantas "grabadas".
Ademas eso que estas leyendo los datos de un "teclado" imagino que lo haces con las librerias kbd_lib, eso devuelve un caracter ASCII y no un numero, Espero que en tu transmisor estes enviando correctamente los segundos. Sino por eso no se apagaba nunca el led