en ello estoy simplificandolo al maximo, y en pequeño parece funcionar. Os dejo el programa que me ha salido probando por si a alguien le sirve. lo que hace es basicamente leer el estado de la entrada de los 74165 conectados en serie hasta 256 y sacar los datos por los 74595 si mirais en el programa hay dos registros a modificar con el nº de shifts a la entrada y la salida. la usart esta configurada para que almacene los datos recibidos en los registros a mostrar tambien se puede elegir el nº de registros a rescribir. aun siendo las mismas rutinas y estar configurado de la misma forma en mi prgrama no funciona , tendre que buscar que es en las partes que no estan a base de añadirlas una a una para saber que interfiere
un saludo y gracias
LIST p=16f88
#include <P16F88.INC>
N_REGISTROS EQU 0X25
N_BITS EQU 0X26
REG_REC_SPI EQU 0X27
N_DIGITOS EQU 0X28
REG_ENV_SPI EQU 0X29
CENT EQU 0X2A
MSD EQU 0X2B
LSD EQU 0X2C
REG_ENV_USART EQU 0X2D
REG_RETARDO EQU 0X2E
W_TEMP EQU 0X2F
STATUS_TEMP EQU 0X30
PCLATH_TEMP EQU 0X31
FSR_TEMP EQU 0X32
REG_REC_USART EQU 0X33
N_LLEGADAS EQU 0X34
N_PUESTOS EQU 0X35
;-----------------------------------
org 0
goto PROGRAMA
org 4
goto INTERRUPT
org 5
;------------------------------------
INTERRUPT
BCF STATUS,RP0 ;PAGE 0
MOVWF W_TEMP
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_TEMP
MOVF PCLATH,W
MOVWF PCLATH_TEMP
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_TEMP
;---------------------------------------------
BTFSC PIR1,TMR1IF
CALL INT_TMR1
BTFSC PIR1,RCIF
CALL INT_RX_USART
GOTO FIN_INT
;---------------------------------------------
INT_TMR1
RETURN
;--------------------------------------------------------
INT_RX_USART
BCF STATUS,RP0
MOVF RCREG,W ;MUEVE EL BYTE RECIBIDO A W
MOVWF REG_ENV_USART
CALL ENVIAR_USART
DECFSZ N_LLEGADAS ;PARA INICIAR LA PANTALLA ENVIAR UN Nº DEL 1 AL 9 HARA QUE SALTE LA PRIMERA VEZ Y EMPIEZE
GOTO RECEP_TECLA
GOTO RELLENA
RECEP_TECLA ;AÑADE PUESTO EN EL BANCO DE MEMORIA
INCF N_PUESTOS ;N_PUESTOS = 0X50-0X70
BORRA ;NO AÑADE PUESTO EN EL BANCO DE MEMORIA POR LO QUE SUSTITUYE UNA POSICION POR OTRA
MOVF N_PUESTOS,W ;POSICION DE MEMORIA DECLARADA PARA GUARDAR LA POSICION DE MEMORIA DONDE SE ALOJA EL DEST DE FSR
MOVWF FSR
MOVF REG_REC_USART,W
MOVWF INDF
RETURN
;---------------------------------------------------------
RELLENA MOVLW 0X49 ;DIRECCION -1 DE MEMORIA DONDE EMPIEZA
MOVWF N_PUESTOS
MOVLW .1 ;Nº DE REGISTROS CONECTADOS A LA SALIDA
MOVWF N_LLEGADAS
RETURN
;---------------------------------------------------------
;---------------------------------------------
FIN_INT
CALL ENVIA_TEXTO
CALL CONFIG_INTERRUPTS
MOVF FSR_TEMP,W
MOVWF FSR
MOVF PCLATH_TEMP,W
MOVWF PCLATH
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
;---------------------------------------------
CONFIG_TRISB
BSF STATUS,5
MOVLW B'01100100'
MOVWF TRISB
RETURN
CONFIG_TRISA ;111011
BSF STATUS,RP0 ;PAGE 1
BCF TRISA,0
BCF TRISA,1
BSF TRISA,2
BSF TRISA,3
BSF TRISA,4
BSF TRISA,5
BSF TRISA,6
BCF TRISA,7
RETURN
;---------------------------------------------
CONFIG_RS232
BANKSEL SPBRG
MOVLW .9
MOVWF SPBRG ;BAUD RATE A 31250
BANKSEL TXSTA
BCF TXSTA,CSRC ;SELECCIONA RELOJ (ASINCRONO NO IMPORTA)
BCF TXSTA,TX9 ;DATOS DE 8 BITS
BSF TXSTA,TXEN ;NO ENVIA DATOS POR AHORA
BCF TXSTA,SYNC ;MODO ASINCRONO
BCF TXSTA,3 ;NO IMPLEMENTADO
BCF TXSTA,BRGH ;BAJA VELOCIDAD DE TRANSMISION
BCF TXSTA,TRMT ;ESTADO DEL REGISTRO DE DESPLAZAMIENTO (VACIO)
BCF TXSTA,TX9D ;NOVENO BIT A TRANSMITIR
BANKSEL RCSTA
BSF RCSTA,SPEN ;HABILITA PUERTO SERIE
BCF RCSTA,RX9 ;BITS A RECIVIR 8
BCF RCSTA,SREN ;HABILITA RECEPCION UNICA (ASINCRONO NO IMPORTA)
BSF RCSTA,CREN ;HABILITA RECEPCION CONTINUA
BCF RCSTA,3
BCF RCSTA,FERR ;NO HAY ERROR DE EMPAQUETAMIENTO
BCF RCSTA,OERR ;NO HAY ERROR DE DESBORDAMIENTO
BCF RCSTA,RX9D ;NOVENO BIT DE RECIVIDO
BANKSEL PIE1
BCF PIE1,TXIE ;DESHABILITA INTERRUPCION DE TRANSMISION
BSF PIE1,RCIE ;HABILITA INTERRUPCION DE RECEPCION
BANKSEL PIR1
BCF PIR1,TXIF ;APAGA BANDERA DE INTERRUPCION POR TRANSMISION
BCF PIR1,RCIF ;APAGA BANDERA DE INTERRUPCION POR RECEPCION
BCF STATUS,RP0 ;CAMBIA AL BANCO 0
BCF STATUS,RP1
RETURN
;---------------------------------------------
CONFIG_ANSEL
BSF STATUS,RP0
MOVLW B'00011100'
MOVWf ANSEL
RETURN
CONFIG_ADCON0
BCF STATUS,RP0
MOVLW B'00000100'
MOVWF ADCON0
RETURN
CONFIG_ADCON1 ; 00000110
BSF STATUS,RP0 ;PAGE 1
MOVLW B'00000000'
MOVWF ADCON1
RETURN
;---------------------------------------------
CONFIG_TMR1 ;00000111
BCF STATUS,RP0 ;PAGE 0
BCF T1CON,T1CKPS1 ;SELECCION DEL PREESCALER DEL TMR0
BCF T1CON,T1CKPS0 ;SELECCION DEL PREESCALER DEL TMR0
BCF T1CON,T1OSCEN ;ACTIVACION OSCILADOR POR CRISTAL
BSF T1CON,T1INSYNC ;CONTROL SINC EXTERNO
BSF T1CON,TMR1CS ;SELECCION DE RELOJ INT- EXT
BSF T1CON,TMR1ON ;1-ACTIVADO 0-DESACT. TIMER0
RETURN
;---------------------------------------------
CONFIG_INTERRUPTS
BSF STATUS,RP0
MOVLW B'11000000'
MOVWF INTCON
MOVLW B'00100001'
MOVWF PIE1
BCF STATUS,RP0
CLRF PIR1
RETURN
;---------------------------------------------
ENVIAR_USART
MOVF REG_ENV_USART,W
MOVWF TXREG
BANKSEL TXSTA ;DEJA EL REGISTRO COMO ESTABA
BSF TXSTA,TXEN ;HABILITA EL ENVIO
BANKSEL PIR1 ;LIMPIA LA BANDERA
ESPERA_TX ;ESPERA A QUE HAYA TERMINADO
BTFSS PIR1,TXIF
GOTO ESPERA_TX
BCF STATUS,RP0 ;PAGE 0
BCF STATUS,RP1
MOVLW .128
MOVWF REG_RETARDO
RETARDO DECFSZ REG_RETARDO ;TIENE PUESTA UN RETARDO DE 128 CICLOS, ES PARA DARLE TIEMPO AL ESCLAVO PARA QUE PROCESE LA INFO
GOTO RETARDO ;QUE RECIBE, ES UNA PREGUNTA QUE DEBO HACER A ALGUIEN QUE ENTIENDA
RETURN ;¿CUÁTNO TIEMPO NECESITA UN ESCLAVO PARA PROCESAR UN DATO MIDI?
;-----------------------------------
PROGRAMA
CALL CONFIG_TRISA
CALL CONFIG_TRISB
BCF STATUS,RP0
CALL RELLENA
CALL CONFIG_ANSEL
CALL CONFIG_ADCON0
CALL CONFIG_ADCON1
CALL CONFIG_TMR1
CALL CONFIG_RS232
CALL CONFIG_INTERRUPTS
BUCLE
CALL CONFIG_REG_REC_SPI
CALL ENVIA_TEXTO
GOTO BUCLE
;-----------------------------------
CONFIG_REG_REC_SPI
BCF STATUS,RP0 ;PAGE 0
MOVLW 0X50
MOVWF FSR
MOVLW .1
MOVWF N_REGISTROS
RECEP_SPI ;CADA VEZ QUE SE LE LLAMA GUARDA EN EL REGISTRO W 8 BITS
BCF STATUS,RP0 ;PAGE 0
BCF PORTB,7 ;BAJA PULSO PARA ESPERAR DATO
NOP ;ESPERA PARA ESTABILIZAR
NOP
MOVLW .9 ;Nº DE BITS A DAR LA VUELTA
MOVWF N_BITS
DESCONT DECFSZ N_BITS ;DECREMENTA N BITS
GOTO ENUMERA
GOTO GUARDA ;VA A GUARDA
ENUMERA BSF PORTB,7 ;SI LLEGO A CERO UN BYTE MENOS
NOP ;SUBE PULSO PARA NUEVO DATO
NOP ;ESPERA ESTABILIZA
BTFSC PORTB,6 ;SI ES CERO...
GOTO RECIBE_UNO ;...NO HAY SALTO ESTABA A CERO
RECIBE_CERO
NOP
NOP
BCF STATUS,C ;SI FUE CERO BAJA EL CARRY (ARROZ??)
RRF REG_REC_SPI,F ;Y ROTA EL REGISTRO INTRODUCIENDO EL VALOR DEL CARRY
BCF PORTB,7 ;BAJA EL PULSO PARA ESPERAR NUEVO DATO AL SUBIR
NOP ;ESTABILIZA
NOP
GOTO DESCONT ;VUELTA ATRAS HASTA QUE SE ACABEN LOS BITS
RECIBE_UNO
NOP
NOP ;SI ESTABA ALTO
BSF STATUS,C ;SALTA PONE A UNO EL CARRY
RRF REG_REC_SPI,F ;Y ROTA EL REGISTRO INTRODUCIENDO EL VALOR DEL CARRY
BCF PORTB,7 ;BAJA EL PULSO PARA ESPERAR NUEVO DATO AL SUBIR
NOP ;ESTABILIZA
NOP
GOTO DESCONT ;VUELTA ATRAS HASTA QUE SE ACABEN LOS BITS
GUARDA MOVF REG_REC_SPI,W ;GUARDA EN W
INCF FSR ;INCREMNTA FSR
MOVWF INDF ;1ª MEMORIA LIBRE?? 0X50
DECFSZ N_REGISTROS ;REPITE X VECES SEGUN EL NUMERO DE REGISTROS
GOTO RECEP_SPI
RETURN
;-------------------------------------------------------------
ENVIA_TEXTO
BCF STATUS,RP0 ;PAGE 0
MOVLW .1 ;Nº DE REGISTROS A LA SALIDA
MOVWF N_DIGITOS
MOVLW 0X50
MOVWF FSR
ENVIAR_SPI
MOVF INDF,W
MOVWF REG_ENV_SPI ;DE W A REG_ENV_SPI
MOVLW .9 ;Nº DE BITS DEL REGISTRO A W
MOVWF N_BITS ;DE W A N_BITS
REMONT
DECFSZ N_BITS ;DECREMENTA Nº DE BITS 8-0
GOTO ENVIA_BIT ;SALTA A ENVIA_BIT
GOTO COMPLETA ;RETORNA, NO QUEDAN MAS BITS A ENVIAR
ENVIA_BIT
RLF REG_ENV_SPI,F ;ROTA A LA IZQUIERDA Y EL BIT DE MAS PESO VA AL CARRY, A LA SIGUIENTE
;ESTE VUELVE A ENTRAR POR EL CARRY;Y CUANDO PASAN 8 BITS VUELVE A DEJAR EL QUE ESTABA
BTFSC STATUS,C ;TESTEA SI ES CERO O UNO
GOTO ENVIA_UNO ;SI FUE CERO NO SALTA Y VA A ENVIA _UNO
;--------------ENVIA CERO Y ESPERA NUEVO BIT------------------------------------
ENVIA_CERO ;SI FUE CERO SALTA PARA ENVIAR CERO POR EL SPI
BCF PORTA,0 ;PONE A CERO RA0
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
BSF PORTA,1 ;CLOCK EN ALTO RA1 PARA ENVIAR DATO
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
BCF PORTA,0 ;PONE A CERO RA0
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
BCF PORTA,1 ;PONE A CERO CLOCK PARA ESPERAR NUEVO DATO
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
GOTO REMONT ;RETORNA PARA ENVIAR NUEVO BIT
;--------------ENVIA UNO Y ESPERA NUEVO BIT-----------------------------------
ENVIA_UNO ;SI EL CARRY ESTABA A UNO, NO SALTÓ
BSF PORTA,0 ;1 EN DATO
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
BSF PORTA,1 ;CLOCK A UNO PARA ENVIAR DATO
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
BCF PORTA,0 ;PONE A CERO PARA ESPERAR NUEVO DATO
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
BCF PORTA,1 ;PONE A CERO PARA ESPERAR NUEVO DATO
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
GOTO REMONT ;RETORNA PARA ENVIAR NUEVO BIT
COMPLETA
DECFSZ N_DIGITOS
GOTO OTRO_MAS
GOTO LATCH
OTRO_MAS
INCF FSR
GOTO ENVIAR_SPI
LATCH BSF PORTB,1
NOP
NOP
BCF PORTB,1
NOP
NOP
RETURN
B2_BCD
CLRF CENT ;CENTENAS
clrf MSD ;DECENAS
movwf LSD ;UNIDADES
gtenth
movlw .10
subwf LSD,W
BTFSS STATUS,C
goto OVERHAUL
movwf LSD
incf MSD, F
goto gtenth
OVERHAUL
MOVLW .10
SUBWF MSD,W
BTFSS STATUS,C
GOTO OVER
MOVWF MSD
INCF CENT,F
GOTO OVERHAUL
OVER
RETLW 0
S_SEGMENT
ADDWF PCL
RETLW 0X3F ;------------0
RETLW 0X06
RETLW 0X5B
RETLW 0X4F
RETLW 0X66
RETLW 0X6D
RETLW 0X7D
RETLW 0X07
RETLW 0X7F
RETLW 0X6F
END