Sie sind auf Seite 1von 7

LIST

#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

;temporar. byte a enviar/dato leido

DATASSP

EQU

0x70

;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////

INICIO

ORG
GOTO

0X0000
INICIO

ORG
return

0X0004

ORG

0X0020

BANK0
BSF STATUS,RP0
MOVLW
0x06

;PINS DEL PUERTO A Y PUERTO E TO

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

;cargar dato a escribir en la 24

WriteI2CByte
flag,0
errorcom
DEMORA ;dar 10ms a que termine la escritura

clrf

DIRH

;cargar paginas de 24LC08B de la

clrf

DIRL

;cargar direccion de 24LC08B de

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

;dato disponible en SSPBUF para

goto

$-1

;no, esperar

bcf
movf
movwf
return

STATUS,RP0
SSPBUF,W
DATO

;banco 0

ser leidos?

;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////

i2c_write
error"

okack

bcf

flag,0

;inicializar flag como "

call
movf
movwf
bsf
btfsc
goto

i2c_idle
DATO,w
SSPBUF
STATUS,RP0
SSPSTAT,R_W
$-1

btfss
goto

SSPCON2,ACKSTAT ;checkear ack


okack

bsf
bcf
return

SSPCON2,PEN
STATUS,RP0

;error ack. enviar STOP


;banco 0
;volver con flag= 0 error

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

;volver con flag = 1 OK!

;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
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. "

000" = numero EEPROM "0"= Write


movwf
DATO
call
i2c_write
btfss
flag,OK
return
;esta parte es donde se carga un dato para la direccion en donde se quiere escri
bir en la eproms
movf
DIRH,W
movwf
DATO
;cargar byte en variable a envia
r(DATO)
call
i2c_write
btfss
flag,OK
return
;volver. error de escritura
;esta parte es donde se carga un dato x para escribir
movf
DATASSP,W
movwf
DATO
;cargar en DATO
call
i2c_write
btfss
flag,OK
return
;volver. error de escritura
call
return

i2c_stop
;flag = 1 OK!

;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
ReadI2CByte
ibere el BUS

call

movlw
numero EEPROM 0=write
movwf
r(DATO)
call
btfss
return

i2c_start

;enviar START, esperar a que se l

b'10100000'

;1010=identificador EEPROM 000=

DATO

;cargar byte en variable a envia

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'

;1010=identificador EEPROM 000=

;solo 7 bits admitidos p

ara esta EEPROM

movlw
numero EEPROM 1=read
movwf

;volver. error de escritura

DATO

;cargar byte en variable a envi

ar(DATO)
call
btfss
return

i2c_write
flag,OK

call
call
call
return

i2c_read
i2c_sendnack
i2c_stop

;volver. error de escritura

;flag = 1 OK!

;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
CurrentI2CRead call
que se libere el BUS

i2c_start

;enviar START, esperar a

movlw
numero EEPROM 1= read
movwf
r(DATO)
call
btfss
return

b'10100001'

;1010=identificador EEPROM 000=

DATO

;cargar byte en variable a envia

i2c_write
flag,OK
;volver. error de escritura

call
i2c_read
call
i2c_sendnack
call
i2c_stop
return
;flag = 1 OK!
;///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////
END

Das könnte Ihnen auch gefallen