bueno, aki sigo con un problema...
hice un codigo simple, solo para verificar que existe la comunicación entre los pic's, y resulta que no hay conexion.
el maestro pide un dato al esclavo (un string), pero en el esclavo nunca entra la interrupcion SSP.
podrian ayudarme?
aki les dejo los codigos que hice para cada pic.
tambien les adjunto la simulacion en proteus.
maestro: cada 10 seg el maestro pide un dato al esclavo
#include <18F26J50.h>
#device adc=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B1,rcv=PIN_B2,bits=8,stream=PORT1)
#use i2c(Master,Fast,sda=PIN_B5,scl=PIN_B4)
int segundo=0;
int segfive=0;
//unsigned char cadena;
char valor=0;
#int_timer0
void tiempo(void) //interrupcion de 1 segundo
{
segundo++;
if(segundo==5) //cuento 5 seg
{
segfive++;
segundo=0;
}
set_timer0(46100);
delay_ms(100);
if(segfive==2) //cuento 10 segundos
{
i2c_start(); //esto es para pedir los datos al esclavo
i2c_write(0xA0);
delay_ms(10);
i2c_start();
i2c_write(0x0A+1);
valor=i2c_read();
i2c_stop();
//valor = atof(cadena);
fprintf(PORT1,"VELOCIDAD PROMEDIO %s",valor); //muestro lo que lee del i2c
puts("\r");
segfive=0;
}
set_timer0(46150);
}
void main()
{
set_tris_b(0xff);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); //3.4 s overflow
setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
setup_timer_4(T4_DISABLED,0,1);
enable_interrupts(INT_TIMER0);
setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
//enable_interrupts(INT_RTCC);
disable_interrupts(INT_EXT);
disable_interrupts(INT_EXT1);
disable_interrupts(INT_EXT2);
enable_interrupts(GLOBAL);
set_timer0(46100);
while(TRUE)
{
//TODO: User Code
}
}
esclavo:
#include <18F26J50.h>
#device adc=16
#include <math.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B1,rcv=PIN_B2,bits=8,stream=PORT1)
#use i2c(Slave,Fast,sda=PIN_B5,scl=PIN_B4,address=0x0A)
#priority SSP
float valor;
char string[5];
int i=0;
typedef enum {NOTHING, CONTROL_READ,ADDRESS_READ} I2C_STATE;
I2C_STATE fstate;
#int_SSP
void SSP_isr(void)
{puts("funcion SSP"); // esto es para ver si entra la interrupcion
fstate=i2c_isr_state(); //en caso de entrar deberia enviar el primer nro (1)
if(fstate==0x80)
{
i2c_write(string); //escribo el primer nro en el puerto
i++;
}
}
void main()
{
set_tris_b(0xff);
output_float(pin_b0);
ext_int_edge(H_TO_L);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); //3.4 s overflow
setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
setup_timer_4(T4_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC); // This device COMP currently not supported by the PICWizard
disable_interrupts(INT_TIMER0);
disable_interrupts(INT_EXT);
disable_interrupts(INT_EXT1);
disable_interrupts(INT_EXT2);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
set_timer0(46100);
while(TRUE)
{
valor=17.53; //defino un valor flotante
sprintf(string,"%01.2f",valor); //convierto el flotante a un string
printf("string=");
fprintf(PORT1,"%c ",string); //muestro el primer numero, o sea el 1
puts(" "); //todo esto es solo para vefiricar que valor se convirtio a string
delay_ms(1000);
}
}