Skip to content

Instantly share code, notes, and snippets.

@RoberCRivera
Created November 25, 2013 21:57
Show Gist options
  • Save RoberCRivera/7649665 to your computer and use it in GitHub Desktop.
Save RoberCRivera/7649665 to your computer and use it in GitHub Desktop.
title "PIC18F4550 Envio de cadena por SPI Modo Esclavo"
list p=18F4550 ; indica el modelo de PIC
#include <p18f4550.inc> ; archivo de encabezado
CONFIG FOSC = INTOSCIO_EC
CONFIG WDT = OFF
CONFIG PBADEN = OFF
CONFIG MCLRE = ON
CONFIG DEBUG = ON
CONFIG LVP = OFF
;VARIABLES
contb equ 0x20 ;Dato recibido del maestro
send equ 0x30 ;Dato enviado para comprobar la bidireccionalidad
temp equ 0x40 ; variable temporal para comparadión
dato equ 0x50 ; variable para copiar dato recibido
reg1 equ 0x60
org 0
goto mainp
;PROGRAMA PRINCIPAL
org 100
mainp:
bsf OSCCON,6 ;Divisor de preescala del
bsf OSCCON,5 ;reloj a 8Mhz
bsf OSCCON,4
;Configuración de las lineas fisicas
movlw 0x0f
movwf ADCON1
movlw 0x07
movwf CMCON
bsf TRISB,1 ;Entrada SCK
bcf TRISC,7 ;Salida SDO
bsf TRISA,5 ;Entrada SS es importante en entornos múltiple esclavo
bsf TRISB,0 ;Entrada SDI
clrf TRISD ;Salida LEDs
;Configuración del SPI
movlw B'01000000' ;Muestreo al medio
movwf SSPSTAT
movlw B'00110101' ;Activar el SPI, polaridad, esclavo pin SS activo
movwf SSPCON1
movlw 0x04
movwf FSR0H
clrf FSR0L
movlw 0x05
movwf FSR1H
clrf FSR1L
clrf temp
clrf contb
recibe:
movf SSPBUF,W ;Lectura tonta del Buffer
movf INDF0,W
movwf SSPBUF ;Se pasa el dato a enviar al maestro
lazo1 movf SSPSTAT,W ;Esperar por la señal de reloj del maestro
btfss SSPSTAT,BF ;Se recibio el dato?
goto lazo1 ;NO, Espere
movf SSPBUF,W ; SI, cargue el dato
movwf INDF1 ; Guardeló y envíelo al puerto D
INCF FSR1L, 1
incf FSR0L, 1
MOVLW 0X05
cpfsgt FSR0L
goto recibe
clrf FSR1L
clrf FSR0L
; comprobacion de paridad por byte
inicio clrf contb ;poniendo en cero el contador
movff INDF1, dato; copia de dato recibido para compararlo
movlw 0x01 ;poniendo un valor de 00000001 en w
movwf reg1 ;pasando el valor de w al registro reg1
d movff dato, temp ;se hace una copia del dato1 y se guarda en temp
movf reg1, w ;se carga el valor de reg1 en w
andwf temp,1 ;se multiplica en el valor de reg1 por el de temp para compararlo despues
cpfseq temp ;compara si son iguales reg1 con el dato1 (bit0)
goto seguir1
incf contb, 1 ; incrementa el contador
seguir1 rlcf reg1 ;rota hacia la izquierda el bit0 del reg1
btfss reg1,7 ;ya comparo los 7bits? (ya dio la vuelta)
goto d
;************determinacion del tipo de paridad por byte en la cadena**********
comp btfsc contb, 0 ; verifica si la cantidad de unos es par (bit 0 en 0)
goto impar ; no, determina paridad impar
par bsf dato, 7 ; pone a 1 el bit MSB
goto paso
impar bcf dato, 7 ; pone a 0 el bit MSB
movf dato, W
cpfseq INDF1
GOTO falla
goto guardar
falla clrf INDF1 ;HUBO FALLA, SE LIMPIA LA LOCALIDAD PRESENTE
goto paso
guardar bcf INDF1, 7 ;regresa el dato a su forma natural
paso incf FSR1L, 1 ;se desplaza al siguiente dato de la cadena
movlw 0x05
cpfsgt FSR1L ; se termino de comprobar paridad en todos los datos?
goto inicio ; No
clrf FSR1L
clrf contb
;punto
;bcf INDF1, 7
;movlw 0x05
;cpfseq FSR1L
;goto punto
nop
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment