Hola gente como va hace rato que no posteo nada por los estudios , les queria comentar mi problema , y si alguien esta interesado en ayudarme lo agradeceria muchisimo ...
desde principio de año estoy con un proyecto que lleve a cabo desde la nada , mi idea era hacer un interruptor inalambrico con 2 pics y dos modulos nrf24l01
ya que necesito una comunicacion bidireccional , chequear el estado del interruptor y dependiendo de esto se sigue una secuencia de desacople u acople del interruptor , carga del mismo u otra accion .
Interruptor:
Electronica para saber estado de interruptor y accionarlo:
el proyecto lo hice para saber cuanto me podria superar , un objetivo mas grande de lo que podia lograr en el momento por eso tanto tiempo me esta llevando terminarlo ya que cuando empece no tenia ni la mas minima ides de lo que era un pic ni programar , ahora el problema que tengo es el siguiente :
*cree una comunicacion spi en assembler entre dos pics 16f88 , para poder provar previamente de que puedo realizar una comunicacion spi de manera exitosa antes de pasar a la parte mas pesada que seria meter la comunicacion en el proyecto con los modulos tranceptores.
*
El programa del maestro y el eclavo , por separado en el proteus funcionan correctamente , cuando los pruebo juntos en el proteus no funciona nada , se cuelga asi que decidi montar un diagrama basico de una comunicacion SPI en una placa virgen de pruebas y ver de que las señales sean las correctas y que funcione adecuadamente , pero ahi me encontre con el problema , el maestro manda la señal de datos , el clock (sck) y el cs (chip select) bien .. osea las señales adecuadas .... pero el esclavo no responde bien , los datos que le pido que salgan que son constantes , (un ejemplo mestro manda 0xFF , y el esclavo cuando recibe manda 0x0F) en vez de recibir datos desde el esclavo lo que recibo es ruido o un pequeño pasto y la verdad no se que estoy haciendo mal .. que me recomiendan algun consejo ? alguna ayuda ? ya estoy medio desesperado .. si pueden mandarme algun ejemplo se los agradeceria muchisimo ..
igualmente les dejo el programa :
Maestro
LIST p=16F88 ; list directive to define processor
#INCLUDE <P16F88.INC> ; processor specific variable definitions
;------------------------------------------------------------------------------
;
; CONFIGURATION WORD SETUP
;
; The 'CONFIG' directive is used to embed the configuration word within the
; .asm file. The lables following the directive are located in the respective
; .inc file. See the data sheet for additional information on configuration
; word settings.
;
;------------------------------------------------------------------------------
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
;------------------------------------------------------------------------------
;
; VARIABLE DEFINITIONS
;
; Available Data Memory divided into Bank 0 through Bank 3. Each Bank contains
; Special Function Registers and General Purpose Registers at the locations
; below:
;
; SFR GPR SHARED GPR's
; Bank 0 0x00-0x1F 0x20-0x6F 0x70-0x7F
; Bank 1 0x80-0x9F 0xA0-0xEF 0xF0-0xFF
; Bank 2 0x100-0x10F 0x110-0x16F 0x170-0x17F
; Bank 3 0x180-0x18F 0x190-0x1EF 0x1F0-0x1FF
;
;------------------------------------------------------------------------------
CBLOCK 0x20 ; Sample GPR variable registers allocated contiguously
MYVAR1 ; User variable
MYVAR2 ; User variable
MYVAR3 ; User variable
DY1
DY2
DY3
ENDC
Ctr0 EQU 0x20 ; Counter variable - sent to SPI
Dly0 EQU 0x21 ; Delay Variable (low byte)
Dly1 EQU 0x22 ; Delay Variable (high byte)
#define CS 0x02 ; PORTA,2
W_TEMP EQU 0x7D ; w register for context saving (ACCESS)
STATUS_TEMP EQU 0x7E ; status used for context saving (ACCESS)
PCLATH_TEMP EQU 0x7F ; variable used for context saving
;------------------------------------------------------------------------------
; EEPROM INITIALIZATION
;
; The 16F88 has 256 bytes of non-volatile EEPROM, starting at address 0x2100
;
;------------------------------------------------------------------------------
DATAEE ORG 0x2100
DE "MCHP" ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3
;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------
RESET ORG 0x0000 ; processor reset vector
PAGESEL START
GOTO START ; go to beginning of program
;------------------------------------------------------------------------------
; INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------
ISR ORG 0x0004 ; interrupt vector location
; Context saving for ISR
MOVWF W_TEMP ; save off current W register contents
MOVF STATUS,W ; move status register into W register
MOVWF STATUS_TEMP ; save off contents of STATUS register
MOVF PCLATH,W ; move pclath register into W register
MOVWF PCLATH_TEMP ; save off contents of PCLATH register
;------------------------------------------------------------------------------
; USER INTERRUPT SERVICE ROUTINE GOES HERE
;------------------------------------------------------------------------------
; Restore context before returning from interrupt
MOVF PCLATH_TEMP,W ; retrieve copy of PCLATH register
MOVWF PCLATH ; restore pre-isr PCLATH register contents
MOVF STATUS_TEMP,W ; retrieve copy of STATUS register
MOVWF STATUS ; restore pre-isr STATUS register contents
SWAPF W_TEMP,F
SWAPF W_TEMP,W ; restore pre-isr W register contents
RETFIE ; return from interrupt
;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------
START ; Set up the SPI Support
BANKSEL TRISA ; BANK 1
movlw 0x00 ; Set PORTA as
movwf TRISA ; all Outputs
movlw 0x01 ; Turn off A/D
movwf ADCON0 ; so PORTA can be used
; Set up the SPI Port
BANKSEL TRISB ; BANK 1
movlw 0x02 ; SCK is output (Master), SDI is input,
movwf TRISB ; SDO is output, all others output
movlw 0x40 ; Mode 1,1 SPI, middle of output
movwf SSPSTAT ; time sampling
BANKSEL SSPCON ; BANK 0
movlw 0x31 ; Mode 1,1 SPI Master Mode, 1/16 Tosc bit
time
movwf SSPCON ; SSP is on
Send_DT
bcf PORTA,CS ; Enable Chip Select Output (low)
CALL RUTINE
movlw 0x0F
movwf SSPBUF ; put in SSPBUF
BANKSEL SSPSTAT ; BANK 1
Char1 btfss SSPSTAT,BF ; Data transfer complete? (Buffer Full?)
goto Char1 ; if not, check again
BANKSEL SSPBUF ; BANK0
movf SSPBUF,W ; Get Data from SSPBUF
; ; Throw it away
bsf PORTA,CS ; Disable Chip Select Output (high)
Update_Test_Counter
incf Ctr0,F ; Increment counter variable
Delay movlw 0x01 ; Simple Delay loop
movwf Dly1 ; |
movlw 0x0F ; |
movwf Dly0 ; |
DlyLoop decfsz Dly0,F ; |
goto DlyLoop ; |
decfsz Dly1,F ; |
goto DlyLoop
DoAgain goto Send_DT ; Done, Send Next Byte.
RUTINE
return
;------------------------------------------------------------------------------
; PLACE USER PROGRAM HERE
;------------------------------------------------------------------------------
GOTO $
END
Esclavo
LIST p=16F88 ; list directive to define processor
#INCLUDE <P16F88.INC> ; processor specific variable definitions
;------------------------------------------------------------------------------
;
; CONFIGURATION WORD SETUP
;
; The 'CONFIG' directive is used to embed the configuration word within the
; .asm file. The lables following the directive are located in the respective
; .inc file. See the data sheet for additional information on configuration
; word settings.
;
;------------------------------------------------------------------------------
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC & _FOSC_XT
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
;------------------------------------------------------------------------------
;
; VARIABLE DEFINITIONS
;
; Available Data Memory divided into Bank 0 through Bank 3. Each Bank contains
; Special Function Registers and General Purpose Registers at the locations
; below:
;
; SFR GPR SHARED GPR's
; Bank 0 0x00-0x1F 0x20-0x6F 0x70-0x7F
; Bank 1 0x80-0x9F 0xA0-0xEF 0xF0-0xFF
; Bank 2 0x100-0x10F 0x110-0x16F 0x170-0x17F
; Bank 3 0x180-0x18F 0x190-0x1EF 0x1F0-0x1FF
;
;------------------------------------------------------------------------------
CBLOCK 0x20 ; Sample GPR variable registers allocated contiguously
MYVAR1 ; User variable
MYVAR2 ; User variable
MYVAR3 ; User variable
DY1
DY2
DY3
ENDC
#define CS 0x20 ; PORTA,5 (HW SS pin)
W_TEMP EQU 0x7D ; w register for context saving (ACCESS)
STATUS_TEMP EQU 0x7E ; status used for context saving (ACCESS)
PCLATH_TEMP EQU 0x7F ; variable used for context saving
;------------------------------------------------------------------------------
; EEPROM INITIALIZATION
;
; The 16F88 has 256 bytes of non-volatile EEPROM, starting at address 0x2100
;
;------------------------------------------------------------------------------
DATAEE ORG 0x2100
DE "MCHP" ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3
;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------
RESET ORG 0x0000 ; processor reset vector
PAGESEL START
GOTO START ; go to beginning of program
; MAIN PROGRAM
;------------------------------------------------------------------------------
START
clrf PORTB
CLRF PORTA
; Set up the SPI Support
BANKSEL TRISA ; BANK 1
movlw CS ; Chip Select pin
movwf TRISA ; is in input mode
movlw 0x06 ; Turn Off A/D mode for at least the
movwf ADCON1 ; Chip Select pin (all Digital mode)
; Set up output port
BANKSEL TRISB ; BANK 1
movlw b'00110010' ; Configure all PORTB pins
movwf TRISB ; to be in output mode
BANKSEL PORTA
CLRF PORTA
BANKSEL TRISB
; Set up the SPI
movlw 0x40 ; Mode 1,1 SPI with
movwf SSPSTAT ; middle of output time sampling
BANKSEL SSPCON ; BANK 0
movlw 0x34 ; Mode 1,1 SPI Slave Mode, /SS Required
movwf SSPCON ; SSP is on
Chk4Dat
btfss SSPSTAT,BF ; Here is the test
goto Chk4Dat ; New data, do a transfer (below
Recibed
BANKSEL SSPBUF
movf SSPBUF,W
MOVWF MYVAR2 ; put in SSPBUF into W
UNOS2 CALL UNOS
DOS1 CALL DOS
tres2 CALL TRES
CUATRO2 CALL CUATRO
BANKSEL PORTB ; BANK 0
movwf PORTB ; Show the results on PORTB
CALL ENVIOSLAVE
DoAgain
; Optional customer code can go here
goto Chk4Dat ; Receive Next Byte
UNOS BTFSS MYVAR2,0
CALL UNO1
BSF PORTA,1
CALL DELAY
RETURN
UNO1 BCF PORTA,1
GOTO UNOS2
DOS BTFSS MYVAR2,1
CALL DOS2
BSF PORTB,5
CALL DELAY
RETURN
DOS2 BCF PORTB,5
GOTO DOS1
TRES BTFSS MYVAR2,2
CALL TRES1
BSF PORTB,6
CALL DELAY
RETURN
TRES1 BCF PORTB,6
GOTO tres2
CUATRO BTFSS MYVAR2,3
CALL CUATRO1
BSF PORTB,7
CALL DELAY
RETURN
CUATRO1 BCF PORTB,7
GOTO CUATRO2
ENVIOSLAVE
MOVLW 0XFF
MOVWF MYVAR1
MOVLW MYVAR1
MOVWF SSPBUF
RETURN
DELAY CLRF DY1
CLRF DY2
clrf DY3
ITER DECFSZ DY1
GOTO ITER
DECFSZ DY2
GOTO ITER
DECFSZ DY3
GOTO ITER
RETURN
;------------------------------------------------------------------------------
; PLACE USER PROGRAM HERE
;------------------------------------------------------------------------------
GOTO $
END