Autor Tema: :: PIC18F250 nunca entra en #INT_SSP ::  (Leído 14552 veces)

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

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
:: PIC18F250 nunca entra en #INT_SSP ::
« en: 11 de Junio de 2012, 15:08:42 »
Hola

Tengo 3 pic conectados mediante i2c,
para la recepcion del esclavo tengo una interrupcion.

#INT_SSP

la cosa es que esta insterupcion se activa si el bus i2c tiene eventos,
lo raro es que hay eventos pero la puñetera no se entera del evento.

Si le quito la interrupcion y le pongo un bucle y printeo el bus con
i2c_read() y i2c_isr_state();

obtengo la direcion del esclavo y los datos de lectura y escritura

la obtencion es 0,1 2 3,
y 80,81,82,83

pero la interrupción del bus no se entera que hay datos como  puedo obligar a que
se active,  ¿algun metodo? ¿que hace que esto ocurra.?

#Se agradeceria una ayuda#

Un Saludo.
 

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #1 en: 11 de Junio de 2012, 16:42:25 »
  ¿Podés mostrar el código? Para activar la interrupción creo que en CCS tienes que escribir algo así "enable_interrupt(xxx)" y "enable_interrupt(global)" Siendo xxx la interrupción que quieras activar.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #2 en: 11 de Junio de 2012, 19:19:54 »
  ¿Podés mostrar el código? Para activar la interrupción creo que en CCS tienes que escribir algo así "enable_interrupt(xxx)" y "enable_interrupt(global)" Siendo xxx la interrupción que quieras activar.

como menciona AngelGris, muestra como configuras tu interrupcion y como declaras el I2C para poder ayudarte
"Nada es imposible, no si puedes imaginarlo"

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #3 en: 12 de Junio de 2012, 21:03:39 »
Hola amigos

siguiendo las indicaciones pongo el codigo:
correspondiente a 1 master (M1) y 2 esclavos (S1 , S2).
esclavo uno con interrupcion del i2c y esclavo 2 sin interrupcion del i2c.
los estoy simulando en proteus con pic18F250, el IDE de pragramacion
es bajo CCS.



codigo master

Código: C++
  1. /*******************************************************
  2. * M1.c: libreia principal
  3. *
  4. ********************************************************/
  5. #include "M1.h"
  6.  
  7.  
  8. void main()
  9. {
  10.  
  11.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  12.    setup_adc(ADC_CLOCK_DIV_2);
  13.    setup_wdt(WDT_OFF);
  14.    setup_timer_0(RTCC_INTERNAL);
  15.    setup_timer_1(T1_DISABLED);
  16.    setup_timer_2(T2_DISABLED,0,1);
  17.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  18.    setup_comparator(NC_NC_NC_NC);
  19.    setup_vref(FALSE);
  20. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  21.  
  22.    // TODO: USER CODE!!
  23.    
  24.    OUTPUT_HIGH(PIN_B3);
  25.    
  26.    printf("\n\r PIC MASTER: ");
  27.    printf("\n\r     enviando.... ");
  28.    
  29. int8 leodato,state,dato;
  30.      
  31.       state = i2c_isr_state(); //lee el estado del bus
  32.       dato=i2c_read();
  33.       printf("\n\r dato: %X  state: %X" dato,state);
  34.  
  35.       delay_ms(10);
  36.      
  37.       escribir_i2c(S1,5);
  38.      
  39.       state = i2c_isr_state(); //lee el estado del bus
  40.       dato=i2c_read();
  41.       printf("\n\r dato: %X  state: %X" dato,state);
  42.      
  43.       delay_ms(1000);
  44.      
  45.       state = i2c_isr_state(); //lee el estado del bus
  46.       dato=i2c_read();
  47.       printf("\n\r dato: %X  state: %X" dato,state);
  48.      
  49.       leodato=leer_i2c(S1);
  50.      
  51.      
  52.       state = i2c_isr_state(); //lee el estado del bus
  53.       dato=i2c_read();
  54.      
  55.       printf("\n\r leodato:%X state: %X dato: %X" leodato,state,dato);
  56.  
  57. }


Codigo Cabecera:

Código: C++
  1. /*******************************************************
  2. * s1.h: libreia de cabeceras
  3. *
  4. ********************************************************/
  5. #include <18F2550.h>
  6. #device adc=8
  7.  
  8. #FUSES NOWDT                    //No Watch Dog Timer
  9. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  10. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  11. #FUSES NOPROTECT                //Code not protected from reading
  12. #FUSES NOBROWNOUT               //No brownout reset
  13. #FUSES BORV20                   //Brownout reset at 2.0V
  14. #FUSES NOPUT                    //No Power Up Timer
  15. #FUSES NOCPD                    //No EE protection
  16. #FUSES STVREN                   //Stack full/underflow will cause reset
  17. #FUSES NODEBUG                  //No Debug mode for ICD
  18. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  19. #FUSES NOWRT                    //Program memory not write protected
  20. #FUSES NOWRTD                   //Data EEPROM not write protected
  21. #FUSES IESO                     //Internal External Switch Over mode enabled
  22. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  23. #FUSES NOPBADEN                   //PORTB pins are configured as digital I/O on RESET
  24. #FUSES NOWRTC                   //configuration not registers write protected
  25. #FUSES NOWRTB                   //Boot block not write protected
  26. #FUSES NOEBTR                   //Memory not protected from table reads
  27. #FUSES NOEBTRB                  //Boot block not protected from table reads
  28. #FUSES NOCPB                    //No Boot Block code protection
  29. #FUSES MCLR                     //Master Clear pin enabled
  30. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  31. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  32. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  33. #FUSES CPUDIV4                  //System Clock by 4
  34. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  35. #FUSES VREGEN                   //USB voltage regulator enabled
  36.  
  37. #use delay(clock=20000000)
  38. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  39. #use i2c(Master,Slow,sda=PIN_B0,scl=PIN_B1)
  40.  
  41. #include "milib.c"


mis librerias

Código: C++
  1. /*******************************************************
  2. * milib.c: libreia de mis funciones
  3. *
  4. ********************************************************/
  5. //direcciones de dispositivos
  6.  
  7. #Define M1 0xA0 //Master
  8. #Define S1 0xA2 //Esclavo 1
  9. #Define S2 0xA4 //Esclavo 2
  10. #Define S3 0xA6 //Esclavo 3
  11.  
  12.  
  13. // --- escribir en dispositivo ---
  14.  
  15. void escribir_i2c(int8 direccion, int8 dato)
  16. {
  17.    i2c_start();
  18.    i2c_write(direccion);
  19.    //i2c_write(0);//add
  20.    i2c_write(dato);
  21.    i2c_stop();
  22.    delay_us(150);
  23. }
  24.  
  25.  
  26. // --- leer del dispositivo ---
  27. int8 leer_i2c(int8 direccion)
  28. {
  29.    int8 dato = 0;
  30.    i2c_start();
  31.    i2c_write(direccion); //direccion device
  32.    //i2c_write(0); //add
  33.      
  34.    i2c_start();
  35.    i2c_write(direccion+1);
  36.    dato = i2c_read();
  37.    //dato = i2c_read(0);//add
  38.    i2c_stop();
  39.    
  40.    return(dato);
  41. }



Esclavo 1

Código: C++
  1. /*******************************************************
  2. * s1.c: libreia principal
  3. *
  4. ********************************************************/
  5. #include "s1.h"
  6.  
  7. #INT_SSP
  8. //void  SSP_isr(void) {}
  9. void ssp_interrupt(void);
  10.  
  11.  
  12.  
  13.  
  14. void main(){
  15.  
  16.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  17.    setup_adc(ADC_CLOCK_DIV_2);
  18.    setup_wdt(WDT_OFF);
  19.    setup_timer_0(RTCC_INTERNAL);
  20.    setup_timer_1(T1_DISABLED);
  21.    setup_timer_2(T2_DISABLED,0,1);
  22.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  23.    setup_comparator(NC_NC_NC_NC);
  24.    setup_vref(FALSE);
  25.    
  26.    enable_interrupts(INT_SSP);
  27.    enable_interrupts(GLOBAL);
  28. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  29.  
  30.    // TODO: USER CODE!!
  31.    
  32.    OUTPUT_HIGH(PIN_B3);
  33.    
  34.    printf("\n\r PIC ESCLAVO 1: ");
  35.    printf("\n\r     recibiendo.... ");
  36.    while(true){
  37.    
  38.    }
  39.  
  40. }


cabecera

Código: C++
  1. /*******************************************************
  2. * s1.h: libreia de cabeceras
  3. *
  4. ********************************************************/
  5. #include <18F2550.h>
  6. #device adc=8
  7.  
  8. #FUSES NOWDT                    //No Watch Dog Timer
  9. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  10. #FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
  11. #FUSES NOPROTECT                //Code not protected from reading
  12. #FUSES NOBROWNOUT               //No brownout reset
  13. #FUSES BORV20                   //Brownout reset at 2.0V
  14. #FUSES NOPUT                    //No Power Up Timer
  15. #FUSES NOCPD                    //No EE protection
  16. #FUSES STVREN                   //Stack full/underflow will cause reset
  17. #FUSES NODEBUG                  //No Debug mode for ICD
  18. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  19. #FUSES NOWRT                    //Program memory not write protected
  20. #FUSES NOWRTD                   //Data EEPROM not write protected
  21. #FUSES IESO                     //Internal External Switch Over mode enabled
  22. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  23. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  24. #FUSES NOWRTC                   //configuration not registers write protected
  25. #FUSES NOWRTB                   //Boot block not write protected
  26. #FUSES NOEBTR                   //Memory not protected from table reads
  27. #FUSES NOEBTRB                  //Boot block not protected from table reads
  28. #FUSES NOCPB                    //No Boot Block code protection
  29. #FUSES MCLR                     //Master Clear pin enabled
  30. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  31. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  32. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  33. #FUSES CPUDIV4                  //System Clock by 4
  34. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  35. #FUSES VREGEN                   //USB voltage regulator enabled
  36.  
  37. #use delay(clock=20000000)
  38. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  39. #use i2c(Slave,Slow,sda=PIN_B0,scl=PIN_B1,address=0xA2)
  40.  
  41. #include "milib.c"


mi libreria

Código: C++
  1. /*******************************************************
  2. * milib.c: libreia de mis funciones
  3. *
  4. ********************************************************/
  5. //direcciones de dispositivos
  6.  
  7. #Define M1 0xA0 //Master
  8. #Define S1 0xA2 //Esclavo 1
  9. #Define S2 0xA4 //Esclavo 2
  10. #Define S3 0xA6 //Esclavo 3
  11.  
  12.  
  13. // --- escribir en dispositivo ---
  14.  
  15. void escribir_i2c(int8 direccion, int8 dato)
  16. {
  17.    i2c_start();
  18.    i2c_write(direccion);
  19.    //i2c_write(0);//add
  20.    i2c_write(dato);
  21.    i2c_stop();
  22.    delay_us(150);
  23. }
  24.  
  25.  
  26. // --- leer del dispositivo ---
  27. int8 leer_i2c(int8 direccion)
  28. {
  29.    int8 dato = 0;
  30.    i2c_start();
  31.    i2c_write(direccion); //direccion device
  32.    //i2c_write(0); //add
  33.      
  34.    i2c_start();
  35.    i2c_write(direccion+1);
  36.    dato = i2c_read();
  37.    //dato = i2c_read(0);//add
  38.    i2c_stop();
  39.    
  40.    return(dato);
  41. }
  42. // -- funcion interrupcion ---
  43.  
  44. void ssp_interrupt(void){
  45.    int8 state, buffer[];
  46.    int8 i2c_dato_entrada,i2c_dato_funcion;
  47.  
  48.    state = i2c_isr_state();
  49.    if(state >= 0x80){                    //master pide un dato
  50.       i2c_write(buffer[i2c_dato_entrada]);          
  51.    }
  52.    else if(state == 0x01){               //Master esta enviando datos
  53.       i2c_dato_entrada = i2c_read();
  54.       buffer[i2c_dato_funcion] = i2c_dato_entrada;
  55.    }
  56.  
  57. }


Esclavo 2


Código: C++
  1. /*******************************************************
  2. * s2.c: libreia principal
  3. *
  4. ********************************************************/
  5. #include "s2.h"
  6. //#int_SSP
  7. //void ssp_interrupt(void);
  8.  
  9.  
  10.  
  11. void main()
  12. {
  13.  
  14.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  15.    setup_adc(ADC_CLOCK_DIV_2);
  16.    setup_wdt(WDT_OFF);
  17.    setup_timer_0(RTCC_INTERNAL);
  18.    setup_timer_1(T1_DISABLED);
  19.    setup_timer_2(T2_DISABLED,0,1);
  20.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  21.    setup_comparator(NC_NC_NC_NC);
  22.    //setup_vref(FALSE);
  23.    
  24.    //enable_interrupts(INT_SSP);// las deshabilito porque lee cosas raras
  25.    //enable_interrupts(GLOBAL); // las deshabilito porque lee cosas raras
  26. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  27.  
  28.    // TODO: USER CODE!!
  29.    printf("\n\r PIC ESCLAVO 2: ");
  30.    printf("\n\r     recibiendo.... ");
  31.    
  32.    int8 state,leo;
  33.    
  34.    OUTPUT_HIGH(PIN_B3);
  35.    
  36.    while (true) {
  37.        
  38.      
  39.    state = i2c_isr_state(); //lee el estado del bus
  40.    leo=i2c_read();
  41.    printf("\n\r leo: %X  state: %X  "leo,state);
  42.    delay_ms(1000);
  43.    state = i2c_isr_state(); //lee el estado del bus
  44.    leo=i2c_read();
  45.    printf("\n\r leo: %X  state: %X  "leo,state);
  46.    
  47.    }//fin while
  48.  
  49. }


cabeceras

Código: C++
  1. /*******************************************************
  2. * s2.h: libreia de cabeceras
  3. *
  4. ********************************************************/
  5. #include <18F2550.h>
  6. #device adc=8
  7.  
  8. #FUSES NOWDT                    //No Watch Dog Timer
  9. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  10. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  11. #FUSES NOPROTECT                //Code not protected from reading
  12. #FUSES NOBROWNOUT               //No brownout reset
  13. #FUSES BORV20                   //Brownout reset at 2.0V
  14. #FUSES NOPUT                    //No Power Up Timer
  15. #FUSES NOCPD                    //No EE protection
  16. #FUSES STVREN                   //Stack full/underflow will cause reset
  17. #FUSES NODEBUG                  //No Debug mode for ICD
  18. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  19. #FUSES NOWRT                    //Program memory not write protected
  20. #FUSES NOWRTD                   //Data EEPROM not write protected
  21. #FUSES IESO                     //Internal External Switch Over mode enabled
  22. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  23. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  24. #FUSES NOWRTC                   //configuration not registers write protected
  25. #FUSES NOWRTB                   //Boot block not write protected
  26. #FUSES NOEBTR                   //Memory not protected from table reads
  27. #FUSES NOEBTRB                  //Boot block not protected from table reads
  28. #FUSES NOCPB                    //No Boot Block code protection
  29. #FUSES MCLR                     //Master Clear pin enabled
  30. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  31. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  32. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  33. #FUSES CPUDIV4                  //System Clock by 4
  34. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  35. #FUSES VREGEN                   //USB voltage regulator enabled
  36.  
  37. #use delay(clock=20000000)
  38. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  39. #use i2c(Slave,Slow,sda=PIN_B0,scl=PIN_B1,address=0xA4)
  40.  
  41. #include "milib.c"


mi libreria

Código: C++
  1. /*******************************************************
  2. * milib.c: libreia de mis funciones
  3. *
  4. ********************************************************/
  5. //direcciones de dispositivos
  6.  
  7. #Define M1 0xA0 //Master
  8. #Define S1 0xA2 //Esclavo 1
  9. #Define S2 0xA4 //Esclavo 2
  10. #Define S3 0xA6 //Esclavo 3
  11.  
  12.  
  13. // --- escribir en dispositivo ---
  14.  
  15. void escribir_i2c(int8 direccion, int8 dato)
  16. {
  17.    i2c_start();
  18.    i2c_write(direccion);
  19.    //i2c_write(0);//add
  20.    i2c_write(dato);
  21.    i2c_stop();
  22.    delay_us(150);
  23. }
  24.  
  25.  
  26. // --- leer del dispositivo ---
  27. int8 leer_i2c(int8 direccion)
  28. {
  29.    int8 dato = 0;
  30.    i2c_start();
  31.    i2c_write(direccion); //direccion device
  32.    //i2c_write(0); //add
  33.      
  34.    i2c_start();
  35.    i2c_write(direccion+1);
  36.    dato = i2c_read();
  37.    //dato = i2c_read(0);//add
  38.    i2c_stop();
  39.    
  40.    return(dato);
  41. }
  42. // -- funcion interrupcion ---
  43.  
  44. void ssp_interrupt(void){
  45.    int8 state, buffer[];
  46.    int8 i2c_dato_entrada,i2c_dato_funcion;
  47.    
  48.    printf("\n\r interrupcion");
  49.    state = i2c_isr_state();
  50.    if(state >= 0x80){                    //master pide un dato
  51.       i2c_write(buffer[i2c_dato_entrada]);          
  52.    }
  53.    else if(state == 0x01){               //Master esta enviando datos
  54.       i2c_dato_entrada = i2c_read();
  55.       buffer[i2c_dato_funcion] = i2c_dato_entrada;
  56.    }
  57.  
  58. }


debajo adjunto el archivo de proteus.

Un saludo
« Última modificación: 17 de Junio de 2012, 16:02:13 por pajaro »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #4 en: 12 de Junio de 2012, 22:10:27 »
  Yo no veo ningún código que corresponda a la interrupción SSP en el esclavo 1. Está la definición, pero no la implementación.
Por lo tanto, si no hay implementación no vas a poder hacer nada.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #5 en: 13 de Junio de 2012, 04:52:37 »
 Yo no veo ningún código que corresponda a la interrupción SSP en el esclavo 1. Está la definición, pero no la implementación.
Por lo tanto, si no hay implementación no vas a poder hacer nada.

Hola AngelGris
Lo implemeeto en la libreria "milib.c", junto con la funcion de escribir y leer el i2c.

El master es un proyecto, el esclavo 1 es otro y el esclavo 2 es otro.
Cada proyecto tiene 3 archivos, el principal o main.c su caberea el .h
y una tecera milib.c lo hago asi para que me genere 3 *.hex distintos.
Cada main tiene su milib.c y su cabecera.

No se, si con este IDE se pueden meter todos los main en un mismo proyecto,
y que te generen distintos *.hex disculpen las molestias.


Un saludo.

« Última modificación: 13 de Junio de 2012, 04:56:05 por pajaro »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #6 en: 13 de Junio de 2012, 08:06:16 »
Te has comido una "r" en la palabra interrupt.

Citar
Void SSP_Interupt
el compilador piensa que es otra funcion mas... :mrgreen: :mrgreen:

Ademas delante de la funcion debes poner esta marca de interrupcion:

Código: C
  1. #INT_SSP
« Última modificación: 13 de Junio de 2012, 08:10:57 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #7 en: 13 de Junio de 2012, 09:01:33 »
  Más allá de lo que te comenta MGLSOFT, en tu librería existe una función declarada como

Código: C
  1. void ssp_interupt(void)

y en el main existe otra declarada como

Código: C
  1. void ssp_interupt();

  Creo que el compilador puede interpretar que se trata de dos funciones distintas, ya que una no recibe parámetros y la otra no se... porque no tiene nada entre los paréntesis, o sea, no se como interprete esa ausencia el compilador.
 

  No estoy seguro si en la declaración de la función es necesario que figure "interrupt", yo creería que es suficiente con el señalizador "#INT_SSP"

  Yo probaría implementando directamente la interrupción en el main.c. O como dice MGLSOFT pone el señalizador en la implementación que está en la librería.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #8 en: 13 de Junio de 2012, 12:07:26 »
Hola
voya a por eso de la "r", supuestamente es una funcion mas no..?

pero predecida de  #INT_SSP

tambien he decir que el asitente al crar el proyectos si le marcas lo de
 aviso de interupcion i2c o spi te crea una funcion..

#INT_SSP
//void  SSP_isr(void) {}

pero la llama de forma diferente yo solo le cambien nombre para reconocerla,
 eso no tendra que ver ... no..

resumiendo:
- cambio lo del a r :: void ssp_interupt(); por void ssp_interrupt()
- cambio lo de la declaracion:: void ssp_interrupt(); por void ssp_interrupt(void);

y cruzaremos todos los dedos para que sea eso..

ahora nos vemos..
 ......


=========================================

ya de vuelta...

No hubo suerte coloque la función con la r y en el main, comentado la de la libreria
para que no se queje de duplicidad
al final la defini con void...(void);

pero sigue igual

al mirar el debug del i2c del proteus y los mensas me dice una cosa muy rara
en el debug me salen interrogante delante de los numeros  ? ? ? ? ? S A2 A 05 A P
y en otra linea muchos mas hay ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? S A2 A Sr A3 N FF A P
y en la ultima so hay ? ? ? ? ? ? ? ? ? ? ?


y el cuadro de mensajes me dice .. un insulto ...:

Spurious SCL Transition detected at 0.0677xxs

este mensaje lo da como unas 200 veces, las xx cambiam

Que me esta diciendo el simulador?

mis funciones de lectura y escritura implementadas son correctas?

yo pienso que si, pero ustedes... puedes ponerles un ojo..

no se ocurre otra cosa...



« Última modificación: 13 de Junio de 2012, 12:45:54 por pajaro »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #9 en: 13 de Junio de 2012, 20:19:55 »
  Los signos de pregunta, se deben a que el debbuger detecta actividad del bus pero no puede interpretarla.
  ¿Que tipo de resistencia estás colocando en proteus para la simulación?
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #10 en: 13 de Junio de 2012, 20:49:19 »
  Los signos de pregunta, se deben a que el debbuger detecta actividad del bus pero no puede interpretarla.
  ¿Que tipo de resistencia estás colocando en proteus para la simulación?

 de 1K analogicas, los valores eran de 2k2, 4k7 y 10 K
 creo recordar segun la velocidad y la distancia del bus
 las cambie por las de 2k2 analogicas y las ? ? ? ? ? ? ?  siguen


a lo mejor son las funciones que uso en la lectura y la escritura
ya no se que pensar....

No se.. tu que crres que puede ser...?

Un Saludo.



Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #11 en: 13 de Junio de 2012, 22:04:23 »
  Generalmente para simular bien el bus I2C no hay que usar las resistencias comunes sino unas llamadas pullups que se encuentran en la categoría "Modelling primitives"
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
:: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #12 en: 14 de Junio de 2012, 06:31:22 »
 Generalmente para simular bien el bus I2C no hay que usar las resistencias comunes sino unas llamadas pullups que se encuentran en la categoría "Modelling primitives"

Hola yo tenia entendido que las pull up eran resistencias digitales,
asi que las puse como digitales y tampo iba pero esaminado el master

vi que como tenia puesto esto:

      state = i2c_isr_state(); //lee el estado del bus
      dato=i2c_read();
      printf("\n\r dato: %X  state: %X" dato,state);


para saber como estaba el bus eso era el causante de los interrogantes
como bien dijiste habia actividad en el bus cuando los comente ya no salieron.

Pero el problema persiste no se entera de la interrupcion.

la configuracion es la de cada pic es que los tengo en los pines B0 y B1
que son los pines de SDA y SCL correspondientementte se podria decir que son los pines
del hardware pero no quiero forzar con la sentencia de fuerza harware.

Debe de haber algun problema en la libreria de ccs u algo se me esta pasando no es normal esto que me pasa.

¿Como se detectaria las fallas en ese bus?


- como provocar o forzar la interrupcion #INT_SSP

- evaluar que mis funcones implementadas (escritura y lectura del i2c) estan bien contruidas

- estados del bus (00,01,02,03..... 80,81,82,83,84,85....)






« Última modificación: 17 de Junio de 2012, 16:09:38 por pajaro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #13 en: 19 de Junio de 2012, 09:47:20 »
hola

ya han pasado varios dias luchando con la dichosa interrupción
por el momento ella va ganando.

Lo unico que he conseguido por el momento es que con el debug de proteus y el teminal virtual
me saque 00 o 80 y ello depende de los tiempos de espera es decir depende del tiempo
que le pongo me muestra el bit de escritura o el de lectura del bus.

Pero la Señora interrupccion ni se inmuta. y por el bus hay eventos confirmados.

!!Necesito ayuda¡¡ ya no se lo que hacerle

ya solo me queda probar algun codigo de alguien que si que le funcione
para ver es el simulador de proteus ..o es la configuracion del pic ...o tan solo el pic18f2550

... :?



Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #14 en: 19 de Junio de 2012, 09:52:18 »
Deberias poner tu ultimo codigo (completo) para ver que puede estar causandote esto, incluso alguno podria compilarlo y ver que pasa para ayudarte.
Si pones el codigo, usa GeShi y la opcion C o C++.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.