Beruflich Dokumente
Kultur Dokumente
#include
P=16F876
"p16F876.INC"
__CONFIG
_CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _
BODEN_OFF &_LVP_OFF &_CPD_OFF ;&_WRT_ENABLE_OFF
ERRORLEVEL
-302
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
; CONSTANTES:
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
#define
#define
#define
#define
#define
CLOCK
STROBE
SCL
SDA
OK
D'0'
D'2'
D'3'
D'4'
D'0'
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
;Memoria EEPROM
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
; MACROS
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
BANK0
MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1
MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK2
MACRO
BSF STATUS,RP1
BCF STATUS,RP0
ENDM
BANK3
MACRO
BSF STATUS,RP1
BSF STATUS,RP0
ENDM
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
DIRL
DIRH
DATO
flag
cuenta
CONTA0
CONTA1
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0X20
0X21
0X22
0X24
0X25
0X26
0X27
DATASSP
EQU
0x70
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
INICIO
ORG
GOTO
0X0000
INICIO
ORG
return
0X0004
ORG
0X0020
BANK0
BSF STATUS,RP0
MOVLW
0x06
DOS DIGITALES.
MOVWF
CLRW
MOVWF
ADCON1
TRISA
BANK0
CLRF
BSF
MOVLW
MOVWF
PORTA
STATUS,RP0
0X00
TRISB
BANK0
CLRF
BSF
MOVLW
MOVWF
PORTB
STATUS,RP0
B'00011000'
TRISC
BANK0
MOVLW
MOVWF
BSF
B'00010000'
PORTC
STATUS,RP0
BANK0
;CLRF
BSF
PORTD
STATUS,RP0
BANK0
call
i2c_init
;configurar y encender I
2C
MOVLW
MOVWF
en donde escribiremos
movlw
movwf
LC08B
call
btfss
goto
call
D'0'
DIRH
;
;cargamos dato para la direccion
'b'
DATASSP
WriteI2CByte
flag,0
errorcom
DEMORA ;dar 10ms a que termine la escritura
clrf
DIRH
clrf
DIRL
call
btfss
goto
ReadI2CByte
flag,0
errorcom
s cuales leer
las cuales leer
movlw
.1
;escritura y lectura OK. encende
r RA0, mostrar dato leido en PuertoB y loop eterno
movwf
PORTA
movf
DATO,w
movwf
PORTB
nop
goto
$-1
errorcom
movlw
.3
ctura, encender RA0 y RA1 y loop eterno
movwf
PORTA
nop
goto
$-1
;error de escritura o le
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
DEMORA movlw
RET1
RET2
.55
movwf
movlw
movwf
nop
nop
decfsz
goto
decfsz
goto
return
CONTA0
.181
CONTA1
CONTA1,1
RET2
CONTA0,1
RET1
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
i2c_init
movlw
banksel
iorwf
movlw
movwf
clrf
movlw
bcf
movwf
CLRF
call
return
b'00011000'
TRISC
;banco 1
TRISC,F
b'00001011'
;.11 para 400khz @ 20 mhz
SSPADD
;400 khz @ 20 mhz
SSPSTAT
b'00101000'
STATUS,RP0
;banco 0
SSPCON
PIR1
i2c_idle
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
i2c_idle
bsf
STATUS,RP0
;banco 1
btfsc
goto
SSPSTAT,R_W
$-1
movf
andlw
btfss
goto
SSPCON2,w
0x1F
STATUS,Z
$-3
bcf
return
STATUS,RP0
;banco 0
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
i2c_start
bsf
bsf
btfsc
goto
call
i2c_idle
STATUS,RP0
;banco 1
SSPCON2,SEN
SSPCON2,SEN
$-1
bcf
btfss
goto
STATUS,RP0
PIR1,SSPIF
$-1
;banco 0
bcf
PIR1,SSPIF
return
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
i2c_restart
bsf
bsf
btfsc
goto
STATUS,RP0
SSPCON2,RSEN
SSPCON2,RSEN
$-1
;banco 1
bcf
return
STATUS,RP0
;banco 0
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
i2c_read
bsf
bsf
btfsc
goto
call
i2c_idle
STATUS,RP0
;banco 1
SSPCON2,RCEN
;activar modo lectura
SSPCON2,RCEN
;termino la recepcion?
$-1
;no, esperar
btfss
SSPSTAT,BF
goto
$-1
;no, esperar
bcf
movf
movwf
return
STATUS,RP0
SSPBUF,W
DATO
;banco 0
ser leidos?
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
i2c_write
error"
okack
bcf
flag,0
call
movf
movwf
bsf
btfsc
goto
i2c_idle
DATO,w
SSPBUF
STATUS,RP0
SSPSTAT,R_W
$-1
btfss
goto
bsf
bcf
return
SSPCON2,PEN
STATUS,RP0
bcf
btfss
STATUS,RP0
PIR1,SSPIF
;banco 0
;esperar finalizacion del noveno
goto
$-1
bcf
bsf
return
PIR1,SSPIF
flag,0
;mover DATO a W
;cargar dato en buffer I2C
;banco 1
;esperar a que termine el envio
clock
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
i2c_sendack
bsf
bcf
bsf
bcf
return
STATUS,RP0
SSPCON2,ACKDT
SSPCON2,ACKEN
STATUS,RP0
;banco 1
;banco 0
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
i2c_sendnack
bsf
bsf
bsf
bcf
return
STATUS,RP0
;banco 1
SSPCON2,ACKDT
SSPCON2,ACKEN
STATUS,RP0
;banco 0
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
i2c_stop
bsf
bcf
return
bsf
STATUS,RP0
;banco 1
SSPCON2,PEN
;enviar STOP
STATUS,RP0
;banco 0
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
;esta parte es donde se carga un dato como identificador para la epromss
WriteI2CByte
call
i2c_start
;enviar START, esperar a
que se libere el BUS
movlw
b'10100000'
;"1010"= identificador EEPROM. "
i2c_stop
;flag = 1 OK!
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
ReadI2CByte
ibere el BUS
call
movlw
numero EEPROM 0=write
movwf
r(DATO)
call
btfss
return
i2c_start
b'10100000'
DATO
i2c_write
flag,OK
;volver. error de escritura
movf
andlw
DIRH,W
b'01111111'
movwf
call
btfss
return
DATO
i2c_write
flag,OK
movf
movwf
call
btfss
return
DIRL,W
DATO
i2c_write
flag,OK
call
i2c_restart
;enviar RESSTART
b'10100001'
movlw
numero EEPROM 1=read
movwf
DATO
ar(DATO)
call
btfss
return
i2c_write
flag,OK
call
call
call
return
i2c_read
i2c_sendnack
i2c_stop
;flag = 1 OK!
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
CurrentI2CRead call
que se libere el BUS
i2c_start
movlw
numero EEPROM 1= read
movwf
r(DATO)
call
btfss
return
b'10100001'
DATO
i2c_write
flag,OK
;volver. error de escritura
call
i2c_read
call
i2c_sendnack
call
i2c_stop
return
;flag = 1 OK!
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
END