Autor Tema: :: Depurado del protocolo I2c : proteus: CCS ::  (Leído 1618 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
:: Depurado del protocolo I2c : proteus: CCS ::
« en: 21 de Agosto de 2012, 17:58:34 »
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 MASTER

cabecera:

Código: C++
  1. #include <18F2550.h>
  2. #device adc=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  6. #FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES BORV20                   //Brownout reset at 2.0V
  10. #FUSES NOPUT                    //No Power Up Timer
  11. #FUSES NOCPD                    //No EE protection
  12. #FUSES STVREN                   //Stack full/underflow will cause reset
  13. #FUSES NODEBUG                  //No Debug mode for ICD
  14. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  15. #FUSES NOWRT                    //Program memory not write protected
  16. #FUSES NOWRTD                   //Data EEPROM not write protected
  17. #FUSES IESO                     //Internal External Switch Over mode enabled
  18. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  19. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  20. #FUSES NOWRTC                   //configuration not registers write protected
  21. #FUSES NOWRTB                   //Boot block not write protected
  22. #FUSES NOEBTR                   //Memory not protected from table reads
  23. #FUSES NOEBTRB                  //Boot block not protected from table reads
  24. #FUSES NOCPB                    //No Boot Block code protection
  25. #FUSES MCLR                     //Master Clear pin enabled
  26. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  27. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  28. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  29. #FUSES CPUDIV4                  //System Clock by 4
  30. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  31. #FUSES VREGEN                   //USB voltage regulator enabled
  32.  
  33. #use delay(clock=20000000)
  34. #define I2C_SDA   PIN_B0
  35. #define I2C_SCL   PIN_B1
  36. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  37. #use i2c(Master,Slow,sda=PIN_B0,scl=PIN_B1,FORCE_HW)
  38.  
  39. //Leds que se iluminaran
  40. #DEFINE LED1 PIN_B7  //PIN 3
  41.  
  42. //pulsadores
  43. #DEFINE P1 PIN_A4    
  44. #DEFINE P2 PIN_A5
  45.  
  46. //esclavos de i2c
  47. #DEFINE PIC2 0xB0    //Direccion dispositivo PIC 2 (esclavo)
  48. #DEFINE PIC3 0xB2    //Direccion dispositivo PIC 3 (esclavo)
  49. #DEFINE PIC4 0xB4    //Direccion dispositivo PIC 4 (esclavo)
  50. #DEFINE PIC5 0xB6    //Direccion dispositivo PIC 5 (esclavo)
  51. #DEFINE PIC6 0xB8    //Direccion dispositivo PIC 6 (esclavo)
  52.  
  53. #DEFINE PICx 0xB0    // probando i2c
  54.  
  55. void bus_i2c_rw(int8 PIC, int8 DATO){
  56.      i2c_start();    // Condicion Inicio
  57.      i2c_write(PIC);// Direccion dispositivo
  58.      //delay_ms(3);    // *** Necesario ***
  59.      i2c_write(DATO);// dato
  60.      //delay_ms(3);    // *** Necesario ***
  61.      //i2c_write(++dato);// dato
  62.      i2c_stop();     // Stop
  63.      //delay_us(20);
  64.      
  65. }
  66.  
  67. void bus_i2c_rw_v(int8 PIC, int8 *DATO[], int8 r){
  68.      int8 a;
  69.      i2c_start();    // Condicion Inicio
  70.      i2c_write(PIC);// Direccion dispositivo
  71.      delay_ms(3);    // *** Necesario ***
  72.      for(a=0;a<r;a++){
  73.      i2c_write(DATO[a]);// dato
  74.      delay_ms(3);    // *** Necesario ***
  75.      }
  76.      //i2c_write(++dato);// dato
  77.      i2c_stop();     // Stop
  78.      delay_us(20);
  79.      
  80. }

Progrma principal:

Código: C++
  1. void main()
  2. {
  3.  
  4.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  5.    setup_adc(ADC_CLOCK_DIV_2);
  6.    setup_wdt(WDT_OFF);
  7.    setup_timer_0(RTCC_INTERNAL);
  8.    setup_timer_1(T1_DISABLED);
  9.    setup_timer_2(T2_DISABLED,0,1);
  10.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  11.    setup_comparator(NC_NC_NC_NC);
  12.    setup_vref(FALSE);
  13. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  14.  
  15.    // TODO: USER CODE!!
  16. int8 mi_dato=0;
  17. int8 dato[]={45,90,1};
  18.  
  19. int8 angulo;
  20. int8 inclina;
  21. angulo=1; //1-2-3-4-5-6-7
  22. inclina=1; //1-2-3-4-5-6-7
  23.  
  24.   delay_ms(1000);  //Hay que dejar tiempo que se inicialize el esclavo
  25.  
  26.   while(true)
  27.   {
  28.   if(input(P1)==1){
  29.      output_high(PIN_B7);
  30.      delay_ms(100);
  31.  /*
  32.      i2c_start();    // Condicion Inicio
  33.      i2c_write(PIC4);// Direccion dispositivo
  34.      delay_ms(3);    // *** Necesario ***
  35.      i2c_write(dato);// dato
  36.      delay_ms(3);    // *** Necesario ***
  37.      //i2c_write(++dato);// dato
  38.      i2c_stop();     // Stop
  39.   */
  40.   printf("\n\r mi_dato: %u"angulo);
  41.   bus_i2c_rw(PIC4,angulo);
  42.  
  43.   //printf("\n\r mi_dato: %u"angulo);
  44.  
  45.      output_low(PIN_B7);
  46.      delay_ms(1000);
  47.   }
  48.   if(input(P2)==1){  
  49.      mi_dato=mi_dato+1;
  50.      
  51.      output_high(PIN_B6);
  52.      delay_ms(1000);
  53.  /*    
  54.      i2c_start();    // Condicion Inicio
  55.      i2c_write(PIC5);// Direccion dispositivo
  56.      delay_ms(3);    // *** Necesario ***
  57.      i2c_write(dato);// dato
  58.      delay_ms(3);    // *** Necesario ***
  59.      //i2c_write(++dato);// dato
  60.      i2c_stop();     // Stop
  61.  */
  62.      bus_i2c_rw(PIC5, mi_dato) ;
  63.      
  64.      output_low(PIN_B6);
  65.      delay_ms(1000);
  66.     }//fin if
  67.    }//fin while
  68.  
  69. }

aca debajo el esclavo:

..


Leyendo el data del pic en su seccion de i2c...

« Última modificación: 21 de Agosto de 2012, 19:26:14 por pajaro »