hola amigos, hace poco hice un programa de escribir y leer en una eeprom serial que lo habia hecho hace mucho tiempo y lo cargaba al pic 16f84 y funcionaba bien .pero al parecer no funciona con el pic 16f628 y no entiendo porque si con el f84 trabaja normal, existen muchas diferencias entre estos dos pic? porque dicen que el f628 no es muy confiable ademas de que cuesta menos precio que el f84. aqui les dejo el codigo que modifique un poco para el f628 lo estoy haciendo funcionar con un cristal de 4mhz a ambos.
el pic escribe 12 secuencias de la tabla a la memoria empezando de la direccion cero y luego los lee y los bota por el puerto b y un pequeño retardo y los vuelve a leer.... un buen ejemplo para aprender con el f84 si quitaramos: Movlw 0x07 Movwf CMCON
LIST p=16f628
#include <E:\ARCHIVOS MANU\MPLAB\P16F628.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _LVP_OFF & _INTRC_OSC_NOCLKOUT
ERRORLEVEL -302, -306
SDA EQU 03
SCL EQU 02
CONTADOR EQU 21H
CICLO EQU 22H
AUXA EQU 23h
AUXB EQU 24h
DAT_VAL EQU 25H
NUM_VAL EQU 26H
ADR_HI EQU 27H
ADR_LO EQU 28H
DEV_ADR EQU 29H ; A2, A1, A0
_N EQU 2AH
O_BYTE EQU 2BH
I_BYTE EQU 2CH
LOOP1 EQU 2DH ; timing
LOOP2 EQU 2FH ; timing
#define bank1 bsf STATUS,5 ;Macro para abreviar el BANCO 1
#define bank0 bcf STATUS,5 ;Macro para abreviar el BANCO 0
ORG 000H
goto main
main: bank1
Movlw 0x07 ; Comparadores desactivados,
Movwf CMCON ; i/o digitales.
Movlw b'00000000'
Movwf PORTB
Movwf PORTA
Clrf PORTA ; limpia el puerto A, salidas
bank0
goto INICIO
TABLA ADDWF 02H,F
retlw b'11111110'
retlw b'11111101'
retlw b'11111011'
retlw b'11110111'
retlw b'11101111'
retlw b'11011111'
retlw b'10111111'
retlw b'11011111'
retlw b'11101111'
retlw b'11110111'
retlw b'11111011'
retlw b'11111101'
retlw b'11111110'
retlw b'11111101'
retlw b'11111011'
retlw b'11110111'
retlw b'11101111'
;........................................................................................
INICIO
MOVLW .12
MOVWF CICLO
CLRF CONTADOR
MOVLW 00H
MOVWF DEV_ADR ; A2 A1 A0
MOVLW 00H
MOVWF ADR_HI
MOVWF ADR_LO
MOVF CONTADOR,W
CALL TABLA
MOVWF DAT_VAL
CALL RANDOM_WRITE
MOVLW .25
CALL DELAY_N_MS
ESCR
DECFSZ CICLO,F
GOTO SIGUE
CALL NACK
CALL STOP
GOTO LEER
SIGUE
INCF ADR_LO,F
INCF CONTADOR,F
MOVF CONTADOR,W
CALL TABLA
MOVWF DAT_VAL
CALL ACK
CALL SEQ_WRITE
MOVLW .25
CALL DELAY_N_MS
GOTO ESCR
;..........................................................................................
LEER
CLRF CICLO
MOVLW .12
MOVWF CICLO
MOVLW 00H
MOVWF DEV_ADR ; A2 A1 A0
MOVLW 00H
MOVWF ADR_HI
MOVWF ADR_LO
CALL RANDOM_READ
CALL DISPLAY
CALL RETARDO
LEE
DECFSZ CICLO,F
GOTO AUNO
CALL NACK
CALL STOP
GOTO LEER
AUNO
INCF ADR_LO,F
CALL ACK
CALL SEQ_READ
CALL DISPLAY
CALL RETARDO
GOTO LEE
RANDOM_WRITE:
CALL START
BCF STATUS, C
RLF DEV_ADR, W
IORLW 0A0H
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
MOVF ADR_HI, W
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
MOVF ADR_LO, W
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
SEQ_WRITE
MOVF DAT_VAL, W
MOVWF O_BYTE
CALL OUT_BYTE
RETURN
RANDOM_READ:
CALL START
BCF STATUS, C
RLF DEV_ADR, W
IORLW 0A0H
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
MOVF ADR_HI, W
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
MOVF ADR_LO, W
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
CALL START
BCF STATUS, C
RLF DEV_ADR, W
IORLW 0A1H
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
SEQ_READ
CALL IN_BYTE
MOVF I_BYTE, W
RETURN
DISPLAY:
MOVWF PORTB
RETURN
IN_BYTE
CLRF I_BYTE
MOVLW .8
MOVWF _N
CALL HIGH_SDA
IN_BIT
CALL HIGH_SCL
BTFSS PORTA, SDA
GOTO IN_ZERO
GOTO IN_ONE
IN_ZERO
BCF STATUS, C
RLF I_BYTE, F
GOTO CONT_IN
IN_ONE
BCF STATUS, C
RLF I_BYTE, F
INCF I_BYTE, F
GOTO CONT_IN
CONT_IN
CALL LOW_SCL
DECFSZ _N, F
GOTO IN_BIT
RETURN
;;;;;;
OUT_BYTE:
MOVLW .8
MOVWF _N
OUT_BIT:
BCF STATUS,C
RLF O_BYTE, F
BTFSS STATUS, C
GOTO OUT_ZERO
GOTO OUT_ONE
OUT_ZERO:
CALL LOW_SDA
CALL CLOCK_PULSE
CALL HIGH_SDA
GOTO OUT_CONT
OUT_ONE:
CALL HIGH_SDA
CALL CLOCK_PULSE
GOTO OUT_CONT
OUT_CONT:
DECFSZ _N, F
GOTO OUT_BIT
RETURN
;;;;;;
NACK:
CALL HIGH_SDA
CALL CLOCK_PULSE
RETURN
ACK:
CALL LOW_SDA
CALL CLOCK_PULSE
RETURN
START:
CALL LOW_SCL
CALL HIGH_SDA
CALL HIGH_SCL
CALL LOW_SDA
CALL LOW_SCL
RETURN
STOP:
CALL LOW_SCL
CALL LOW_SDA
CALL HIGH_SCL
CALL HIGH_SDA
CALL LOW_SCL
RETURN
CLOCK_PULSE:
CALL HIGH_SCL
CALL LOW_SCL
RETURN
HIGH_SDA:
BSF STATUS, RP0
BSF TRISA, SDA
BCF STATUS, RP0
CALL DELAY_SHORT
RETURN
LOW_SDA:
BCF PORTA, SDA
BSF STATUS, RP0
BCF TRISA, SDA
BCF STATUS, RP0
CALL DELAY_SHORT
RETURN
HIGH_SCL:
BSF STATUS, RP0
BSF TRISA, SCL
BCF STATUS, RP0
CALL DELAY_SHORT
RETURN
LOW_SCL:
BCF PORTA, SCL
BSF STATUS, RP0
BCF TRISA, SCL
BCF STATUS, RP0
CALL DELAY_SHORT
RETURN
DELAY_SHORT:
MOVLW .5
MOVWF LOOP2
DELAY_SHORT_1:
NOP
DECFSZ LOOP2, F
GOTO DELAY_SHORT_1
RETURN
DELAY_LONG:
MOVLW .250
DELAY_N_MS:
MOVWF LOOP1
OUTTER:
MOVLW .110
MOVWF LOOP2
INNER:
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ LOOP2, F
GOTO INNER
DECFSZ LOOP1, F
GOTO OUTTER
RETURN
RETARDO movlw .255
movwf AUXA
CA movlw 0xff
movwf AUXB
CB nop
decfsz AUXB,F
goto CB
decfsz AUXA,F
goto CA
return
END