TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: fernandesorus en 31 de Mayo de 2005, 02:28:00

Título: comunicacion SPI con 16F876
Publicado por: fernandesorus en 31 de Mayo de 2005, 02:28:00
Buenas! Tengo un pequeño problema. Tengo que comunicar dos pics uno un motorola (que no es mi parte) i el otro un 16F876 via SPI i no sé como hacerlo. Si alguien me puede passar una rutina para ello lo agradeceria.
Título: RE: comunicacion SPI con 16F876
Publicado por: antoniof en 31 de Mayo de 2005, 17:31:00
Aqui tienes:

Codigo:
;SUBRRUTINA "SPI":
;Envia el byte que viene en el registro "w" mediaante el protocolo spi.
;Utiliza los registro temporales "temp1" y "temp2"

spi   movwf   temp1      ;Salva el byte a transmitir en el registro temporal "temp1"
   movlw   0x08
   movwf   temp2      ;Inicializa el contador
bck_spi   bsf   p_spi,sdin   ;Sube data
   btfss   temp1,7      ;Comprueba el bit y lo baja si es cero
   bcf   p_spi,sdin
   nop         ;Envia el bit
   bsf   p_spi,sclk
   nop         ;Da un pulso de reloj
   bcf   p_spi,sclk
   nop
   rlf   temp1,f      ;Rotamos a la izquierda "temp1"
   decfsz   temp2,f      ;Comprobamos el contador, para ver si hemos enviado los 8 bits
   goto   bck_spi      ;Si no, repetimos el bucle
   bcf   p_spi,sdin
   return         ;Fin


Debes definir para usar esta rutina, el puerto que vayas a utilizar como "p_spi" y los bits dentro del puerto, tanto de datos como de reloj, como "sdin" y "sclk". También se utilizan dos resitros temporales "temp1" y "temp2" que debes definir. Aqui va un ejemplo:

Codigo:
;Definición de bits

sdin   equ   0x00   ;Bits de control del bus spi: Datos bit 0
sclk   equ   0x01   ;Reloj bit 1

;Puertos del PIC

porta   equ   0x05
p_spi   equ   0x05   ;Puerto A es el puerto utilizado para el spi
portb   equ   0x06

;Declaración de variables

temp1   equ   0x20
temp2   equ   0x21
Título: RE: comunicacion SPI con 16F876
Publicado por: fernandesorus en 05 de Junio de 2005, 04:40:00
Muchas gracias antoniof. El proximo martes lo voy a probar a ver si funciona. Por cierto este es el que envia o el que recibe?? si tienes alguna rutina que comunique dos pics 16f876 uno como master i el otro como esclavo me la podrias passar para hacer una prueba. bueno el martes te cuento. Saludos
Título: RE: comunicacion SPI con 16F876
Publicado por: antoniof en 05 de Junio de 2005, 16:52:00
La rutina anterior es la que envia. Aqui tienes la que recibe:

Codigo:
;SUBRRUTINA "SPI_RX":
;Recibe un byte por el bus SPI y devuelve el resultado en el registro "w"
;Utiliza los registro temporales "temp1" y "temp2" y el bit de carry del registro "status"

spi_rx   movlw   0x08
   movwf   temp2      ;Inicializa el contador
bck_spi   btfss   p_spi,sclk
   goto   bck_spi
   bsf   status,0
   btfss   p_spi,sdin   ;Copia el valor de data en el carry
   bcf   status,0
   rlf   temp1,f      ;Para guardarlo en el temporal
bck_sp2   btfsc   p_spi,sclk
   goto   bck_sp2
   decfsz   temp2,f      ;Comprobamos el contador, para ver si hemos recibido los 8 bits
   goto   bck_spi      ;Si no, repetimos el bucle
   movf   temp1,w
   return         ;Fin


Ten en cuenta que esta rutina espera por 8 pulsos de reloj, por lo que si la utilizas y no se reciben los 8 pulsos se quedará el PIC esperando indefinidamente
Título: RE: comunicacion SPI con 16F876
Publicado por: fernandesorus en 06 de Junio de 2005, 02:14:00
bueno gracias. Lo pruebo y te digo cosas. Saludos!!!
Título: RE: comunicacion SPI con 16F876
Publicado por: fernandesorus en 08 de Junio de 2005, 05:16:00
no me rula nada! y creo que la configuracion es correcta. pero no comunican. Por cierto. Sabe alguien si se puede visualizar la señal de clock de entrada del pic? yo lo consegui pero hoy nada de nada. Si alguien me puede enviar todo completo mejor. Me queda poco tiempo!!!
Título: RE: comunicacion SPI con 16F876
Publicado por: antoniof en 08 de Junio de 2005, 19:26:00
Te puedo asegurar que las rutinas funcionan perfectamente. Pon aqui el código que estás utilizando en el emisor y en el receptor y lo vemos.
Título: RE: comunicacion SPI con 16F876
Publicado por: fernandesorus en 09 de Junio de 2005, 03:48:00
bueno esta es la que envia:

List   p=16F876   ;Tipo de procesador
      include   "P16F876.INC"   ;Definiciones de registros internos

#define ENABLE_CS       bcf PORTA,0        ;Activa señal E
#define DISABLE_CS      bsf PORTA,0        ;Desactiva señal E

DIRECCIO   equ   0x29      ;ON PASSAM LA DIRECCIO
COMMAND      equ    0X28


         org   0x05
         goto Inicio

;TRANSMIT***************************************************************************
;

TRANSMIT      bcf   STATUS,RP0
            MOVWF   SSPBUF
            bsf    STATUS,RP0
LOOP1         btfss   SSPSTAT,BF
            goto   LOOP1
            bcf    STATUS,RP0
            return

;************************************************************************************
;CONTROL_RESISTOR
;

CONTROL_RESISTOR   bcf   STATUS,RP0
               ENABLE_CS
               movf   COMMAND,W
               call    TRANSMIT
               DISABLE_CS
               return

;************************************************************************************
;START_SPI
;

START_SPI      bcf   STATUS,RP0
         movlw   b"00110001"   ;
         movwf   SSPCON
         bsf    STATUS,RP0
         movlw   b"01000000"   ;40 mode 1,1 SPI
         movwf   SSPSTAT
         bcf    STATUS,RP0
         return
;**********************************************************************************
;STOP_SPI
;

STOP_SPI         bcf   STATUS,RP0
               movlw   b"00000001"   ; Funciona a 5MHz, 0x30
               movwf   SSPCON
               return

;Programa principal
Inicio      clrf   PORTA
      clrf   PORTB
      clrf   PORTC      ;Borra salidas
      bsf    STATUS,RP0   ;Selecciona banco 1
      movlw   0x06
      movwf   ADCON1      ;Puerta A digital
      movlw   b"00000000"
      movwf   TRISA
      movlw   b"00010000"
      movwf   TRISC      ;RC2 salida
      bcf      STATUS,RP0   ;Selecciona banco 0
      
      
      
      
torna   call   START_SPI
      movlw   .4
      movwf   DIRECCIO  ;POSAM LA DIRECCIO
      movwf   COMMAND
      call   CONTROL_RESISTOR
      call   STOP_SPI
      goto torna
      end
****************************************************
I la que recibe:

list p=16F876
   #include "p16F876.inc"

   #define CS 0x20 ; PORTA,5 (HW SS pin)
   ORG 0
   nop ; FOR ICD

; Set up the SPI Support
   BANKSEL TRISA ; BANK 1
   movlw CS ; Chip Select pin
   movwf TRISA ; is in input mode
   movlw 0x06 ; Turn Off A/D mode for at least the
   movwf ADCON1 ; Chip Select pin (all Digital mode)

; Set up output port
   BANKSEL TRISB ; BANK 1
   movlw 0x00 ; Configure all PORTB pins
   movwf TRISB ; to be in output mode

; Set up the SPI
   BANKSEL TRISC ; BANK 1
   movlw 0x18 ; SCK is input (Slave), SDI is input,
   movwf TRISC ; SDO is output, all others output
   movlw 0x40 ; Mode 1,1 SPI with
   movwf SSPSTAT ; middle of output time sampling

   BANKSEL SSPCON ; BANK 0
   movlw 0x34 ; Mode 1,1 SPI Slave Mode, /SS Required
   movwf SSPCON ; SSP is on

Chk4Dat    movlw SSPSTAT ; Indirectly test
   movwf FSR ; a register by loading FSR
   btfss INDF,BF ; Here is the test
   goto Chk4Dat ; New data, do a transfer (below

RX_Data BANKSEL SSPBUF ; BANK 0
   movf SSPBUF,W ; put in SSPBUF into W
   BANKSEL PORTB ; BANK 0
   movwf PORTB ; Show the results on PORTB
   DoAgain
; Optional customer code can go here
   goto    Chk4Dat    ; Receive Next Byte
                end


Antoniof: Creo que tus subrutinas son por software y las mias per hard. Pero bueno. Por cierto, cuando tienes el pic de esa manera se deben de poder visualizar la onda de reloj y con el mio no hay manera. Bueno si me puedes echar esa mano. Muy agradecido. Saludos
Título: RE: comunicacion SPI con 16F876
Publicado por: antoniof en 10 de Junio de 2005, 04:23:00
Pues no veo ningún fallo ni en el emisor ni en el receptor. Una cosa que tendrás hecha supongo es que el PORTA,0 del emisor se une con el PORTA,5 del receptor, que corresponde a la señal SS (Slave Select).

Te aconsejo que pruebes primero el emisor con un osciloscopio a ver si envía lo que tiene que enviar y después lo unas al receptor.

Tu problema puede ser de conexiones o hardware porque en el soft no veo ningún fallo.