Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > ASM y Microcontroladores
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-03-2013
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 454
Poder: 21
REHome Va por buen camino
Manejar EEPROM interna

Hola:

Uso el PIC12F629 puedo leer un valor en la EEPROM interna pero no soy capaz de almacenarlo en la misma dirección.

Este es el código.
Código:
;No olvidar que si GP2 detecta un un 0 en la entreda menor de 5 segundos,
;el PIC no actua, vuelve a lo suyo como si no pasara nada.
;
; Cuando detecte 
;GP2|GP0 GP1 GP4 GP5
;---+----------------
;1) | 0   1   0   0
;2) | 1   0   1   0
;3) | 0   1   1   0
;4) | 1   0   0   1
;
;ZONA DE DATOS*****************************************************************

    LIST P=12F629                          ; Procesador usado.
    INCLUDE <P12F629.INC>                  ; Fichero que definen las etiquetas.

    __CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _FOSC_INTRCIO
    ERRORLEVEL -302

#DEFINE     Pulsador    GPIO,2      ; Pulsador.
#DEFINE     Leds        GPIO        ; Leds está conectado al GPIO.

VARIABLES	UDATA_SHR
ContadorEstado	RES	1
RAM_ret		RES	1
RAM_ret_1	RES	1
Contador	RES	1

;ContadorEstado     equ  20h
;RAM_ret         equ 21h
;RAM_ret_1       equ 22h
;Contador        equ 23h

;	ORG	0x2100				; Corresponde a la dirección 0 de la zona EEPROM de datos.
;	DE	0x00				; El contador en principio a cero.

;ZONA DE CÓDIGOS***************************************************************
    ORG     0     
                  ; El programa comienza en la dirección 0.
    goto    Inicio

Inicio
    bsf     STATUS,RP0                  ; Selecciona banco 1.
    call    0x3FF                    ; Lo el valor de la calibración que sera almacenada en W.
    movwf   OSCCAL                    ; Paso el valor de W a OSCCAL para calibrar el oscilador.
    movlw   b'00000100'
    movwf   TRISIO
    movlw   b'00001111'
    movwf   OPTION_REG              ; Activa Pull Up.
    movlw   b'0000100'
    movwf   WPU                     ; Activada Pull Up del GP0.
    bcf     STATUS,RP0                      ; Selecciona banco 0.
    movlw   b'00000111'             ; Desactivar comparadores.
    movwf   CMCON
	movlw	.3
    movwf	Contador
	clrf	GPIO
;***************************************************************************

Principal
    btfsc   Pulsador                ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Principal               ; No. Vuelve a leerlo.
;    call    Retardo_20ms            ; Espera que se estabilicen los niveles de tensión.
    btfsc   Pulsador                ; Comprueba si es un rebote.
    goto    Principal               ; Era un rebote y sale fuera.
    call    IncrementaVisualiza             ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
    btfss    Pulsador                ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar         ; No. Espera que deje de pulsar.
Fin    goto    Principal

;***************************************************************************    
; Subrutina "IncrementaVisualiza" ---------------------------------------------------------

IncrementaVisualiza
	call	Lee_Dato_EEPROM
	incf	Contador,F				; Incrementa el contador y comprueba si ha
	call	Escribe_Dato_EERPOM
	movlw 	d'4'					; llegado a su valor máximo mediante una
	subwf	Contador,W				; resta. (W)=(Contador)-4.
	btfsc	STATUS,C				; ¿C=0?, ¿(W) negativo?, ¿(Contador)<4?
InicializaContador
	clrf	Contador				; No, era igual o mayor. Por tanto, resetea.
Visualiza
	movf	Contador,W
	call	Tabla					; Lo pasa a siete segmento para poder ser
	movwf	GPIO					; visualizado en el display.
	return


Tabla				
    addwf 	PCL,F                      ; Sumo W al contador de programa. ;
    retlw 	b'00000010'  ;1 
    retlw 	b'00010001'  ;2         
    retlw 	b'00010010'  ;3               ; Retorno con el valor correspondiente.  
    retlw 	b'00100001'  ;4
;Subrutina EEPROM ******************************************************************

Lee_Dato_EEPROM
    bsf     STATUS,RP0             	; Banco 1
    movlw   0x00              	 	; Primera posición de la tabla
    movwf   EEADR                 	; Apunta ahí
;    movf    Contador,W		     	; Coge el contador
;    addwf   EEADR                 	; Suma el contador para apuntar al dato que nos interesa
    bsf     EECON1,RD             	; Lee el valor de la tabla
    movf    EEDATA,W             	; Pasa el valor a W para trabajar con él.
	bcf		STATUS,RP0
    return



;Guarda en la EEPROM el valor del contador
Escribe_Dato_EERPOM
    bsf      STATUS,RP0             ; Banco 1.
    movlw    0x00	                ; Elijo esta dirección de la EEPROM y
    movwf    EEADR                  ; lo cargo en EEADR con el dato a escribir.
    movlw    Contador
    movwf    EEDAT                  ; Cargo el registro EEDAT con el dato a escribir.
    bsf      EECON1,WREN            ; Habilitar
    bcf     INTCON,GIE              ; Deshabilitar intercepciones.
    movlw     0x55                  ; Desbloquear escritura.
    movwf     EECON2
    movlw     0xAA
    movwf     EECON2
    bsf     EECON1,WR               ; Inicie la escritura.
    bsf     INTCON,GIE              ; Habilitar INTS.
	bcf		STATUS,RP0
    return
    
;Subrutina Retardo_20ms ************************************************************
 ; Retardo = 0.02 segundos.
; Frecuencia Reloj = 4 MHz.
; Retardo actual = 0.02 segundos = 20000 ciclos.

Retardo_20ms
            ;19993 ciclos.
    movlw    0x9E
    movwf    RAM_ret
    movlw    0x10
    movwf    RAM_ret_1
Retardo_20ms_0
    decfsz    RAM_ret, f
    goto    $+2
    decfsz    RAM_ret_1, f
    goto    Retardo_20ms_0
            ;3 ciclos.
    goto    $+1
    nop
            ;4 ciclos (incluyendo call).
    return

	END
Salu2.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.
Responder Con Cita
  #2  
Antiguo 07-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.011
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración
Responder Con Cita
  #3  
Antiguo 16-03-2013
Avatar de fenixariel
fenixariel fenixariel is offline
Miembro
 
Registrado: mar 2007
Posts: 77
Poder: 18
fenixariel Va por buen camino
Que te parece mejor hacerlo con un lenguaje de alto nivel, mi opinion es que se tiene que aprender si o si con asm al inicio, pero el paso a un lenguaje de alto nivel es natural.

MikroC, MikroPascal, en sus nuevas versiones espectaculares en su rendimiento, tambien PICC, C18, Hitech, etc etc..



Saludos.
Responder Con Cita
  #4  
Antiguo 16-03-2013
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 454
Poder: 21
REHome Va por buen camino
Buenas:

En ese sentido tienes razón. Si usas PIC de gama baja o gama media se usan ASM, si ya son de gama alta se recomienda lenguaje de alto nivel como el C o otros, recomendable usar los de fabriante, ya que son los más actualizados y tienen ejemplos asm y C de sus PIC para practicar.

Un cordial saludo.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
chat en lazarus red interna anubis Lazarus, FreePascal, Kylix, etc. 1 08-08-2011 21:43:29
Variedad de programadores de PIC y EEPROM. REHome ASM y Microcontroladores 0 16-10-2008 13:20:40
Base de datos interna??? paladincubano Conexión con bases de datos 5 27-06-2008 22:41:04
Mensajeria Interna bohemioloco Varios 3 19-04-2007 20:34:41
Obtener la ip de LAN (interna o de red) DarkByte Internet 7 02-09-2004 13:58:57


La franja horaria es GMT +2. Ahora son las 09:25:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi