hola MLO
lo estoy realizando en lenguanje ensamblador .....
pibe ...
no pude transmitir con la rutina que me recomendaste ..... mira hice cambios en tu rutina para probar y me quedo asi, el Puerto c7 yo lo coloque en C2 lo estoy enviando Storage register clock pin (latch pin) del 74hc595 los datos los estoy sacando por el puerto C5 el reloj por C3 ( la interrupcion la estoy manejando para un teclado matricial que voya ocupar ) ayudame por favor ...
mil gracias de antemano
LIST p=PIC16F873A ; Directiva para definir micro.
include <P16F873A.inc> ; Fichero standard de cabezera.
; __CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC
;#################### DEFINICIONES ###########################
;Include p16f873a.inc
PUERTOA EQU 05
PUERTOB EQU 06
PUERTOC EQU 07
UNI EQU16
STATUS EQU03
PDel2 EQU 0c
PDel1 EQU 0d
PDel0 EQU 0e
loops EQU 18
TRISC EQU 87
T2CON EQU12
TMR2 EQU 11
PIR2 EQU 0D
org H'0000'
goto Inicio ;Se salta el vector de interrupción
org H'0004' ;VECTOR DE INTERRUPCION
btfsc INTCON,RBIF ;Comprueba si es int. de RB0/INT
goto IntExt
retfie
Inicio: BSf STATUS,5
bcf STATUS,6 ;Activa la pagina 1
MOVLW 0x06 ; Configure all pins
MOVWF ADCON1
Movlw b'000000' ;RA0..RA4 como salida.
Movwf TRISA
Movlw b'11110000' ;Todo el puerto B como entrada.
Movwf TRISB
movlw B'00010000'
movwf TRISC
bcf OPTION_REG,NOT_RBPU ;Activa Pull-up en puerto B
bcf OPTION_REG,INTEDG ;Flanco de bajada en interrupcion.
Bcf STATUS,RP0 ;Activa la pagina 0
bsf INTCON,GIE ;Activa todas las interrupciones.
bsf INTCON,RBIE ;INTE ;Activa la interrupcion RA0/INT.
MOVLW B'01000000' ;MUESTREO MITAD DATO, TRANSMISION EN ALTO
MOVWF SSPSTAT
MOVLW B'00110001' ;MODE 1,1 SPI MAESTRO,RELOG ALTO, FOSC/16
MOVWF SSPCON
BCf STATUS,5
bsf PUERTOC,2 ; make sure cs is set high
Main
call Wren
bcf PUERTOC,2 ; set chip select line low
movlw b'00000000' ; high addr byte is all 0's
call output ; call the output subroutine
bcf SSPCON,4 ; set clock idle low, mode 0,1
bsf PUERTOC,2 ; set chip select, begin write cycle
bsf SSPCON,4 ; set clock idle high, mode 1,1
call wait ; little delay between SPI sequence
call DEMORA1s
goto Main ; do it all over again
; loop can be used to evaluate SPI
; signals on oscilloscope
output movwf SSPBUF ; place data in buffer to send
loop1 bsf STATUS,RP0 ; specify bank 1
btfss SSPSTAT,0 ; has data been received (xmit done)?
goto loop1 ; not done yet, keep trying
bcf STATUS,RP0 ; specify bank 0
return ; return from subroutine
Wren bcf PORTC,7 ; set chip select line low
movlw B'00000110' ; WREN control byte
call output ; Call the output subroutine
bcf SSPCON,4 ; set clock idle low, mode 0,1
bsf PUERTOC,2 ; set chip select, begin write
bsf SSPCON,4 ; set clock idle high, mode 1,1
return ; return from subroutine
;********************* BEGIN SUBROUTINES*******************************
;*** DELAY ROUTINE - 400uS ***
; Subrutina de espera 400us
wait movlw .200 ; timing adjustment variable
movwf loops ; move variable into loops
top nop ; sit and wait
nop ; no operation
decfsz loops,f ; loop complete?
goto top ; no, go again
return ; yes, return from sub
DEMORA1s movlw .22 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .134 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .211 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return
END