Autor Tema: Escritura/lectura I2c pic16f877A  (Leído 2031 veces)

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

Desconectado boadacr

  • PIC10
  • *
  • Mensajes: 3
Escritura/lectura I2c pic16f877A
« en: 02 de Mayo de 2012, 12:39:04 »
Hola muy buenas, queria abrir este hilo para preguntar en que puede fallar mi codigo en C para la programación de un maestro y un esclavo con comunicación i2c bidireccional. Os situo en la idea que quiero realizar. Con un esclavo (direccion 0xA0) recibo mediante pulsadores bits en todo su puertoB. Este puerto lo traslado al puerto D del esclavo. El maestro tiene un array de leds en su puerto B como salida y un pulsador en el bit.1 de su puerto D.  La idea de la comunicacion es que el maestro solicite el dato del estado de los interruptores del esclavo y que cuando pulse el boton del bit D1 envie un 0xFF al esclavo y lo visualize en el puerto D.

El codigo del master es este:


master.c

Código: [Seleccionar]
#include "C:\Users\Cristian\Desktop\Prueba CCS\I2c Puertas\MAESTRO MANOLO\MAESTRO2\maestro manolo 2.h"

#byte trisb=0x86
#byte portb=0x06
#byte trisd=0x88
#byte portd=0x08

#define luces     0xA0
#define sen_luz   0


BYTE encendido=0xFF;

int dato=0;

void escribir_esclavo()   //enviar un 0xFF al esclavo para sacarlo por el portd
 {
   i2c_start();
   i2c_write(luces);
   i2c_write(encendido);
   i2c_stop();
 }

void leer_esclavo()   //leer del esclavo el estado del portb para sacarlo por el portb del maestro
 {
   i2c_start();
   i2c_write(luces);
   i2c_write(sen_luz);
   i2c_stop();
   i2c_start();
   i2c_write(luces+1);
   dato=i2c_read(0);
   i2c_stop();
 }
 
 
void main()
{
set_tris_b(0x00);
set_tris_d(0x02);
portb=0;
   port_b_pullups(TRUE);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

while(1)
{
 if(input_state(PIN_D1)==1)
   {
   escribir_esclavo();
   delay_ms(100);
   }
 leer_esclavo();
 delay_ms(100);
 portb=dato;
}
   

}

master.h

Código: [Seleccionar]
#include <16F877A.h>
#device ICD=TRUE
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES RC                       //Resistor/Capacitor Osc with CLKOUT
#FUSES PUT                      //Power Up Timer
#FUSES PROTECT                  //Code protected from reads
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES BROWNOUT                 //Reset when brownout detected

#use delay(clock=4000000)
#use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3,force_hw)


esclavo.c:

Código: [Seleccionar]
#include "C:\Users\Cristian\Desktop\Prueba CCS\I2c Puertas\MAESTRO MANOLO\ESCLAVO\esclavo manolo.h"

#byte trisb=0x86
#byte portb=0x06
#byte trisd=0x88
#byte portd=0x08
#byte trisa=0x85
#byte porta=0x05

int luces,buffer[4],address,state,incoming;

#int_SSP
void ssp_interupt ()
{
   
   state = i2c_isr_state();
   
   if(state < 0x80)                 //El mestre envia dades
   {
      incoming = i2c_read();
      if(state == 1)                   //El primer byte rebut és una adreça
      {         
         address = incoming;
      }
      if(state == 2)                   //El segon byte rebut són dades
      {           
         buffer[address] = incoming;
      }     
   }
   
   if(state == 0x80)                //El mestre demana dades
   {
      i2c_write (luces);  //S'envien les dades seleccionades
   }
}




void main()
{
set_tris_b(0xFF);
set_tris_d(0x00);
set_tris_a(0x00);
   port_b_pullups(TRUE);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);

   
while(1)
 {
 luces=portb;
 delay_ms(50);
 portd=luces;
 }
}

esclavo.h:

Código: [Seleccionar]
#include <16F877A.h>
#device ICD=TRUE
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES RC                       //Resistor/Capacitor Osc with CLKOUT
#FUSES PUT                      //Power Up Timer
#FUSES PROTECT                  //Code protected from reads
#FUSES DEBUG                    //Debug mode for use with ICD
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES BROWNOUT                 //Reset when brownout detected

#use delay(clock=4000000)
#use i2c(Slave,Slow,sda=PIN_C4,scl=PIN_C3,force_hw,address=0xA0)


Pido por favor un poco de consejo a la hora de programar y que errores estoy cometiendo y que no me estoy dando cuenta. Me esta desesperando porque miro y miro ejemplos y no logro que el mio funcione.

adjunto también el esquema para que tengan mejor idea de lo que estoy intentando probar.

Muchisimas gracias.

Saludos.



 

anything