Autor Tema: Ayuda con Conexión serial entre dos PIC. CCS  (Leído 2123 veces)

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

Desconectado sharemaxi

  • PIC10
  • *
  • Mensajes: 1
Ayuda con Conexión serial entre dos PIC. CCS
« en: 11 de Octubre de 2014, 15:41:53 »
Hola, es la primera vez que me registro en un foro pero ya no me quedan libros a los cuales recurrir, estoy trabajando en una cerradura electrónica con codigo para el proyecto final de la escuela y le quiero poner un control remoto para abrir un portón.




Uso un 16F876 como receptor y programa principal y un 16F628A como transmisor. El 628A simplemente manda el dato que yo ponga en putc() y la función de interrupción en el 876 recibirá el caracter supuestamente. Pero para la condición solo pude conseguir que se cumpla con un 0. Es decir :

int rx;
#INT_RDA

void rd_isr(void)
 {   
     rx = getc();
     if (rx == 0 ) {
      output_high(PIN_C4);
      printf(lcd_putc,"\fConexión Establecida");
      } }


/* Esta condición si se cumple, pero no logro hacer que sea por ejemplo con 1, 2, a, b, etc. Ya probé cambiar los enteros por caracteres y nada, solo el 0 es correcto en la recepción. Necesito que sea con más posibilidades para mejorar mi proyecto.

En mi transmisor (16F628A) tengo esto demás de toda la configuración necesaria:

#INT_EXT
RB0() {

output_toggle(PIN_B4);
putc(0);
              }


Alguien me puede dar una mano? Desde ya aclaro que las configuraciones están bien. Mi profesor de programación dice que el TX del 628A envía un tren de pulsos con los datos, que debo hacer?

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: Ayuda con Conexión serial entre dos PIC. CCS
« Respuesta #1 en: 13 de Octubre de 2014, 13:54:23 »
Hola, es la primera vez que me registro en un foro pero ya no me quedan libros a los cuales recurrir, estoy trabajando en una cerradura electrónica con codigo para el p
/* Esta condición si se cumple, pero no logro hacer que sea por ejemplo con 1, 2, a, b, etc. Ya probé cambiar los enteros por caracteres y nada, solo el 0 es correcto en la recepción. Necesito que sea con más posibilidades para mejorar mi proyecto.




¿Qué es lo que intentas decir que con 1, 2, a, a, b, etc?

A mi me parece lógico que cuando llega '0' a tu uC, se cumple la condición que has escrito y por lo tanto C4 pasa a 1 lógico.

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Ayuda con Conexión serial entre dos PIC. CCS
« Respuesta #2 en: 13 de Octubre de 2014, 15:53:13 »
Pero para la condición solo pude conseguir que se cumpla con un 0. Es decir :

eso sucede porque estás programando la interrupción para que reciba un carácter y no para que reciba una trama.

el maestro Diego tiene un código para manejar tramas de recepción en

http://picmania.garcia-cuervo.net/picc.php#COMBUF232

te recomiendo que leas la parte del código que dice

Código: [Seleccionar]
#int_rda
void serial_isr() {    // Interrupción recepción serie USART

  rcvchar=0x00;        // Inicializo carácter recibido
  if(kbhit()){         // Si hay algo pendiente de recibir ...
    rcvchar=getc();    // lo descargo y ...
    addcbuff(rcvchar); // lo añado al buffer y ...
    echos(rcvchar);    // hago eco (si procede).
  }
}


La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: Ayuda con Conexión serial entre dos PIC. CCS
« Respuesta #3 en: 13 de Octubre de 2014, 16:19:30 »
A ya... Comprendí la pregunta.

Puede ser el código así:



void rd_isr(void)
 {  
     MiClave[PunteroMiClave] = getc();
     PunteroMiClave++;
     if (PunteroMiClave == 4)
     {
        PunteroMiCLave = 0; // reinicio el puntero para otra trama
        if (MiClave[0] == 0 && MiClave[1] == 2 && MiClave[2] == 'a' && MiClave[3] == 'a' && MiClave[4] == 'b')
        {
                    output_high(PIN_C4);
                    printf(lcd_putc,"\fConexión Establecida");
         }
         for(i= 0; i<5; i++)   MiClave [ i ] = 0; //Borro este array para un proximo ingreso
  
     }




MiClave y PunteroMiClave deberían ser inicializados (puestos a cero) en alguna parte del programa, en el inicio.

No estoy seguro si a, b, etc te refieres a los caracteres en ascii o al valor de un número en hexadecimal.

También es recomendable que con un temporizador limpies la MiClave y PunteroMiClave después de un cierto tiempo que el usuario presione pocas teclas antes de completar el número necesario de caracteres para abrir la puerta.

Obviamente cuando llega el primer carácter arrancaría el timer y se detendría cuando complete el número de caracteres necesario, en este caso 5. Cuando el desborde del timer se produce porque no se ha ingresado 5 caracteres, aparte de limpiar MiClave y PunteroMiClave, también debería detenerse.
« Última modificación: 13 de Octubre de 2014, 16:22:08 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything