Autor Tema: Comunicar 2 16f877 (duda)  (Leído 1958 veces)

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

Desconectado YF-21

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 185
Comunicar 2 16f877 (duda)
« en: 30 de Octubre de 2004, 08:16:00 »
Pues asi es ... este es el codigo que usé es para presionar una tecla de un teclado 4x4 en el micro master y esta aparece en el esclavo en un lcd...

Para el master ...

Codigo:
#include "16f877.h"
#fuses noprotect,nobrownout,noput,nowdt,nolvp
#use delay(clock=4000000)
#use standard_io(A)
#use standard_io(b)
#use standard_io(d)

#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3,FAST,FORCE_HW)

int tecla=0,conta=0,x,corrim=8;

int getkey (conta)
{
   i2c_start ();

   i2c_write (254);

   i2c_write (conta);

   i2c_stop ();

   output_a (conta);
   delay_ms (1000);
}


void main ()
{
conta=0;
while (1){
for (x=0;x<=3;x++)
{
   output_b(corrim);
   output_d (conta);

   if (input(PIN_B4))
      {
         getkey(conta);
      }
      conta++;
      output_d(conta);

      if (input(PIN_B5))
      {
         getkey(conta);
      }

      conta++;
      output_d(conta);

         if (input(PIN_B6))
      {
         getkey(conta);
      }

      conta++;
      output_d(conta);

         if (input(PIN_B7))
      {
         getkey(conta);
      }
      conta++;
      rotate_right(&corrim,1);
      output_d(conta);

}
conta=0;
corrim=8;
}
}



y slave ...

Codigo:
#include "16f877.h"
#use     i2c (slave, ADDRESS=254, scl=pin_c3, sda=pin_c4, fast, force_hw)
#use delay(clock=4000000)
#fuses noprotect,nobrownout,noput,nowdt,nolvp
#include "lcd.c"
#use fast_io (C)
#use standard_io (A)


int data;

void main ()
{
   set_tris_c (0xff);
   lcd_init ();
   lcd_putc ("Esperando"Giño;

   while (1)
   {
   if(~input(PIN_c4))
    {
      data=i2c_read ();
      if (data==254)
      {
            data=i2c_read ();
            lcd_putc ("f"Giño;
            printf (lcd_putc, "El dato es el %i", data);
      }
    }
   }
}


Y funciona, pero tengo unas dudas ...

Primero. No queria usar el i2c_poll y me pregunto si la manera de leer el dato en el esclavo es adecuada

Segundo. Al no usar el i2c_poll creo que no es necesario usar el force_hw

Tercero. Algunas sugerencias o comentarios sobre el programa para mejorar

Cuarto. Se podria hacer que al no presionar ninguna tecla (o al soltarla) de teclado en el micro master, aparezca "esperando" en la pantalla del micro slave?