TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: arturo98370 en 25 de Febrero de 2009, 21:58:30
-
hola !!!
Quisiera que por favor alguen me ayudara con este problema que tengo, estoy tratando de transmitir datos por medio de el SPI con un pic 16f873 hacia un registro de desplazamiento 74hc595. Tengo entendido que se manejan solo 3 pines para esto entrada, salida pero no se como iniciar con esto se que los datos para sacarlos se colocan en el registro sspbuf y que salen los datos uno a uno segun el pulso de el reloj . pero no se quien es el reloj, ni como es que lo saco por el puerto RC3 por favor ayudenme estoy desesperado por que no puedo transmitir nada
puede alguin instruirme en como hacerlo se que hay mucha gente muy sabia en este foro por favor ayudenme
muchas gracias de antemano
-
Hola.
En que lenguaje?
-
Este ejemplo lo hice en assembler, si te sirve. Es para una memoria eeprom externa pero los principios son idénticos
http://www.todopic.com.ar/foros/index.php?topic=24218.0
-
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
-
"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 "
Me parece a mi o le estas indicando chip select con otro pin?