; Master.asm
list p=16F877A
#include "p16F877A.inc"
__CONFIG _CP_OFF&_DEBUG_OFF&_WRT_OFF&_CPD_OFF&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC
Ctr0 EQU 0x20 ; Variable con datos - SPI
Dly0 EQU 0x21 ; Variable funcion Delay (L-byte)
Dly1 EQU 0x22 ; Variable funcion Delay (H-byte)
#define CS 0x02 ; PORTA,2 chip select
ORG 0 ; Comienzo del codigo en direccion 0
nop ; FOR ICD. No implementations speed side effects.
; ****************Apoyo al SPI
; El pin RA2 del master se usa para soporte de la linea "Select Slave"
; La configuracion del puerto sera, por tanto "output, no analog"
BANKSEL TRISA ; Selecciona banco de TRISA: BANK 1
movlw 0x00 ; Preparar PortA, todo output.
movwf TRISA ; Hacerlo.
movlw 0x06 ; A/D DESACTIVADO
movwf ADCON1 ; Todo el portA es I/O digital
; El puerto C contiene el modulo SPI
BANKSEL TRISC ; Selecciona banco de TRISC (BANK 1)
movlw 0x10 ; SCK=output , SDI=input, SDO=output, others=output
movwf TRISC ; Hacerlo
movlw 0x40 ; 0100 0000. Sampled at middle
; SMP=0,Input data sampled at middle of data output time
; CKE=1,Data transmitted on rising edge of SCK
movwf SSPSTAT ;
BANKSEL SSPCON ; BANK 0
movlw 0x22 ; 0010 0001. SCK, SDO, SDI, and SS as serial port pins. CKP=LOW, SPI Master Mode, fosc/16
movwf SSPCON ;
; **************** Envio de datos a traves del modulo SPI del Master.
Send_DT
bcf PORTA,CS ; Enable Chip Select
movf Ctr0,W ; Counter a W.
movwf SSPBUF ; y a SSPBUF. Debe poner BF a 1
BANKSEL SSPSTAT ; BANK 1
Char1
btfss SSPSTAT,BF ; esperando Buffer Full
goto Char1 ; si no, otra vez
BANKSEL SSPBUF ; BANK0
movf SSPBUF,W ; leer desde SSPBUF. Debe poner BF a 0
bsf PORTA,CS ; Disable Chip Select Output (high)
; **************** conteo
Update_Test_Counter
incf Ctr0,F ; Incremento contador
Delay
movlw 0x01 ; Delay
movwf Dly1 ;
movlw 0x0F ;
movwf Dly0 ;
DlyLoop
decfsz Dly0,F ;
goto DlyLoop ;
decfsz Dly1,F ;
goto DlyLoop ;
; Done Delay ;
DoAgain
goto Send_DT ; Repetir envio de siguiente dato,
end