;---------------Encabezado-------------
LIST p=16f876
radix hex
;------------mapa de memoria---------
status equ 0x03 ; Aquí le asignamos nombres a los
trisa equ 0x05 ; registros indicando
porta equ 0x05
trisb equ 0x06 ; la posición
portb equ 0x06
trisc equ 0x07
portc equ 0x07 ; en la que se encuentran
temp1 equ 0x20 ; temporal 1
temp2 equ 0x21 ; temporal 2
cont equ 0x20 ; defino contador
sspcon equ 0x14 ; control SPI
sspstat equ 0x94 ; estado SPI
sspbuf equ 0x13 ; buffer SPI
; INICIO
reset org 0x00 ; origen del programa, aquí comenzaré
; siempre que ocurra un reset
goto inicio ; salto a "inicio"
org 0x05 ; origen del código de programa
inicio bsf status,5 ; pongo rp0 a 1 y paso al banco1
movlw b"00000" ; cargo W con 00000 salidas
movwf trisa ; y paso el valor a trisa puerto A display
movlw b"11111111" ; cargo W con 11111111 entradas
movwf trisb ; y paso el valor a trisb puerto B interruptores
movlw b"00010000" ; cargo W con 00010000
movwf trisc ; y paso el valor a trisc puerto C solo entrada SPI data in
bcf status,5 ; pongo rp0 a 0 y regreso al banco0
clrf portb ; limpio el puerto B
clrf cont ; limpio el contador
movlw b"00110000" ; no collision, no overflow, autoconfigure, clock high level, FOSC/4
movwf sspcon ; pasamos estos valores a control SPI
; ORDENAR LECTURA DEL POT GRAVES
bsf portc,1 ; pone un 1 para desactivar pot medios-altos
bcf portc,0 ; pone un 0 para activar pot graves-ganancia
movlw b"10010001" ; leer memoria EEMEM RDAC2 graves
movwf temp1 ; la pasamos a temp1
movlw 0x08
movwf temp2 ; Inicializa el contador
spi bsf portc,5 ; Sube data
btfss temp1,7 ; Comprueba el bit y lo baja si es cero
bcf portc,5
nop ; Envia el bit
bsf portc,3
nop ; Da un pulso de reloj
bcf portc,3
nop
rlf temp1,f ; Rotamos a la izquierda "temp1"
decfsz temp2,f ; Comprobamos el contador, para ver si hemos enviado los 8 bits
goto spi ; Si no, repetimos el bucle
bcf portc,5
return ; Fin
movlw b"00000000" ; el resto de bits son X, la cadena es de 16 bits
movwf temp1 ; la pasamos a temp1
movlw 0x08
movwf temp2 ; Inicializa el contador
spi2 bsf portc,5 ; Sube data
btfss temp1,7 ; Comprueba el bit y lo baja si es cero
bcf portc,5
nop ; Envia el bit
bsf portc,3
nop ; Da un pulso de reloj
bcf portc,3
nop
rlf temp1,f ; Rotamos a la izquierda "temp1"
decfsz temp2,f ; Comprobamos el contador, para ver si hemos enviado los 8 bits
goto spi2 ; Si no, repetimos el bucle
bcf portc,5
return ; Fin
; LEER POSICION POT GRAVES
bsf portc,0 ; pone un 1 para desactivar pot graves-ganancia
spi_cnt movlw 0x08
movwf temp2 ;Inicializa el contador
spi_lee btfss portc,3
goto spi_lee
bsf status,0
btfss portc,4 ;Copia el valor de data en el carry
bcf status,0
rlf temp1,f ;Para guardarlo en el temporal
spi_bck btfsc portc,3
goto spi_bck
decfsz temp2,f ;Comprobamos el contador, para ver si hemos recibido los 8 bits
goto spi_lee ;Si no, repetimos el bucle
movf temp1,w
return ;Fin. Tenemos la posicion del POT GRAVES en el registro w
MOSTRAR POSICION EN EL LCD
test btfsc portb,0 ; Si alguien presiona interruptor 1 CAMBIO
call cambio ; voy a etiqueta cambio
btfsc portb,1 ; si alguien presiona interruptor 2 UP
call up ; voy a etiqueta up
btfsc port,2 ; si alguien presiona interruptor 3 DOWN
call down ; voy a etiqueta down
btfsc port,3 ; si alguien presiona interruptor 4 MEM1
call mem1 ; voy a etiqueta mem1
btfsc port,4 ; si alguien presiona interruptor 5 MEM2
call mem2 ; voy a etiqueta mem2
btfsc port,5 ; si alguien presiona interruptor 6 MEM3
call mem3 ; voy a estiqueta mem3
btfsc port,6 ; si alguien presiona interruptor 7 MEM4
call mem4 ; voy a estiqueta mem4
btfsc port,7 ; si alguien presiona interruptor 8 MEM5
call mem5 ; voy a estiqueta mem5
DUDAS:
1) El clock del PIC que lo genero a traves de un cristal de cuarzo 4MHz?
2) Esta bien configurado sspcon? que es FOSC/4?