Autor Tema: :: timer interrupe comunicacion i2c::  (Leído 2709 veces)

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

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
:: timer interrupe comunicacion i2c::
« en: 15 de Agosto de 2012, 17:05:20 »
Hola

necesito saber como solucionar un problema entre el timer y el i2c.
o como lo harian ustedes.

El caso es que el servo necesita de los timer (su interupcion) para su sincronizacion,
pero tampoco puedo pasar de la interupcion del ssp ya que la recepcion del i2c depende  
de su interrup y si se interrumpe la comunicacion no le llega los nuevos angulos.

tanto el pwm como el i2c es por software sin forzar.

Tengo el tipico caso de lo que se conoce en base de datos como "el abrazo del oso."

Esta si que es buena...


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: :: timer interrupe comunicacion i2c::
« Respuesta #1 en: 15 de Agosto de 2012, 18:18:45 »
tanto el pwm como el i2c es por software sin forzar.

Si usas interrupción por i2c tiene que ser por hardware. Muestra como haces el tema de las interrupciones, es raro lo que comentas si lo implementas bien.
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: timer interrupe comunicacion i2c::
« Respuesta #2 en: 15 de Agosto de 2012, 20:20:08 »
 Hola
esto que pongo es el codigo del esclavo
el cual tiene implementado varias interrupciones:
timer0, timer1, ssp,..

este es el codigo del main:

Código: C++
  1. //variables i2c
  2. int8 state, comando;
  3. //int8 iic_dato, Direc_master;
  4. int8 direc_Mas_esc, recivo=0;
  5. int8 dato[4];
  6. //int8 dato_1[4];
  7. int8 cnt=0;
  8. int8 angulo;
  9. int8 inclina;
  10. int8 motor_on;
  11.  
  12. //servos pwm soft
  13. int8 servos[]={sv_0,sv_1,sv_2,sv_3,sv_4,0,0,0,0,0};
  14.  
  15.  
  16. //variables timer
  17. int8 cnt_t0=0;
  18. int8 cnt_t1=0;
  19. int1 t0=0;
  20. int1 t1=0;
  21.  
  22. #priority ssp, timer0, timer1,
  23. /*
  24. #int_RTCC
  25. void  RTCC_isr(void)
  26. {
  27.  
  28. }
  29. */
  30. #int_TIMER0
  31. void  TIMER0_isr(void)
  32. {  
  33.    
  34.    output_high (servos[cnt_t0]);             //activo servo
  35.    //ventana de 1 ms cambio de svmotor
  36.      
  37.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);   //activo timer1
  38.    set_timer1(g_0);  //tiempo en alto
  39.    
  40.    set_timer0(ventana);                      //desborda cada 1ms
  41.  
  42.    if(cnt_t0==20){ //cambio de ventana
  43.       cnt_t0=0;
  44.       //printf("\n\r -->T0 1ms 20 ventanas  1 perido");
  45.    }
  46.  
  47.    //printf("\n\r cnt_t0: %d "cnt_t0);
  48.    //cnt_t0=cnt_t0+1; //incremta ventana => motor
  49. }
  50.  
  51. #int_TIMER1
  52. void  TIMER1_isr(void)
  53. {
  54. output_low (servos[cnt_t0]);     //apago motor
  55. //printf("\n\r OFF servo: %d "cnt_t0-1);
  56. cnt_t0=cnt_t0+1;                 // incremta ventana => motor
  57. setup_timer_1(0);                // desactivo timer 1
  58.  
  59. }
  60.  
  61. /*
  62. #int_SSP
  63. void  SSP_isr(void)
  64. {
  65.  
  66. }
  67. */
  68.  
  69. #int_SSP
  70. void  SSP_isr(void){
  71. disable_interrupts(INT_SSP);
  72. disable_interrupts(INT_TIMER0);
  73. disable_interrupts(INT_TIMER1);
  74. //int8 comando;
  75. //master escribe de esclavo  menor de <80
  76. //master lee de esclavo      mayor de >80
  77.  
  78. state = i2c_isr_state();
  79.    if(state==0)
  80.    {
  81.       direc_Mas_esc=i2c_read();
  82.       if(direc_Mas_esc==S1){
  83.       printf("\n\r --> Direccion: %X "direc_Mas_esc);
  84.          recivo=1;
  85.       }
  86.      
  87.       //printf("\n\r Direccion : %X "direc_Mas_esc); //para solo imprime s1
  88.       //if(SSPADD==S1){
  89.       //printf("\n\r state==0 soy S1: %X "SSPADD);
  90.       //}
  91.      
  92.    }
  93.    
  94.    if(state < 0x80)
  95.    {
  96.      
  97.       //iic_dato=i2c_read();
  98.       //comando=iic_dato;
  99.       if(recivo==1){
  100.          dato[cnt]=i2c_read();
  101.          
  102.          // coreccion para lo de error en dato=1
  103.          if(dato[cnt]==10){
  104.            dato[cnt]=1;
  105.          }
  106.          
  107.          if(dato[0]==1){ // control de motor
  108.             output_high(PIN_B6);
  109.             motor_on=1;
  110.          }
  111.          
  112.          if(dato[cnt]!=0){ //control de angulo
  113.             angulo=dato[1];
  114.             inclina=dato[2];
  115.          }
  116.          ///////////////////////
  117.          
  118.          printf("\n\r dato[%u]:%u"cnt,dato[cnt]);
  119.          recivo=0;
  120.          
  121.          // para resetear almacen dato
  122.          if(dato[cnt]==99){  //cnt resetea en 3 si es 99
  123.            cnt=0;
  124.          }
  125.          else{
  126.            cnt=cnt+1;
  127.          }
  128.          
  129.       }
  130.      
  131.      
  132.      
  133.  
  134.      
  135.  
  136.      
  137.       //Aqui colocas lo que necesites hacer con el dato enviado por el maestro
  138.       //printf("\n\r comando recibo <80: %u"comando);
  139.      
  140.    }
  141.    if(state == 0x80)
  142.    {
  143.    
  144.     switch(comando)
  145.       {
  146.          Case Pide_Dato1:
  147.             i2c_write(Dato1);
  148.             output_high(PIN_B7);
  149.             delay_ms(300);
  150.             output_low(PIN_B7);
  151.            
  152.             printf("\n\r Llego dato.");
  153.             break;
  154.          Case Pide_Dato2:
  155.             i2c_write(Dato2);
  156.             output_high(PIN_B2);
  157.             break;
  158.       }
  159.    }
  160. }
  161.  
  162.  
  163. #int_BUSCOL
  164. void  BUSCOL_isr(void)
  165. {
  166.  
  167. }
  168.  
  169.  
  170.  
  171. void main()
  172. {
  173.  
  174.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  175.    setup_adc(ADC_CLOCK_DIV_2);
  176.    setup_wdt(WDT_OFF);
  177.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  178.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  179.    setup_timer_2(T2_DISABLED,0,1);
  180.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  181.    setup_comparator(NC_NC_NC_NC);
  182.    setup_vref(FALSE);
  183.    enable_interrupts(INT_RTCC);
  184.    enable_interrupts(INT_TIMER0);
  185.    enable_interrupts(INT_TIMER1);
  186.    enable_interrupts(INT_SSP);
  187.    enable_interrupts(INT_BUSCOL);
  188.    enable_interrupts(GLOBAL);
  189. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  190.  
  191.    // TODO: USER CODE!!
  192. set_timer0(ventana);
  193. setup_timer_1(T1_DISABLED);  // timer 1 no activo
  194. //set_timer1(0);
  195.  
  196. printf("\n\r Prueba de timer: ");
  197.  
  198.    while(true){
  199.       if(t0==2){
  200.          printf("\n\r -->T0 20ms");
  201.       }
  202.       if(t1==4){
  203.          printf("\n\r -->T1 40ms");
  204.       }
  205.    }
  206. }


este es el de 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 HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz 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.  
  34. //esclavos
  35. #define S1 0xB0
  36. #define S2 0xB2
  37. #define S4 0xB4
  38. #define S6 0xB6
  39. #define S8 0xB8
  40.  
  41. // define los servos
  42. #define sv_0 PIN_B7
  43. #define sv_1 PIN_B6
  44. #define sv_2 PIN_C1
  45. #define sv_3 PIN_C2
  46. #define sv_4 PIN_C0
  47. /*
  48. #define sv_5 PIN_B7
  49. #define sv_6 PIN_B6
  50. #define sv_7 PIN_B5
  51. #define sv_8 PIN_B4
  52. #define sv_9 PIN_B3
  53. */
  54.  
  55. // tick para grados 16 bit : 65536 tick 0.2us -->13107.2us
  56.  
  57. //tiempo entre servomotor
  58. const int16 ventana = 60536;  // 65536 - 5000 = n tick para INT 1000us :1ms
  59.  
  60. const int16 g_0    = 64936;    //65536 -  600  120us
  61. //const int16 g_90   = 63661;    //65536 - 1875  375us
  62. const int16 g_90   = 58036;    //65536 - 7500  375us
  63. const int16 g_180  = 62386;    //65536 - 3150  630us
  64.  
  65. const int16 g_45   = 63661;    //65536 - 1875  375us
  66. const int16 g_60   = 63661;    //65536 - 1875  375us
  67. const int16 g_75   = 63661;    //65536 - 1875  375us
  68.  
  69. const int16 g_105  = 63661;    //65536 - 1875  375us
  70. const int16 g_120  = 63661;    //65536 - 1875  375us
  71. const int16 g_135  = 63661;    //65536 - 1875  375us
  72.  
  73. static int16 valor_PWM[]={g_0, g_90,g_180,0,0,0,0};
  74. static int16 ini_PWM[]={g_90, g_90, g_90, g_90,0,0,0,0}; //8 servos
  75.  
  76. #define Pide_Dato1 2
  77. #define Pide_Dato2 3
  78. #define dato1 4
  79. #define dato2 5
  80.  
  81. #use delay(clock=20000000)
  82. #define I2C_SCL   PIN_B7
  83. #define I2C_SDA   PIN_C4
  84. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  85. #use i2c(Slave,Slow,sda=PIN_B0,scl=PIN_B1,address=0xB0)

este codigo lo simulo  con proteus

por i2c le paso 4 valores y solo me pasa 1 el resto caput..



« Última modificación: 15 de Agosto de 2012, 20:27:16 por pajaro »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: :: timer interrupe comunicacion i2c::
« Respuesta #3 en: 15 de Agosto de 2012, 21:27:02 »
Debes usar el módulo MSSP, sino como vas a generar una interrupción  :shock: En el PIC18F2550 esta en los pines RB0 y RB1  ;-)

Además dentro de una interrupción no podes usar printf, y menos si se necesita que sea lo más rápida posible como en este caso  :?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: timer interrupe comunicacion i2c::
« Respuesta #4 en: 15 de Agosto de 2012, 22:34:29 »
Hola suky

cuando el master escribe en el eclavo por i2c
genera trafico en el bus i2c en ese momento
se genera en el esclavo  una interrupcion
la INT_SSP. es la encargada de recoger en el esclavo lo que manda el master
en el pin b0 y b1 estan los pines del i2c SDA y SCL correspondientemente.

los printf los puse para poder ver lo que se cuece en el master y en el esclavo,
mediante el terminal virtual.

No entiendo tu respuesta, me la puedes explicar.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: :: timer interrupe comunicacion i2c::
« Respuesta #5 en: 16 de Agosto de 2012, 00:13:54 »
A! vi:

Código: [Seleccionar]
#define I2C_SCL   PIN_B7
#define I2C_SDA   PIN_C4

 :?

Respecto a printf, fácil no los uses en una interrupción  :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: timer interrupe comunicacion i2c::
« Respuesta #6 en: 16 de Agosto de 2012, 07:50:03 »
Hola  SuKy  :mrgreen:

esas lineas me las pone  el asistente  de proyectos automaticamante
de normal las suelo borrar, algunas veces se me olvida quitarlas como es este caso
si te fijas mas abajo en el use i2c pone b0 y b1.

voy a comentar esas lineas en el pos anterior.
pero despues de eso el problema persiste.

La pregunta es como haces para encajar la interupcion del
master por el ssp cuando el timer 0 y el timer 1 no trabajan.

ademas otra cosa, si tengo que enviar 4 valores y por lo visto solo le da tiempo
a uno como me las apaño?

tendria que enviar el master sin tener que estar pendiente del sclavo
en los aviones de radio control como lo haces ?
no creo que cada ves que le envien un nuevo comando el avion se caiga.

voy a comentar los print a ver si gano velocidad?

se te ocurre alguna solucion a este problema,
a mi se me ocurre una muy drastica cuando entra en la interrumción ssp
desactivar las otras interrupciones y no activarlas hasta que sale,
pero de essa forma me cargo la sincronizacion d los pwm.

De todas formas cambie la prioridad y puses primero la de ssp y aun asi.

a lo dicho como solventariamos el problema..



« Última modificación: 16 de Agosto de 2012, 07:52:52 por pajaro »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: :: timer interrupe comunicacion i2c::
« Respuesta #7 en: 16 de Agosto de 2012, 12:50:18 »
Si CCS implementara correctamente las interrupciones y MSSP estuviera bajo nivel de prioridad y los timer alta prioridad, al recibir un dato por I2C se ejecuta su interrupción pero si en ese instante también salta la del timer, ejecuta la del timer y después vuelve. Hay que pensar de realizar rutinas cortas y rápidas, y como todo se maneja por hardware no deberías de tener problemas.

Ahora si te pones a imprimir, "llego dato por I2C", "envio respuesta"  :shock: como que no es para nada rapida  :mrgreen: Tampoco generar delays de ms!!!

Saludos!
« Última modificación: 16 de Agosto de 2012, 12:54:23 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: timer interrupe comunicacion i2c::
« Respuesta #8 en: 16 de Agosto de 2012, 14:21:11 »
hola Suky

El ccs hace bien las cosas?
tengo entendido que si se esta ejecutando un interupcion
hasta que no termina no le da paso a la otra.

Tu que opinas.?


 jugando con las interrupciones consegui ponerlos a comunicar
cuando entra en la interrupcion desactivo el resto entonces no funciona pero
si cuando sale de la interupcion vuelvo a habilitar funciona

pero hay un problema, cambie las prioridades T0,T1,SSP

si envio comentando los printff el ebug de i2c me retornoa nack
si lo hago con printf me retorna ack..

otra cosa .. el proteus me dice Sporuis SCL trasmition en 0.000021s
y el debug de i2c me dice..

21.200us   ?

21.200us  noise SCL=0 SL0


significa que hay ruido pero de donde viene ese ruido.

tambien me da un mensaje raro:
que se repite muchas veces:

OSCTUNE register not fully modelled - the TUNx bits are not modelled

nunca antes vi ese mensaje..

investigue el data y tiene que ver con el oscilador interno,
pero yo uso un oscilador externo de 20Mz.

Alguien tiene alguna idea de esos errores..!?



« Última modificación: 16 de Agosto de 2012, 17:29:24 por pajaro »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: timer interrupe comunicacion i2c::
« Respuesta #9 en: 16 de Agosto de 2012, 14:57:56 »
  Que es hora de probar otro compilador  :D :D :D

  Perdón  :oops: pero me vi tentado... después de tantos dolores de cabeza que te viene dando CCS, sinceramente creo que no sería mala idea pensar en otro compilador
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: :: timer interrupe comunicacion i2c::
« Respuesta #10 en: 16 de Agosto de 2012, 15:07:11 »
hola Suky

El ccs hace bien las cosas?
tengo entendido que si se esta ejecutando un interupcion
hasta que no termina no le da paso a la otra.

Tu que opinas.?



Has leído el datasheet del microcontrolador? ¿¿Vas aprovachar que puedes usar los niveles de prioridad?? Parece chiste, pero vengo hablando de prioridad alta y baja vectorizada y haces esa pregunta  :?
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: timer interrupe comunicacion i2c::
« Respuesta #11 en: 16 de Agosto de 2012, 18:10:30 »
Hola
AngelGris
No creas que no se me ha pasado de veces por la cabeza,  :mrgreen:
pero si me cambio sera a mejor, no a peor y tras una larga y precisa comparacion
de pros y contras.

Ademas hace un tiempo que voy buscando un ide que me permita programar mas de una familia de micros
pero aun no di con el, y no sera por falta de ganas..



Suky
Lo de las prioridades si las empece a usar, pero no hay diferencia
puedes combinarlas como quieras el resultado es el mismo...

Otra cosa,... esto es una... muy buena consigo enviar del master al esclavo y el debug de i2c me lo reconoce
respondiendo con ack, paquete ack ...paquete ack,  pero si comento los /////printf/////
 el debug i2c ya no me los reconoce y me tira no ack, mire el retardo de un printf y es casi 20ms.

Tambien descubri el reacticar una interrupcion y sin ponerla a disable
puede hacer que te imprima el mensa del main o no, logica.. ninguna que yo sepa..

Menuda tarde la que llevo..

pongo el codigo para que le sacaies pegas a ver si entre mis ojos y los vuestros
descubrimos.. cosas nuevas..

codigo main:

Código: C++
  1. //variables i2c
  2. int8 state, comando;
  3. //int8 iic_dato, Direc_master;
  4. int8 direc_Mas_esc, recivo=0;
  5. int8 dato[4];
  6. //int8 dato_1[4];
  7. int8 cnt=0;
  8. int8 angulo;
  9. int8 inclina;
  10. int8 motor_on;
  11.  
  12. //servos pwm soft
  13. int8 servos[]={sv_0,sv_1,sv_2,sv_3,sv_4,0,0,0,0,0};
  14.  
  15.  
  16. //variables timer
  17. int8 cnt_t0=0;
  18. int8 cnt_t1=0;
  19. int1 t0=0;
  20. int1 t1=0;
  21.  
  22. #priority  timer0, timer1, ssp    
  23. /*
  24. #int_RTCC
  25. void  RTCC_isr(void)
  26. {
  27.  
  28. }
  29. */
  30. #int_TIMER0
  31. void  TIMER0_isr(void)
  32. {  
  33.    
  34.    output_high (servos[cnt_t0]);             //activo servo
  35.    //ventana de 1 ms cambio de svmotor
  36.      
  37.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);   //activo timer1
  38.  
  39.    set_timer1(g_90);  //tiempo en alto
  40.    
  41.    set_timer0(ventana);                      //desborda cada 1ms
  42.  
  43.    if(cnt_t0==20){ //cambio de ventana
  44.       cnt_t0=0;
  45.       //printf("\n\r -->T0 1ms 20 ventanas  1 perido");
  46.    }
  47.  
  48.    //printf("\n\r cnt_t0: %d "cnt_t0);
  49.    //cnt_t0=cnt_t0+1; //incremta ventana => motor
  50. }
  51.  
  52. #int_TIMER1
  53. void  TIMER1_isr(void)
  54. {
  55. output_low (servos[cnt_t0]);     //apago motor
  56. //printf("\n\r OFF servo: %d "cnt_t0-1);
  57. cnt_t0=cnt_t0+1;                 // incremta ventana => motor
  58. setup_timer_1(0);                // desactivo timer 1
  59.  
  60. }
  61.  
  62.  
  63. #int_SSP
  64. void  SSP_isr(void){
  65. //disable_interrupts(INT_SSP);
  66. //disable_interrupts(INT_TIMER0);
  67. //disable_interrupts(INT_TIMER1);
  68. //int8 comando;
  69. //master escribe de esclavo  menor de <80
  70. //master lee de esclavo      mayor de >80
  71.  
  72. state = i2c_isr_state();
  73.    if(state==0)
  74.    {
  75.       direc_Mas_esc=i2c_read();
  76.       if(direc_Mas_esc==S1){
  77.       ////////////////////////////////
  78.       printf("\n\r --> Direccion: %X "direc_Mas_esc); //--- debug mas rapido
  79.       ////////////////////////////////
  80.          recivo=1;
  81.          output_high(PIN_B2);  //---debug rapido
  82.       }
  83.      
  84.       //printf("\n\r Direccion : %X "direc_Mas_esc); //para solo imprime s1
  85.       //if(SSPADD==S1){
  86.       //printf("\n\r state==0 soy S1: %X "SSPADD);
  87.       //}
  88.      
  89.    }
  90.    
  91.    if(state < 0x80)
  92.    {
  93.      
  94.       //iic_dato=i2c_read();
  95.       //comando=iic_dato;
  96.       if(recivo==1){
  97.          dato[cnt]=i2c_read();
  98.          
  99.          // coreccion para lo de error en dato=1
  100.          if(dato[cnt]==10){
  101.            dato[cnt]=1;
  102.          }
  103.          
  104.          if(dato[0]==1){ // control de motor
  105.             output_high(PIN_B6);
  106.             motor_on=1;
  107.          }
  108.          
  109.          if(dato[cnt]!=0){ //control de angulo
  110.             angulo=dato[1];
  111.             inclina=dato[2];
  112.          }
  113.          ///////////////////////
  114.          
  115.          /////////////////////////////
  116.          printf("\n\r dato[%u]:%u"cnt,dato[cnt]);  //-- debug +rapido
  117.          /////////////////////////////
  118.          recivo=0;
  119.          output_low(PIN_B2);  //--- debug rapido
  120.          
  121.          // para resetear almacen dato
  122.          if(dato[cnt]==99){  //cnt resetea en 3 si es 99
  123.            cnt=0;
  124.          }
  125.          else{
  126.            cnt=cnt+1;
  127.          }
  128.          
  129.       }
  130.      
  131.      
  132.      
  133.  
  134.      
  135.  
  136.      
  137.       //Aqui colocas lo que necesites hacer con el dato enviado por el maestro
  138.       //printf("\n\r comando recibo <80: %u"comando);
  139.      
  140.    }
  141.    if(state == 0x80)
  142.    {
  143.     /*
  144.     switch(comando)
  145.       {
  146.          Case Pide_Dato1:
  147.             i2c_write(Dato1);
  148.             output_high(PIN_B7);
  149.             delay_ms(300);
  150.             output_low(PIN_B7);
  151.            
  152.             printf("\n\r Llego dato.");
  153.             break;
  154.          Case Pide_Dato2:
  155.             i2c_write(Dato2);
  156.             output_high(PIN_B2);
  157.             break;
  158.       }
  159.       */
  160.    }
  161. enable_interrupts(INT_SSP);  //para imprimir completo priff del main
  162. //enable_interrupts(INT_TIMER0);
  163. //enable_interrupts(INT_TIMER1);
  164. }
  165.  
  166.  
  167. #int_BUSCOL
  168. void  BUSCOL_isr(void)
  169. {
  170.  
  171. }
  172.  
  173.  
  174.  
  175. void main()
  176. {
  177.  
  178.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  179.    setup_adc(ADC_CLOCK_DIV_2);
  180.    setup_wdt(WDT_OFF);
  181.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  182.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  183.    setup_timer_2(T2_DISABLED,0,1);
  184.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  185.    setup_comparator(NC_NC_NC_NC);
  186.    setup_vref(FALSE);
  187.    enable_interrupts(INT_RTCC);
  188.    enable_interrupts(INT_TIMER0);
  189.    enable_interrupts(INT_TIMER1);
  190.    enable_interrupts(INT_SSP);
  191.    enable_interrupts(INT_BUSCOL);
  192.    enable_interrupts(GLOBAL);
  193. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  194.  
  195.    // TODO: USER CODE!!
  196. set_timer0(ventana);
  197. setup_timer_1(T1_DISABLED);  // timer 1 no activo
  198. //set_timer1(0);
  199.  
  200. printf("\n\r Prueba de timer: ");
  201.  
  202.    while(true){
  203.       if(t0==2){
  204.          printf("\n\r -->T0 20ms");
  205.       }
  206.       if(t1==4){
  207.          printf("\n\r -->T1 40ms");
  208.       }
  209.       enable_interrupts(INT_SSP);
  210.       enable_interrupts(INT_TIMER0);
  211.       enable_interrupts(INT_TIMER1);  
  212.    }
  213. }

codigo 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 HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz 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. //timer 0
  34. /*
  35. #DEFINE T0CON 0xFD5     // timer0
  36. #DEFINE T1CON 0xFCD     // timert1
  37.  
  38. #BIT TMR0ON = T0CON.7   // valor enable del timer0 1=on, 0=Off
  39. #BIT RD16 = T1CON.7     // valor enable del timer0 1=on, 0=Off
  40.  
  41. #define TIMER1_ON RD16
  42. */
  43. //esclavos
  44. #define S1 0xB0
  45. #define S2 0xB2
  46. #define S4 0xB4
  47. #define S6 0xB6
  48. #define S8 0xB8
  49.  
  50. // define los servos
  51. #define sv_0 PIN_B7
  52. #define sv_1 PIN_B6
  53. #define sv_2 PIN_C1
  54. #define sv_3 PIN_C2
  55. #define sv_4 PIN_C0
  56. /*
  57. #define sv_5 PIN_B7
  58. #define sv_6 PIN_B6
  59. #define sv_7 PIN_B5
  60. #define sv_8 PIN_B4
  61. #define sv_9 PIN_B3
  62. */
  63.  
  64. // tick para grados 16 bit : 65536 tick 0.2us -->13107.2us
  65.  
  66. //tiempo entre servomotor
  67. const int16 ventana = 60536;  // 65536 - 5000 = n tick para INT 1000us :1ms
  68.  
  69. const int16 g_0    = 64936;    //65536 -  600  120us
  70. const int16 g_90   = 63661;    //65536 - 1875  375us
  71. //const int16 g_90   = 58036;    //65536 - 7500  375us
  72. const int16 g_180  = 62386;    //65536 - 3150  630us
  73.  
  74. const int16 g_45   = 63661;    //65536 - 1875  375us
  75. const int16 g_60   = 63661;    //65536 - 1875  375us
  76. const int16 g_75   = 63661;    //65536 - 1875  375us
  77.  
  78. const int16 g_105  = 63661;    //65536 - 1875  375us
  79. const int16 g_120  = 63661;    //65536 - 1875  375us
  80. const int16 g_135  = 63661;    //65536 - 1875  375us
  81.  
  82. static int16 valor_PWM[]={g_90, g_0,g_180,0,0,0,0};
  83. static int16 ini_PWM[]={g_90, g_90, g_90, g_90,0,0,0,0}; //8 servos
  84.  
  85. #define Pide_Dato1 2
  86. #define Pide_Dato2 3
  87. #define dato1 4
  88. #define dato2 5
  89.  
  90. #use delay(clock=20000000)
  91. //#define I2C_SCL   PIN_B7
  92. //#define I2C_SDA   PIN_C4
  93. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  94. #use i2c(Slave,Slow,sda=PIN_B0,scl=PIN_B1,address=0xB0)

este codigo permite enviar del master al esclavo,
con la pega que no le puedo quitar los printf //// recuadrados ///  
de ser asi ya no envia ack sino Nack
tambien al ser asi el timer es interumpido inevitablemente.

a y aun hay mas el cuadro de mensajes dice

Spurios SCL trasmision ....xxxxs
curiosamnete coincide con el tiempo que al inicio se queda en el debug i2c al arrancar
dice
   21.200us ?
     +   21.200us noise SCL=0 (SL0)
     +  10.918s   noise SCL=1 (WHI)
     +  10.918s                S
    ....
    ....

aca empieza la comunicación
    


a mi me da que quiere entra al esclavo pero este como esta el timer no le deja
y repite y repite ....hasta entra porque el mensaje ese despues no lo muestra

Hay alguna forma humana de sacar el log de emnsajes de alguna forma racional?

« Última modificación: 16 de Agosto de 2012, 18:13:05 por pajaro »