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

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

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #30 en: 22 de Junio de 2012, 21:06:55 »
Hola

En el codigo de esclavo 1

Código: C++
  1. ...
  2. nada = SSPBUF;          // Limpio el Buffer
  3.  SSPOV = 0;              // Limpio el flag de overflow
  4.  SSPIE = 1;              // Habilito interrupcion por SSP
  5.  PEIE = 1;               // Habilito interrupcion de perifericos
  6.  GIE = 1;                // Habilito las interrupciones globales
  7. ..

Me referia  a lo de interrupcion de periferico

te pregunto porque intento comprender el codigo de tu compilador
para ver si consigo que funcione en el mio que es con ccs..

***Ya probe lo de forzar hardware,
no funciona estamos en las mismas..

¿Que version de proteus usas?
¿Que retardos usas para la inicializacion?


 hace un rato lei algo  de un enlace y por lo visto el INT_SSP a mas de uno
le dio dolores de cabeza..

encontre unos enlaces:

http://www.todopic.com.ar/foros/index.php?topic=5312.0

http://www.ucontrol.com.ar/forosmf/problemas-con-mis-proyectos/problema-con-pic16f877a-y-pic16f876a-como-esclavos-i2c/?PHPSESSID=lo7u704ntfc07udqs8p0fivpp7


en estos codigos encontre una similitud con el tuyo ambos usais el BF y otras variables
de donde las has obtenido, porque las declaras con esos nombres tan especiales..
en ccs estaran declarados u las tendre que declar para usarlas..




Continuo con el code..


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #31 en: 23 de Junio de 2012, 01:23:01 »
Hola

En el codigo de esclavo 1


...
nada = SSPBUF;          // Limpio el Buffer
 SSPOV = 0;              // Limpio el flag de overflow
 SSPIE = 1;              // Habilito interrupcion por SSP
 PEIE = 1;               // Habilito interrupcion de perifericos
 GIE = 1;                // Habilito las interrupciones globales
..


Me referia  a lo de interrupcion de periferico


  PEIE es el bit que habilita las interrupciones de los periféricos en general (ADC, SSP, UART). Dicho bit tiene que estar en 1 si o si para que funcionen dichas interrupciones. Pero además hay que habilitar la interrupción particular que se quiera utilizar. Y, por supuesto, habilitarlas globalmente.

  Todo lo mencionado anteriormente está explicado en el datasheet del PIC.


te pregunto porque intento comprender el codigo de tu compilador
para ver si consigo que funcione en el mio que es con ccs..

***Ya probe lo de forzar hardware,
no funciona estamos en las mismas..

¿Que version de proteus usas?
¿Que retardos usas para la inicializacion?


 hace un rato lei algo  de un enlace y por lo visto el INT_SSP a mas de uno
le dio dolores de cabeza..

encontre unos enlaces:

http://www.todopic.com.ar/foros/index.php?topic=5312.0

http://www.ucontrol.com.ar/forosmf/problemas-con-mis-proyectos/problema-con-pic16f877a-y-pic16f876a-como-esclavos-i2c/?PHPSESSID=lo7u704ntfc07udqs8p0fivpp7


en estos codigos encontre una similitud con el tuyo ambos usais el BF y otras variables
de donde las has obtenido, porque las declaras con esos nombres tan especiales..
en ccs estaran declarados u las tendre que declar para usarlas..




Continuo con el code..



  La versión de Proteus es la 7.8 SP2
  En el único código que puse retardos es en el del master, y es sólo para asegurarme de que los esclavos estén bien configurados antes que el master empiece a mandar información. Puse cuatro delays de 250ms cada uno así que hay 1 segundo aproximadamente antes de querer comunicarme con algún esclavo.

  BF y las otras variables son algunos bits de los registros que forman parte del módulo SSP. Dicha información la encontrarás en el datasheet del PIC
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 #32 en: 23 de Junio de 2012, 13:38:01 »
Hola AngelGris

en tu codigo del esclavo,
vi que asignas el dato recibido a una variable
y esa variable la asignas a un puerto,
con ello ¿equivaldria a enceder y apagar los bit de un puerto?



Código: C++
  1. ....
  2. else             // si no hay overflow proceso el dato
  3.    {
  4.      if (BF == 1)  // si hay dato
  5.      {
  6.        if (RW == 0)  // esclavo para escritura
  7.        {    
  8.          lectura = read_i2c(0);
  9.          if (DA == 1) PORTB = lectura; // si llego un dato, lo mando al puerto
  10.        }      
  11.      }
  12.      if (RW == 1) write_i2c(0x77); // esclavo para lectura
  13.    }
  14.    SSPIF = 0;  
  15. ....


ahora me surgen 4 preguntas...
 ¿ese dato lo puedes asignar a cualquier "cosa" (variable)?

- igual que lo asignas un puerto lo podrias asignar al comando de definicion del puerto (TRISB)
me esplico:
 en principio lo declaras como entradas y mediante ese dato lo redeclaras como salida o al reves.

- otra cosa en tu ejemplo cuando escribes en el esclavo le pasas la direccion del esclavo y el dato.
en algunas otras funciones que consulte por ahi le pasan una direcion donde escribir. ¿exite diferencia?


- si le pasaramos la direcion del esclavo ,la direccion del puertox , y el dato ¿esto funcionaria ..verdad?


sigo con el codigo...
a mi no me funciona ni con retardos despues de la escritura...
malico me toy poniendo

 :?



« Última modificación: 23 de Junio de 2012, 17:35:59 por pajaro »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #33 en: 23 de Junio de 2012, 16:06:44 »
Hola AngelGris

en tu codigo del esclavo,
vi que asignas el dato recibido a una variable
y esa variable la asignas a un puerto,
con ello ¿equivaldria a enceder y apagar los bit de un puerto?

  Exacto!!!
  Creo recordar que para setear el valor de un puerto completamente en CCS hay algo parecido a setport_b() o algo así.


....
else             // si no hay overflow proceso el dato
   {
     if (BF == 1)  // si hay dato
     {
       if (RW == 0)  // esclavo para escritura
       {    
         lectura = read_i2c(0);
         if (DA == 1) PORTB = lectura; // si llego un dato, lo mando al puerto
       }      
     }
     if (RW == 1) write_i2c(0x77); // esclavo para lectura
   }
   SSPIF = 0;  
....



ahora me surgen 4 preguntas...
 ¿ese dato lo puedes asignar a cualquier "cosa" (variable)?

- igual que lo asignas un puerto lo podrias asignar al comando de definicion del puerto (TRISB)
me esplico:
 en principio lo declaras como entradas y mediante ese dato lo redeclaras como salia o al reves.

  Sí, se lo puede asignar a cualquier cosa. Ten en cuenta que, asignarlo a una variable, a un puerto o a cualquier registro (a excepción, obviamente, de los que son solo de lectura), sería lo mismo. En definitiva, lo que se está haciendo es copiar el dato en tal o cual dirección.


- otra cosa en tu ejemplo cuando escribes le pasas la direccion del esclavo y el dato.
en algunas otras funciones le pasan una direcion donde escribir


- si le pasaramos la direcion del esclavo ,la direccion del puertox , y el dato funcionaria verdad?


sigo con el codigo...


  Imagino que sí funcionaría, sería cuestión de ver como implementar el código pero debería funcionar.
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 #34 en: 23 de Junio de 2012, 18:17:25 »
Hola

despues de probar de mil y una con lo de los retardos y no funcionar de nada
a pesar de que en el post dice que le funciona:

http://www.todopic.com.ar/foros/index.php?topic=5312.0

voy a intentar implementar las variables para controlar lo del llenado del esclavo

como hace este enlace :

http://www.ucontrol.com.ar/forosmf/problemas-con-mis-proyectos/problema-con-pic16f877a-y-pic16f876a-como-esclavos-i2c/?PHPSESSID=lo7u704ntfc07udqs8p0fivpp7

y el amigo AngelGris.


Angelgris cuando usas BF , RW

lo declaras de alguna forma ?

en el fichero de cabecera lo deberas de tener definido en alguna direcion?

por eso no lo declaras en el programa..!

¿Estoy en lo cierto?


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #35 en: 23 de Junio de 2012, 18:29:35 »


Angelgris cuando usas BF , RW

lo declaras de alguna forma ?

en el fichero de cabecera lo deberas de tener definido en alguna direcion?

por eso no lo declaras en el programa..!

¿Estoy en lo cierto?



  Exactamente, HiTech tiene definido dichos bits en el archivo de cabecera.

  Desconozco si CCS los tiene definidos.
  Sé que CCS tiene la función bit_test, así que podrías hacer uso de ella y testear los bits correspondientes a BF y RW.. Para ello vas a necesitar el datasheet a mano para saber a qué registros pertenecen y qué bits son.
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 #36 en: 23 de Junio de 2012, 20:46:32 »
Hola AngelGris

En mi ccs busque el fichero de cabecera
del PIC es un PIC18F2550 y tine definidas
dentro de su *.h muchas cosas pero no estab esos registros imagino
que tendre que impremetarlos yo.

He mirado el Data de este pic en su sección de MSSP y la verdad
no se por donde cogerlo.

He leido que tiene 6 registros:

SSPCON1:
SSPCON2:
SSPSTAT:

son para el control y registro de estado en i2c,

SSPBUF: registro del buffer
SSPBSR: registro de desplazamineto.
SSPADD:registro de direciones

leyendo mas por debajo entiendo lo que hace cada bit pero no
se por donde coger esto.

¿alguna idea de como se declara?
 viendo tu codigo y el de los enlaces que puse parece tan facil..
pero cuando estas delante del data del chip da miedo..




Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #37 en: 23 de Junio de 2012, 20:59:09 »
  Si mal no recuerdo en CCS podías declarar de la siguiente manera

Código: C
  1. #byte SSPSTAT 0xFC7

  Siendo 0xFC7 la dirección del registro, esa información está en el datasheet

  Luego, en tu programa, podrías hacer algo así para testear el bit 0 que corresponde a BF

Código: C
  1. bit_test(SSPSTAT,0)

  Creo que era así como se utilizaba la función bit_test
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 #38 en: 23 de Junio de 2012, 22:11:13 »
Hola AngelGris

SSPSTAT:
bit 7-6 se pueden escribir (W), leer(R), limpiar(0)
bit 5-0 se puden solo leer(R),  limpiar(0)


bit 7:SMP
bit 6:CKE


bit 5:D/A
bit 4:P
bit 3:S
bit 2:R/W
bit 1:UA
bit 0:BF


//Configuracion de los registros
#BYTE SSPADD = ....0xFC8
#BYTE SSPCON1 = ....0xFC6
#BYTE SSPCON2 = ....0xFC5



AngelGris, ¿puedes pasarme el fichero de cabecera del pic18f250 y pic18F4550?
de tu compilador. donde define los pines..

seguire mañana ... :ni)  necesito descansar..




Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #39 en: 25 de Junio de 2012, 10:07:55 »
  Te dejo el archivo de encabezado...
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 #40 en: 25 de Junio de 2012, 16:38:06 »
 Te dejo el archivo de encabezado...

Gracias por el fichero pero necesitaria el del pic18F2550
me equivoque y puse pic18F250, en realidad es pic18F2550  es sobre este ultimo sobre
quien implemento todo esto, ...

0xFxx

las direciones son en hexadecimal,
en el data mire los registros
#BYTE SSPADD = ....0xFC8
#BYTE SSPCON1 = ....0xFC6
#BYTE SSPCON2 = ....0xFC5

todos son de 8 bit, asi pues que significa la F
En CCS para Hexadecimal con 0xa5 ya se entiende que es hexadecimal
pero no entiendo lo de la F en otro ejemplo tambien aparece.


http://solocodigo.com/45062/comunicacion-i2c-multi_master-entre-pics/


¿Tiene que ver con algo lo de la F cuando se define?


sigo investigando..

« Última modificación: 25 de Junio de 2012, 20:23:36 por pajaro »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #41 en: 25 de Junio de 2012, 16:59:38 »
  El número indica la dirección que tiene el registro en el mapa de memoria del pic, no tiene nada que ver que un registro sea de 8 bits.

  Si tuviese un registro en última dirección de un mapa de 0xFFFF posiciones, la dirección de dicho registro sería 0xFFFE sin importar que el resto de los registros sea de 8 bits.

  No encuentro ningún archivo de cabecera para 18F250
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 #42 en: 25 de Junio de 2012, 19:49:25 »
 El número indica la dirección que tiene el registro en el mapa de memoria del pic, no tiene nada que ver que un registro sea de 8 bits.

  Si tuviese un registro en última dirección de un mapa de 0xFFFF posiciones, la dirección de dicho registro sería 0xFFFE sin importar que el resto de los registros sea de 8 bits.

  No encuentro ningún archivo de cabecera para 18F250

Llevas razon compañero.
 Se corresponde con el mapeo de la memoria ahora en el data
al buscar la organizacion de la memoria, he dado con lo que buscaba,
en otros pic  al principio del data te muestra una tabla con las direciones de los puertos
y otras cosas, si... en este pic pic18F2550 se situa en la hoja 68 de 430 hay un apartado que dice:

SPECIAL FUNCTION REGISTER MAP FOR PIC18F2455/2550/4455/4550 DEVICES


hay se define las direciones del :

#BYTE SSPADD = 0xFC8
#BYTE SSPCON1 = 0xFC6
#BYTE SSPCON2 = 0xFC5
#BYTE SSPBUF = 0xFC9          //FC9h SSPBUF

como bien ponia en el enlace que pegue anteriormente.

con respecto ala libreria dentro de esta pone:

Código: C++
  1. /* header file for the MICROCHIP PIC18 microcontrollers
  2.   PIC18F2455
  3.   PIC18F2550
  4.   PIC18F4455
  5.   PIC18F4550
  6.   PIC18F2458
  7.   PIC18F2553
  8.   PIC18F4458
  9.   PIC18F4553
  10.  */

podria valer la misma libreria pero con algunos cambios imagino...
la idea era como tenia definicas las cosas.

cosas conseguidas:
- se de donde sale lo de los registros del control y su famoso numerito:
- se que valen para mi pic eas definiciones
- se que :


#BYTE SSPADD = 0xFC8
#BYTE SSPCON1 = 0xFC6
#BYTE SSPCON2 = 0xFC5
#BYTE SSPBUF = 0xFC9



coasas que me faltan:


me puedes confirma estas cosillas...?







cosas que dudo si se corresponderan:

- SSPIF == 1)  // interrupcion SSP


bit 3 del PIR1 y PIR1 es

PIR1: PERIPHERAL INTERRUPT REQUEST (FLAG) REGISTER 1

- SSPOV == 1)  // si hay overflow leo el buffer y borro dicho flag

bit 6 del registro del
SSPCON1: MSSP CONTROL REGISTER 1 (I2C™ MODE)

- BF == 1) // si esta lleno el buffer

BF

se corresponde con el bit 0 del registro
SSPSTAT: MSSP STATUS REGISTER (I2C™ MODE)

- RW == 0

rw :  RD or WR

de este no encontre nada ....  :(

 no ser que se coresponda con el bit 2 del
SSPSTAT: MSSP STATUS REGISTER



- DA == 1

da :    SPP data write

de este no encontre nada ....  :(

- SSPIF = 0;  // borro el flag de interrupcion

PIR1: PERIPHERAL INTERRUPT REQUEST (FLAG) REGISTER 1

el bit 3 de este registro es el SSPIF (segun data)

SSPIF: Master Synchronous Serial Port Interrupt Flag bit
1 = The transmission/reception is complete (must be cleared in software)
0 = Waiting to transmit/receive




- SSPIE = 1;              // Habilito interrupcion por SSP

enable_interrupts(INT_SSP);

- PEIE = 1;               // Habilito interrupcion de perifericos

enable_interrupts(....); // no se con cual se correspondera o su hara falta
lo mas parecido que encontre en le data es el regidstro de control de interrupciones
PIE1,PIE2 estas partenecen a una lista de 10 , las cuales se usan para el control de inerrupciones (pag 99)

pero mas abajo encontre el PEIE:

INTCON: INTERRUPT CONTROL REGISTER(pag_101):

PEIE es el bit 6 del INTCON

pero en el fichero de cabecera de mi pic donde estan definidas los tipos de interrupciones no aparece
o no la reconozco y aparece con otro nombre


- GIE = 1;                // Habilito las interrupciones globales

enable_interrupts(GLOBAL);


volvemos al codigo ...




Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #43 en: 25 de Junio de 2012, 20:25:08 »
 El número indica la dirección que tiene el registro en el mapa de memoria del pic, no tiene nada que ver que un registro sea de 8 bits.

  Si tuviese un registro en última dirección de un mapa de 0xFFFF posiciones, la dirección de dicho registro sería 0xFFFE sin importar que el resto de los registros sea de 8 bits.

  No encuentro ningún archivo de cabecera para 18F250

Perdona,
 me equivoque en realidad es el pic18F2550, me comi un 5.

Gracias.


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: PIC18F250 nunca entra en #INT_SSP ::
« Respuesta #44 en: 25 de Junio de 2012, 21:29:05 »

............

coasas que me faltan:
me puedes confirma estas cosillas...?
cosas que dudo si se corresponderan:

- SSPIF == 1)  // interrupcion SSP


bit 3 del PIR1 y PIR1 es

PIR1: PERIPHERAL INTERRUPT REQUEST (FLAG) REGISTER 1

- SSPOV == 1)  // si hay overflow leo el buffer y borro dicho flag

bit 6 del registro del
SSPCON1: MSSP CONTROL REGISTER 1 (I2C™ MODE)

- BF == 1) // si esta lleno el buffer

BF

se corresponde con el bit 0 del registro
SSPSTAT: MSSP STATUS REGISTER (I2C™ MODE)

  Exacto!

- RW == 0

rw :  RD or WR

de este no encontre nada ....  :(

 no ser que se coresponda con el bit 2 del
SSPSTAT: MSSP STATUS REGISTER


- DA == 1

da :    SPP data write

de este no encontre nada ....  :(

  RW corresponde al bit 2 del registro SSPSTAT
  DA corresponde al bit 5 del registro SSPSTAT


- SSPIF = 0;  // borro el flag de interrupcion

PIR1: PERIPHERAL INTERRUPT REQUEST (FLAG) REGISTER 1

el bit 3 de este registro es el SSPIF (segun data)

SSPIF: Master Synchronous Serial Port Interrupt Flag bit
1 = The transmission/reception is complete (must be cleared in software)
0 = Waiting to transmit/receive




- SSPIE = 1;              // Habilito interrupcion por SSP

enable_interrupts(INT_SSP);

- PEIE = 1;               // Habilito interrupcion de perifericos

enable_interrupts(....); // no se con cual se correspondera o su hara falta
lo mas parecido que encontre en le data es el regidstro de control de interrupciones
PIE1,PIE2 estas partenecen a una lista de 10 , las cuales se usan para el control de inerrupciones (pag 99)

pero mas abajo encontre el PEIE:

INTCON: INTERRUPT CONTROL REGISTER(pag_101):

PEIE es el bit 6 del INTCON

pero en el fichero de cabecera de mi pic donde estan definidas los tipos de interrupciones no aparece
o no la reconozco y aparece con otro nombre


- GIE = 1;                // Habilito las interrupciones globales

enable_interrupts(GLOBAL);


volvemos al codigo ...


  Tal vez en CCS se active automáticamente el bit PEIE, al habilitar las interrupciones globales.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas


 

anything