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

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

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #45 en: 28 de Junio de 2012, 05:22:41 »
Hola AngelGris
con el proteus hay forma de ver esos registros,
para verifocar eso que dices,
por si solo no los muestra imagino que si los declaro dentro del programa los mostrara
como si se tratase de una variable mas..

sigo con el problema...

en ningun mumento cambiam los valores:

yo declare asi:
#BYTE SSPADD = 0xFC8
#BYTE SSPCON1 = 0xFC6
#BYTE SSPCON2 = 0xFC5
#BYTE SSPBUF = 0xFC9

al arrancar el proteus muestra: su valor en 0xFF

y en ningun momento cambian esos valores

pero investigando mas en el watch windows de proteus en la pestaña debug
 encontre la forma de anadir registros y
te deja añadir por nombre de variable

ahora necesitaria saber que registros son los que cambian
para saber que esta trabajando bien, y poder fijarme en ellos.


sigo investigando....

creo que esta haciendo cosas raras
analizo ,  sistetizo y cuento

...




« Última modificación: 28 de Junio de 2012, 05:46:05 por pajaro »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #46 en: 28 de Junio de 2012, 09:16:22 »
  Efectivamente la forma de visualizar los registros es utilizando el watch window.

  Corrobora que la forma en que estás utilizando la sentencia "#byte" sea la correcta. Como no utilizo CCS no sé si lleva el "=" o no.
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 #47 en: 28 de Junio de 2012, 13:46:01 »
 Efectivamente la forma de visualizar los registros es utilizando el watch window.

  Corrobora que la forma en que estás utilizando la sentencia "#byte" sea la correcta. Como no utilizo CCS no sé si lleva el "=" o no.

Hola AngelGris

es correcto como lo defino:
En el manual de referencia lo dice asi:

Citar
#BYTE id = x

Elements:
id is a valid C identifier, x is a C variable or a constant

Purpose:
If the id is already known as a C variable then this will locate the variable at address x. In this case the variable type does not change from the original definition. If the id is not known a new C variable is created and placed at address x with the type int (8 bit)

Warning:
In both cases memory at x is not exclusive to this variable. Other variables may be located at the same location. In fact when x is a variable, then id and x share the same memory location.


seguire indagando..



« Última modificación: 28 de Junio de 2012, 19:23:08 por pajaro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #48 en: 28 de Junio de 2012, 19:25:19 »
hola
pase casi todo tu codigo a ccs cuasitodo..

AngelGris espero que no te importe
pero pienso que si a ti te funciona a mi tambien  me deberia.... esto solo en teoria
cuando lo ponga en practica lo podre afirmar.

Tengo dos preguntas:

en el codigo del esclavo declaras algo
que no comprendo:
Código: C++
  1. ...
  2. ..
  3.         lectura=i2c_read(0);
  4.          //if (DA == 1)
  5.          if(bit_test (SSPSTAT, 5))
  6.           {
  7.              PORTB = lectura;  // si llego un dato, lo mando al puerto
  8.           }  
  9.        }      
  10.      }
  11.      //if (RW == 1)
  12.      if(bit_test (SSPSTAT, 2))
  13.       {
  14.          //write_i2c(0x77); // esclavo para lectura
  15.          i2c_write(0x77); // esclavo para lectura
  16.       }
  17.    }
  18.  
  19. ...

PORTB = lectura;  // si llego un dato, lo mando al puerto

esto que es un configura puerto
set_tris_b(lectura);

u  es otra cosa..

... me huelo que es otra cosa...



- Segunda pregunta?

write_i2c(0x77); // esclavo para lectura

esta direcion no coincide con la ningun esclavo ...

si miramos en las funciones del master no hay ninguna direcion llamada 0x77
de donde sale esto..

sigo con el codigo...


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #49 en: 28 de Junio de 2012, 20:07:20 »
  En respuesta a la primer pregunta, PORTB = lectura es para que salga por el puerto B el dato que me llego vía I2C. Simplemente es para corroborar que llegó bien el dato.

  En cuanto a la segunda pregunta... i2c_write(0x77).... me refiero a que llega a ésa línea cuando el esclavo es accedido para lectura (es decir que el master quiere leer un dato desde el esclavo) y 0x77 es el dato que el esclavo le envía al master.
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 #50 en: 29 de Junio de 2012, 03:57:39 »
 En respuesta a la primer pregunta, PORTB = lectura es para que salga por el puerto B el dato que me llego vía I2C. Simplemente es para corroborar que llegó bien el dato.

  En cuanto a la segunda pregunta... i2c_write(0x77).... me refiero a que llega a ésa línea cuando el esclavo es accedido para lectura (es decir que el master quiere leer un dato desde el esclavo) y 0x77 es el dato que el esclavo le envía al master.

Hola AngelGris
pregunta 1:
¿entonces seria como encender los led del puerto b con el dato que llegue?

en caso de ser asi seria como set_tris_b(lectura);

continuo con el codigo..



Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #51 en: 29 de Junio de 2012, 05:54:59 »
Hola

DESEPERACION es la palabra  ...  :5]

pongo el codigo del master

Código: C++
  1. /***************************************************
  2. *
  3. * master_ag_1.c
  4. *
  5. ***************************************************/
  6. #include "Master_ag.h"
  7.  
  8.  
  9.  
  10. void main()
  11. {
  12.  
  13.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  14.    setup_adc(ADC_CLOCK_DIV_2);
  15.    setup_wdt(WDT_OFF);
  16.    setup_timer_0(RTCC_INTERNAL);
  17.    setup_timer_1(T1_DISABLED);
  18.    setup_timer_2(T2_DISABLED,0,1);
  19.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  20.    setup_comparator(NC_NC_NC_NC);
  21.    setup_vref(FALSE);
  22.    
  23.    enable_interrupts(INT_SSP);
  24.    enable_interrupts(GLOBAL);
  25. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  26.  
  27.    // TODO: USER CODE!!
  28. int8 midato;
  29.  
  30. printf("\n\r MASTER: ");
  31.  delay_ms(1000);
  32.  
  33.  printf("\n\r escribo en esclavo");
  34.  
  35.  i2c_master_escribe(s1,5);
  36.  
  37.   printf("\n\r fin de escritura");
  38.  
  39.  
  40.  printf("\n\r leo de esclavo");
  41.  
  42.  midato=i2c_master_lee(S1);
  43.  
  44.  printf("\r\n %d"midato);
  45.  
  46.  
  47. }

cabecera:

Código: C++
  1. /***************************************************
  2. *
  3. * master_ag_1.h
  4. *
  5. ***************************************************/
  6. #include <18F2550.h>
  7.  
  8. #device adc=8
  9.  
  10. #FUSES NOWDT                    //No Watch Dog Timer
  11. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  12. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  13. #FUSES NOPROTECT                //Code not protected from reading
  14. #FUSES NOBROWNOUT               //No brownout reset
  15. #FUSES BORV20                   //Brownout reset at 2.0V
  16. #FUSES NOPUT                    //No Power Up Timer
  17. #FUSES NOCPD                    //No EE protection
  18. #FUSES STVREN                   //Stack full/underflow will cause reset
  19. #FUSES NODEBUG                  //No Debug mode for ICD
  20. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  21. #FUSES NOWRT                    //Program memory not write protected
  22. #FUSES NOWRTD                   //Data EEPROM not write protected
  23. #FUSES IESO                     //Internal External Switch Over mode enabled
  24. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  25. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  26. #FUSES NOWRTC                   //configuration not registers write protected
  27. #FUSES NOWRTB                   //Boot block not write protected
  28. #FUSES NOEBTR                   //Memory not protected from table reads
  29. #FUSES NOEBTRB                  //Boot block not protected from table reads
  30. #FUSES NOCPB                    //No Boot Block code protection
  31. #FUSES MCLR                     //Master Clear pin enabled
  32. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  33. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  34. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  35. #FUSES CPUDIV4                  //System Clock by 4
  36. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  37. #FUSES VREGEN                   //USB voltage regulator enabled
  38.  
  39. #use delay(clock=20000000)
  40. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  41. #use i2c(Master,Slow,sda=PIN_B0,scl=PIN_B1,force_hw)
  42. //#include "milib.c"
  43.  
  44. #DEFINE MODO_LECTURA 00000001
  45. #DEFINE MODO_ESCRITURA 00000000
  46. #DEFINE S1 0xB0
  47.  
  48.  
  49. void i2c_master_escribe(int8 direccion,int8 dato){
  50.    i2c_start();            // Comienzo comunicación
  51.    i2c_write(direccion);   // Dirección del esclavo en el bus I2C modo rw
  52.    //i2c_write(posicion);    // Posición donde se guardara el dato transmitido
  53.    i2c_write(dato);        // Dato a transmitir
  54.    i2c_stop();             // Fin comunicación
  55.    delay_ms(1000);
  56.  }
  57.  
  58.  
  59.  
  60. int8 i2c_master_lee(int8 direccion){
  61. int8 dato_leido;
  62.    i2c_start();            // Comienzo de la comunicación
  63.    i2c_write(direccion);   // Dirección del esclavo en el bus I2C modo RW
  64.    //i2c_write(posicion);    // Posición de donde se leerá el dato en el esclavo
  65.    i2c_start();            // Reinicio
  66.    i2c_write(direccion +1); // Dirección del esclavo en modo lectura (modo r)
  67.    dato_leido=i2c_read(1); // Lectura del dato
  68.    i2c_stop();             // Fin comunicación
  69.    delay_ms(50);
  70. return dato_leido;
  71. }

pongo el codigo del esclavo

Código: C++
  1. /***************************************************
  2. *
  3. * esclavo_ag_1.c
  4. *
  5. ***************************************************/
  6.  
  7. #include "esclavo_ag_1.h"
  8. char lectura;
  9. #int_SSP
  10. void  SSP_isr(void)
  11. {
  12.  
  13. //if (SSPIF == 1)  // interrupcion por SSP
  14. if(bit_test (PIR1, 3))
  15.  {    
  16.    //if (SSPOV == 1) // si hay overflow leo el buffer y borro dicho flag
  17.    if(bit_test (SSPCON1, 6)) // return 0 o 1
  18.    {
  19.      //lectura = read_i2c(1);
  20.      lectura=i2c_read(1);
  21.      //SSPOV = 0;
  22.      bit_clear(SSPCON1,6); //limpio bit 6 del SSPCON1
  23.    }
  24.    else             // si no hay overflow proceso el dato
  25.    {
  26.      //if (BF == 1)  // si hay dato
  27.      if(bit_test (SSPSTAT, 0))
  28.      {
  29.        //if (RW == 0)  // esclavo para escritura
  30.        if(bit_test (SSPSTAT, 2)==0)
  31.        {    
  32.          //lectura = read_i2c(0);
  33.          lectura=i2c_read(0);
  34.          //if (DA == 1)
  35.          if(bit_test (SSPSTAT, 5))
  36.           {
  37.              PORTB = lectura;  // si llego un dato, lo mando al puerto
  38.              printf("\n\n lectura: %d"lectura);
  39.           }  
  40.        }      
  41.      }
  42.      //if (RW == 1)
  43.      if(bit_test (SSPSTAT, 2))
  44.       {
  45.          //write_i2c(0x77); // esclavo para lectura
  46.          i2c_write(0x77); // esclavo para lectura
  47.          output_High(PIN_B3);// anado para vericar entro
  48.       }
  49.    }
  50.    //SSPIF = 0;
  51.    bit_clear(PIR1, 3);
  52.  }
  53. }
  54.  
  55.  
  56.  
  57. void main()
  58. {
  59.  
  60.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  61.    setup_adc(ADC_CLOCK_DIV_2);
  62.    setup_wdt(WDT_OFF);
  63.    setup_timer_0(RTCC_INTERNAL);
  64.    setup_timer_1(T1_DISABLED);
  65.    setup_timer_2(T2_DISABLED,0,1);
  66.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  67.    setup_comparator(NC_NC_NC_NC);
  68.    setup_vref(FALSE);
  69.    set_tris_b(0x00);
  70.    
  71.    
  72.    enable_interrupts(INT_SSP);
  73.    enable_interrupts(GLOBAL);
  74. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  75.  
  76.    // TODO: USER CODE!!
  77.  
  78. printf("\n\r ESCLAVO: ");
  79.  
  80. }


Código: C++
  1. /***************************************************
  2. *
  3. * esclavo_ag_1.h
  4. *
  5. ***************************************************/
  6.  
  7. #include <18F2550.h>
  8. #device adc=8
  9.  
  10. #FUSES NOWDT                    //No Watch Dog Timer
  11. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  12. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  13. #FUSES NOPROTECT                //Code not protected from reading
  14. #FUSES NOBROWNOUT               //No brownout reset
  15. #FUSES BORV20                   //Brownout reset at 2.0V
  16. #FUSES NOPUT                    //No Power Up Timer
  17. #FUSES NOCPD                    //No EE protection
  18. #FUSES STVREN                   //Stack full/underflow will cause reset
  19. #FUSES NODEBUG                  //No Debug mode for ICD
  20. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  21. #FUSES NOWRT                    //Program memory not write protected
  22. #FUSES NOWRTD                   //Data EEPROM not write protected
  23. #FUSES IESO                     //Internal External Switch Over mode enabled
  24. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  25. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  26. #FUSES NOWRTC                   //configuration not registers write protected
  27. #FUSES NOWRTB                   //Boot block not write protected
  28. #FUSES NOEBTR                   //Memory not protected from table reads
  29. #FUSES NOEBTRB                  //Boot block not protected from table reads
  30. #FUSES NOCPB                    //No Boot Block code protection
  31. #FUSES MCLR                     //Master Clear pin enabled
  32. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  33. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  34. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  35. #FUSES CPUDIV4                  //System Clock by 4
  36. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  37. #FUSES VREGEN                   //USB voltage regulator enabled
  38.  
  39. #use delay(clock=20000000)
  40. #define I2C_SDA   PIN_B0
  41. #define I2C_SCL   PIN_B1
  42. #define S1 0xB0
  43.  
  44. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  45. #use i2c(Slave,Slow,sda=PIN_B0,scl=PIN_B1,force_hw,address=0xB0)
  46.  
  47. //#include "milib.c"
  48.  
  49. //Define pines
  50. #BYTE SSPADD = 0xFC8
  51. #BYTE SSPCON1 = 0xFC6
  52. #BYTE SSPCON2 = 0xFC5
  53. #BYTE SSPBUF = 0xFC9
  54. #BYTE SSPSTAT = 0xFC7
  55. #BYTE PIR1 = 0xF9E
  56. #BYTE PORTB = 0xF81
  57.  
  58. void i2c_master_escribe(int8 direccion,int8 dato){
  59.    i2c_start();            // Comienzo comunicación
  60.    i2c_write(direccion);   // Dirección del esclavo en el bus I2C modo rw
  61.    //i2c_write(posicion);    // Posición donde se guardara el dato transmitido
  62.    i2c_write(dato);        // Dato a transmitir
  63.    i2c_stop();             // Fin comunicación
  64.    delay_ms(1000);
  65.  }
  66.  
  67.  
  68.  
  69. int8 i2c_master_lee(int8 direccion){
  70. int8 dato_leido;
  71.    i2c_start();            // Comienzo de la comunicación
  72.    i2c_write(direccion);   // Dirección del esclavo en el bus I2C modo RW
  73.    //i2c_write(posicion);    // Posición de donde se leerá el dato en el esclavo
  74.    i2c_start();            // Reinicio
  75.    i2c_write(direccion+1); // Dirección del esclavo en modo lectura (modo r)
  76.    dato_leido=i2c_read(1); // Lectura del dato
  77.    i2c_stop();             // Fin comunicación
  78.    delay_ms(50);
  79. return dato_leido;
  80. }

No funciona nada...


« Última modificación: 29 de Junio de 2012, 06:01:25 por pajaro »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #52 en: 29 de Junio de 2012, 09:02:25 »
Me llama bastante la atencion como usas las instrucciones I2C, por eso refresque un poco lo que habia usado, mirando las librerias actuales de CCS, en este caso para una memoria.
Pongo el codigo que usan para escritura, mira bien como separan las instrucciones, y prueba hacerlo en tus programas a ver como te va...

Código: C++
  1. int1 ext_eeprom_ready() {
  2.    int1 ack;
  3.    i2c_start();            // If the write command is acknowledged,
  4.    ack = i2c_write(0xa0);  // then the device is ready.
  5.    i2c_stop();
  6.    return !ack;
  7. }
  8.  
  9. void write_ext_eeprom(EEPROM_ADDRESS address, BYTE data) {
  10.    while(!ext_eeprom_ready());
  11.    i2c_start();
  12.    i2c_write((0xa0|(BYTE)(address>>7))&0xfe);
  13.    i2c_write(address);
  14.    i2c_write(data);
  15.    i2c_stop();
  16. }
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #53 en: 29 de Junio de 2012, 10:36:21 »
Me llama bastante la atencion como usas las instrucciones I2C, por eso refresque un poco lo que habia usado, mirando las librerias actuales de CCS, en este caso para una memoria.
Pongo el codigo que usan para escritura, mira bien como separan las instrucciones, y prueba hacerlo en tus programas a ver como te va...


Código: C++
  1. int1 ext_eeprom_ready() {
  2.    int1 ack;
  3.    i2c_start();            // If the write command is acknowledged,
  4.    ack = i2c_write(0xa0);  // then the device is ready.
  5.    i2c_stop();
  6.    return !ack;
  7. }
  8.  
  9. void write_ext_eeprom(EEPROM_ADDRESS address, BYTE data) {
  10.    while(!ext_eeprom_ready());
  11.    i2c_start();
  12.    i2c_write((0xa0|(BYTE)(address>>7))&0xfe);
  13.    i2c_write(address);
  14.    i2c_write(data);
  15.    i2c_stop();
  16. }

Hola
 ojeando tu codigo vi INT1
si INT8 es byte supongo que int1 es un bit ... ¿es correcta mi suposicion?

0xa0 -> sera la direccion por lo tanto
esa funcion verifica si un dispositivo con esa direcion esta dispoinible
si es asi , esta disponoble responde con ack

¿ack es un 1 o un 0?

para la segunda funcion..

te reformatea a BYTE la address desde ...

aca la pregunta: ¿te desplaza todo 7 posiciones ?
¿te rota 7 veces?

intentas darle la vuelta a la direcion un algo

luego  le haces una or si son 0 y 0 son 0 sino 1
y luego la and si son 1 y 1 sera 1 si no cero

para que esa converison no le termino de ver..

¿Puedes contarme, ...?


Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #54 en: 01 de Julio de 2012, 13:04:18 »
AngelGris

aun estoy aca tu ejemplo no paro de mirarlo
si ati te funciono como es posible que a mi
no me funcione.

tu lo hiciste con un pic distinto al mio, pero el codigo es clavado

Seria abusar de tu buena fe que probaras tu codigo en un pic18F2550
con el simulador de protesus.a ver si es el pic el que hace cosa raras.

De esa forma podria testear entre tu code y el mio, aun mas cerca.

ayer noche pense en implementar el code de otra forma en vez de usar
las funciones propias de ccs podia declarar a nivel de bit

#BIT BF=0xFC8.0

no se si funcionara
pero si para el manejo de los bit de un puerto funciona
deberia de hacerlo tambien aca.

No se si podras ayudarme, pero de todas formas te agradezco toda tu ayuda
que me has ofrecido con esta pesadilla...

sigo indagando...


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #55 en: 01 de Julio de 2012, 14:19:10 »
  Hago los cambios necesarios, seguramente será sólo en lo que respecta a los bits de configuración y te comento.

  Tal vez en tu caso no entra en la interrupción porque no está utilizando el módulo SSP.... sino no le encuentro otra explicación... o tal vez la versión de Preoteus. Yo estoy utilizando la 7.8 SP2
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 #56 en: 02 de Julio de 2012, 07:42:35 »
  Hago los cambios necesarios, seguramente será sólo en lo que respecta a los bits de configuración y te comento.

  Tal vez en tu caso no entra en la interrupción porque no está utilizando el módulo SSP.... sino no le encuentro otra explicación... o tal vez la versión de Preoteus. Yo estoy utilizando la 7.8 SP2

Hola AngelGris

La version de mi proteus con la que implemento o diseño es la 7.2 sp6 pero
dispongo de una portable mas avanzada 7.8 sp2 para pasar los diseños de versiones posteriores
a esta.

que esquema electrico usas tu.

te cuelgo el mio.

Sigo con el codigo


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #57 en: 02 de Julio de 2012, 09:36:39 »
  Después de tener que cambiar de versión del compilador para PIC18 pude compilar bien el programa y lo pude simular constatando que sí responde bien el esclavo por interrupciones en el PIC18F2550.

  De dejo el circuito que estoy utilizando.
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 #58 en: 02 de Julio de 2012, 11:28:15 »
 Después de tener que cambiar de versión del compilador para PIC18 pude compilar bien el programa y lo pude simular constatando que sí responde bien el esclavo por interrupciones en el PIC18F2550.

  De dejo el circuito que estoy utilizando.

El codigo usado es el mismo que publicaste
en la vez pasada?

¿y lo de cambiar del compilador a que se debe..?
El anterior no te dejaba...

ya modificando mi codigo tal como dije..

quedo como tu codigo...pero al simularlo
hace cosas raras..

si quito el esclavo de la simulacion en lo de propiedades excluir el master se mete en un bucle infinito
pero si lo pongo ..
enciende el led del esclavo


pongo el code:

Código: C++
  1. /***************************************************
  2. *
  3. * master_ag_1.c
  4. *
  5. ***************************************************/
  6. #include "Master_ag.h"
  7.  
  8.  
  9.  
  10. void main()
  11. {
  12.  
  13.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  14.    setup_adc(ADC_CLOCK_DIV_2);
  15.    setup_wdt(WDT_OFF);
  16.    setup_timer_0(RTCC_INTERNAL);
  17.    setup_timer_1(T1_DISABLED);
  18.    setup_timer_2(T2_DISABLED,0,1);
  19.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  20.    setup_comparator(NC_NC_NC_NC);
  21.    setup_vref(FALSE);
  22.    
  23.    enable_interrupts(INT_SSP);
  24.    enable_interrupts(GLOBAL);
  25. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  26.  
  27.    // TODO: USER CODE!!
  28. int8 midato;
  29.  
  30. printf("\n\r MASTER: ");
  31.  delay_ms(1000);
  32.  
  33.  printf("\n\r escribo en esclavo");
  34.  
  35.  i2c_master_escribe(s1,5);
  36.  
  37.   printf("\n\r fin de escritura");
  38.  
  39.  
  40.  printf("\n\r leo de esclavo");
  41.  
  42.  midato=i2c_master_lee(S1);
  43.  
  44.  printf("\r\n %X : "midato);
  45.  
  46.  
  47. }



cabcera:

Código: C++
  1. /***************************************************
  2. *
  3. * master_ag_1.h
  4. *
  5. ***************************************************/
  6. #include <18F2550.h>
  7.  
  8. #device adc=8
  9.  
  10. #FUSES NOWDT                    //No Watch Dog Timer
  11. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  12. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  13. #FUSES NOPROTECT                //Code not protected from reading
  14. #FUSES NOBROWNOUT               //No brownout reset
  15. #FUSES BORV20                   //Brownout reset at 2.0V
  16. #FUSES NOPUT                    //No Power Up Timer
  17. #FUSES NOCPD                    //No EE protection
  18. #FUSES STVREN                   //Stack full/underflow will cause reset
  19. #FUSES NODEBUG                  //No Debug mode for ICD
  20. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  21. #FUSES NOWRT                    //Program memory not write protected
  22. #FUSES NOWRTD                   //Data EEPROM not write protected
  23. #FUSES IESO                     //Internal External Switch Over mode enabled
  24. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  25. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  26. #FUSES NOWRTC                   //configuration not registers write protected
  27. #FUSES NOWRTB                   //Boot block not write protected
  28. #FUSES NOEBTR                   //Memory not protected from table reads
  29. #FUSES NOEBTRB                  //Boot block not protected from table reads
  30. #FUSES NOCPB                    //No Boot Block code protection
  31. #FUSES MCLR                     //Master Clear pin enabled
  32. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  33. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  34. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  35. #FUSES CPUDIV4                  //System Clock by 4
  36. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  37. #FUSES VREGEN                   //USB voltage regulator enabled
  38.  
  39. #use delay(clock=20000000)
  40. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  41. #use i2c(Master,Slow,sda=PIN_B0,scl=PIN_B1,force_hw)
  42. //#include "milib.c"
  43.  
  44. #DEFINE MODO_LECTURA 00000001
  45. #DEFINE MODO_ESCRITURA 00000000
  46. #DEFINE S1 0xB0
  47.  
  48.  
  49. void i2c_master_escribe(int8 direccion,int8 dato){
  50.    i2c_start();            // Comienzo comunicación
  51.    delay_us(100);
  52.    i2c_write(direccion);   // Dirección del esclavo en el bus I2C modo rw
  53.    delay_us(100);
  54.    //i2c_write(posicion);    // Posición donde se guardara el dato transmitido
  55.    i2c_write(dato);        // Dato a transmitir
  56.    delay_us(100);
  57.    i2c_stop();             // Fin comunicación
  58.    delay_ms(1000);
  59.  }
  60.  
  61.  
  62.  
  63. int8 i2c_master_lee(int8 direccion){
  64. int8 dato_leido;
  65.    i2c_start();            // Comienzo de la comunicación
  66.    delay_us(100);
  67.    i2c_write(direccion);   // Dirección del esclavo en el bus I2C modo RW
  68.    delay_us(100);
  69.    //i2c_write(posicion);    // Posición de donde se leerá el dato en el esclavo
  70.    i2c_start();            // Reinicio
  71.    delay_us(100);
  72.    i2c_write(direccion+1); // Dirección del esclavo en modo lectura (modo r)
  73.    delay_us(100);
  74.    dato_leido=i2c_read(1); // Lectura del dato
  75.    delay_us(100);
  76.    i2c_stop();             // Fin comunicación
  77.    delay_ms(50);
  78. return dato_leido;
  79. }



para el esclavo:

Código: C++
  1. /***************************************************
  2. *
  3. * esclavo_ag_1.c
  4. *
  5. ***************************************************/
  6.  
  7. #include "esclavo_ag_1.h"
  8.  
  9. //define bit a bit
  10.  
  11. #BIT SSPIF = 0xF9E.3         //PIR1 bit 3
  12. #BIT SSPOV = 0xFC6.6         //SSPCON1 bit 6
  13. #BIT BF = 0xFC8.0            //SSPSTAT bit 0
  14. #BIT RW = 0xFC7.2            //SSPSTAT bit 2
  15. #BIT DA = 0xFC7.5            //SSPSTAT bit 5
  16.  
  17. char lectura;
  18. #int_SSP
  19. void  SSP_isr(void)
  20. {
  21.  
  22. if (SSPIF == 1)  // interrupcion por SSP
  23. //if(bit_test (PIR1, 3))
  24.  {    
  25.    if (SSPOV == 1) // si hay overflow leo el buffer y borro dicho flag
  26.    //if(bit_test (SSPCON1, 6)) // return 0 o 1
  27.    {
  28.      //lectura = read_i2c(1);
  29.      lectura=i2c_read(1);
  30.      output_High(PIN_B6);// añado para vericar entro
  31.      SSPOV = 0;
  32.      //bit_clear(SSPCON1,6); //limpio bit 6 del SSPCON1
  33.    }
  34.    else             // si no hay overflow proceso el dato
  35.    {
  36.      if (BF == 1)  // si hay dato
  37.      //if(bit_test (SSPSTAT, 0))
  38.      {
  39.        if (RW == 0)  // esclavo para escritura
  40.        //if(bit_test (SSPSTAT, 2))
  41.        {    
  42.          //lectura = read_i2c(0);
  43.          lectura=i2c_read(0);
  44.          if (DA == 1)
  45.          //if(bit_test (SSPSTAT, 5))
  46.           {
  47.              PORTB = lectura;  // si llego un dato, lo mando al puerto
  48.              printf("\n\n lectura: %d"lectura);
  49.           }  
  50.        }      
  51.      }
  52.      if (RW == 1)
  53.      //if(bit_test (SSPSTAT, 2))
  54.       {
  55.          //write_i2c(0x77); // esclavo para lectura
  56.          i2c_write(0x77); // esclavo para lectura
  57.          output_High(PIN_B7);// añado para vericar entro
  58.       }
  59.    }
  60.    SSPIF = 0;
  61.    //bit_clear(PIR1, 3);
  62.  }
  63. }
  64.  
  65.  
  66.  
  67. void main()
  68. {
  69.  
  70.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  71.    setup_adc(ADC_CLOCK_DIV_2);
  72.    setup_wdt(WDT_OFF);
  73.    setup_timer_0(RTCC_INTERNAL);
  74.    setup_timer_1(T1_DISABLED);
  75.    setup_timer_2(T2_DISABLED,0,1);
  76.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  77.    setup_comparator(NC_NC_NC_NC);
  78.    setup_vref(FALSE);
  79.    set_tris_b(0x00);
  80.    
  81.    
  82.    enable_interrupts(INT_SSP);
  83.    enable_interrupts(GLOBAL);
  84. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  85.  
  86.    // TODO: USER CODE!!
  87.  
  88. printf("\n\r ESCLAVO: ");
  89.  
  90. }


cabecera de esclavo:


Código: C++
  1. /***************************************************
  2. *
  3. * esclavo_ag_1.h
  4. *
  5. ***************************************************/
  6.  
  7. #include <18F2550.h>
  8. #device adc=8
  9.  
  10. #FUSES NOWDT                    //No Watch Dog Timer
  11. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  12. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  13. #FUSES NOPROTECT                //Code not protected from reading
  14. #FUSES NOBROWNOUT               //No brownout reset
  15. #FUSES BORV20                   //Brownout reset at 2.0V
  16. #FUSES NOPUT                    //No Power Up Timer
  17. #FUSES NOCPD                    //No EE protection
  18. #FUSES STVREN                   //Stack full/underflow will cause reset
  19. #FUSES NODEBUG                  //No Debug mode for ICD
  20. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  21. #FUSES NOWRT                    //Program memory not write protected
  22. #FUSES NOWRTD                   //Data EEPROM not write protected
  23. #FUSES IESO                     //Internal External Switch Over mode enabled
  24. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  25. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  26. #FUSES NOWRTC                   //configuration not registers write protected
  27. #FUSES NOWRTB                   //Boot block not write protected
  28. #FUSES NOEBTR                   //Memory not protected from table reads
  29. #FUSES NOEBTRB                  //Boot block not protected from table reads
  30. #FUSES NOCPB                    //No Boot Block code protection
  31. #FUSES MCLR                     //Master Clear pin enabled
  32. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  33. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  34. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  35. #FUSES CPUDIV4                  //System Clock by 4
  36. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  37. #FUSES VREGEN                   //USB voltage regulator enabled
  38.  
  39. #use delay(clock=20000000)
  40. #define I2C_SDA   PIN_B0
  41. #define I2C_SCL   PIN_B1
  42. #define S1 0xB0
  43.  
  44. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  45. #use i2c(Slave,Slow,sda=PIN_B0,scl=PIN_B1,force_hw,address=0xB0)
  46.  
  47. //#include "milib.c"
  48.  
  49. //Define pines
  50. #BYTE SSPADD = 0xFC8
  51. #BYTE SSPCON1 = 0xFC6
  52. #BYTE SSPCON2 = 0xFC5
  53. #BYTE SSPBUF = 0xFC9
  54. #BYTE SSPSTAT = 0xFC7
  55. #BYTE PIR1 = 0xF9E
  56. #BYTE PORTB = 0xF81
  57.  
  58. //define bit a bit
  59.  
  60. #BIT SSPIF = 0xF9E.3         //PIR1 bit 3
  61. #BIT SSPOV = 0xFC6.6         //SSPCON1 bit 6
  62. #BIT BF = 0xFC8.0            //SSPSTAT bit 0
  63. #BIT RW = 0xFC7.2            //SSPSTAT bit 2
  64. #BIT DA = 0xFC7.5            //SSPSTAT bit 5
  65.  
  66.  
  67.  
  68. void i2c_master_escribe(int8 direccion,int8 dato){
  69.    i2c_start();            // Comienzo comunicación
  70.    i2c_write(direccion);   // Dirección del esclavo en el bus I2C modo rw
  71.    //i2c_write(posicion);    // Posición donde se guardara el dato transmitido
  72.    i2c_write(dato);        // Dato a transmitir
  73.    i2c_stop();             // Fin comunicación
  74.    delay_ms(1000);
  75.  }
  76.  
  77.  
  78.  
  79. int8 i2c_master_lee(int8 direccion){
  80. int8 dato_leido;
  81.    i2c_start();            // Comienzo de la comunicación
  82.    i2c_write(direccion);   // Dirección del esclavo en el bus I2C modo RW
  83.    //i2c_write(posicion);    // Posición de donde se leerá el dato en el esclavo
  84.    i2c_start();            // Reinicio
  85.    i2c_write(direccion+1); // Dirección del esclavo en modo lectura (modo r)
  86.    dato_leido=i2c_read(1); // Lectura del dato
  87.    i2c_stop();             // Fin comunicación
  88.    delay_ms(50);
  89. return dato_leido;
  90. }

voy a introducir led de forma que cuando escriba en el esclavo
en el master se encianda un led y en el master tambine se enciednda ese led
y cuando lea se apague ese led en el esclavo y se encida otro led y en el master haga lo mismo,

asi vere por donde va el programa...

sabes que le puede ocurrir..

te paso los cof. para que si eso lo simules y lo puedas ver como yo lo veo..


sigo con esto..






« Última modificación: 02 de Julio de 2012, 11:36:28 por pajaro »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #59 en: 02 de Julio de 2012, 12:19:42 »
  Tuve que cambiar de versión de compilador porque la anterior (versión 9.65) me daba error interno cada vez que quería hacer algo con interrupciones. Ahora pasé a la 9.80.

  Sí, el código es el mismo que te mostré la vez pasada.

  No sé si soy yo o no está, pero no veo que termines tus programas con

Código: C
  1. while(TRUE);

  en el caso de HiTech yo uso

Código: C
  1. while(1);

  Eso hay que usarlo para que el contador de programa no siga avanzando hacia un posición que no se sabe que habrá.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas


 

anything