Autor Tema: diferencias 16f84 y f628 en eeprom i2c  (Leído 2300 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado manongo123

  • PIC10
  • *
  • Mensajes: 5
diferencias 16f84 y f628 en eeprom i2c
« en: 19 de Agosto de 2007, 01:10:47 »
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
« Última modificación: 20 de Agosto de 2007, 02:42:40 por manongo123 »

Desconectado vszener

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2395
Re: diferencias 16f84 y f628 en eeprom i2c
« Respuesta #1 en: 19 de Agosto de 2007, 15:30:57 »
¿Quién dice que el PIC16F628A no es confiable? Yo creo que es un fantástico pic, y su hermano mayor e, PIC16F648A ni te cuento jeje  :mrgreen:

Seguramente el problema lo tendrás al configurar los pines del manejo de la eeprom serial externa, en el PIC16F84A la única solución para los pines es de I/O digitales, por lo que es directo su manejo, en el que estás usando tú, hay varios pines que son analógicos, que en el arranque del pic, pues estarán configuradas como entradas analógicas, en vez de salidas digitales como es el caso que quieres usar tú.

Mirate el data sheet, los pines que usas.

PD: Si vale más barato es porque el PIC16F84A fue un 'boom' de Microchip, se usaba bastante y le subieron el precio.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado manongo123

  • PIC10
  • *
  • Mensajes: 5
Re: diferencias 16f84 y f628 en eeprom i2c
« Respuesta #2 en: 20 de Agosto de 2007, 02:50:31 »
Gracias por responder vszener, tenias razon y es q hace ya bastante tiempo que no programo pics por causa del trabajo, y ahora veo que se me olvidan las cosas, ya no es como antes que iba rapido. Tambien voy a hecharle un vistazo a todos los datashetts para no tener estos problemas. Sobre el codigo solo tuve que hacerle estos cambios:



   ORG 000H
   goto   main


          
 Banksel TRISA


main:     Clrf    PORTA        ; limpia el puerto A,  salidas
       Movlw   0x07         ; Comparadores desactivados,
       Movwf   CMCON        ; i/o digitales.

   bsf   03h,5
   Movlw   b'00000000' 
       Movwf    PORTB
       Movwf    PORTA
   bcf   03h,5
   

   goto   INICIO

Desconectado vszener

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2395
Re: diferencias 16f84 y f628 en eeprom i2c
« Respuesta #3 en: 20 de Agosto de 2007, 05:59:26 »
Me alegro que hayas resuelto tu problema, no hace falta que te mires todos los data sheet, que son un montón, sólo mirate del pic que vayas a usar.


Suerte!!! :)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: diferencias 16f84 y f628 en eeprom i2c
« Respuesta #4 en: 20 de Agosto de 2007, 09:50:01 »
yo soy hincha del 16f628a  :mrgreen: no se metan con el micro!  :D
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com


 

anything