Created
November 25, 2013 21:57
-
-
Save RoberCRivera/7649665 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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