1
« en: Lunes 16 de Mayo de 2005, 05:44 »
Hola, bueno, aqui dejo el codigo, como esta funciona en un 16F877 u otro que tenga puerto C, por lo tanto hay que modificar esto, tambien debe usarse la instruccion tris para los 16CX (los de 12 bits) en lugar de cargar el registro tris, por lo tanto si se pretende usar un PIC16C55 por ejemplo ( pues este posee port C), se debe reemplazar esto
bsf STATUS,RP0
movlw b'11100111'
movwf TRISC
bcf STATUS,RP0
por
movlw b'11100111'
tris portc
Y ademas las direcciones de los registros de RAM, que pueden lelgar a ser posiciones usadas en otros procesos, o bueno si les sobra memoria las dejas solo para esto, pero no olviden este precioso detalle.
Como podran observar mas abajo, cada vez que se realiza una operacion se programa el sentido de los pines, se puede llegar a optimizar, y eliminar algunas
operaciones pero para entender la rutina se las dejo asi, y por supuesto no olviden que el valor binario que cargan al registro debe contener las direcciones fijas de los otro pines, y por ultimo las lineas SDA y SCL deben tener una resistencia de PULL-UP de 100K al +VCC, en algunos circuitos omiten la de SDA, pero les aconsejo porner las dos si no le puede llegar a doler la cabeza.
Es posible, en los micros que lo disponen, activar en el portB los week pullup, con esto se pueden omitir las resistencias internas.
Al final hay dos rutinas una que lee y otra que escribe un byte determinado de la memoria.
No todas las 24XX son iguales, de la 24C16 en adelante la direccion es de 16 bits, y si se va usar la 24LC16 mucha atencion que su direccionamiento no es igual, de cualquier modo les recomiendo leer la hoja de datos de la memoria que vayan a utilizar, basicamente estas rutinas pueden ser usadas para cualquiera.
saludos y espero que les sirva.
PIKMAN / ARIEL
;====================================================================
; Definicion de registros auxiliares en RAM para manejo de la memoria
; Rutina generica para microcontroladores sin MSSP, totalmente
; FIRMWARE es aplicable en cualquier microcontrolador, de la linea 16c6xx
; para los 16c5x hay que modificar los registros TRIS si no no anda
;====================================================================
ADDR equ 0x30 ; direccion a escribir
DATAO equ 0x31 ; dato a escribir
SLAVE equ 0x32 ; direccion de esclavo
TXBUF equ 0x33 ; buffer de tx
COUNT equ 0x34
EEPROM equ 0x35
RXBUF equ 0x36 ; buffer de rx
LOOPS equ 0x37
LOOPS2 equ 0x38
BCOUNT equ 0x39
; Definicion de Bits Para para manejo de la memoria
DI equ 7 ; bits internos
DO equ 6
SDATA equ 4 ; pines SDA ( datos) y SCL ( clock ) I2C
SCLK equ 3 ; en este caso programa los pines 3 y 4
; modificar segun circuito.
;==============RUTINA PARA GENERAR BIT DE START===================
BSTART
bsf STATUS,RP0
movlw b'11100111'
movwf TRISC
bcf STATUS,RP0
bcf PORTC,SCLK
bsf PORTC,SDATA
nop
bsf PORTC,SCLK
nop
nop
nop
nop
nop
bcf PORTC,SDATA
nop
nop
nop
nop
nop
bcf PORTC,SCLK
nop
nop
return
;==============RUTINA PARA GENERAR BIT DE STOP===================
BSTOP
bsf STATUS,RP0
movlw b'11100111'
movwf TRISC
bcf STATUS,RP0
bcf PORTC,SCLK
bcf PORTC,SDATA
nop
nop
nop
bsf PORTC,SCLK
nop
nop
nop
bsf PORTC,SDATA
nop
nop
bcf PORTC,SCLK
nop
nop
nop
return
;==============RUTINA PARA ENVIAR BIT HACIA LA MEMORIA============
BITOUT
bsf STATUS,RP0
movlw b'11100111'
movwf TRISC
bcf STATUS,RP0
bcf PORTC,SCLK
bsf PORTC,SDATA
btfss EEPROM,DO
bcf PORTC,SDATA
nop
nop
bsf PORTC,SCLK
nop
nop
nop
nop
bcf PORTC,SCLK
return
;==============RUTINA PARA RECIBIR BIT DESDE LA MEMORIA===========
BITIN
bsf EEPROM,DI
bsf STATUS,RP0
movlw b'11110111'
movwf TRISC
bcf STATUS,RP0
bcf PORTC,SCLK
bsf PORTC,SCLK
nop
nop
nop
nop
nop
nop
nop
nop
btfss PORTC,SDATA
bcf EEPROM,DI
bcf PORTC,SCLK
return
;==============RUTINA TRANSMITIR UN BYTE ===================
TX
movlw .8
movwf COUNT
TXLP bcf EEPROM,DO
btfsc TXBUF,7
bsf EEPROM,DO
call BITOUT
rlf TXBUF,1
decfsz COUNT
goto TXLP
call BITIN
return
;==============RUTINA PARA RECIBIR UN BYTE========================
RX
clrf RXBUF
movlw .8
movwf COUNT
bcf STATUS,C
RXLP rlf RXBUF,F
call BITIN
btfsc EEPROM,DI
bsf RXBUF,0
decfsz COUNT
goto RXLP
bsf EEPROM,DO
call BITOUT
return
;==============RUTINA PARA LEER UN BYTE DE LA MEMORIA=============
LEER
call BSTART ; Se genera Bit de START
nop
nop
bcf SLAVE,0 ; Selecciona el modo de escritura
movfw SLAVE ; del dispositivo esclavo
movwf TXBUF ; Tranb
call TX ;
movfw ADDR
movwf TXBUF
call TX
nop
nop
call BSTART
nop
nop
bsf SLAVE,0
movfw SLAVE
movwf TXBUF
call TX
nop
call RX
bsf EEPROM,DO
call BITOUT
call BSTOP
return
;==============RUTINA PARA ESCRIBIR UN BYTE DE LA MEMORIA=============
ESCRIB
call BSTART ; Se genera bit de START
nop
nop
bcf SLAVE,0 ; Selecciona modo escribir en
movfw SLAVE ; la direccion del esclavo y se pone en W
movwf TXBUF ; Se transfiere W al buffer de TX
call TX ; Se transmite el byte a la memoria
movfw ADDR ; Se carga en W la direccion a escribir
movwf TXBUF ; Se transfiere W al buffer de TX
call TX ; Se transmite el byte a la memoria
nop
nop
movfw DATAO ; Se transfiere a W el dato a escribir
movwf TXBUF ; Se transfiere W al buffer de TX
call TX ; Se transmite el byte a la memoria
call BSTOP ; Se Genera bit de STOP
movlw .20 ; Carga 20 milisegundos
movwf LOOPS ; Para esperar que termine
call WAIT ; la escritura en la memoria
return ; Y retorna
goto WAIT
WAIT1 movlw .150
goto WAIT
WAIT ; Retardo de W milisegundos
movwf TEMP3
TOP2 movlw .110
movwf TEMP4
TOP nop ; sit and wait
nop
nop
nop
nop
nop
decfsz TEMP4,F ; inner loop done?
goto TOP ; no, go again
decfsz TEMP3,F ; outer loop done?
goto TOP2 ; no, go again
return
;=================================================================