; --------------------------------------------------------------------------------------------- ; COMUNICACAO SIMPLES ENTRE DOIS PIC18F4620 USANDO A INTERFACE SPI ; ; PROGRAMA PARA O DISPOSITIVO MASTER ; ; Este programa envia bytes ao dispositivo SLAVE que mostrara os dados nos LEDs do PORTB. ; ; O hardware para o circuito teste pode ser visto no arquivo "schematic.png" no diretorio ; deste projeto. ; ; --------------------------------------------------------------------------------------------- LIST P=18F4620 #include ; --------------------------------------------------------------------------------------------- ; CONFIGURATION BITS ou FUSES ; --------------------------------------------------------------------------------------------- CONFIG WDT = OFF CONFIG MCLRE = ON CONFIG debug = OFF CONFIG LVP = OFF CONFIG OSC = HS ; oscilador a cristal externo 20MHZ ; --------------------------------------------------------------------------------------------- ; REGISTRADORES E SIMBOLOS NA MEMORIA DE DADOS ; --------------------------------------------------------------------------------------------- UDATA 0x80 ; RAM do sistema delay_temp RES 1 ; registrador da subrotina de delay contador RES 1 ; contador R1 RES 1 ; registrador auxiliar ; #define SPI_TRIS TRISC ; I/O do PORTC #define SPI_PORT PORTC ; PORTC contem os bits SCK, SDI e SDO #define SPI_SCK 3 ; bit SCK -- CLock no Master sera saida #define SPI_SDI 4 ; bit SDI -- Entrada serial #define SPI_SDO 5 ; bit SDO -- Saida serial ; --------------------------------------------------------------------------------------------- ; Vetores de interrupcao ; --------------------------------------------------------------------------------------------- rstvec CODE 0x0000 goto inicio inth CODE 0x0008 retfie ; --------------------------------------------------------------------------------------------- ; Inicio ; --------------------------------------------------------------------------------------------- MAIN CODE inicio movlw 0x00 ; W=0 movwf SPI_PORT ; SPI_PORT=0 movlw b'11010111' ; mascara de I/O SCK=saida, SDI=entrada e SDO=saida movwf SPI_TRIS ; configura I/O bsf SPI_PORT,SPI_SCK ; mantem o clock em Idle state (high) clrf SSPSTAT ; amostragem no meio do tempo (SMP) e Idle--->Act (CKE) movlw 0x31 ; habilita SSPI, IDLE state high e Fosc/16 movwf SSPCON1 ; configura SPI como master clrf contador ; zera o contador sendcnt movf contador,w ; byte a enviar movwf SSPBUF ; envia o contador loop1 btfss PIR1,SSPIF ; o SLAVE respondeu? goto loop1 ; NAO... espera responder loop2 btfss SSPSTAT,BF ; o buffer esta completo? goto loop2 ; NAO... espera completar movf SSPBUF,w ; le a resposta do SLAVE zerando o bit SSPSTAT bcf PIR1,SSPIF ; limpa o flag incfsz contador,f ; decrementa o contador movlw .250 ; milisegundos call tempo ; tempo... goto sendcnt ; vai enviar ; --------------------------------------------------------------------------------------------- ; Subrotina de retardo ; --------------------------------------------------------------------------------------------- tempo movlw .250 movwf delay_temp t1 call wastetme decfsz delay_temp,f goto t1 return ; wastetme movlw .50 ; 200ns movwf R1 ; 200ns waste01 goto $+2 ; 400ns goto $+2 ; 400ns goto $+2 ; 400ns goto $+2 ; 400ns goto $+2 ; 400ns goto $+2 ; 400ns goto $+2 ; 400ns decfsz R1,f ; 200ns goto waste01 ; 400ns return ; 400ns END