desktop

Problema usando la EEPROM del PIC12F675

Bueno, vengo a pedirles ayuda con un programa que me viene rompiendo la cabeza hace algunos días y no lo puedo solucionar..

El programa este espera a que se ponga en 1 GP0 (un interruptor) y una vez que se pone en 1 empieza a hacer siempre lo mismo:
1) Lee el puerto analógico GP1
2) Escribe el dato del puerto analógico (solo 8bits) y lo escribe en la EEPROM (empezando de la posición 0).
3) espera 30 segundos
4) el ciclo se repite

Cuestión que cuando lo compilo no me arroja ningún problema, pero al pasarlo al pic prendo la fuente y no sucede nada, ningún indicio de vida...

Gracias al que me pueda ayudar, mi idea es hacer un data logger.

El código es este:

Código:
;-------------------------------------------------------------
; Define el PIC
;-------------------------------------------------------------
                list         p=12f675
                #include     P12F675.INC
                org            0
                __CONFIG    _MCLRE_ON & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON
;-------------------------------------------------------------
; Calibración del RC interno
;-------------------------------------------------------------
                bsf         STATUS,RP0                        ;Bank 1
                call         3FFh                              ;Get the cal value
                movwf         OSCCAL                           ;Calibrate
                bcf            STATUS,RP0
;-------------------------------------------------------------
; Declaracion de variables
;-------------------------------------------------------------
conversion        equ            d'00041'
direccion        equ            d'00042'
CounterA        equ            d'00043'
CounterB        equ            d'00044'
CounterC        equ            d'00045'
;-------------------------------------------------------------
; Configuración entradas y salidas (GP1 entrada analogica)
;-------------------------------------------------------------
                bcf            STATUS,RP0      ;se pasa al banco 0
                movlw        b'00000101'     ;[configura 1)"justificado a la izquierda" (todos los bit comprimidos hacia la izquierda del restultado), 2)Vref en Vdd ]
                movwf        ADCON0          ;[3)entrada analogica en GP1. 4)no empieza la conversion y esta operable (ultimos 2 bits)                        ]
                clrf         GPIO             ;limpia las salidas
                movlw         b'00000111'        ;[desactiva el comparador de tension y quedan libres GP1,GP2 y GP0]
                movwf         CMCON             ;
                bsf         STATUS,RP0         ;se pasa al banco 1
                movlw        b'00010010'        ;configura 1)toma el divisor de tiempo fosc/8. 2)configura GP1 como entrada analogica y las otras como digitales I/O
                movwf         ANSEL             ;
                movlw         b'001011'       ;Configura GP1 y GP0 como entradas
                movwf         TRISIO
                bcf            STATUS,RP0        ;se pasa al banco 0                
;-------------------------------------------------------------
; Programa principal
;-------------------------------------------------------------

                movlw        d'0'
                movwf        GPIO            ;apaga todos los leds
                movwf        EEADR            
                movwf        direccion        ;comienza a grabar datos desde la posición d'0' de la EEPROM
                bcf         INTCON,GIE         ;Disable INTs

inicio            btfss        GPIO,0            ;pregunta para empezar conversion cada 30 segundos
                goto        inicio
convertir        bsf            ADCON0,1        ;comienza la conversion A/D                
convierte        btfsc        ADCON0,1        ;espera a que convierta el dato
                goto        convierte
                movf        ADRESH,w        ;pasa el resultado de la conversion a w
                movwf        conversion        ;y luego a la variable conversion
                bsf            STATUS,RP0        ;pasa al banco 1 (donde se maneja la EEPROM)
                movf        conversion,w
                movwf        EEDAT            ;y lo deja listo para grabar                                    CONFIGURACION DE DATOS A GRABAR EN EEPROM
                movf        direccion,w        ;tambien carga la direccion donde se va a grabar el dato
                movwf        EEADR
                incf        direccion,1        ;deja seteado donde se va a grabar el proximo dato                
                bsf         STATUS,RP0         ;Bank 1                                                            HABILITA GRABACION A EEPROM
                bsf         EECON1,WREN     ;Enable write
                movlw        0x55             ;Inicio de las intrucciones para EECON2
                movwf        EECON2
                movlw        0xAA         
                movwf        EECON2        ;Fin de las intrucciones para EECON2
                bsf         EECON1,WR         ;Start the write                                                INICIA LA GRABACION
esperargrabe    btfsc        EECON1,WR
                goto        esperargrabe
                bcf            EECON1,WREN        ;deshabilita la escritura para prevenir errores
                bsf            GPIO,5            ;avisa que se grabo un dato
                call        demora0.1
                bcf            GPIO,5
                call        demora30
                goto        convertir

;-------------------------------------------------------------
; SUBRUTINA DE RETARDO DE 30 SEGUNDOS
;-------------------------------------------------------------
demora30        movlw        D'153'
                movwf        CounterC
                movlw        D'49'
                movwf        CounterB
                movlw        D'161'
                movwf        CounterA
loop1            decfsz        CounterA,1
                goto        loop1
                decfsz        CounterB,1
                goto        loop1
                decfsz        CounterC,1
                goto        loop1
                retlw        0    

;-------------------------------------------------------------
; SUBRUTINA DE RETARDO DE 0.1 SEGUNDOS
;-------------------------------------------------------------
demora0.1        movlw        D'130'
                movwf        CounterB
                movlw        D'221'
                movwf        CounterA
loop2            decfsz        CounterA,1
                goto        loop2
                decfsz        CounterB,1
                goto        loop2
                retlw        0    
                END

En 2) quise decir "Lee el dato del puerto analógico (solo 8bits) y lo escribe en la EEPROM (empezando de la posición 0)."
 
Última edición por un moderador:
Problema solucionado.

No se bien lo que hice pero acá les pongo el programa funcionando por si le sirve a alguien:

Código:
;-------------------------------------------------------------
; Define el PIC
;-------------------------------------------------------------
                list         p=12f675
                #include     P12F675.INC
                org            0
                __CONFIG    _MCLRE_ON & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON
;-------------------------------------------------------------
; Calibración del RC interno
;-------------------------------------------------------------
                bsf         STATUS,RP0                        ;Bank 1
                call         3FFh                              ;Get the cal value
                movwf         OSCCAL                           ;Calibrate
                bcf            STATUS,RP0
;-------------------------------------------------------------
; Declaracion de variables
;-------------------------------------------------------------
conversion        equ            d'00041'
direccion        equ            d'00042'
CounterA        equ            d'00043'
CounterB        equ            d'00044'
CounterC        equ            d'00045'
;-------------------------------------------------------------
; Configuración entradas y salidas (GP1 entrada analogica)
;-------------------------------------------------------------
                bcf            STATUS,RP0      ;se pasa al banco 0
                movlw        b'00000101'     ;[configura 1)"justificado a la izquierda" (todos los bit comprimidos hacia la izquierda del restultado), 2)Vref en Vdd ]
                movwf        ADCON0          ;[3)entrada analogica en GP1. 4)no empieza la conversion y esta operable (ultimos 2 bits)                        ]
                clrf         GPIO             ;limpia las salidas
                movlw         b'00000111'        ;[desactiva el comparador de tension y quedan libres GP1,GP2 y GP0]
                movwf         CMCON             ;
                bsf         STATUS,RP0         ;se pasa al banco 1
                movlw        b'00010010'        ;configura 1)toma el divisor de tiempo fosc/8. 2)configura GP1 como entrada analogica y las otras como digitales I/O
                movwf         ANSEL             ;
                movlw         b'001011'       ;Configura GP1 y GP0 como entradas
                movwf         TRISIO
                bcf            STATUS,RP0        ;se pasa al banco 0                
;-------------------------------------------------------------
; Programa principal
;-------------------------------------------------------------

                movlw        d'0'
                movwf        GPIO            ;apaga todos los leds            
                movwf        direccion        ;comienza a grabar datos desde la posición d'0' de la EEPROM
                bcf         INTCON,GIE         ;Disable INTs

inicio            btfss        GPIO,0            ;pregunta para empezar conversion cada 30 segundos
                goto        inicio
convertir        call        CONVERSORAD
                bsf            STATUS,RP0        ;pasa al banco 1 (donde se maneja la EEPROM)
                movf        conversion,w
                movwf        EEDATA            ;y lo deja listo para grabar                                    CONFIGURACION DE DATOS A GRABAR EN EEPROM
                movf        direccion,w        ;tambien carga la direccion donde se va a grabar el dato
                movwf        EEADR
                incf        direccion,1        ;deja seteado donde se va a grabar el proximo dato                
                call        ESCRIBIR_EEPROM
                bsf            GPIO,5            ;avisa que se grabo un dato
                call        demora0.1
                bcf            GPIO,5
                call        demora30
                goto        convertir

;-------------------------------------------------------------
; SUBRUTINA QUE OBTIENE EL VALOR DEL CONVERSOR A/D (GP1)
;-------------------------------------------------------------
CONVERSORAD        bsf            ADCON0,1        ;comienza la conversion A/D                
convierte        btfsc        ADCON0,1        ;espera a que convierta el dato
                goto        convierte
                movf        ADRESH,w        ;pasa el resultado de la conversion a w
                movwf        conversion        ;y luego a la variable conversion
                retlw        0

;-------------------------------------------------------------
; SUBRUTINA DE ESCRITURA DE DATOS EN EEPROM (se deben haber cargado EEDATA y EEADR)
;-------------------------------------------------------------
ESCRIBIR_EEPROM    bsf         STATUS,RP0         ;Bank 1                                                        
                bsf         EECON1,WREN     ;Enable write
                bcf            INTCON,GIE
                movlw        0x55             ;Inicio de las intrucciones para EECON2
                movwf        EECON2
                movlw        0xAA         
                movwf        EECON2            ;Fin de las intrucciones para EECON2
                bsf         EECON1,WR         ;Start the write                                            
                bcf            EECON1,WREN     ; disable Write
                bcf           STATUS,RP0      ; Banco 0 
                retlw        0

;-------------------------------------------------------------
; SUBRUTINA DE RETARDO DE 30 SEGUNDOS
;-------------------------------------------------------------
demora30        movlw        D'153'
                movwf        CounterC
                movlw        D'49'
                movwf        CounterB
                movlw        D'161'
                movwf        CounterA
loop1            decfsz        CounterA,1
                goto        loop1
                decfsz        CounterB,1
                goto        loop1
                decfsz        CounterC,1
                goto        loop1
                retlw        0    

;-------------------------------------------------------------
; SUBRUTINA DE RETARDO DE 0.1 SEGUNDOS
;-------------------------------------------------------------
demora0.1        movlw        D'130'
                movwf        CounterB
                movlw        D'221'
                movwf        CounterA
loop2            decfsz        CounterA,1
                goto        loop2
                decfsz        CounterB,1
                goto        loop2
                retlw        0    
                END
 
Última edición por un moderador:
Atrás
Arriba