Skip to content

Instantly share code, notes, and snippets.

@davidae1704
Last active December 27, 2015 17:59
Show Gist options
  • Save davidae1704/7366747 to your computer and use it in GitHub Desktop.
Save davidae1704/7366747 to your computer and use it in GitHub Desktop.
codigo de la guia para trabajar en el desafio de micro
title "PIC18F4550 Envio de byte por SPI Modo Maestro"
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
conta equ 0x10
dconta equ 0x20
recibe equ 0x30
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
clrf conta
clrf dconta
;Configuración de las lineas fisicas
movlw 0x0f
movwf ADCON1
bcf TRISB,1 ;Salida SCK
bcf TRISC,7 ;Salida SDO
bcf TRISA,1 ;Salida SS
bsf TRISB,0 ;Entrada SDI
bsf TRISD,0 ;Push de entrada
;Configuración del SPI
movlw B'01000000' ;Muestreo al medio
movwf SSPSTAT
movlw B'00110000' ;Activar el SPI, polaridad, SCK=fosc/4
movwf SSPCON1
movlw 0x04
movwf FSR0H ;Localidad inicial de cadena de envío
clrf FSR0L
movlw 0x05
movwf FSR1H ;Localidad inicial de cadena de recepción
clrf FSR1L
NO btfss PORTD,0 ;Se presiono el push?
goto NO
NO1 btfsc PORTD,0 ;Se libero?
goto NO1
movf SSPBUF,W ;Lectura tonta
envio movf INDF0, W ;mover a W
bcf PIR1,SSPIF ;limpiar bandera
movwf SSPBUF ;Iniciar la transmisión
lazo1 btfss PIR1,SSPIF ;Se completo ??
goto lazo1 ;No espere
bcf PIR1, SSPIF ; limpiar bandera de SSP
incf FSR0L ;apunta a la siguiente localidad de la cadena de envío
movf SSPBUF,W
movwf INDF1
incf FSR1L ;apunta a la siguiente localidad de la cadena de recepciòn
movlw 0x03
cpfsgt FSR0L ;dejar de enviar datos una vez que se completa la cadena
goto envio ;No, envie el siguiente
clrf FSR0L
clrf FSR1L
nop
end
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
; 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 FSR0L, 1 ;se desplaza al siguiente dato de la cadena
movlw 0x03
cpfsgt FSR0L ; se termino de comprobar paridad en todos los datos?
goto recibe ; No
clrf FSR0L
clrf contb
incf FSR0L, 1
INCF FSR1L, 1
MOVLW 0X03
cpfsgt FSR0L
goto recibe
NOP
end
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
dato equ 0x20 ;Dato recibido del maestro
send equ 0x30 ;Dato enviado para comprobar la bidireccionalidad
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
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 FSR0L, 1
incf FSR1L, 1
movlw 0x03
cpfsgt FSR0L
goto recibe
clrf FSR0L
clrf FSR1L
;movwf LATD
goto recibe
end
title "PIC18F4550 Envio de byte por SPI Modo Maestro"
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
conta equ 0x10
dconta equ 0x20
recibe equ 0x30
temp equ 0x02 ;donde se guarda momentaneamente los datos
reg1 equ 0x00 ;se almacena el bit a comparar
contb equ 0x40
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
clrf conta
clrf dconta
;Configuración de las lineas fisicas
movlw 0x0f
movwf ADCON1
bcf TRISB,1 ;Salida SCK
bcf TRISC,7 ;Salida SDO
bcf TRISA,1 ;Salida SS
bsf TRISB,0 ;Entrada SDI
bsf TRISD,0 ;Push de entrada
;Configuración del SPI
movlw B'01000000' ;Muestreo al medio
movwf SSPSTAT
movlw B'00110000' ;Activar el SPI, polaridad, SCK=fosc/4
movwf SSPCON1
movlw 0x01
movwf FSR0H ;Localidad inicial de cadena de envío
clrf FSR0L
movlw 0x02
movwf FSR1H ;Localidad inicial de cadena de recepción
clrf FSR1L
movlw 0x01
movwf FSR2H
movlw 0x10
movwf FSR2L
;**************generacion de copias de datos
copiado movff INDF0, INDF2
incf FSR0L, 1
incf FSR2L, 1
movlw 0x05
cpfsgt FSR0L
goto copiado
clrf FSR0L
;************conteo de unos por byte en la cadena*************
inicio clrf contb ;poniendo en cero el contador
movlw 0x01 ;poniendo un valor de 00000001 en w
movwf reg1 ;pasando el valor de w al registro reg1
d movff INDF0, 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 INDF0, 7 ; pone a 1 el bit MSB
goto paso
impar bcf INDF0, 7 ; pone a 0 el bit MSB
paso incf FSR0L, 1 ;se desplaza al siguiente dato de la cadena
movlw 0x05
cpfsgt FSR0L ; se termino de comprobar paridad en todos los datos?
goto inicio ; No
clrf FSR0L
clrf contb
;************INICIO DEL FUNCIONAMIENTO****************************
NO btfss PORTD,0 ;Se presiono el push?
goto NO
NO1 btfsc PORTD,0 ;Se libero?
goto NO1
movf SSPBUF,W ;Lectura tonta
envio movf INDF0, W ;mover a W
bcf PIR1,SSPIF ;limpiar bandera
movwf SSPBUF ;Iniciar la transmisión
lazo1 btfss PIR1,SSPIF ;Se completo ??
goto lazo1 ;No espere
bcf PIR1, SSPIF ; limpiar bandera de SSP
incf FSR0L, 1 ;apunta a la siguiente localidad de la cadena de envío
recep movf SSPBUF,W
movwf INDF1
incf FSR1L, 1 ;apunta a la siguiente localidad de la cadena de recepciòn
movlw 0x05
cpfsgt FSR0L ;dejar de enviar datos una vez que se completa la cadena
goto envio ;envie el siguiente
nop
end
title "PIC18F4550 Envio de byte por SPI Modo Maestro"
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
conta equ 0x10
dconta equ 0x20
recibe equ 0x30
temp equ 0x02 ;donde se guarda momentaneamente los datos
reg1 equ 0x00 ;se almacena el bit a comparar
contb equ 0x40
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
clrf conta
clrf dconta
;Configuración de las lineas fisicas
movlw 0x0f
movwf ADCON1
bcf TRISB,1 ;Salida SCK
bcf TRISC,7 ;Salida SDO
bcf TRISA,1 ;Salida SS
bsf TRISB,0 ;Entrada SDI
bsf TRISD,0 ;Push de entrada
;Configuración del SPI
movlw B'01000000' ;Muestreo al medio
movwf SSPSTAT
movlw B'00110000' ;Activar el SPI, polaridad, SCK=fosc/4
movwf SSPCON1
movlw 0x04
movwf FSR0H ;Localidad inicial de cadena de envío
clrf FSR0L
movlw 0x05
movwf FSR1H ;Localidad inicial de cadena de recepción
clrf FSR1L
;************conteo de unos por byte en la cadena*************
inicio clrf contb ;poniendo en cero el contador
movlw 0x01 ;poniendo un valor de 00000001 en w
movwf reg1 ;pasando el valor de w al registro reg1
d movff INDF0, 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 INDF0, 7 ; pone a 1 el bit MSB
goto paso
impar bcf INDF0, 7 ; pone a 0 el bit MSB
paso incf FSR0L, 1 ;se desplaza al siguiente dato de la cadena
movlw 0x03
cpfsgt FSR0L ; se termino de comprobar paridad en todos los datos?
goto inicio ; No
clrf FSR0L
clrf contb
;************INICIO DEL FUNCIONAMIENTO****************************
NO btfss PORTD,0 ;Se presiono el push?
goto NO
NO1 btfsc PORTD,0 ;Se libero?
goto NO1
movf SSPBUF,W ;Lectura tonta
envio movf INDF0, W ;mover a W
bcf PIR1,SSPIF ;limpiar bandera
movwf SSPBUF ;Iniciar la transmisión
lazo1 btfss PIR1,SSPIF ;Se completo ??
goto lazo1 ;No espere
bcf PIR1, SSPIF ; limpiar bandera de SSP
incf FSR0L, 1 ;apunta a la siguiente localidad de la cadena de envío
movf SSPBUF,W
movwf INDF1
incf FSR1L, 1 ;apunta a la siguiente localidad de la cadena de recepciòn
movlw 0x03
cpfsgt FSR0L ;dejar de enviar datos una vez que se completa la cadena
goto envio ;No, envie el siguiente
nop
end
@davidae1704
Copy link
Author

codigos de maestro con arreglo de cadena y maestro con arreglo de cadena y detector de paridad

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment