TODOPIC

Simuladores, editores de PCB, etc => Simuladores de circuitos => Proteus ISIS => Mensaje iniciado por: Chenao en 02 de Enero de 2010, 19:05:46

Título: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 02 de Enero de 2010, 19:05:46
Saludos después de mucho estudio, parciales, trabajo y demás cosas que se hacen en diciembre.... :D :D :D, me he puesto a trabajar con los micros ahora estoy trabajando con el modulo SPI y estado trabajando leyendo mucho realizando pruebas (por ahora simulaciones), y debido a este trabajao hoy quiero compartir con ustedes un pequeño trabajo el cual utliza dos micros 16f877 y se comunican por el protocolo SPI uno actua como maestro y el otro como esclavo, el programa hace lo siguiente.

El micro maestro: Le envia los siguientes datos al esclavo ({ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67}) que para un display de cátodo comú serian los siguiente (0,1,2,3,4,5,6,7,8,9) y el micro esclavo recibe los datos y los visualiza por el puerto B.

Acá les dejo la simulación y el código hay dos carpetas la primera prueba2 contiene el .hex del esclavo y prueba 1 que contiene el código, la simulación y el .hex del maestro. Espero que le agrade el ejemplo

Saludos 
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: PalitroqueZ en 03 de Enero de 2010, 14:11:43
pues muchas gracias por el aporte Chenao

Título: Re: Ejemplo Simulación del módulo spi
Publicado por: MLO__ en 05 de Enero de 2010, 14:22:37
Muy buen aporte chenao, gracias por compartirlo.

Saludo
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 05 de Enero de 2010, 16:49:09
Saludos

Gracias por los comentarios, en este momento estoy realizando otra prueba, cuando la tenga terminada la subo  ;-).

 
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 05 de Enero de 2010, 18:03:49
Saludos

Como lo prometido es deuda acá traigo el ejemplo que también utiliza el módulo SPI del 16F877, es parecido al ejemplo anterior la única diferencia es que le agregue el módulo A/D del micro.

Basicamente el archivo contiene dos carpetas una que se llama maestro que contiene la simulación,código en CCS y .hex del micro maestro y la otra llamada esclavo que contiene el .hex y el código en CCS del micro esclavo.

Bueno compañeros adjunto los archivos espero que le guste.

Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Lobo_Azul en 30 de Octubre de 2010, 17:20:46
Exelente aporte chenao, es de gran ayuda para los que nos iniciamos en el PSI, solo tendría una duda...¿porqué en tu proyecto del ADC no inicia desde 0 la visualización por el puerto B? y ¿por qué no se va incrementando de a 1 en 1?, ¿es acaso por la resolución?, bueno, de todas formas gracias, lo voy a checar, ya que necesito hacer algo usando el protocolo SPI, gracias.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Lobo_Azul en 30 de Octubre de 2010, 18:26:04
Gracias de todas formas...
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 31 de Octubre de 2010, 23:51:12

Saludos Lobo_Azul
Citar
¿porqué en tu proyecto del ADC no inicia desde 0 la visualización por el puerto B? y ¿por qué no se va incrementando de a 1 en 1?, ¿es acaso por la resolución?, bueno, de todas formas gracias, lo voy a checar, ya que necesito hacer algo usando el protocolo SPI, gracias.

La verdad no empieza desde 0 porqué la conversión es bastante rápida entonces no hay necesidad, con respecto a la otra pregunta no incrementa de en 1 en 1 por el voltaje de referencia que utiliza el proyecto.

Citar
Gracias de todas formas...

Que pena por no responder antes pero estoy algo alejado de la comunidad debido a que estoy ocupado con la materias del semestre.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Lobo_Azul en 01 de Noviembre de 2010, 01:23:39
Haaa orale, no hay problema, gracias.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Lobo_Azul en 07 de Noviembre de 2010, 12:23:31
Esta muy chido, y... ahora tengo otra duda  :oops:
Para que sirve la línea:   #if defined(__PCM__)   
que pones en tu maestro y esclavo?
Y otra preguntita....la linea:
set_tris_c(16);            // Configuración del puerto C para trabajar el spi // como lo dice, sirve para configurar el puerto como SPI
pero por qué en el esclavo pones
 set_tris_a(255);
 set_tris_c(223);
es necesario poner los 2 set_tris y para que los 2?
Gracias por tu ayuda, esas son mis dudas, de ahi en fuera, los ejemplos estan muy chidos y se entiende bien el SPI  :-/
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 10 de Noviembre de 2010, 18:21:13
Saludos Lobo_azul

La directiva #if defined(__PCM__) indica que tipo de compilador se va a utilizar, recuerda que dependiendo la serie existe un respectivo compilador.

La Función set_tris_c(16); configuran los terminales que se utilizan en la cominicación SPI es decir, configura los terminales sdi, sdo y clk, obviamente esto depende si el microcontrolador esta trabajando en modo esclavo o en modo maestro fijate que depediendo si es maestro o esclavo la configuración de estos terminales cambia.

y la instrucción set_tris_a(255) configura el puerto A como entrada para el conversor análogo digital. Para terminal te recomiendo si quieres aprender más consultar el datasheet del microcontrolador PIC16F877
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Lobo_Azul en 10 de Noviembre de 2010, 20:28:33
Ok Chenao, gracias por responder, lo voy a seguir checando, espero resolver mis dudas lo mas pronto posible, pero gracias en verdad.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Lobo_Azul en 20 de Noviembre de 2010, 20:12:38
Hola  :o, jeje, pues ahora escribo por que he logrado hacer que el maestro en mi caso un PIC18F4550 le mande datos a mi esclavo un PIC16F877A, pero lo que no he logrado, es que el esclavo me responda, podría alguien ayudarme... en el enlace de a continuación, expongo con más detalle mi duda, espero alguien pueda hecharme una mano, gracias...

http://www.todopic.com.ar/foros/index.php?topic=32340.0
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 03 de Enero de 2011, 13:54:20
Saludos

Hoy quiero compatir con la comunidad un pequeño resumen que he hecho acerca del módulo mssp del microcontrolador PIC16F877. En este resumen se da una idea básica como funciona el módulo, en la segunda parte se da un algoritmo para trabajar el módulo mssp en modo SPI tanto para el maestro como para el esclavo y para finalizar un ejemplo desarrollado en leguaje de máquina para seguir de cerca que es lo que hace la máquina espero les agrade.


[bFuncionamiento de módulo MSSP][/b]

El funcionamiento de módulo MSSP esta gobernado por dos registro. El primero de ellos se llama SSPSR que es un registro de desplazamiento y el registro SSPBUF que actua como buffer cuando la información es transmitida o recibida. El registro SSPBUF se encuentra en la dirección 13h (banco 0) de la memoria RAM, en cambio, el registro SSPSR es un registro al cual el usuario no tienen acceso.

Cuando se requiere transmitir un byte (8 bits), el byte se traspasa al registro SSPBUF y automáticamente el contenido del registro SSPBUF se traspasa al registro SSPSR cuya función es ir despalazando bit a bit el contenido del registro SSPBUF transmitiendo ordenadamente al ritmo de los impulsos de reloj. En recepción, los bits va entrado al ritmo del reloj por un terminal del microcontrolador y se van despalzando, en el momento, en que el registro SSPSR se llena, la información pasa inmediatamente al registro SSPBUF y en ese momento se puede leer su contenido. Más adelante se explicara como actuan los señalizadores en el momento en  que el registro SSPBUF se llena en recepción.

Protocolo de comunicación serial SPI

El protocolo de comunicación serial SPI permite la transferencia de datos de 8 bits en serie, los cuales pueden se transmitidos y recibido de forma síncrona y simultanea. Para lograr la comunicación se utiliza unos terminales lo cuales son:

1.   Serial Clock (SCK) reloj de sincronización
2.   Serial Data In (SDI) entradad de datos en serie
3.   Serial Data Out (SDO) salida de datps em serie
4.   Selección de esclavo (SS#) sólo se utiza cuando el microcontrolador funciona en modo esclavo

En el microcontrolador PIC16F877 esta lineas vienen implementadas en los siguientes terminales RC3/SD0, RC4/SDI, RC5/SCK y RA5/SS#.

En la mayorias de los casos el microcontrolador trabaja en modo maestro para lo cual los terminales deben ser programados así: RC5/SDO como salida, RC4/SDI como entrada y la linea RC3/SCK también como salida, ahora si el microcontrolador trabajara como esclavo, los terminales RC3/SCK como entrada, RC4/SDI como entrada, RC5/SDO como salida y el terminal RA5/SS# debe estar conectado a tierra.


A continuación una serie de pasos para configurar el módulo MSSP en modo SPI tanto en modo maestro como en modo esclavo:

Microcontrolador como maestro

1.   Configurar los terminales RC3/SCK y RC5/SDO como salidas.

2.   Configurar el terminal RC4/SDI como entrada.

3.   Configurar el microcontrolador en modo maestro programando adecuadamente los bits SSPM3 – SSPM0 del registro SSPCON.

4.   Poner en “1” lógico en bit SSPEN del registro SSPCON.

5.   Configurar el estado de polaridad del reloj en bit CKP del registro SSPCON.

6.   Poner en “1” lógico el bit SMP del registro SSPSTAT.

7.   Configurar el flanco del reloj activo en el bit CKE del registro SSPSTAT.

8.   Cargar el valor que se desea transmitir en el registro SSPBUF.

Microcontrolador como esclavo

1.   Configurar los terminales RC3/SCK y RC5/SDO como lineas de entrada.

2.   Configurar el terminal RC4/SDI como salida

3.   Configurar el microcontrolador en modo maestro programando adecuadamente los bits SSPM3 – SSPM0 del registro SSPCON, es importante aclarar que la velocidades del reloj tanto para el esclavo como para el maestro deben ser las mismas.

4.   Poner en “1” lógico en bit SSPEN del registro SSPCON.

5.   Configurar el estado de polaridad del reloj en bit CKP del registro SSPCON.

6.   Poner en “0” lógico el bit SMP del registro SSPSTAT.

7.   Configurar el flanco del reloj activo en el bit CKE del registro SSPSTAT.

8.   Activar la interrupción global y la de periféricos en el registro INTCON.

9.   Activar la interrupción para la puerta serie síncrona poniendo en “1” lógico el bit SSPIE del registro PIE1.

10.   Una vez detectada la interrupción leer el contenido del valor recibido, es decir, el contenido del registro SSPBUF.

11.   Limpiar el respectivo señalizador de interrupción y bit WCOL del registro SSPCON.


“Comunicación entre 2 microcontroladores PIC16F877 utilizando el protocolo SPI”

En el presente ejemplo se va aplicar todo lo estudiado acerca de la comunicación serial en modo SPI, para comunicar 2 microcontroladores PIC16F877 mediante el protocolo SPI.

El programa es sencillo, un microcontrolador actuara como maestro y el otro como esclavo, el microcontrolador maestro tiene como función realizar una conersión A/D por el canal 0, el valor digital capturado por microcontrolador maestro será enviado al microcontrolador esclavo mediante el protocolo SPI y este a su vez mostrara el dato recibido por el puerto B.

A continuación se muestra el código en lenguaje de máquina para el maestro:

Código: [Seleccionar]
;*********************** Registro de control *************************************
status equ 03h
porta equ 05h
portb equ 06h
portc equ 07h
portd equ 08h
porte equ 09h
intcon equ 0bh
pir1 equ 0ch
sspbuf equ 13h
sspcon equ 14h
adcon0 equ 1fh
adresh equ 1eh

trisa equ 85h
trisb equ 86h
trisc equ 87h
trisd equ 88h
trise equ 89h
pie1 equ 8ch
sspstat equ 94h
adresl equ 9eh
adcon1 equ 9fh
;******************************* Registro de usuario ****************************
bandera equ 20h
lectura equ 21h
loop1 equ 22h
loop2 equ 23h
;******************************* Empieza el programa ***************************

list p = 16f877

org 00
goto inicio

org 04
goto inter
;****************************** Rutina que controla las interrupciones ********

inter btfsc pir1,6 ; Pregunta si hubo interrupción por fin
; De conversión A/D

goto convierte
retfie ; Si no hubo interrupción sale de la
; Interrupción
;************* Rutina de atención de interrupción de la conversión A/D *****

convierte

bcf pir1,6 ; Se limpia la bandera de interrupción
movlw d'1'
movwf bandera ; Se pone bandera en 1 para indicar
; Que hubo conversión A/D
movf adresh,0
movwf lectura ; Se leé el valor de la conversión a 8
movwf sspbuf ; Bits se traspasa el valor al registro
; SSPBUF para ser transmitido
retfie ; Sale de la interrupción

;***************************** Rutina de unos microsegundo *******************

retar movlw d'255'
movwf loop1
movlw d'100'
movwf loop2
decfsz loop2,1
goto $-1
decfsz loop1,1
goto $-5
return

;****************************** Rutina principal MAIN() *************************

inicio bcf status,6
bsf status,5 ; Banco 1
movlw b'11111111'
movwf trisb ; Puerto B como entradas digitales
movlw b'11010111'
movwf trisc ; Se configura RC3/SCK como salida,
; RC4/SDI como entrada y
; RC3/SDO como salida
movlw b'11111111'
movwf trisa
movwf trisd
movwf trise ; Puertos A,C,D y E como entradas
; Digitales
clrf adresl ; Se Limpia inicialmente la conversión
movlw b'00000001'
movwf adcon1 ; Se configura el adcon1 para que
; Todas los canales sean
; Entradas análogas y RA3 como Vref+
movlw b'11000000'
movwf sspstat ; Se configura el modo SPI para
; Muestrear al final del Impulso del
; Reloj
movlw b'01000000'
movwf pie1 ; Se activo la interrupción por fin de
; Conversión A/D

    bcf status,5 ; Banco 0
clrf portb
clrf lectura
clrf adresh ; Se inicializan todos los registros que
; Se van a trabajar
movlw b'11000000'
movwf intcon ; Se activa la interrupción Global y la
; De periféricos
movlw b'00100000'
movwf sspcon ; Se activa el modo SPI en modo
; Maestro con reloj Fosc/4
movlw b'10000001'
movwf adcon0 ; Se Configura el canal 0 y se activa el
; Inicio de la conversión A/D
bsf adcon0,2

repite
movf bandera,0 ; Se pasa bandera a W
xorlw d'1' ; Comparo si son iguales
btfss status,2
goto repite
clrf bandera
call retar ; Una pequeña rutina de tiempo para
; Volver a iniciar la conversión
bsf adcon0,2 ; Inicia nuevamente la conversión
goto repite ; Bucle infinito
end

Código: [Seleccionar]
Código para el esclavo en el esamblador:

;*********************** Registro de control *************************************
status equ 03h
porta equ 05h
portb equ 06h
portc equ 07h
portd equ 08h
porte equ 09h
intcon equ 0bh
pir1 equ 0ch
sspbuf equ 13h
sspcon equ 14h

trisa equ 85h
trisb equ 86h
trisc equ 87h
trisd equ 88h
trise equ 89h
pie1 equ 8ch
sspstat equ 94h
;******************************* Registro de usuario ****************************

lectura equ 40h ; Variable que contiene el valor
; Recibido por la
; Comunicación SPI
;******************************* Empieza el programa ***************************
list p = 16f877

org 00
goto inicio

org 04
goto inter
;******************** Rutina que controla las interrupciones ******************


inter btfsc pir1,3 ; Pregunta si hubo interrupción por la
; Puerta serie síncrona
goto recibe
retfie ; Si no hubo interrupción sale de la
; interrupción

;************** Rutina de atención de interrupción de la serie sincrona ******

recibe
movf sspbuf,0
movwf lectura ; Se leé el byte recibido
movwf portb
bcf pir1,3 ; Se inicializa la interrupción
bcf sspcon,7 ; Se limpia el bit WCOL si hubo una
; Interrupción
retfie ; Retorna al PCL + 1

;****************************** Rutina principal MAIN() *************************

inicio bcf status,6
bsf status,5 ; Banco 1
movlw b'00000000'
movwf trisb ; Puerto B como salidas digitales
movlw b'11101111'
movwf trisc ; Se configura RC3/SDO como
; Entrada, RC4/SDI como salida y
; RC5/SCK como entrada
movlw b'11111111'
movwf trisa
movwf trisd
movwf trise ; Puertos A,C,D y E como entradas
; Digitales
movlw b'11000000'
movwf sspstat ; Se configura el modo SPI para
; Muestrear al final del Impulso del
; Reloj
movlw b'00001000'
movwf pie1 ; Interrupción por el módulo serie
; Síncrono habilitado
bcf status,5 ; Banco 0
clrf portb
clrf lectura
movlw b'11000000'
movwf intcon ; Se activa la interrupción Global y la ; De periféricos
movlw b'00100100'
movwf sspcon ; Se activa el modo SPI en modo
; Esclavo con reloj SCK
nada goto nada ; Espera interrupción al llenarce el
; SSPBUF
end

Buenos compañeros eso era todo lo que queria compartir con ustedes ojalá el resumen sirva de ayuda a los que se inician con este módulo.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 03 de Enero de 2011, 14:05:05

Saludos

Para cerrar con broche de oro acá la simulación. Se adjuntan dos carpetas una con el nombre ad_spi que contiene la simulación, el código y .hex del maestro y la otra que contiene el código y el .hex del esclavo. La simulación fue hecha en el proteus 7.2.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: isa12345 en 17 de Febrero de 2011, 17:38:10
gracias por los aportes pero quisera tener una comunicacion full udplex entre los pics por el modulo spi. si alguine puede ayudarme lo agradeceria mucho gracias
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 31 de Agosto de 2011, 21:08:28
Hola a todos, muy bueno el tema que estan llevando a cabo.
Ya con haberlo leido aprendi mucho sobre SPI.

Ahora bien, paso a comentarles mi caso, estoy intentando trabajar con
el integrado ADE7758 de analog devices. A continuacion su hoja de datos.

http://www.analog.com/static/imported-files/data_sheets/ADE7758.pdf

A partir de la pagina 58 explica sobre como acceder a cada uno de sus
registros.

Mi pregunta es la siguiente, vi que ustedes han comunicado dos pics mediante
SPI, uno funcionando como maestro y otro como esclavo.

En este caso, deberia configurar el pic como maestro, ya que el esclavo es
el ADE7758 ??

Como tengo que hacer para poder acceder a cada uno de los parametros que
mide dicho integrado ??

Desde ya gracias por sus respuestas, parece que hace rato que vienen estudiando
SPI  :lol:   :lol: 

Saludos a todos !!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 01 de Septiembre de 2011, 13:23:04


En efecto Simon21, el microcontrolador debe ser el dispositivo maestro. Para medir los parámetros que entrega el integrado debes consultar el datasheet, debe ser parecido al manejo de una microsd, donde el microcontrolador envia la orden (que puede ser escritura, lectura, información acerca de la memoria), "pero igual que cualquier dispositivo que utiliza este tipo de comunicación debe ser inicializado correctamente al principio de la comunicación" Una vez el microntrolador solicitá la orden el dispositivo esclavo responde de acuerdo a los pulsos del reloj.

Para finalizar debes tener en cuenta que la frecuencia con que se están comunicando los dos dispositivo debe ser muy parecidas, de lo contrario, no hay seguridad que funciones correctamente la comunicación.

Saludos.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 01 de Septiembre de 2011, 19:19:00
Cito a continuacion tus dos ejemplos chenao...

---------MAESTRO----------

#if defined(__PCM__)
#include <16f877.h>
#use delay(clock = 4000000)

void main()
{
  int i,conversion;
  set_tris_c(16);                                  // Configuración del puerto C para trabajar el spi
  setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);
  setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);         // configuro los pines de la conversion
  setup_adc(adc_clock_div_32);                     // configuro el conversor análogo digital
  conversion = 0;
 
  do
   {
     set_adc_channel(0);                           // escojo el canal a convertir
     delay_ms(1);                                  // esperar mientras se inicializa el módulo A/D
     conversion = read_adc();                      // leer el valor
     delay_ms(1);
     spi_write(conversion);
   }
  while(true);
}

---------ESCLAVO----------

#if defined(__PCM__)
#include <16f877.h>
#use delay(clock = 4000000)
#byte puerto_b=06

void main()
{
  set_tris_a(255);
  set_tris_c(223);
  set_tris_b(0);
  puerto_b = 0;
  setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16| SPI_XMIT_L_TO_H);
  do
   {
     if(spi_data_is_in())
       {
         puerto_b = spi_read();
       }
   }
  while(true);
}

Es muy facil entender ambos programas, en mi caso para acceder a los distintos registros
del ADE7758, como debo hacer, en el caso de tu código MAESTRO ??

Agradeceria que me des una mano en esto.

Saludos !!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 01 de Septiembre de 2011, 21:02:20
Por lo que me parece, debo configurar el pic para q sea esclavo, ya que leera los valores que le envie
el integrado ADE.. El tema es que uno tambien puede escribir en los registros de dicho integrado
para cambiar algunos parametros...
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 02 de Septiembre de 2011, 10:43:27

En la memorias microsd el microcntrolador es el encargado de enviar vía SPI los camandos de orden para que la tarjeta responda, es decir, si el controlador envia la orden de escritura la memoria responde a dicha orden.

A continuación muestro una rutina para inicializar una memoria microsd con un pic16f877

Código: [Seleccionar]
///////////////////////////////////////////// Rutina que reinicializa la memoria ////////////////////////////////////////

int init_mmc()
  {
    SETUP_SPI(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16 | SPI_XMIT_L_TO_H);
    OUTPUT_HIGH(PIN_C2);
    for(i=0; i<20; i++)
      {
        SPI_WRITE(0xFF);             // espero a que se inicialice la memoria que van desde 8 a 10 pulso del reloj
      }
    OUTPUT_LOW(PIN_C2);             // Activo la targeta
    for(i=0; i<20; i++)
      {
        SPI_WRITE(0xFF);             // espero a que se inicialice la memoria que van desde 8 a 10 pulso del reloj
      }
    SPI_WRITE(0x40);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x95);                // Comando CMDO datos a enviar
    if(mmc_respuesta(0x01)==1)
      {
        return 1;                    // Error en memoria por que se supero el tiempo
      }
    i = 0;
    do
      {
        SPI_WRITE(0x41);         // Envia comando hasta que de la respuesta y hasta que se cumpla el tiempo
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0xFF);            // Secuencia del comando CMD1
        i= i + 1;
      }
    while((i<250) && (mmc_respuesta(0x00)==0x01));
    if(i>=250)
      {
        return 1;                // si se supera el tiempo de respuesta no se ha inicializado bien la targeta
      }
    SPI_WRITE(0x50);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x02);
    SPI_WRITE(0x00);
    SPI_WRITE(0xFF);              // Comando CMD16 para configurarlo de 512 bytes
    delay_ms(2);
    if(mmc_respuesta(0x00)==0x01)
      {
        return 1;                // se ha inicializado incorrectamente
      } 
    OUTPUT_HIGH(PIN_C2);
    return 0;                // se ha inicializado correctamente 
   
  }



Nota como el microcontrolador envía los comandos y espera a que el dispositivo responda, lo mismo se debe hacer para tu dispositivo, debes enviar el comando y esperar respuesta del dispositivo esclavo.

Saludos




















Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 02 de Septiembre de 2011, 12:23:47
  Mas allá que el PIC reciba los datos del integrado, es casi seguro (no digo 100% porque nunca usé dicho integrado) que el PIC tiene que estar configurado como maestro. Por ejemplo, para leer una memoria también recibe los datos de dicha memoria y sin embargo está configurado como maestro.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 06 de Septiembre de 2011, 17:24:17
Muy buena explicacion Chenao, en estos dias voy a armar el circuito en una proto para
empezar a hacer pruebas, ya que no puedo simularlo  :?

Respecto a la sincronizacion de ambos dispositivos, hay que configurar algo en especial ?
Digo esto ya que el 16F877A que voy a usar va a ser con un cristal de 4 MHz, y
el ADE7758 lleva uno de 10 MHz, por eso tengo la duda si hay que configurar algo para
ponerlos en sincronismo.

Saludos a todos, gracias por sus aportes !!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 06 de Septiembre de 2011, 18:04:14
  Más allá de los cristales, tenés que tener en cuenta la velocidad del módulo SPI. Debés asegurarte de configurar una velocidad que no sea superior a la máxima soportada por el dispositivo.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 06 de Septiembre de 2011, 18:58:49
Buena respuesta AngelGris.
Se supone que la velocidad del modulo spi la configuro en la siguiente linea ?

SPI_CLK_DIV_16

Otra pregunta q se me hizo al ver el código es que funcion cumplen todas estas
lineas ?

    SPI_WRITE(0x40);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x95);                // Comando CMDO datos a enviar

Saludos !!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 06 de Septiembre de 2011, 21:30:51
Buena respuesta AngelGris.
Se supone que la velocidad del modulo spi la configuro en la siguiente linea ?

SPI_CLK_DIV_16



  Sí, esa es la opción para configurar la velocidad... Fijate en la ayuda del compilador que debería haber otras opciones, dependiendo del PIC.



Otra pregunta q se me hizo al ver el código es que funcion cumplen todas estas
lineas ?

    SPI_WRITE(0x40);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x95);                // Comando CMDO datos a enviar

Saludos !!

  Imagino que esos son comando que se envían a la memoria microsd que comenta Chenao.

  En tu caso, habría que ver que comandos hay que enviarles al dispositivo (si es que es necesario enviar alguno), y ver como sería la lecutra.... Yo no utilizo CCS, así que no estoy del todo seguro como son sus funciones.

  En todo caso, voy a ver si me hago un tiempo para leer el datasheet del dispositivo y ver si puedo aportar algo.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 06 de Septiembre de 2011, 22:08:42
Si, en realidad son los comandos que se le envian al dispositivo, pero no entiendo para que pone la linea
 SPI_WRITE(0x40); y luego repite 4 veces SPI_WRITE(0x00);
Supongo que es por si el micro no la recibe en la primera, lo va a recibir en alguna de las siguientes..

Gracias por tu aporte Angel Gris, abrazo !!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 07 de Septiembre de 2011, 12:06:21
  Hola Simon, no encuentro en Proteus el ADE como para poder simularlo.

  Por otro lado, leyendo el datasheet de dicho integrado, veo que se puede acceder a varios registros tanto para escribir en ellos como para leerlos. Básicamente la comunicación consta de enviar un primer byte con la dirección de registro a acceder (con el bit 7 en 1 o 0 según se quiera leer o escribir dicho registro). Luego enviar la cantidad de bytes necesaria, si la operación era de escritura, y si la operación es de lectura recibir los bytes. necesarios. La cantidad de bytes de cada registro está indicada en la tabla 17 del datasheet

  A modo de mnemónico sería

Código: C
  1. pin_cs = 0; //comienzo comunicación con el dispositivo
  2. write_spi (0x0e); //registro 0E para lectura (supuestamente leere el valor V RMS  de la fase B)
  3. parte_alta = read_spi(); // leo el byte de mayor peso
  4. parte_media = read_spi(); // leo la parte media del registro
  5. parte_baja = read_spi(); // leo el byte de menor peso
  6. pin_cs = 1; // termino la comunicación con el dispositivo
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 07 de Septiembre de 2011, 15:58:16
Que pena por noresponde antes. En lo refetente a la siguiente pregunta

Citar
Otra pregunta q se me hizo al ver el código es que funcion cumplen todas estas
lineas ?

    SPI_WRITE(0x40);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x95);                // Comando CMDO datos a enviar


La memoria microsd tiene un registro de 6 bytes los cuales hay que direcionar, por ejemplo el comando al cual hago referencia es para activar la memoria, figate que dependiendo el comando que debe enviar el microcontrolador cambia los datos a envia por el bus SPI.

Tengo que sacar algo de tiempo para leer el datasheet y poder contribuir en algo, espero seguir ayudando.

Nota: Los ejemplos que he puesto a lo largo del presente hilo se pueden simular en proteus 7.0 sin problema, incluyendo el de la microsd.

Saludos.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 08 de Septiembre de 2011, 18:32:38
Gracias por las respuestas, me esta sirviendo muchisimo.
Finalmente voy a ir probando en el micro ya que no puedo
simularlo.
Para conectarlo fisicamente, a que pines del pic 16F877A
debo conectar cada uno de estos pines de mi dispositivo?

DOUT
SCLK
CS
DIN
IRQ

CS e IRQ son negados.

Saludos !!

Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 08 de Septiembre de 2011, 20:18:06
Gracias por las respuestas, me esta sirviendo muchisimo.
Finalmente voy a ir probando en el micro ya que no puedo
simularlo.
Para conectarlo fisicamente, a que pines del pic 16F877A
debo conectar cada uno de estos pines de mi dispositivo?

DOUT
SCLK
CS
DIN
IRQ

CS e IRQ son negados.

Saludos !!



DOUT (dispositivo)  -------------- SDI (pic)
DIN    (dispositivo) --------------- SDO (pic)
SCLK  (dispositivo) --------------- SCK (pic)

  Para CS podés usar cualquier pin que te quede cómodo..

  Por lo que leí del datasheet del dispositivo, IRQ es una salida que se activa cuando ocurren ciertos procesos. Sí querés hacer uso de esa funcionalidad podrías conectarla al pin B0, ya que este es el de interrupción externa. Si no te interesa tener esa funcionalidad, podrías obviar el conexionado.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 08 de Septiembre de 2011, 21:46:54
Gracias por la info !!
La semana que viene me voy a poner de cabeza con todo esto
y les cuento como me fue

Saludos a todos y gracias nuevamente por sus aportes
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 17 de Octubre de 2011, 20:25:16
Gente, para los que probaron.. Tengo algunas preguntas..
Que tiempo debe esperar el integrado desde que envía un spi_write
hasta que realiza un spi_read ??

Que tiempo debe pasar desde que lee un dato hasta que pide otro dato
de otro registro ??

Estoy haciendo las pruebas y por el momento no leo demasiado...

A proposito, el pin CS e IRQ no lo estoy utilizando.. Debería usarlo ?

Saludos a todos !!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 17 de Octubre de 2011, 20:28:44
El pin CS sí, porque sino ¿Cómo haces para indicarle al dispositivo el comienzo y/o fin de la secuencia de lectura/escritura?
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 17 de Octubre de 2011, 20:52:44
Eso no estaba entendiendo del todo como hacerlo..
Supuestamente, el pin CS debo ponerlo en "0" cuando leo,
cuando escribo, o siempre ??

A lo que tengo entendido, apenas comienzo el programa del micro
debe estar en "1", para que unos instantes antes de hacer el spi_write
debo bajar el CS a "0". Luego de hacer el spi_read vuelvo el CS a "1".
Y asi cada vez que quiera leer un dato.

Esta bien el análisis que estoy haciendo, o lo estoy mal interpretando ??

Saludos y gracias a todos por su ayuda
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 17 de Octubre de 2011, 22:03:17
  Tiene que permanecer normalmente en 1. Cuando querés trabajar con el bus spi tiene que bajar a 0 y una vez terminado de trabajar volver a 1. Eso es válido tanto para operaciones de escritura como para operaciones de lectura.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 17 de Octubre de 2011, 22:07:25
Tal cual, pero a lo que voy..
Por ejemplo..
Necesito leer el dato de 2 registros distintos
sigo los siguientes pasos

- Arranco con el CS en 1
- Delay
- CS= 0
- Delay
- spi_write (valor del registro que voy a leer)
- Delay
- variable= spi_read ()
- CS=1
- Delay
- CS=0
- delay
- spi_write (valor del registro que voy a leer)
- delay
- variable2= spi_read ()
..........
........
........
.......

¿¿ Es correcto este análisis ??
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 17 de Octubre de 2011, 22:16:57
Tal cual, pero a lo que voy..
Por ejemplo..
Necesito leer el dato de 2 registros distintos
sigo los siguientes pasos

- Arranco con el CS en 1
- Delay
- CS= 0
- Delay
- spi_write (valor del registro que voy a leer)
- Delay
- variable= spi_read ()
- CS=1
- Delay
- CS=0
- delay
- spi_write (valor del registro que voy a leer)
- delay
- variable2= spi_read ()
..........
........
........
.......

¿¿ Es correcto este análisis ??

  A simple vista la forma puede llegar a ser correcta... pero para eso tenés que ver bien el datasheet del dispositivo que quieras manejar.  Los delay no creo que sean necesarios pero como dije, hay que ver bien el datasheet del dispositivo.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 18 de Octubre de 2011, 12:36:57
Saludos

Lo que se tiene que tener en cuenta no es tanto los retardos, si no el tiempo que demora en responder el dispositivo conectado al bus SPI (afirmátivamente o en caso contrario un error), por lo tanto, el dispositivo puede responder en cualquier momento (en el intervalo) y es deber del programador detectar las respuesta del dispositivo. Si te fijas en el ejemplo de la microsd hay una parte del la función que realiza este procedimiento.  
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 18 de Octubre de 2011, 15:15:19
Gracias Chenao por tu ayuda..
Podrias explicar un poco mejor esto ??
Seguramente por ahi debe venir mi error ya
que el micro lee cualquier valor del dispositivo.

Saludos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 19 de Octubre de 2011, 13:05:36
Hola Simon21

Claro que sí, esa es la idea del foro 8). Mira el siguiente código el cual pertenece a parte de algoritmo para inicializar una microsd.

Código: [Seleccionar]
do
      {
        SPI_WRITE(0x41);         // Envia comando hasta que de la respuesta y hasta que se cumpla el tiempo
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0xFF);            // Secuencia del comando CMD1
        i= i + 1;
      }
    while((i<250) && (mmc_respuesta(0x00)==0x01));
    if(i>=250)
      {
        return 1;                // si se supera el tiempo de respuesta no se ha inicializado bien la targeta
      }

Nota como el micro envia el comando y espera a que la memoria responda, si responde en el intervalo con 0 la memoria responde acertadatamente, en caso contrario si el tiempo de respuesta es muy prolongado hubo un error y por lo tanto retorna un 1. Fijate como el programa pregunta una y otra vez (durante 250 veces) si la memoria respondio acertadamente.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 20 de Octubre de 2011, 19:06:02
Paso a comentarles lo que estuve haciendo..
La idea en este caso es escribir el valor en un registro y luego leer dicho valor..
Como verán en la imagen adjunta, el primer bit indica si voy a escribir o si voy a leer.
y a continuación leo o escribo.

Mi problema es que no estoy leyendo nada..

Agradecería si alguien pudiera darme una mano ya que seguramente es una pavada
y no me estoy dando cuenta.

El código que pongo a continuación es bastante simple, le envío al registro de lectura/escritura
el valor de count y luego intento leerlo. Una vez leído lo imprimo en el lcd.

El problema es que no estoy leyendo nada.. Ya que si leyera algo, debería mostrar el mismo
valor ambas lineas en el lcd.

Saludos y gracias por su ayuda

------------------------------------------------------------------------------------------------------

void main()
{
  lcd_init();
  delay_ms(100);
  lcd_putc('\f');
 
  int test, cont=0;
 
  set_tris_c(16);                                                         // Configuración del puerto C para trabajar el spi
  setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);   
   
  do
   {
       
     cont++;
     
     spi_write(0x9D); // 1001 1101 Escribo a la direccion 1D (El primer 1 indica que se va a escribir)
     delay_us(10);
     spi_write(cont);
     delay_us(20);
     

     spi_write(0x1D); // 0001 1101 Escribo a la direccion 1D (El primer 0 indica que se va a leer)
     delay_us(10);
     test = spi_read();  // Leo el valor del registro
     
     lcd_gotoxy(1,1);
     printf(lcd_putc, "Contador: %d", cont);   // Imprimo el valor de count

     lcd_gotoxy(1,3);
     printf(lcd_putc, "Test contador: %d", test); // Imprimo el valor del registro

     delay_ms(500);       // Espero 500 ms para poder visualizar

     lcd_putc('\f');           // Limpio la pantalla
     
   }
  while(true);
}
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Suky en 20 de Octubre de 2011, 19:09:26
Consulta, que modo SPI es el dispositivo y que modo estas configurando?
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 20 de Octubre de 2011, 19:10:36
Estoy trabajando con el ADE7758 http://www.analog.com/static/imported-files/data_sheets/ADE7758.pdf
el mismo trabaja en modo ESCLAVO, por lo que el micro es el MASTER.

Saludos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Suky en 20 de Octubre de 2011, 19:12:22
No me refiero a eso, sino Modo 00, 01, 10 o 11. En cualquier dispositivo SPI primero hay que establecer eso, luego la frecuencia máxima que acepta, etc...
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 20 de Octubre de 2011, 19:15:03
Me parece que este dispositivo no es asi..
Si ves la hoja de datos que postié antes, explica como es el protocolo
y como son los niveles de tension del mismo, por lo que creo que el error
no está ahi.
La frecuencia que trabajará la determina el SCK del pic que va directo al
SCLK del ADE7758. De esa forma se sincronizan ambos dispositivos.

Desconosco lo que me preguntas..

Saludos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Suky en 20 de Octubre de 2011, 19:16:33
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28952.0;attach=16939)
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 20 de Octubre de 2011, 19:20:45
De que hoja de datos esta sacado eso ??
No dice nada respecto a eso en el ADE7758...
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Suky en 20 de Octubre de 2011, 19:26:31
De que hoja de datos esta sacado eso ??
No dice nada respecto a eso en el ADE7758...

Pero leyendo lo del cuadro y las imagen que posteas, si no me equivoco procuraría configurar el modo 01.. Sino prueba en cambiar entre los distintos modos  :mrgreen:


Saludos!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 20 de Octubre de 2011, 19:56:38
  Tenés que tener muy en cuenta lo que comenta Suky, ya que si estás configurando tu pic de un modo distinto al soportado por el dispositivo, no vas a poder comunicarte.

  Esto está en el datasheet del dispositivo

"SERIAL INTERFACE
The ADE7758 has a built-in SPI interface. The serial interface
of the ADE7758 is made of four signals: SCLK, DIN, DOUT,
and CS. The serial clock for a data transfer is applied at the
SCLK logic input. This logic input has a Schmitt trigger input
structure that allows slow rising (and falling) clock edges to be
used. All data transfer operations are synchronized to the serial
clock. Data is shifted into the ADE7758 at the DIN logic input
on the falling edge of SCLK
. Data is shifted out of the ADE7758
at the DOUT logic output on a rising edge of SCLK."

  La oración que puse en negrita indica que el dato será transferido hacia el dispositivo en los flancos de bajada de la señal de clock.
  Como en la imagen que subiste la línea de CLK parece permanecer normalmente en bajo, y por lo mencionado por la oración anterior (que sería la salida desde el PIC al dispositivo) parecería que el dispositivo trabaja en el modo 00 de la terminología standard del SPI.


  ¿De cuantas lineas es el LCD que estás utilizando? Pregunto porque cuando querés escribir lo leido ponés

Código: C
  1. lcd_gotoxy(1,3);

  Pero si tu LCD sólo es de 2 líneas te estás yendo fuera de él.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 20 de Octubre de 2011, 21:30:46
Perfecto, pero eso lo he configurado en el setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);   

Lo que puse en negrita indica que permanece siempre en cero, los flancos van de cero a uno.. Si hubiera
puesto H to L los flancos van de uno a cero.. Eso lo comprobé midiendo con el osciloscopio..

Respecto a las líneas del lcd no es problema ya que mi LCD es de 20x4

Saludos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Suky en 20 de Octubre de 2011, 21:40:05
Prueba colocando CKE, CKP y en SMP en 0.


Saludos!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 20 de Octubre de 2011, 21:44:47
En que parte configuro eso ??
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Suky en 20 de Octubre de 2011, 21:49:12
En que parte configuro eso ??

En la configuración SPI... Habría que leer en detalle la ayuda de CCS. Lo que yo comento es en base al datasheet del microcontrolador.


Saludos!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 20 de Octubre de 2011, 21:58:20
En que parte sale esa tabla en el Datasheet??
No la encontre en ningun lado en el Datasheet del
16F877A que es el micro que estoy utilizando..
Agradecería que me digan en que pagina esta

http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf

Saludos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Suky en 20 de Octubre de 2011, 22:04:50
mmm... en la página 76 podes ver el tema de los bits.


Saludos!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 20 de Octubre de 2011, 22:28:15
Claro, veo que está especificado en el registro SSPBUF
Ahora tengo que ver como modificarlo y ver que parametros vienen
por defecto ya que nunca configure eso y quizá lo tenga bien configurado
como quizá no...

Deberían coincidir ambas configuraciones (pic y ade7758) tal como se ven
cada una en las distintas imagenes..

Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 20 de Octubre de 2011, 22:53:38
Tenes idea como configurarlo desde ccs ? O que tengo que configurar especificamente ??
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 20 de Octubre de 2011, 23:10:10
  No veo en tu programa como es que manejas el pin CS del dispositivo.

  Busca en la ayuda de CCS a ver si figura algo acerca de SPI_XMIT_L_TO_H  Yo lo he visto definido en algún lado pero no sé donde...
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 20 de Octubre de 2011, 23:24:26
El pin CS lo puse directamente a masa, ya que en una parte del datasheet dice que
en caso de usar un solo dispositivo podes ponerlo a masa directamente.
El chip select es para cuando tenes varios dispositivos entonces elejir cual utilizar..

Saludos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 24 de Octubre de 2011, 12:48:28
Hola Simon21

He estado pendiente del desarrollo del hilo, estuve leyendo en la red que proteus tiene implementado este dispositivo en sus librerias, porque no intentas simularlo utilizando el debug del SPI y así ver más detalladamente los datos enviados por el bus (tanto como del maestro como del esclavo). Creo que así te podría ayudar más y se podría depurar más fácilmente el código.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 24 de Octubre de 2011, 22:09:10
Me es mucho mas facil trabajar directamente en el circuito ya que tengo todo armado y funcionando..
El unico problema es algo que estoy haciendo mal en el programa que hace que no se puedan comunicar
bien el pic y el dispositivo (ADE7758). Me estoy quemando las neuronas a full estos dias jaja
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 25 de Octubre de 2011, 00:08:20
Me parece que encontre lo que estoy haciendo mal..
Segun el datasheet del ADE, la frecuencia minima de CLK es de 5 MHz
y la maxima 10 MHZ, y yo estoy usando un 16F877A con un cristal
de 4 MHz, y al hacer la siguiente linea setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);
Hago 4/16= 250 KHz, es mucho mas baja que la minima permitida..
No me va a quedar otra opcion que poner un cristal de 10 o 20 MHz...
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: MerLiNz en 25 de Octubre de 2011, 00:25:48
con 10mhz solo conseguiras 2,5mhz. Con 20mhz 5Mhz
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 25 de Octubre de 2011, 14:31:42
Hola Simon21

El cálculo lo estas haciendo mal recuerda que el ciclo de instrucción se define como la  4 / Fosc así que tienes que revisar el programa para garantizar la frecuencia por el el terminal CLK que específica el fabricante, modificando el cristal y la línea de código SPI_CLK_DIV_XX.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 25 de Octubre de 2011, 15:14:50
Comprobado con el osciloscopio..
Con un cristal de 4 MHz y un divisor por 16 tengo
justo 250 KHz..
Puedo usar un cristal de 10 MHz y no usar divisor, por lo que
tendría 10 MHz en CK..
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: MerLiNz en 25 de Octubre de 2011, 15:57:05
Comprobado con el osciloscopio..
Con un cristal de 4 MHz y un divisor por 16 tengo
justo 250 KHz..
Puedo usar un cristal de 10 MHz y no usar divisor, por lo que
tendría 10 MHz en CK..

Aunque no uses divisor los pics trabajan con fosc/4, con uno de 10mhz tendrias 2,5mhz
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 25 de Octubre de 2011, 17:28:01
Entonces voy a tener que usar un cristal de 20 MHz..
Puedo usar un cristal de 20 MHz con un 16F877A a lo que
estoy viendo.
Debo cambiar alguna configuración inicial además de
las siguiente línea ??
#use delay(clock = 4000000)
Con respecto al FUSE, en vez de XT que era lo que cambiaba
al usar un cristal de 20 en la siguiente línea??
#FUSES XT   

Saludos y gracias por su ayuda permanente !! :lol:
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 25 de Octubre de 2011, 17:44:48
  Para el módulo SPI (hardware) del 87x, las posibles frecuencias son Fosc/4, Fosc/16 y Fosc/64. Fosc hace referencia a la frecuencia de oscilación y no a la de instrucción. Por lo tanto con un cristla de 20MHz y usando la forma de Fosc/4 se obtendrían los 5MHz necesarios para el clock del SPI.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: MerLiNz en 25 de Octubre de 2011, 19:04:00
tendrias que poner delay=20000000 y en vez de XT debes poner HS
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 25 de Octubre de 2011, 19:04:16
Perfecto !!
En un rato voy a probar y les cuento como me fue..
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 26 de Octubre de 2011, 18:59:01
Hola a todos.. Ya logré hacer funcionar el sck a 5 MHz...
Ahora vamos al siguiente punto..
Como hago para configurar CKP y CKE desde CCS ??
Ya que no puedo ver como los configura la funcion
spi_read y spi_write, o por lo menos no pude encontrar
el programa de dichas funciones.
Me refiero a la página 76 del datasheet del 16F877A
Creo que ahi está la clave de esto.

http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf

Saludos a todos y agradecería una respuesta

P/D: la imagen adjunta muestra en verde la señal SCK del pic y
la amarilla SDO, la señal SDI no la muestro ya que no recibo nada
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 26 de Octubre de 2011, 19:55:23
  Los bits CKP y CKE los debe modificar la función setup_spi() según los parámetros que se les pase.
 
  Se me ocurren dos maneras de saber como están... una sería testearlos con la función bit_test y encender leds en distintos pines del pic (si es que te quedan salidas disponibles) y otra sería simularlo en ISIS y desde las ventanitas de debuggeo ver como están los bits
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 27 de Octubre de 2011, 21:40:08
bit test ??
Pero no se en que registro estan y como estan ubicados ???
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Suky en 27 de Octubre de 2011, 21:50:29
bit test ??
Pero no se en que registro estan y como estan ubicados ???


Pero tienes el datasheet! O podes usar #byte para trabajar directamente con los bytes y configurarlo al estilo C18 o ASM.


Saludos!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 27 de Octubre de 2011, 21:52:51
Siii Tengo el datasheet del 16F877A pero no encuentro el esquema del registro
para ver donde estan ubicados esos bits
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Suky en 27 de Octubre de 2011, 21:57:38
Búscalo dentro de MEMORY ORGANIZATION y MASTER SYNCHRONOUS SERIAL PORT (MSSP) MODULE, allí te das cuenta la dirección. Por ejemplo:

#byte SSPSTAT=0x94
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 01 de Noviembre de 2011, 19:09:39
Gente.. Una pregunta algo simple seguramente para ustedes
pero entre tanta programacion ya me marie y no recuerdo bien
para que servía esta linea ??

#use standard_io (C);

y esta otra ??

#if defined(__PCM__)

Gracias y saludos a todos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 01 de Noviembre de 2011, 19:11:35
 Debería figurar en la ayuda del CCS... creo que la primera sirve para indicarle al compilador que configure el tris de cada puerto automáticamente según se quiera leer o escribir.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 01 de Noviembre de 2011, 19:22:09
No figura... Agradecería que alguien  me lo facilitara....

Pude leer y escribir un registro del ADE7758..

Agarré un registro de lectura y escritura y le escribo
un valor y puedo leerlo :) :)

Ahora estoy intentando ir un poco mas allá..

Saludos y gracias
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 01 de Noviembre de 2011, 19:27:45
  Esto encontré en el manual de CCS


#USE STANDARD_IO (puerto)
Esta directiva afecta al código que el compilador genera para las instrucciones de
entrada y salida. El método standar de hacer I/O causará que el compilador genere
código para hacer que un pin de I/O sea entrada o salida cada vez que se utiliza. En los
procesadores de la serie 5X esto necesita un byte de RAM para cada puerto
establecido como I/O estandar.
Ejemplo:
#use standard_io(A)
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 01 de Noviembre de 2011, 19:29:00
Y si en el mismo programa pongo...
 
#use standard_io (C)

y luego...

 set_tris_c(16);

A cual de las dos responde el micro ?? 
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AngelGris en 01 de Noviembre de 2011, 20:04:13
Supongo que a la directiva #use.

  Para manejar manualmente los tris tenés que usar la directiva #use fast_io (puerto)
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Suky en 01 de Noviembre de 2011, 23:01:25
Y si en el mismo programa pongo...
 
#use standard_io (C)

y luego...

 set_tris_c(16);

A cual de las dos responde el micro ??  

Al colocar set_tris_c(16), carga 16 en TRISC, pero cuando actúes sobre el puerto cambiará el tris según la operación a realizar. O sea, no deja fijo ese valor.

Luego, __PCH__ corresponde a la famila PIC18F, __PCM__ PIC16, y hay otra para los PIC24. Se utiliza para que, dependiendo de la familia que se use, cargue el *.h adecuado.


Saludos!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: tincho_a en 02 de Mayo de 2012, 10:17:59
simon21 podrias poner el programa realizado?
estoy tratando de hacer funcionar un DSPIC 30f3013 con un ADE7753 llevo varias semanas trantando de comunicarlo y no logro hacer andar el SPI, agradeceria mucho si puedes subir el programa finalizado.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 02 de Mayo de 2012, 16:22:43
Hola tincho !, tengo un programa que hice pero no funciona del todo bien.
Lo que primero hice fue es escribir un registro de lectura / escritura y luego
leer dicho valor para verificar que realmente lo habia escrito.
Luego intento leer los valores de los demas registros, pero todavia no he podido
obtener nada satisfactorio. Realmente estoy buscando gente que quiera
trabajar en esto para entre todos tratar de buscarle una solucion y una
forma correcta de usar este dispositivo.
Si queres te paso lo que tengo, pero no tengo nada funcionando al 100 %
como para que obtengas valores de tension, corriente, potencia, etc..
Trabajo con PICC (compilador PCW) lenguaje CCS.
Saludos a todos, vamos para adelante nomas !!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: MerLiNz en 02 de Mayo de 2012, 17:14:53
simon21 podrias poner el programa realizado?
estoy tratando de hacer funcionar un DSPIC 30f3013 con un ADE7753 llevo varias semanas trantando de comunicarlo y no logro hacer andar el SPI, agradeceria mucho si puedes subir el programa finalizado.


que es lo que le pasa, no envia? no recibe? no hace nada?
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 02 de Mayo de 2012, 17:31:21
Se cansa de enviar y recibe algo raro cada taaaaaaaaanto jaja
En breve lo subo.
Saludos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: tincho_a en 11 de Mayo de 2012, 17:15:28
Gente logre sacar el SCK y el dato por SDO,  :), ahora el problema es que el integrado ADE7753 no me responde  :(, cuando miro por el osciloscopio la salida del ADE es cero. adjunto programa e imagen de osciloscopio con salida y reloj....

#include <30F3013.h>

#fuses XT, PR, NOWDT, NOPROTECT, NOWRT, NOMCLR,NOBROWNOUT
#use delay(clock=3582056)


#use rs232(UART2, baud=9600, xmit=PIN_F5, rcv=PIN_F4, parity=N, bits=8)




int address=0x17;
int16 Vrms, Irms;
int data;
int i;



void main()
   {
 
  setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_4 | SPI_XMIT_H_TO_L  );
    while(1)
    {
         output_low(PIN_D8);//CS
         delay_us(5);
         Vrms=spi_read(0x17);
         delay_us(5);
         output_high(PIN_D8);//CS
  
  
     if(spi_data_is_in())
      output_high(PIN_D9);
     else        
      output_low(PIN_D9);
  
   }
   }
  


como veran la instruccion spi_data_is_in() es para ver si ha llegado algun dato, pero este nunca llega (no se enciende el led (PIN_D9).
Si alguien tiene una solucion?
se agradece
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: MerLiNz en 11 de Mayo de 2012, 18:18:35
has puesto bien el pin CS? es muy importante en este tipo de integrados, y por la configuracion que veo en tu programa no veo por ningun sitio accionar el pin CS. Tambien he visto en el datasheet que deberias poner SPI_XMIT_H_TO_L en vez de L_TO_H, de todas formas primero es el CS
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: tincho_a en 11 de Mayo de 2012, 18:27:15
has puesto bien el pin CS? es muy importante en este tipo de integrados, y por la configuracion que veo en tu programa no veo por ningun sitio accionar el pin CS. Tambien he visto en el datasheet que deberias poner SPI_XMIT_H_TO_L en vez de L_TO_H, de todas formas primero es el CS

probe con los 2 (el cs antes lo tenia a gnd) y cambie el SPI_XMIT pero sigue siendo igual no me responde nada el ADE7753
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: MerLiNz en 11 de Mayo de 2012, 18:29:22
no no, el CS lo tienes que controlar tu, antes de enviar un dato lo debes poner a 0, enviar el dato y ponerlo a 1

fijate en la pagina 6:
http://www.analog.com/static/imported-files/data_sheets/ADE7753.pdf
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: tincho_a en 11 de Mayo de 2012, 18:46:25
 :)
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: tincho_a en 11 de Mayo de 2012, 18:47:43
no no, el CS lo tienes que controlar tu, antes de enviar un dato lo debes poner a 0, enviar el dato y ponerlo a 1

fijate en la pagina 6:
http://www.analog.com/static/imported-files/data_sheets/ADE7753.pdf


Gracias por la respuesta.
ahi lo modifique, fijate en el programa que postee que lo acabo de modificar, pero nada aun!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 12 de Mayo de 2012, 14:05:49
El CS (Chip Select) lo debes modificar siempre y cuando tengas varios integrados que
se comunican por spi al pic, el mismo sirve para decirle cual es el que tiene que actuar,
o sea cual es el que estas seleccionando, de ahi la palabra Chip Select.
En la hoja de datos explica claramente que cuando uno esta trabajando con un unico chip
podes dejar dicho pin conectado permanentemente a masa, por lo que siempre estaria
seleccionado ese dispositivo, o sea siempre estaria en funcionamiento.
Debe estar a masa ya que es activo por nivel bajo, no viene por acá tu problema Tincho.
Sigo renegando con el ADE7758.. Vamos por mas !! Cuando logremos establecer la
comunicacion spi con estos dispositivos no nos va a parar nadie !! jajaja

Saludos  a todos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: tincho_a en 23 de Mayo de 2012, 20:41:17
Al fin logre comunicar el ADE 7753 maldito  :5]
Adjunto el programa, esta funcionando implementado, hay q calibrar el tema de los registros asi que ahora me pongo con eso.

#include <30F3013.h>



#fuses XT, PR, NOWDT, NOPROTECT, NOWRT, NOMCLR,NOBROWNOUT
#use delay(clock=3582056)

#use rs232(UART2, baud=9600, xmit=PIN_F5, rcv=PIN_F4, parity=N, bits=8)


#define SDO PIN_F3
#define SCK PIN_F6
#define SDI PIN_F2
#define CS  PIN_D8

#define LEDV PIN_D9
#define LEDR PIN_C14
 

///////////////////////////////////////////////////
//Definición de direción de registros del ADE7753
///////////////////////////////////////////////////

//Direcciones de Registro de Lectura
/// si empieza en 0 leo
//#define RESERVED   0x00 // No utilizado
#define   WAVEFORM     0x01   //24
#define   AENERGY      0x02   //24
#define   RAENERGY     0x03   //24
#define   LAENERGY     0x04   //24
#define   VAENERGY     0x05   //24
#define   RVAENERGY    0x06   //24
#define   LVAENRGY     0x07   //24
#define   LVARENERGY   0x08   //16
#define   MODE         0x09   //16
#define   IRQEN        0x0A   //16
#define   STATUS       0x0B   //16
#define   RSTSTATUS    0x0C   //16
#define   CH1OS        0x0D   //8
#define   CH2OS        0x0E   //8
#define   GAIN         0x0F   //8
#define   PHCAL        0x10   //6
#define   APOS         0x11   //16
#define   WGAIN        0x12   //12
#define   WDIV         0x13   //8
#define   CFNUM        0x14   //12
#define   CFDEN        0x15   //12
#define   IRMS         0x16   //24
#define   VRMS         0x17   //24
#define   IRMSOS       0x18   //12
#define   VRMSOS       0x19   //12
#define   VAGAIN       0x1A   //12
#define   VADIV        0x1B   //8
#define   LINECYC      0x1C   //16
#define   ZXTOUT       0x1D   //12
#define   SAGCYC       0x1E   //8
#define   SAGLVL       0x1F   //8
#define   IPKLVL       0x20   //8
#define   VPKLVL       0x21   //8
#define   IPEAK        0x22   //24
#define   RSTIPEAK     0x23   //24
#define   VPEAK        0x24   //24
#define   RSTVPEAK     0x25   //24
#define   TEMP         0x26   //8
#define   PERIOD       0x27   //16
#define   TMODE        0x3D   //8
#define   CHKSUM       0x3E   //6
#define   DIEREV       0x3F   //8

//Direcciones de Registro de Escritura
//con 0x1 escribo
//#define RESERVED   0x00 // No utilizado

#define   _MODE         0x89   //16
#define   _IRQEN        0x8A   //16
#define   _CH1OS        0x8D   //8
#define   _CH2OS        0x8E   //8
#define   _GAIN         0x8F   //8
#define   _PHCAL        0x90   //6
#define   _APOS         0x91   //16
#define   _WGAIN        0x92   //12
#define   _WDIV         0x93   //8
#define   _CFNUM        0x94   //12
#define   _CFDEN        0x95   //12
#define   _IRMSOS       0x98   //12
#define   _VRMSOS       0x99   //12
#define   _VAGAIN       0x9A   //12
#define   _VADIV        0x9B   //8
#define   _LINECYC      0x9C   //16
#define   _ZXTOUT       0x9D   //12
#define   _SAGCYC       0x9E   //8
#define   _SAGLVL       0x9F   //8
#define   _IPKLVL       0xA0   //8
#define   _VPKLVL       0xA1   //8
#define   _TMODE        0xBD   //8

#define tpo_lect_esc  1
#define tpo_esp       5

////////////////////////////////////////
//ESCRITURA SPI del ADE
////////////////////////////////////////

void escribir(int8 dato)
{
int8 datoaux_esc=0x00;
int8 i;

datoaux_esc=dato;

for(i=1; i<=8; ++i){

output_high(SCK);
delay_us(2);     
output_bit(SDO,shift_left(&datoaux_esc,1,0));
delay_us(8);
output_low(SCK);
delay_us(10);
}

}

/////////////////////////////////////////
///LECTURA SPI del ADE
/////////////////////////////////////////

int8 leer()
{

int8 datoaux_lec;
int8 i;

for(i=1; i<=8; ++i){

output_high(SCK);
delay_us(5);
shift_left(&datoaux_lec,1,input(SDI));
delay_us(5);
output_low(SCK);
delay_us(10);
}
return(datoaux_lec);
}



/////////////////////////////////////////
///PROGRAMA PRINCIPAL
/////////////////////////////////////////

int8 datoL[64]; // arreglo de datos de registros de Lectura
int8 datoE[64]; // arreglo de datos de registros de Configuracion
int8 cont=0x00;
int8 band1=0x00;
int8 selec=0x00;
int8 bandz=1;
int8 i=0;

void main(void)
{
char a;
   output_low(SCK); 
   output_high(CS); 
   
   output_high(LEDV);             
   output_low(LEDR);


   output_low(LEDV);
    output_high(LEDR);         // leds de prueba
 
  /////////////////////////////////////////////////////////////////////////////
   while (TRUE)
   {
      /////////////////////////////////////////////////////////////////////////////
  //////////////////////////CONFIGURO MODO DEL ADE//////////////////////////////
            output_low(CS);
            delay_us(tpo_esp);
            escribir(_MODE);             // PIC escribe al ADE7754
            delay_ms(tpo_lect_esc);
            escribir(0x60);            // 01100000 en binario selecciono chanel 2 solamente lo demas en default
            delay_ms(tpo_lect_esc);
            escribir(0x28);         //00101000 disable SAG output selecciono para medir temp(bit 5)
            delay_ms(tpo_lect_esc);
            delay_us(tpo_esp);
  /////////////////////////////////////////////////////////////////////////////
  //////CONF INTERRUP para sincronizar con el cruce por cero///////////////////
            output_low(CS);
            delay_us(tpo_esp);
            escribir(_IRQEN);             // PIC escribe al ADE7754
            delay_ms(tpo_lect_esc);
            escribir(0x00);
            delay_ms(tpo_lect_esc);
            escribir(0x01);
            delay_ms(tpo_lect_esc);
            delay_us(tpo_esp);
  /////////////////////////////////////////////////////////////////////////////
 printf("\r PRESIONE 1 para leer ADE\n"); // para q no este andando en el bucle infinito lo manejo yo por hyperterminal
a=getc();
 if(a=='1')
 {
  //////////////////////////LECTURA DE TEMPERATURA//////////////////////////////       
                       
            delay_us(tpo_esp);
            escribir(TEMP);             // PIC lee al ADE7754
            delay_ms(tpo_lect_esc);
            datoL[52]=leer();
            delay_ms(tpo_lect_esc);           
           
            output_high(CS);
            delay_us(tpo_esp);
           

  //////////////////////////LECTURA DE MODO//////////////////////////////           
           
            output_low(CS);
            delay_us(tpo_esp);
            escribir(MODE);             // PIC escribe al ADE7754
            delay_ms(tpo_lect_esc);
            datoL[1]=leer();
            delay_ms(tpo_lect_esc);
            datoL[2]=leer();
            delay_ms(tpo_lect_esc);
            delay_us(tpo_esp);
           
           
            output_low(CS);
            delay_us(tpo_esp);
            escribir(RSTSTATUS);             // PIC escribe al ADE7754
            delay_ms(tpo_lect_esc);
            datoL[9]=leer();
            delay_ms(tpo_lect_esc);
            datoL[10]=leer();
            delay_ms(tpo_lect_esc);
            delay_us(tpo_esp);
               //Lectura VRMS 24bits
           
            delay_ms(tpo_lect_esc);
            output_low(CS);
            delay_us(tpo_esp);
            escribir(VRMS);             // PIC escribe al ADE7754
            delay_ms(tpo_lect_esc);
            datoL[3]=leer();
            delay_ms(tpo_lect_esc);
            datoL[4]=leer();
            delay_ms(tpo_lect_esc);
            datoL[5]=leer();
            delay_ms(tpo_lect_esc);
                               
            output_high(CS);
            delay_us(tpo_esp);
           
             //Lectura IRMS 24bits
           
            delay_ms(tpo_lect_esc);
            output_low(CS);
            delay_us(tpo_esp);
            escribir(IRMS);             // PIC escribe al ADE7754
            delay_ms(tpo_lect_esc);
            datoL[6]=leer();
            delay_ms(tpo_lect_esc);
            datoL[7]=leer();
            delay_ms(tpo_lect_esc);
            datoL[8]=leer();
            delay_ms(tpo_lect_esc);
                     
            output_high(CS);
            delay_us(tpo_esp);
           
           
            printf("\rtemp:%Lx\n",datoL[52]);
            printf("\rmode:%Lx%Lx\n",datoL[1],datoL[2]);
            printf("\rVrms:%Lx%Lx%Lx\n",datoL[3],datoL[4],datoL[5]);
            printf("\rirms:%Lx%Lx%Lx\n",datoL[6],datoL[7],datoL[8]);
   
            delay_ms(20);// retardo de 20ms correspondiente a los 50hz
           
 }
 else /// escribo nada si me equivoque de tecla
 printf("\r NADA\n");
   } 
}
[/color]
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Suky en 23 de Mayo de 2012, 23:30:13
El código no lo coloques en distinto color, mejor usa Geshi o (http://www.todopic.com.ar/foros/Themes/babylon/images/bbc/code.gif)   ;-)


Saludos!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 29 de Mayo de 2012, 22:40:37
Hola a todos !! Estoy tratando de compilar y me da un error muy raro.. Me dice que
el identificador no esta definido, y a dicha libreria ni la he tocado, la uso siempre en
cada uno de los proyectos que hago. Es una librería para manejar displays de 20x4
El nombre de la libreria es LCD420.C
Cuando quiero compilar el codigo principal, se me abre la ventana de LCD420.C y me
marca el error tal como se ve en pantalla. Sinceramente no se a que se puede deber.

Agradeceria una respuesta.  :?   :?    :?

Saludos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Suky en 29 de Mayo de 2012, 22:44:11
Que tiene que ver con la simulación SPI ? Por favor respeta las reglas, no desvirtuar el tema actual. Seguramente incluyes la libreria antes de #use delay.


Saludos!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Simon21 en 30 de Mayo de 2012, 15:08:46
No estoy desvirtuando el tema, estoy trabajando en un programa para comunicar
el ADE7758 con el PIC16F877A.. Venia posteando acá, por eso lo puse.
Si es molestia abro un post nuevo, perdon Suky.

El inconveniente era ese, estaba incluyendo la libreria antes del #use delay.

Gracias por tu respuesta Suky. Apenas logre hacer andar el programa lo voy
a compartir con ustedes.

Saludos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: AZUL8 en 11 de Julio de 2012, 22:44:34
señores perdon si llego tarde al tema,

tengo un ADE7754 muy paresido al 7758 cambian muy pocas cosas he hecho de todo para comunicarme con el, utilizo un 18f4550, para poder utilizar un crytal de 20Mhz, asi poder optener una velocidad cercana a lo que pide la comunicación del ade.

hablando con un ascesor de analog device, me dice que la frecuencia minima de comunicación del dispositivo es 2.5Mhz por eso mismo divido del spi en 16, tal como ustedes lo hacen, ya que como les dije  antes las conficguracion del idle, la unica forma de comunicarlo por el modulo del spi es utilizando #use spi aqui si se puede configurar pero se dejaria de utilizar spi_read y spi_write y se trabajaria con xfer.

hay que tener encuenta los tiempos de escritura y lectura puesto ppor ejemplo caso del ade 7754 entre estas dos operaciones se necesitan 4 us. yo creo que eso no cambia ni para el 53 y mucho menos para el 58.


les pregunto:  han podido leer un registro como el de temperatura??

o leer a si sea opmode sin necesidad de configurarlo

simon me gustaria ver el cod que tienes a ver si estamos haciendo algo parecido.

buen dia muchas gracias.



Título: Re: Ejemplo Simulación del módulo spi
Publicado por: borodelostoldos en 12 de Diciembre de 2012, 10:08:30
Buenas gente, muy bueno el hilo, se aprende mucho de compartir experiencias.
A pesar de todo lo logro hacer andar una comunicación SPI entre dos 18Fs donde se intercambian 3 bytes.
Tengo una simulación de PROTEUS funcionando perfecto, un maestro 14k50 enviando datos sincronizados con el /SS, todo chequeado en los pines de entrada del esclavo, la info llega bien al segundo PCB, los niveles lógicos no se degradan en la transmisión.
Sin embargo, en el esclavo no salta la interrupción por recepción completa de SSP.
Aunque tiene el dato disponible y el valor de /SS bajo, o no recibe el valor, o bien la interrupción no salta a pesar de haber recibido el dato.
Les dejo el código por si tienen un ratito para mirarlo...

CODIGO MAESTRO
Código: [Seleccionar]
#include <18F14K50.h>
#device adc=8                    //8 bits 256 cuentas

#FUSES INTRC_IO                  //High Speed Crystal/Resonator with PLL enabled
#FUSES CPUDIV2
#FUSES MCLR                      //Master Clear pin enabled
#FUSES NOWDT                     //No Watch Dog Timer
#FUSES NOPROTECT                 //Code not protected from reading
#FUSES NOLVP                     //No utilizamos el modo de programación con bajo voltaje, B5(PIC18) used for I/O
#FUSES NODEBUG                   //No usamos codigo para debuguear

#use delay(clock=8MHz)

#define VMAX    255.00               
#define AN1M    127.00   
#define AN2M    127.00
#define AN_DERECHA    128   
#define AN_IZQUIERDA    127
#define AN_ADELANTE    128
#define AN_ATRAS        127

#define SS PIN_B7

int8 AN1=0, AN2=0, V1, V2, direccion=0;    // para atras 1
int1 adq=0;
float Vo1, Vd1, Vi1;
float Vo2, Vd2, Vi2;

////////////////////////////////////////////////////////////////////////////////
////////// INTERRUPCIONES //////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

#int_TIMER0
void  TIMER0_isr(void)
{
   set_timer0(15536);             // 50ms
   
   adq=1;
   output_toggle(PIN_C1);      // solo para chequeo en simulacion u operación
}

////////////////////////////////////////////////////////////////////////////////
////////// FUNCIONES ///////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

void adq_pote(void)
{
        set_adc_channel(7);        // desplazamiento longitudinal             
        delay_us(10);
        AN1 = read_adc();

        set_adc_channel(8);        // desplazamiento lateral
        delay_us(10);
        AN2 = read_adc();
}


void calc_vel(void)
{
V1=AN1; //calculo simplificado
V2=AN2;
}
   
   
void send(void)
{
    output_low(SS);

    spi_write(V1);
    delay_us(10);

    spi_write(V2);
    delay_us(10);

    spi_write(direccion);
    delay_us(10);

    output_high(SS);
}

////////////////////////////////////////////////////////////////////////////////
////////// PROGRAMA PRINCIPAL //////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

void main()
{
   set_tris_b(0b00011111);
   set_tris_c(0b01001101);

   setup_adc_ports(sAN7|sAN8|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
     
   setup_spi(SPI_MASTER|SPI_CLK_DIV_16|SPI_XMIT_H_TO_L|SPI_SCK_IDLE_LOW);
   
   setup_timer_0(T0_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   
   setup_comparator(NC_NC_NC_NC);
   
   set_timer0(0);
   
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   
   output_high(PIN_C2);
   output_high(PIN_B5);
   output_high(SS);
   
   while(TRUE)
   {
       
      if(adq==1)                // se genero la interrupcion teporizada
      {
          disable_interrupts(GLOBAL);
           
          adq_pote();
          calc_vel();
          send();                // se envian los valores de Vel al esclavo
           
          adq=0;
          enable_interrupts(GLOBAL);
      }
   }
}

CODIGO ESCLAVO
Código: [Seleccionar]
#FUSES NOPROTECT                 //Code not protected from reading
#FUSES NOLVP                     //No utilizamos el modo de programación con bajo voltaje, B5(PIC18) used for I/O
#FUSES NODEBUG                   //No usamos codigo para debuguear
#FUSES NOPBADEN                  //PORTB pins are configured as digital I/O on RESET
#FUSES CPUDIV2                   //System Clock by 2

#use delay(clock=8MHZ)                 

#define IN1 PIN_C0
#define IN2 PIN_C2    //CPP1 PWM
#define IN3 PIN_A6
#define IN4 PIN_C1    //CPP2 PWM
#define ENA PIN_E2                   
#define ENB PIN_E1                   
#define LED PIN_D2                   

int8 duty1, duty2, direccion;
int8 set=0;

#int_SSP
void SSP_isr(void)
{
    disable_interrupts(global);
   
    duty1=spi_read();
   
    while(!spi_data_is_in());
    duty2=spi_read();

    while(!spi_data_is_in());
    direccion=spi_read();

    set=1;
    output_toggle(LED);        // SOLO PARA CHEQUEAR QUE ENTRO EN LA INTERRUPCION
    clear_interrupt(int_ssp);
    enable_interrupts(global);
}


////////////////////////////////////////////////////////////////////////////////
////////// PROGRAMA PRINCIPAL //////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

void main()
{
   set_tris_A(0b10111111);
   set_tris_B(0b11);
   set_tris_C(0b01101000);
   set_tris_E(0b11111001);
   set_tris_D(0b000);
   
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   
   setup_timer_0(RTCC_OFF);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);    //genera los ticks que miden el pulso
   
   setup_timer_2(T2_DIV_BY_1, 255, 1);            //modulacion de frecuencia del PWM
   setup_CCP1(CCP_PWM);
   setup_CCP2(CCP_PWM);
 
   setup_spi(SPI_SLAVE||SPI_XMIT_H_TO_L|SPI_SCK_IDLE_LOW); 
   
   output_high(IN1);
   output_high(IN3);
   set_pwm1_duty(150);
   set_pwm2_duty(150);
   
   clear_interrupt(int_ssp);
   enable_interrupts(int_ssp);
   enable_interrupts(global);

   output_high(LED);

   while (TRUE)
   {
       if(set==1)
       { 
           disable_interrupts(global);
           if(direccion==0)
           {
               output_high(IN1);
               output_high(IN2);
               set_pwm1_duty(255-duty1);
               set_pwm2_duty(255-duty2);
            }
           if(direccion==1)
           {
               output_low(IN1);
               output_low(IN2);
               set_pwm1_duty(duty1);
               set_pwm2_duty(duty2);
            }
            set=0;
           enable_interrupts(global);
       }
   }
}

MUCHAS GRACIAS!!
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 12 de Diciembre de 2012, 11:54:47
Código: [Seleccionar]
if(set==1)
       {  
           disable_interrupts(global);
           if(direccion==0)
           {
               output_high(IN1);
               output_high(IN2);
               set_pwm1_duty(255-duty1);
               set_pwm2_duty(255-duty2);
            }
           if(direccion==1)
           {
               output_low(IN1);
               output_low(IN2);
               set_pwm1_duty(duty1);
               set_pwm2_duty(duty2);
            }
            set=0;
           enable_interrupts(global);
       }

No entiendo para que activas y desactivas la interrupción global creo que no hay necesidad, por otro lado debes configurar bien el micro esclavo con la siguiente línea de código

Código: [Seleccionar]
setup_spi(SPI_MASTER|SPI_CLK_DIV_16|SPI_XMIT_H_TO_L|SPI_SCK_IDLE_LOW);
Primero que todo los micros debe funcionar a la misma velocidad de reloj, en caso contrario no hay seguridad que funcione, además debes revisar el datasheet de respectivo micro para configurar el siguiente parámetro:

Código: [Seleccionar]
|SPI_XMIT_H_TO_L
Este parámetro cambia si el micro funciona como maestro o como esclavo (creo), espero sean útiles la recomendaciones, cualquier cosa estaré atento.  
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: cguzman en 16 de Marzo de 2013, 11:20:19
Hola companeros.
Tome el ejemplo que pusieron pero surge que al copilarlo siempre tira el mismo erro.
Alguien me pudiera ayudar con esta lio.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 16 de Marzo de 2013, 15:33:51
Citar
Hola companeros.
Tome el ejemplo que pusieron pero surge que al copilarlo siempre tira el mismo erro.
Alguien me pudiera ayudar con esta lio.

Cual error, en mi caso compila perfectamente, deberías especificar mejor el problema.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: lucaspascual en 29 de Abril de 2013, 13:29:16
hola Chenao muy buen aporte hiciste, recien estoy aprendiendo a manejar SPI ya que tengo un calibre digital con salida de datos que quiero ingresar al micro.
El calibre cuenta con un pin de clock y de datos. El calibre me transmite 48 bits de datos donde los primeros 24 bits son de una medida absoluta y los segundos 24 bits una medida relativa que es la que me interesa tomar.
El clock me genera un pulso al inicio y fin con un ancho de pulso mayor que los pulso en la parte del dato, y los 24 bits de la medida absoluta esta separada por un pulso mayor a los 24 bits de la medida relativa. A continuacion adjunto un archivo .rar donde esta bien detallado lo q explico.
Yo quisiera saber si puedo tomar esas lecturas a través del SPI ya q pense de varias formas hacerlo pero no las puedo implementar.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 30 de Abril de 2013, 12:53:22

Mirando por encima no creo que se pueda ya que esta báscula funciona con un protocolo serial denominado Digimatic Protocol y supongo que debe ser diferente que el protocolo serial SPI. ¿Pero creo que esta báscula tiene un canal RS -232? con el cual puedes conectarte con un microcontrolador fácilmente.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: elkin_vivas en 26 de Mayo de 2013, 21:57:24
Saludos después de mucho estudio, parciales, trabajo y demás cosas que se hacen en diciembre.... :D :D :D, me he puesto a trabajar con los micros ahora estoy trabajando con el modulo SPI y estado trabajando leyendo mucho realizando pruebas (por ahora simulaciones), y debido a este trabajao hoy quiero compartir con ustedes un pequeño trabajo el cual utliza dos micros 16f877 y se comunican por el protocolo SPI uno actua como maestro y el otro como esclavo, el programa hace lo siguiente.

El micro maestro: Le envia los siguientes datos al esclavo ({ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67}) que para un display de cátodo comú serian los siguiente (0,1,2,3,4,5,6,7,8,9) y el micro esclavo recibe los datos y los visualiza por el puerto B.

Acá les dejo la simulación y el código hay dos carpetas la primera prueba2 contiene el .hex del esclavo y prueba 1 que contiene el código, la simulación y el .hex del maestro. Espero que le agrade el ejemplo

Saludos 



excelente paRCE ME AYUDASTES  DEMASIADO MUCHAS GRACIAS 
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 26 de Mayo de 2013, 22:07:25
Citar
excelente paRCE ME AYUDASTES  DEMASIADO MUCHAS GRACIAS

Esa es la ideal del foro ayudar y aprender. Qué bueno que el ejemplo te sirvió.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: celihen en 19 de Junio de 2013, 01:26:48
guooouuuuu
de verdad me valio de mucho
gracias compadre ((:-))
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: facuver en 27 de Abril de 2015, 13:26:08
Hola, como estan?
Estoy tratando de realizar una comunicacion SPI bidireccional entre varios pics (por el momento el maestro y un solo esclavo). La comunicacion funciona bien pero tengo un problema para responder con el esclavo.
Simulando con el proteus veo que el byte de respuesta del esclavo varia entre dos valores. El ultimo enviado por el maestro y el valor que tiene que enviar.
El codigo del maestro
Código: [Seleccionar]
#include "mother.h"

int in_data[4] ;

#int_RDA
void  RDA_isr(void)
{

}



void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RDA);
   disable_interrupts(GLOBAL);
   
   
   
   OUTPUT_LOW(PIN_B2); // slave select

   while(1)
   {
     

      in_data[0] = spi_read(0xff);

     
     
      delay_ms(100);
   }

}

y el del escalvo
Código: [Seleccionar]
#include "driver.h"

int in_data[4] ,out_data[4] = {0xfa,0x06,0x07,0xfb} ;

#int_SSP                           //interrupcion SPI
void  SSP_isr(void)
{
   
   
   in_data[0] = spi_read(0xdd);

   

}



void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SLAVE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   while(1)
   {
       
     
   }

}


en este programa la varable in_data del esclavo es siempre "0xff" pero la in_data del maestro varia entre "0xff" y "0xdd".
A alguien se le ocurre donde puede estar el problema?
Estoy utilizando dos 18F2550 y el ccs 4.104

Desde ya muchas gracias!

Saludos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 13 de Agosto de 2015, 22:21:19
No se si ya resolvió el asunto (disculpe la demora). Si no es así trata en modificar la siguiente linea en el código del maestro.

Citar
in_data[0] = spi_read(0xff);


Por

Código: [Seleccionar]
in_data[0] = spi_write(0xff);
Además en el código del esclavo intenta con lo siguiente

Citar
in_data[0] = spi_read(0xdd);

Por

Código: [Seleccionar]
in_data[0] = spi_read();
Saludos.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Berto en 04 de Septiembre de 2015, 13:53:37
Hola a todos. Tengo un codigo muy largo sobre un 16f877 El problema es que todo esta saturado :5] pines del micro memoria RON 80% da problemas errores de compilacion por memoria reservada (no error de codigo escrito -comprobado-) Me estoy dando cuenta que lo que esponeis en este tema es lo que necesito pero yo nunca e hecho nada parecido. No se como empezar. No conozco las conexiones :shock: Os agradeceria que me pasaseis el proyecto ISIS en proteus de cualquier codigo CS que hayais espuesto en este tema con maestro esclavo, a ser posible que uno sea el micro dicho, es el unico con el que e tratado asta ahora en mis proyectos.

Saludos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 04 de Septiembre de 2015, 20:52:21
Compañero Berto acá (http://www.todopic.com.ar/foros/index.php?topic=28952.0) puedes encontrar los archivos, hay varios ejemplos tanto para el CCS como para el ensamblador (creo que también están la simulaciones).
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Berto en 05 de Septiembre de 2015, 06:09:41
Hola chenao Tus archivos es lo primero que baje pero en ellos no se encuentran el proyecto proteus, a menos que tenga que modificar algun archivo proteus me pide extension .pdsprj Estoy muy interesdo en tu codigo ya que utiliza el 16f877 Me gustaria mucho empezar a aprender modificandolo pero no quiero hacerlo a ciegas quiero ver como responde lo que escribo. Si tienes todavia estos proyectos, por favor pasamelos cuando puedas.

Saludos desde el pais vasco
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 05 de Septiembre de 2015, 14:07:48


Citar
us archivos es lo primero que baje pero en ellos no se encuentran el proyecto proteus, a menos que tenga que modificar algun archivo proteus me pide extension .pdsprj

Extraño, qué versión del proteus utilizas. Voy a buscarlos si algo vuelvo y los cuelgo.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Berto en 05 de Septiembre de 2015, 19:40:16
Es una actualizacion proteus8.1.SP1.exe sobre la de proteus-setup77.exe El 8.1 no servia por si solo me pide las librerias del anterior
En tus adjuntos ¿Estan tus trabajos de proteus, como se llaman que extension teien?

Saludos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 05 de Septiembre de 2015, 20:20:53

La versión del proteus donde fueron implementados los esquema eléctricos fue la 7.2. Ahora no se, si existe un problema de compatibilidad con versiones más recientes.

La extensión de los archivos en el proteus es .DNS, acabo de realizar la descarga, en efecto las simulaciones fueron subidas junto con los códigos y archivos .Hex y .Lst etc. 
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Berto en 05 de Septiembre de 2015, 20:39:05
Vaya parece que funciona e cambiado la vieja estension por .DNS y proteus la ejecuta normal el programa Lo poco que e visto esta bien
pero en tus archivos tampoco veo el DNS una ultima pregunta yo ya me voi al sobre. cuales son proteus en los siguentes archivos tuyos
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 05 de Septiembre de 2015, 21:35:00

La que revise fue el archivo SPI_CCS.rar la cual esta en el primer post del hilo. En la carpeta del microcontrolador maestro puedes encontrar la cabecera .DNS.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Berto en 07 de Septiembre de 2015, 16:59:59
Si de hecho tengo 2 .DSN tuyos No me di cuenta porque no mostraban el icono de proteus y tuve que hacer "abrir con"
pero van bien. Gracias. Un ejemplo visual es lo mejor. Esfuerzo cero.
Me e giado de tu primer proyecto porque yo tambien quiero mandar unas tablas contienen variables que pretendo que sean globales para los dos micros. EL problema es que yo necesito refrescar todas las variables en el esclavo de forma instantanea.
Este parte:
///////////////////////////////////MASTER
for(i = 0; i<10; i++)
       {
           spi_write(tabla);
           delay_ms(2000);
       }
//////////////////////////////////SLAVE
if(spi_data_is_in())
       {
         puerto_b = spi_read();
       }
No es fiable con delays-cortos (y a my me combienen que nisiquiera existan) El spi_data_is_in() no es suficiente o no se utilizarlo. E pensado utilizar un par de pins de cada micro tipo "-embiar -recivido" para sincronizar bien al isntante. Pero antes buscare y hare lo que menos me gusta leer sobre este protocolo. Quizas pueda aorrarme algo
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: KILLERJC en 07 de Septiembre de 2015, 22:58:54
Citar
No es fiable con delays-cortos (y a my me combienen que nisiquiera existan)


Utiliza interrupciones, mas rapido que eso no lo veo posible.
Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Berto en 09 de Septiembre de 2015, 20:12:02
Eso es Interrupciones. ahora puedo pasar una gran cantidad de variables casi al instante.
Como siempre hay un problema spi_write(mony); mony=spi_read(); no sirven para embiar variables "long" que es lo que es mony

//Estas variables deben ser globales para los dos
//int peti,cliente,salir;
//int1 tarje;
//long mony;//////Hay un problema con "long" no se puede enviar con spi_write(mony);
//int1 fclee[5];
//int1 fcpos[5];
////////////////////MASTER

main(){
while(true){//whil

refresco();//Es importante que sea funcion porque mi proyecto debe embiar las variables actualizadas
           //para que "slave" las trabaje bastantes veces


}//whil
}


void refresco(){

int co,cu;
output_low(PIN_c6);//S.envio incial 0
lcd_putc("\f"); cu=1;
for (co=0;5>co;co++){  //for int1
valor=rand();
if (valor>20000) { fclee[co]=1; } else { fclee[co]=0; }
lcd_gotoxy(cu,1); lcd_gotoxy(cu,1); printf(lcd_putc,"fl[%d]=%d ",co,fclee[co]);  cu+=8; //printf(lcd_putc,"fl[%d]=%d ",co,valor);
spi_write(fclee[co]);
protMaster(); /// protocolo de envio vajo SPI MAESTRO.........*
}  //for int1
cu=1;
for (co=0;5>co;co++){ // for int1_2
valor=rand();
if (valor>20000) { fcpos[co]=1; } else { fcpos[co]=0; }
lcd_gotoxy(cu,2); printf(lcd_putc,"ps[%d]=%d ",co,fcpos[co]);  cu+=8; //printf(lcd_putc,"fl[%d]=%d ",co,valor); 
spi_write(fcpos[co]);
protMaster(); /// protocolo de envio vajo SPI MAESTRO.........*
} //  for int1_2
    delay_ms(4000);//para mostrar principales boolean master & savle
peti=rand();
spi_write(peti); /// int peti
protMaster();
cliente=rand();   
spi_write(cliente); /// int cliente
protMaster();
salir=rand();   
spi_write(salir); /// int salir
protMaster();
valor=rand();
if (valor>20000) { tarje=1; } else { tarje=0; }
spi_write(tarje); /// int1 tarje
protMaster();
mony=rand();   
spi_write(mony); /// long mony
protMaster();/// protocolo de envio vajo SPI MAESTRO.........*
lcd_putc("\f");
lcd_gotoxy(1,1); printf(lcd_putc,"INT...peti=%d cliente=%d salir=%d",peti,cliente,salir);
lcd_gotoxy(1,2); printf(lcd_putc,"int1 tarje=%d    LONG mony=%lu",tarje,mony);   
  delay_ms(4000);
 
lcd_putc("\f  envio completo");  delay_ms(500);
}
void protMaster(){/// protocolo de envio vajo SPI MAESTRO
output_high(PIN_c6); // s.envio=true afecta PIN_B7_SLAVE/E.envio
delay_ms(5);
while (Input(PIN_c0)==0) { delay_ms(5); } //Impide + envios asta SLAVE lo diga con su S.pin_a1_(S.recivido) -----> E.pin_c0_MASTER(E.recivido)
output_low(PIN_c6); // s.envio=false afecta PIN_B7_SLAVE/E.envio
delay_ms(5);
}
//////////////////////////sclavo/SLAVE//////////////////////

main(){

while(true){//whil

if(Input(PIN_b7)) { //pin_b7=E.envio=true afectado por pin_c6_MASTER/S.envio=true
lcd_putc("\f"); cu=1;
for (co=0;5>co;co++) {//for nt1_1
fclee[co]=spi_read();
lcd_gotoxy(cu,1); printf(lcd_putc,"fl[%d]=%d ",co,fclee[co]);  cu+=8;
protSlave();///protocolo de recivo vajo SPI SLAVE...........*
}//for nt1_1
cu=1;
for (co=0;5>co;co++){//for int1_2
fcpos[co]=spi_read();
lcd_gotoxy(cu,2); printf(lcd_putc,"fp[%d]=%d ",co,fcpos[co]);  cu+=8;     
protSlave();///protocolo de recivo vajo SPI SLAVE...........*
}//for it1_2*/

peti=spi_read();// int* peti
protSlave();///protocolo de recivo vajo SPI SLAVE
cliente=spi_read();// *cliente
protSlave();
salir=spi_read();// *salir
protSlave();
tarje=spi_read();// int1 targe
protSlave();
mony=spi_read();// long mony lectura erronea******
protSlave();///protocolo de recivo vajo SPI SLAVE...........*
lcd_putc("\f");
lcd_gotoxy(1,1); printf(lcd_putc,"int...peti=%d cliente=%d salir=%d",peti,cliente,salir);
lcd_gotoxy(1,2); printf(lcd_putc,"int1 tarje=%d long mony=%lu",tarje,mony);///long mony siempre falla******
delay_ms(1000);
lcd_putc("\f  nuevo recivo");

}//whil
}
void protSlave(){///protocolo de recivo vajo SPI SLAVE
output_high(PIN_a1);//S.recivido=true -----> pin_c0_MASTER/E.recivido
delay_ms(2);
output_low(PIN_a1); //S.recivido=false----->  pin_c0_MASTER/E.recivido
while (Input(PIN_b7)==0) { delay_ms(2); } //Se queda esperando asta qu b7=true (E.envio) afectado por pin_c6_MASTER/S.envio=true
delay_ms(2);
}

Otra cosa que no me gusta es que "slave" se atrasa mas con los delay. No se como sera en la practica pero eso es lo que me hace en proteus.
output_high(PIN_a1);//S.recivido=true -----> pin_c0_MASTER/E.recivido
delay_ms(2);
output_low(PIN_a1); //S.recivido=false----->  pin_c0

Me estraña que funcione porque cuando pin_c0_MASTER es true. Master podria estar sumergido en un delay(5) y luego nunca saldria de
while (Input(PIN_c0)==0) { delay_ms(5); } //Impide + envios asta SLAVE lo diga con su S.pin_a1_(S.recivido) -----> E.pin_c0_MASTER(E.recivido)




Título: Re: Ejemplo Simulación del módulo spi
Publicado por: Chenao en 09 de Septiembre de 2015, 21:37:22
Citar
Como siempre hay un problema spi_write(mony); mony=spi_read(); no sirven para embiar variables "long" que es lo que es mony

Claro es una característica del protocolo debido a que funciona a 8 bits, lo que puedes hacer es dividir la variable tipo long en dos byte haciendo uso de la make8() "No recuerdo si esta", con esta función puede des-concatenar variables tipo long en 2 variables tipo int. Así puedes transmitir la parte alta y la parte baja de la variable tipo long. 

Ahora para refrescar simultáneamente los datos en Slave no podrías utilizar una comunicación full duplex? 
Título: Re:Ejemplo Simulación del módulo spi
Publicado por: CARlosDAN783 en 31 de Diciembre de 2015, 16:31:51
 :-/ Amigo no sabes lo agradecido que estoy muchas gracias por sus ejemplos pues como no consegui nada con dicho pic ya estaba empezando a crear mi propia libreria con sus funciones lo cual se me estaba dificultando mucho. Ahora lo que no entiendo es porque en ningun lado del codigo se llama a ninguna libreria referente al spi si me puedes esplicar se lo agradesco.
Título: Re:Ejemplo Simulación del módulo spi
Publicado por: Chenao en 01 de Enero de 2016, 14:45:42

Todas las funciones utilizadas en los ejemplo vienen incorporadas en la cabecera .h del microcontrolador, es decir, cuando se utiliza

Código: [Seleccionar]
#include<pic16f877.h>
Se cargan las funciones como spi_read(), spiwrite() etc. Ahora para saber las funciones por defecto de cada cabecera .h (de un microcontrolador específico) se puede consultar el respectivo .txt que se encuentra en la carpeta de drivers del compilador.