Autor Tema: Comunicacion Pic a Pic casera.  (Leído 1857 veces)

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

Desconectado Gekido

  • PIC10
  • *
  • Mensajes: 5
Comunicacion Pic a Pic casera.
« en: 27 de Mayo de 2013, 12:10:48 »
Estoy tratando de hacer un código propio en C++(CCS) que permita comunicar dos pics cuando se de un evento determinado. Pero no la estoy logrando hacer funcionar y por ello recurro a su ayuda.

La idea es hacer un código que pueda usarse con cualquier pic aun cuando no tengan periféricos propios para I2C, USART, etc. Los pics que elegí para la prueba son dos chiquitines: 12F675.
Ambos pics están conectados de modo que la patita destinada a transmitir es un pin de salida del Pic1 conectado a la patita que controla la interrupción externa del pic2.

Por ahora intento hacer una transmisión unidireccional del pic maestro, al esclavo. Cuando el master prende TX(pin de transmisión), y lo apaga, justo después, el pic esclavo debería empezar a transmitir los datos.


Archivo:
Comunicacion_PICMaestro.c:

Código: [Seleccionar]
#include "Comunicacion_PICMaestro.h"

// Ponemos nombres mas faciles a las funciones que prenden y apagan las patitas del PIC.
#define ON output_high
#define OFF output_low

#define TX   PIN_A4
#define RX   PIN_A3
#define Led1 PIN_A0
#define Led2 PIN_A1
#define Led3 PIN_A2
#define Led4 PIN_A5

int16 i; // Uso generico.
int16 DuracionCeroUS = 200;
int16 DuracionUnoUS = 400;


int16 Bit; int16 Demora;
int16 _Byte[8];
void PedirDatos(){
   // Pedimos que compense a mandarnos datos.
   ON(TX); Delay_us(100); OFF(TX);
   for(i=0; i>=7; i++){
      while(!input(RX));  // Esperamos envio de un bit.
      set_timer1(0);      // Seteamos el timer a cero.
      while(input(RX));   // Esperamos a que se apague el bit.
      Demora = get_timer1();  // Calculamos cuanto estuvo prendido.
      if(Demora<DuracionCeroUS+20){ // En caso que haya estado prendido menos de DuracionCero.
         Bit=0;
      }else if(Demora<DuracionUnoUS+20){  // Si estuvo mas que DuracionCero pero menos que DuracionUno.
         Bit=1;
      }
      _Byte[i] = Bit;
   }
}
/*
#int_EXT
void EXT_isr(){
}
*/
void main(){
   OFF(TX);
   Delay_ms(20); // Esperamos a que se estabilize la corriente.
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   enable_interrupts(GLOBAL);
   set_tris_a(0b00001000); // PIN_A3 seteado como entrada y las demas patitas seteadas como salidas.
   //    GPIO   --543210
   
   while(1){
      PedirDatos();
      for(i=0; i>=7; i++){
         if(_Byte[i]==1){
            ON(Led1); Delay_ms(400); OFF(Led1); Delay_ms(100);
         }else{
            ON(Led1); Delay_ms(100); OFF(Led1); Delay_ms(400);         
         }
      }
      Delay_ms(3000);
   }
}




Archivo:
Comunicacion_PICEsclavo.c:

Código: [Seleccionar]
#include "Comunicacion_PICEsclavo.h"


// Ponemos nombres mas faciles a las funciones que prenden y apagan las patitas del PIC.
#define ON output_high
#define OFF output_low
#define TX PIN_A4
#define RX PIN_A3


int16 i; // Uso generico.
int16 DuracionCeroUS = 200;
int16 DuracionUnoUS = 400;

int16 Bit;
int16 _Byte[8]={0,1,0,1,0,0,1,1};
void EnviarDatos(){
   while(input(RX));// Cuando baje la senal, empezamos a transimitir.
   for(i=0; i>=7; i++){
      Bit = _Byte[i];
      if(Bit==1){
        ON(TX); delay_us(DuracionUnoUS); OFF(TX);
      }else{
        ON(TX); delay_us(DuracionCeroUS); OFF(TX);
      }
      delay_us(100); // Espacio entre bits.
   }
}


#int_EXT
void EXT_isr(){ // Si entra aca es que nos pidieron Datos.
   EnviarDatos();
}



void main(){
   OFF(TX);
   Delay_ms(20); // Esperamos a que se estabilize la corriente.
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   set_tris_a(0b00001000); // PIN_A3 seteado como entrada y las demas patitas seteadas como salidas.
   //    GPIO   --543210
   
   while(1){ // Nos quedamos dando vueltas sin hacer nada, a la espera de una interrupción.
      delay_us(100);
   }

}


Lo estoy emulando en el proteus, pero no me funciona, puesto que la variable _Bits del maestro nunca reciben los datos.. Me podrían dar una mano para encontrar el problema?


Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: Comunicacion Pic a Pic casera.
« Respuesta #1 en: 27 de Mayo de 2013, 13:47:46 »
te falta añadir en el codigo del maestro
enable_interrupts(INT_EXT);

yo te recomendaria usar #use rs232 por software se utiliza igual como si tuvieras usart solo que en vez de #int_rda seria la recepcion en  #int_ext pero esta bien la iniciativa, espero sea de ayuda, por cierto ya hay dispositivos de ese tamaño que tienen eusart como PIC12F1822 si lo pudieras comprar estaría bien.
Espero sea de ayuda

Desconectado Gekido

  • PIC10
  • *
  • Mensajes: 5
Re: Comunicacion Pic a Pic casera.
« Respuesta #2 en: 27 de Mayo de 2013, 15:35:45 »
te falta añadir en el codigo del maestro
enable_interrupts(INT_EXT);

yo te recomendaría usar #use rs232 por software se utiliza igual como si tuvieras usart solo que en vez de #int_rda seria la recepción en  #int_ext pero esta bien la iniciativa, espero sea de ayuda, por cierto ya hay dispositivos de ese tamaño que tienen eusart como PIC12F1822 si lo pudieras comprar estaría bien.
Espero sea de ayuda

Gracias por tu respuesta, gab163!!
En verdad no agregue esa linea, porque el Master aun no usa la interrupción externa, sino que funciona como una patita de entrada común, aunque mas adelante cuando logre hacer la comunicación bidireccional si se usara. Así que imagino que el problema debe ser otro...

Me intereso muchísimo eso de usar rs232 entre pics! Se puede usar sin necesidad de un MAX232?

Igual me gustaría lograr hacer funcionar este código como aprendizaje, y para otras personas que les pueda resultar útil un protocolo independiente.

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: Comunicacion Pic a Pic casera.
« Respuesta #3 en: 28 de Mayo de 2013, 13:55:13 »
si la comunicación por la uart seria sin max232 únicamente si es punto-punto y es una corta distancia si requieres mas de 2 dispositivos comunicados tienes que hacerlo por rs-485 y si ocuparias un max485 para poder hacer la comunicación esta si no mal recuerdo te permite tener una longitud de red de mas de 1000m teóricamente no recuerdo bien seria cuestión de checarlo

Desconectado Gekido

  • PIC10
  • *
  • Mensajes: 5
Re: Comunicacion Pic a Pic casera.
« Respuesta #4 en: 28 de Mayo de 2013, 14:16:24 »
si la comunicación por la uart seria sin max232 únicamente si es punto-punto y es una corta distancia si requieres mas de 2 dispositivos comunicados tienes que hacerlo por rs-485 y si ocuparias un max485 para poder hacer la comunicación esta si no mal recuerdo te permite tener una longitud de red de mas de 1000m teóricamente no recuerdo bien seria cuestión de checarlo

Muchas gracias! Voy a intentarlo con ese método. Ahora que se que se puede usar comunicación rs232 sin necesidad del MAX232, entonces no tiene sentido seguir con mi desarrollo. Si tengo novedades las pongo aquí por si le es de ayuda a alguien mas.


 

anything