Autor Tema: COMUNICACION PIC TO PIC  (Leído 2358 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado ccmcca

  • PIC10
  • *
  • Mensajes: 14
COMUNICACION PIC TO PIC
« en: 29 de Octubre de 2005, 14:20:00 »
Hola una vez mas recurro a vuestro conocimiento que me saca de apuros siempre
Quiero que un pic atraves de RS232 le mande un string al otro que lo reciba con rs232 tambien atraves de la interrupcion RDA.

El tema es que no me anda y no se que estoy haciendo mal
El que recibe es asi

#include "mainbalanza.h"
#int_RDA
RDA_isr()
{
   printf(LCD_PUTC,"DEBUG"Giño;
}
void main()
{
   ini();

   while(1)
   {

   }
}
y el que manda

#include "USvar16f627.h"
void main()
{
   while(true)
   {
      printf("%S
","16f627"Giño;
   }

}


Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: COMUNICACION PIC TO PIC
« Respuesta #1 en: 29 de Octubre de 2005, 14:29:00 »
Tiene que ser forzosamente a traves de RS-232?? Para mandar informacion entre pics se suele usar el protocolo I2C...

Desconectado ccmcca

  • PIC10
  • *
  • Mensajes: 14
RE: COMUNICACION PIC TO PIC
« Respuesta #2 en: 29 de Octubre de 2005, 14:52:00 »
solo tengo que mandar una variable o string es muy complicado?
Me podrías mandar un ejemplo , ya que no estoy muy familiarizado con I2C
gracias.-

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: COMUNICACION PIC TO PIC
« Respuesta #3 en: 29 de Octubre de 2005, 15:16:00 »
Pues claro que si! Ahora mismo busco unos ejemplillos que tengo no se donde y cuando los encuentre los subo.

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: COMUNICACION PIC TO PIC
« Respuesta #4 en: 29 de Octubre de 2005, 15:25:00 »
No andaban nada lejos los ejemplillosMuchas risas ahi van.

Estas son las rutinas que tienes que usar en el maestro para leer y escrivir en el esclavo.

Codigo:

//It reads a value from a slave I2C device connected to the I2C bus
//Disable all interrupts before use it or when another
//  process can interrupt reading
byte readi2c(byte address, byte pos){
   byte out;
   i2c_start();
   i2c_write(address); //slave can read.
   i2c_write(pos);
   i2c_start();
   i2c_write(address+1); //slave can write.
   out = i2c_read(0);
   i2c_stop();
   return out;
}

//It writes a value in a slave I2C device connected to the I2C bus
//Disable all interrupts before use it or when another
//  process can interrupt writing
writei2c(byte address, byte pos,byte data){
   byte out;
   i2c_start();
   i2c_write(address); //slave can read.
   i2c_write(pos);
   i2c_write(data);
   i2c_stop();
   return out;
}


adress es la direccion del esclavo, pos es la posicion del buffer del slave y data es el dato que quieres mandar.

Y para el slave te pongo un ejemplo que da unos valores al buffer para luego leerlos des del slave.

Codigo:

#include <16f876.h>

#use delay (clock=4000000)

#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa0,force_hw)
static int i;


typedef enum {NOTHING, CONTROL_READ,
              ADDRESS_READ, READ_COMMAND_READ} I2C_STATE;
   static I2C_STATE fState=NOTHING;
   static byte address, buffer[0x10];
   static byte incoming=0;

#INT_SSP
void ssp_interupt ()
{
   
   if (i2c_poll() == FALSE) {
      if (fState == ADDRESS_READ) {  //i2c_poll() returns false on the
         i2c_write (buffer[address]);//interupt receiving the second
         fState = NOTHING;           //command byte for random read operation
      }
   }
   else {
      incoming = i2c_read();

      if (fState == NOTHING){
         fState = CONTROL_READ;
      }
      else if (fState == CONTROL_READ) {
         address = incoming;
         fState = ADDRESS_READ;
      }
      else if (fState == ADDRESS_READ) {
         buffer[address] = incoming;
         fState = NOTHING;
      }
   }
}


void main ()
{
loader16F876();
set_tris_a(0);
set_tris_b(0);
set_tris_c(0);

   fState = NOTHING;
   address = 0x00;
   for (i=0;i<0x10;i++)
      buffer = 0x00;

   enable_interrupts(GLOBAL);
   enable_interrupts(INT_SSP);

   while (TRUE)
   {
   buffer[0x00]=1;
   buffer[0x01]=2;
   buffer[0x02]=3;
   buffer[0x03]=4; //doy valores al buffer para luego poder leerlos
   buffer[0x04]=5; // aqui es donde se guarda la info que el master
   buffer[0x05]=6; // envia al slave
   buffer[0x06]=7;
   buffer[0x07]=8;
   buffer[0x08]=9;
   }

}




Desconectado ccmcca

  • PIC10
  • *
  • Mensajes: 14
RE: COMUNICACION PIC TO PIC
« Respuesta #5 en: 29 de Octubre de 2005, 17:05:00 »
Desde ya muchas gracias por la info y una ultima consulta...
La conexion necesita de algun pullup o resistor?
o es pin a pin?
saludos.-Rebotado

Desconectado ccmcca

  • PIC10
  • *
  • Mensajes: 14
RE: COMUNICACION PIC TO PIC
« Respuesta #6 en: 29 de Octubre de 2005, 17:06:00 »
Desde ya muchas gracias por la info y una ultima consulta...
La conexion necesita de algun pullup o resistor?
o es pin a pin?
saludos.-Rebotado

Desconectado ccmcca

  • PIC10
  • *
  • Mensajes: 14
RE: COMUNICACION PIC TO PIC
« Respuesta #7 en: 29 de Octubre de 2005, 17:07:00 »
Desde ya muchas gracias por la info y una ultima consulta...
La conexion necesita de algun pullup o resistor?
o es pin a pin?
saludos.-Rebotado

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: COMUNICACION PIC TO PIC
« Respuesta #8 en: 29 de Octubre de 2005, 17:14:00 »
Necesita una resistencia de pull-up tanto el la linia de datos como en la de reloj, teoricamente la resistencia de pull-up para el bus I2c ha de calcularse segun los componentes que se van a conectar en el bus. Pero a la practica puedes poner las dos de 4K7 y te funcionara sin problemas.
 

Desconectado olotill

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 249
RE: COMUNICACION PIC TO PIC
« Respuesta #9 en: 29 de Octubre de 2005, 21:56:00 »
Hola que tal compadre Piriots...

He leido tus mensajes en este y otros foros y pues creo que sabes bastante de CCS, pues bien yo estoy aprendiendo este lenguaje en este post tu dieces que tienes unos ejemplitos por ahi sera que puedes enviarmelos para repasar y aprender mas sobre CCS.... por favor compadre...

Bueno espero que si puedas, si puedes por favor enviamelos a mi correo..

fabortizv@hotmail.com

Espero tu respuesta y desde ya muchas gracias hermano..

SALUDOS DESDE ECUADOR RebotadoRebotado
"La imaginación es más importante que el conocimiento"  A. Einstein..

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: COMUNICACION PIC TO PIC
« Respuesta #10 en: 30 de Octubre de 2005, 04:52:00 »
Pues no es  ninguna molestia, ahora mismo te lo mando. Tambien mirate los ejemplos que se esta currando vszener, hay muchos y muy variados.

Salu2

Desconectado olotill

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 249
RE: COMUNICACION PIC TO PIC
« Respuesta #11 en: 30 de Octubre de 2005, 20:35:00 »
Sonrisa GiganteHOLA... Sonrisa Gigante

GRACIAS COMPADRE PIRIOTS QUEDO A LA ESPERA DE TUS EJEMPLOS, Y PUES BUENO LOS EJEMPLOS DE VSZENER LOS HE LEIDO CASI TODOS SOLO ME FALTAN LOS ULTIMOS 5 ES QUE NO HE TENIDO MUCHO TIEMPO DE SENTARME A ESTUDIARLOS,  PERO LA VERDAD ES UN EXCELENTE TRABAJO DEL PANA VSZENER ES UN MAESTRO, COMO MUCHOS DE ESTOS FOROS... Sonrisa Gigante

BUENO CON TUS EJEMPLOS ESPERO COMPLETAR LA COLECCION QUE TENGO CON LOS DE VSZENER CON LOS CUALES ME TOME EL ATREVIMIENTO DE EMPEZAR A ARMAR UN DOCUMENTO QUE INCLUYA EL ESQUEMATICO DEL EJEMPLO UNA BREVE EXPLICACION DEL EJERCICIO Y POR SUPUESTO EL CODIGO CUANDO LO TENGA LISTO LO SUBO A RAPIDSHARE--  Sonrisa Gigante

BUENO HERMANO MUCHAS GRACIAS POR TU AYUDA...


SALUDOS Y UN ABRAZO DESDE ECUADOR
"La imaginación es más importante que el conocimiento"  A. Einstein..

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: COMUNICACION PIC TO PIC
« Respuesta #12 en: 31 de Octubre de 2005, 04:44:00 »
Ya te he mandado los ejemplos. Te han llegado correctamente??

Desconectado Sebascl

  • PIC12
  • **
  • Mensajes: 73
RE: COMUNICACION PIC TO PIC
« Respuesta #13 en: 01 de Noviembre de 2005, 13:10:00 »
hola, para que esto funcione solo tienes que grabarlo en 2 pic y conectar el pin_a4 al pin_b0 del otro y viseversa, y en los pines de entrada pon una recistencia de 470 a tierra para evitar pulsaciones falsas por corrientes parasitas.

#include <16F84A.h>
#use delay(clock=4000000)
#fuses XT
#nolist
#byte port_A=05
#byte port_b=06
#use fixed_io(A_OUTPUTS=PIN_A0,PIN_A1,PIN_A2,PIN_A3,PIN_A4)
#use fixed_io(B_OUTPUTS=PIN_B1,PIN_B2,PIN_B3,PIN_B6,PIN_B7)
#use rs232(baud=9600,xmit=PIN_A4,rcv=PIN_B0,invert)

char opcion;

#INT_EXT
resive_datos()
{
   opcion=getc();
   switch(opcion)
   {
      case "1":
               output_high(pin_a0);
      break;
      case "2":
               output_low(pin_a0);
      break;
   }
}

void main()
{
   enable_interrupts(global);
   enable_interrupts(INT_EXT);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   port_a=0;
   port_b=0;
   port_a=0;
   port_b=0;

   while(TRUE)
   {
      if(input(pin_b4)==1)
      {
         printf("1"Giño;
      }

      if(input(pin_b5)==1)
      {
         printf("2"Giño;
      }

   }
}



saludos...
pd.: si me equivoke en algo porva corrijanme.

chau