Hola a todos
El presente mensaje es para comunicar mi intencion o proposito de depurar
en proteus los 6 registros del MSSP y ver en cada momento
que es lo que sucede que valor obtienen estos registros ,el tiempo que
empleam y si es correcto lo que hacen o los valores que toman.
En todos lados hay un esquema de los valores de envio de SDA y SCL
pero no de que valores o como cambian los registros del:
• MSSP Control Register 1 (SSPCON1)
• MSSP Control Register 2 (SSPCON2)
• MSSP Status Register (SSPSTAT)
• Serial Receive/Transmit Buffer Register (SSPBUF)
• MSSP Shift Register (SSPSR) – Not directly accessible
• MSSP Address Register (SSPADD)
Esto lo hago porque no es nada logico los errores que me esta produciendo,
podria ser algun bug del ccs o algo que yo me pase por alto, en algunos post
encontre que varias personas debian de definir registros y setearlos a un valor
en caso contrario no les funcionaba el programa..ellso mismo no se explicaban esa
solución del problema.
En muchos pos otros compañeros han dedicado un monton de tiempo en depurar errores
que por otra parte no era del programa sino de algun bug del compilador, asi yo me propongo
hacer un depurado para saber como funcionan esos registros de forma que hay si hay algo que no
funciona de forma adecuada se pueda corregir en mi comunicacion y de forma semejante
en la de posteriores compañeros.
Estaria encantado de que si ustedes encontraron un pdf o un documento que explique el valor que
tienen que tomar en una comunicacion i2c de un master y un esclavo estos registros ahora es el momento
de compartir esos ejnlaces o conociminetos.
Asi si ustedes antes se vieron abligados a depurar el i2c por no saber lo que ocurre en las tripas
del i2c, les rogaria que tambien lo añadieran a este hilo.
Tomare un ejemplo que se que funciona (de esas formas):
CODIGO DEL MASTERcabecera:
#include <18F2550.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz 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 NOPBADEN //PORTB pins are configured as digital I/O 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)
#define I2C_SDA PIN_B0
#define I2C_SCL PIN_B1
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,Slow,sda=PIN_B0,scl=PIN_B1,FORCE_HW)
//Leds que se iluminaran
#DEFINE LED1 PIN_B7 //PIN 3
//pulsadores
#DEFINE P1 PIN_A4
#DEFINE P2 PIN_A5
//esclavos de i2c
#DEFINE PIC2 0xB0 //Direccion dispositivo PIC 2 (esclavo)
#DEFINE PIC3 0xB2 //Direccion dispositivo PIC 3 (esclavo)
#DEFINE PIC4 0xB4 //Direccion dispositivo PIC 4 (esclavo)
#DEFINE PIC5 0xB6 //Direccion dispositivo PIC 5 (esclavo)
#DEFINE PIC6 0xB8 //Direccion dispositivo PIC 6 (esclavo)
#DEFINE PICx 0xB0 // probando i2c
void bus_i2c_rw(int8 PIC, int8 DATO){
i2c_start(); // Condicion Inicio
i2c_write(PIC);// Direccion dispositivo
//delay_ms(3); // *** Necesario ***
i2c_write(DATO);// dato
//delay_ms(3); // *** Necesario ***
//i2c_write(++dato);// dato
i2c_stop(); // Stop
//delay_us(20);
}
void bus_i2c_rw_v(int8 PIC, int8 *DATO[], int8 r){
int8 a;
i2c_start(); // Condicion Inicio
i2c_write(PIC);// Direccion dispositivo
delay_ms(3); // *** Necesario ***
for(a=0;a<r;a++){
i2c_write(DATO[a]);// dato
delay_ms(3); // *** Necesario ***
}
//i2c_write(++dato);// dato
i2c_stop(); // Stop
delay_us(20);
}
Progrma principal:
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!!
int8 mi_dato=0;
int8 dato[]={45,90,1};
int8 angulo;
int8 inclina;
angulo=1; //1-2-3-4-5-6-7
inclina=1; //1-2-3-4-5-6-7
delay_ms(1000); //Hay que dejar tiempo que se inicialize el esclavo
while(true)
{
if(input(P1)==1){
output_high(PIN_B7);
delay_ms(100);
/*
i2c_start(); // Condicion Inicio
i2c_write(PIC4);// Direccion dispositivo
delay_ms(3); // *** Necesario ***
i2c_write(dato);// dato
delay_ms(3); // *** Necesario ***
//i2c_write(++dato);// dato
i2c_stop(); // Stop
*/
printf("\n\r mi_dato: %u"angulo);
bus_i2c_rw(PIC4,angulo);
//printf("\n\r mi_dato: %u"angulo);
output_low(PIN_B7);
delay_ms(1000);
}
if(input(P2)==1){
mi_dato=mi_dato+1;
output_high(PIN_B6);
delay_ms(1000);
/*
i2c_start(); // Condicion Inicio
i2c_write(PIC5);// Direccion dispositivo
delay_ms(3); // *** Necesario ***
i2c_write(dato);// dato
delay_ms(3); // *** Necesario ***
//i2c_write(++dato);// dato
i2c_stop(); // Stop
*/
bus_i2c_rw(PIC5, mi_dato) ;
output_low(PIN_B6);
delay_ms(1000);
}//fin if
}//fin while
}
aca debajo el esclavo:
..
Leyendo el data del pic en su seccion de i2c...