Hola
Situacion actual:
M1 maestro envia a S1 un dato
S1 configurado para que mediante la interuppcion del i2c evalue si el dato es para el
S2 lee el bus y muestra lo que lee i2c_lead;
Problemas :
S2 solo me lee, la direcion del ultimo dato colocado en el bus, la direcion del S1, no los datos.
S1 no entra en la interrupcion nunca
El simulador de proteus me tira como una docena de lineas de errores del chip S1 del S2 ni quejarse
Codigo del master:
#include "pic_master_net.h"
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
printf("\r\n PIC MASTER: ");
printf("\r\n enviando.... ");
//limpia_v(nums,4,9);
OUTPUT_HIGH(PIN_B3);
escribir_i2c(S1,10);
//escribir_i2c(S1,20);
// escribir_i2c(S2,10);
// escribir_i2c(S2,20);
}
libreia :bus_i2c.h master
/*****************************************************
*
* Libreria del bus i2c
*
*****************************************************/
//direcciones de dispositivos
#Define M1 0xA1 //Master
#Define S1 0xA2 //Esclavo 1
#Define S2 0xA3 //Esclavo 2
#Define S3 0xA4 //Esclavo 3
// --- escribir en dispositivo ---
void escribir_i2c(BYTE direccion, int dato)
{
i2c_start();
i2c_write(direccion);
i2c_write(dato);
i2c_stop();
delay_us(50);
}
// --- leer del dispositivo ---
int leer_i2c(BYTE direccion, int opcion)
{
int dato = 0;
i2c_start();
i2c_write(direccion); //direccion device
i2c_write(opcion);
i2c_start();
i2c_write(direccion+1);
dato = i2c_read();
i2c_stop();
return(dato);
}
libreria :pricipal del master
#include <18F2550.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES MCLR //Master Clear pin enabled
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12 //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV4 //System Clock by 4
#FUSES USBDIV //USB clock source comes from PLL divide by 2
#FUSES VREGEN //USB voltage regulator enabled
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,SLOW,sda=PIN_B0,scl=PIN_B1)
//#USE FAST_IO(B)
#include <stdlib.h> //Archivo necesario para función rand()
#include <math.h>
#include "bus_i2c.h" //libreia bus
#include "mi_lib.c" //mis librerias
Para el primer esclavo tengo lo siguiente:
/***************************************
*
* Progrma principal del esclavo:
* pic_esclavo_net.c
*
***************************************/
#include "pic_esclavo_net.h"
#INT_SSP
void ssp_interupt();
void main()
{
int8 dato;
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
printf("\n\r PIC ESCLAVO 1: ");
OUTPUT_HIGH(PIN_B3);
}
en lal ibreria de cabeceras del esclavo tengo
/***************************************
*
* lib de cabeceras esclavo
* pic_esclavo_net.h
*
***************************************/
#include <18F2550.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES MCLR //Master Clear pin enabled
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12 //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV4 //System Clock by 4
#FUSES USBDIV //USB clock source comes from PLL divide by 2
#FUSES VREGEN //USB voltage regulator enabled
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
//#use i2c(Slave,Slow,sda=PIN_B0,scl=PIN_B1,address=0xA2,NOFORCE_SW)
#use i2c(Slave,Slow,sda=PIN_B0,scl=PIN_B1,address=0xA2)
#include <stdlib.h> //Archivo necesario para función rand()
#include <math.h>
#include "bus_i2c.h" //libreia bus
#include "mi_lib.c" //mis librerias
lib mi_lib.c
/*****************************************************
*
* Libreria del mis funciones
* mi_lib.c
*
*****************************************************/
//DEFINICIONES
#define led1 PIN_B3
BYTE address, buffer[0x10];
void ssp_interupt (){
BYTE incoming, state;
state = i2c_isr_state();
printf("\n\r state: %d ",state);
if(state < 0x80) //Master is sending data
{
incoming = i2c_read();
printf("\n\r incoming: %d ",incoming);
if(state == 1) //First received byte is address
address = incoming;
if(state == 2) //Second received byte is data
buffer[address] = incoming;
}
if(state == 0x80) //Master is requesting data
{
i2c_write(buffer[address]);
}
}
¿Alguna persona sabe que ocurre?
Un Saludo