Grabar en la EEPROM el modo.


Inicio Foros Electrónica Grabar en la EEPROM el modo.

Este debate contiene 6 respuestas, tiene 1 mensaje y lo actualizó Avatar de Meta Meta hace 3 años, 9 meses.

Viendo 7 publicaciones - del 1 al 7 (de un total de 7)
  • Autor
    Mensajes
  • #5986
    Avatar de Meta
    Meta
    Participante

    Hola:
    Cuando cambie de modo al Termostato, que es el tercer modo. Al reiniciar el PIC completo siempre se me pone al modo 0 que es el predeterminado. ¿Cómo logro grabar en la EEPROM en la posición 2 que al encender el PIC se muestre en el último modo que has puesto en el LCD?

    ; Programa de control para un termómetro y termostato digital. Utiliza el sensor den; temperatura DS1820 que transmite la información vía serie a través de un bus de unan; sola línea según un protocolo del fabricante de semiconductores Dallas Semiconductors.
    ;n; El ajuste de la temperatura a la que conmuta el termostato se logra mediante dosn; pulsadores: "MODO" e "INCREMENTAR", que se conectan a pines del Puerto B y cuyon; funcionamiento se basa en interrupción por cambio en la línea del Puerto B.
    ;n; Se maneja de la siguiente forma:n; -    En estado de reposo funciona sólo como termómetro. Aparece la temperatura en pantallan;    del módulo LCD. La salida del termostato está apagada.
    ; -    Pulsa "MODO" y se ajusta la temperatura deseada mediante el pulsador "INCREMENTAR".
    ; -    Vuelve a pulsar "MODO", se activa el termostato. Si la temperatura medida es menorn;    que la deseada enciende la carga, que puede ser un calefactor. Si la temperatura n;    medida es mayor que la deseada, apaga la carga.
    ; -    Si se vuelve a pulsar "MODO", apaga la carga y pasa a funcionar sólo como termómetro.
    ;n; Así pues, en el circuito se distinguen tres modos de funcionamiento que se identificann; mediante tres flags:n; A)    Modo "Termostato_OFF", donde funciona como termómetro normal sin termostato. Sen;        reconoce por el flag F_Termostato_OFF.
    ; B)    Modo "Termostato_Ajuste", donde se ajusta la temperatura deseada cuando funcionen;        como termostato. Se reconoce por el flag F_Termostato_Ajuste.
    ; C)    Modo "Termostato_ON", donde funciona como termómetro normal con termostato. Sen;        reconoce por el flag F_Termostato_ON.
    ;n; El programa consigue que esté activado uno solo de los flags anteriores.
    ;n; Al apagar el sistema debe conservar el valor de la temperatura deseada en el termostaton; para la próxima vez que se encienda.
    ;n; ZONA DE DATOS **********************************************************************
    LIST P=16F84An INCLUDE <P16F84A.INC>n __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSCn ERRORLEVEL -302
    CBLOCK 0x0Cn ModoDeseadon TemperaturaDeseadan Registro50ms ; Guarda los incrementos cada 50 ms. FlagsModos ; Guarda los flags para establecer losn ENDC ; modos de trabajo.
    ORG 0x2100 ; Corresponde a la dirección 0 de la zonan ; EEPROM de datos. Aquí se va a guardar eln DE .24 ; la temperatura deseada. En principio 24 ºC. n#DEFINE SalidaTermostato PORTB,1 ; Carga controlada por el termostato. #DEFINE Zumbador PORTB,2 ; Aquí se conecta el zumbador. #DEFINE ModoPulsador PORTB,7 ; Los pulsadores se conectan a estosn#DEFINE IncrementarPulsador PORTB,6 ; pines del puerto B. #DEFINE F_Termostato_ON FlagsModos,2 ; Flags utilizados en el ajuste de lan#DEFINE F_Termostato_Ajuste FlagsModos,1 ; temperatura del termostato. #DEFINE F_Termostato_OFF FlagsModos,0nnTMR0_Carga50ms EQU d'256'-d'195' ; Para conseguir interrupción cada 50 ms. CARGA_2s EQU d'40' ; Leerá cada 2s = 40 x 50ms = 2000ms. nn; ZONA DE CÓDIGOS ********************************************************************
    ORG 0n goto Inicion ORG 4n goto ServicioInterrupcio
    Mensajesn addwf PCL,FnMensajePublicitarion DT "Electronica PIC", 0x00nMensajeTermostato_ONn DT "Termostato: ", 0x00nMensajeTermostato_Ajusten DT "Temper. deseada", 0x00nMensajeGradoCentigradon DT "ºC ", 0x00 ; En pantalla LCD: "ºC "nnInicio
    call LCD_Inicializan bsf STATUS,RP0n movlw b'00000111' ; Prescaler de 256 para el TMR0 y habilitan movwf OPTION_REG ; resistencias de Pull-Up del Puerto B. bsf ModoPulsador ; Se configuran como entrada. bsf IncrementarPulsadorn bcf SalidaTermostato ; Se configuran como salida. bcf Zumbadorn bcf STATUS,RP0n call LCD_Linea1 ; Se sitúa al principio de la primera línea. movlw MensajePublicitarion call LCD_Mensajen call DS1820_Inicializa ; Comienza la conversión del termómetro y ponen call ModoTermostato_OFF ; este modo de funcionamiento. movlw TMR0_Carga50ms ; Carga el TMR0 en complemento a 2. movwf TMR0n movlw CARGA_2s ; Y el registro cuyo decremento contará los 2 s. movwf Registro50msn clrw ; Lee la posición 0x00 de memoria EEPROM de datosn call EEPROM_LeeDato ; donde se guarda la temperatura deseada de la últiman movwf TemperaturaDeseada ; vez que se ajustó. movlw 0x01n call EEPROM_LeeDaton movwf ModoDeseadon movlw b'10101000' ; Activa interrupción del TMR0 (T0IE), por cambio den movwf INTCON ; líneas del Puerto B (RBIE) y la general (GIE)n;n; La sección "Principal" es mantenimiento. Sólo espera las interrupciones. ; No se puede poner en modo de bajo consumo porque la instrucción "sleep" detiene el Timer 0. nPrincipaln goto Principalnn; Subrutina "ServicioInterrupcion" ------------------------------------------------------n;n; Detecta qué ha producido la interrupción y ejecuta la subrutina de atención correspondiente. nServicioInterrupcio
    btfsc INTCON,T0IF ; Si es una interrupción producida por el Timer 0n call Termometro ; lee el termómetro y actualiza termostato. btfss INTCON,RBIF ; Si es una interrupción RBI lee los pulsadores. goto FinInterrupcio
    btfss ModoPulsador ; ¿Está presionado el pulsador de "AJUSTE"?n call CambiarModo ; Sí. Ajusta la temperatura deseada en el termostato. btfss IncrementarPulsador ; ¿Pulsado "INCREMENTAR"?n call IncrementarTempDeseada ; Sí, pasa a incrementar la temperatura deseada. FinInterrupcio
    bcf INTCON,RBIF ; Limpia los flags de reconocimiento. bcf INTCON,T0IFn retfienn; Subrutina "Termometro" ----------------------------------------------------------------n;n; Esta subrutina lee y visualiza el termómetro cada 2 segundos aproximadamente. Se ejecutan; debido a la petición de interrupción del Timer 0, cada 50 ms. Para conseguir unan; temporización de 2 s, habrá que repetir 40 veces el lazo de 50 ms (40x50ms=2000ms=2s). ;n; También actúa sobre la salida del termostato posicionándola adecuadamente. nTermometron movlw TMR0_Carga50msn movwf TMR0 ; Recarga el TMR0. decfsz Registro50ms,F ; Decrementa el contador. goto FinInterrupcion ; No han pasado 2 segundos, por tanto sale. movlw CARGA_2s ; Repone este contador nuevamente. movwf Registro50msn call DS1820_LeeTemperatura ; Lee la temperatura. call DS1820_Inicializa ; Comienza conversión para la siguiente lectura. call Termostato ; Actúa sobre el ter
    mostato. ; call Visualiza ; Como esta subrutina se escribe a continuaciónn; return ; se ahorra estas dos instrucciones y ahorra
    ; también espacio en la pila. ; Subrutina "Visualiza" -----------------------------------------------------------------n;n; Visualiza el termómetro en tres formatos posibles:n; A) Con el termostato desactivado, modo "Termostato_OFF". Por ejemplo:n; "IES. Isaac Peral" (Primera línea)n; " 24.5ºC " (Segunda línea). ; Donde en la primera línea se visualiza un mensaje publicitario y en lan; segunda línea la temperatura medida actual. ; B) Ajuste del termostato, modo "Termostato_Ajuste". Por ejemplo:n; "Temper. deseada" (Primera línea)n; " 25ºC " (Segunda línea). ; Donde en la segunda línea visualiza la temperatura que se desea ajustar. ; C) Con el termostato activado, modo "Termostato_ON". Por ejemplo:n; "Termostato: 25ºC" (Primera línea)n; " 23.5ºC " (Segunda línea). ; Donde en la primera línea se visualiza la temperatura que se desean; ajustar y en la segunda línea la temperatura medida actual. Visualizan btfsc F_Termostato_OFFn goto VisualizaTermometron btfsc F_Termostato_Ajusten goto VisualizaTermostato_Ajusten btfsc F_Termostato_ONn goto VisualizaTermostato_ONn retur
    ; "VisualizaTermostato_ON" --------------------------------------------------------------n;n; Visualiza el valor de la temperatura deseada en la primera línea y el valor de lan; temperatura medida en la segunda línea. ; nVisualizaTermostato_ONn call LCD_Linea1n movlw MensajeTermostato_ONn call LCD_Mensajen call VisualizaTemperaturaDeseadan call VisualizaTemperaturaMedidan retur

    Felices fiestas 2010,

    #5987
    Avatar de Meta
    Meta
    Participante

    Segunda parte del código. (Sólo acepta por cada post 10.000 carácteres).

    
    

    call LCD_PosicionLinea2 ; segunda línea.
    VisualizaTemperaturaDeseadan movf TemperaturaDeseada,Wn call BIN_a_BCD ; La pasa a BCD.
    call LCD_Byte ; Visualiza, apagando los ceros no significativos.
    movlw MensajeGradoCentigrado ; En pantalla aparece "ºC ".
    call LCD_Mensajen retur
    ; "VisualizaTermometro" y ""VisualizaTemperaturaMedida" ---------------------------------n;n; En la primera línea se visualiza un mensaje publicitario y en la segunda línea lan; temperatura medidan;n; Entradas:n; - (DS1820_Temperatura), temperatura medida en valor absoluto.
    ; - (DS1820_TemperaturaDecimal), parte decimal de la temperatura medida.
    ; - (DS1820_Signo), registro con el signo de la temperatura. Si es igual an; b'00000000' la temperatura es positiva. Si es b'11111111' resulta quen; la temperatura es negativa.
    ;nVisualizaTermometron call LCD_Linea1 ; Se sitúa al principio de la primera línea.
    movlw MensajePublicitarion call LCD_MensajenVisualizaTemperaturaMedidan movlw .5 ; Se coloca para centrar visualización en lan call LCD_PosicionLinea2 ; segunda línea.
    btfss DS1820_TemperaturaSigno,7 ; ¿Temperatura negativa?n goto TemperaturaPositiva ; No, es positiva.
    TemperaturaNegativa:n movlw '-' ; Visualiza el signo "-" de temperatura negativa.
    call LCD_CaracternTemperaturaPositivan movf DS1820_Temperatura,Wn call BIN_a_BCD ; La pasa a BCD.
    call LCD_Byte ; Visualiza apagando los ceros no significativos.
    movlw '.' ; Visualiza el punto decimal.
    call LCD_Caractern movf DS1820_TemperaturaDecimal,W ; Visualiza la parte decimal.
    call LCD_Nibblen movlw MensajeGradoCentigrado ; En pantalla LCD aparece "ºC ".
    call LCD_Mensajen retur
    ; Subrutina "Termostato" ----------------------------------------------------------------n;n; Controla una carga en función del valor de la temperatura medida respecto de la temperaturan; deseada. Para evitar inestabilidad en la salida, tendrá un pequeño ciclo de histéresis.
    ; Así por ejemplo, si la temperatura deseada es 24 ºC la carga se activará cuando lan; temperatura baje o sea igual a 23,5 ºC y se apagará cuando la supere o sea igual a 25ºC.
    ; Si la temperatura medida está entre esos márgenes (23,5 y 25ºC), se queda en el estadon; anterior, tanto si está encendida como apagada.
    ;n; Para temperaturas negativas la salida se debe activar siempre.
    ;n; Entradas:n; - (DS1820_Temperatura), temperatura medida en valor absoluto.
    ; - (TemperaturaDeseada), temperatura a partir de la cual se tomaránn; decisiones sobre la salida.
    ; - (DS1820_Signo), registro con el signo de la temperatura medida. Si es ceron; la temperatura es positiva y todos sus bits son "1", es negativa.
    ;n; Salida: - Su funcionamiento:n; - Estando apagada, si la temperatura medida desciende por debajo de lan; temperatura deseada la salida se activará.
    ; - Estando encendida, si la temperatura medida supera la deseada lan; salida se apagará.
    ; - Si las temperaturas medidas y deseada son iguales se queda en estadon; anterior, tanto si está encendida como si está apagada.
    ; - Para temperaturas negativas la salida se debe activar siempre.
    Termostaton btfss F_Termostato_ON ; Si el termostato no está activado salta an goto ApagaCarga ; apagar la carga.
    btfsc DS1820_TemperaturaSigno,7 ; Con temperaturas negativas pasa a activarn goto EnciendeCarga ; la carga.
    btfss SalidaTermostato ; Comprueba el estado actual de la salida paran goto SalidaEstabaApagada ; actuar en consecuencia.
    SalidaEstabaActivada ; Pasa a comprobar si tiene que apagar la carga.
    movf DS1820_Temperatura,Wn subwf TemperaturaDeseada,W ; (W)=(TemperaturaDeseada)-(DS1820_Temperatura).
    btfsc STATUS,C ; ¿(TemperaturaDeseada)<(DS1820_Temperatura)?
    goto FinTermostato ; Sí, por tanto, lo deja encendido y sale.
    call Pitido ; Pitido cada vez que conmuta la carga.
    ApagaCargan bcf SalidaTermostato ; Apaga la salida y sale.
    goto FinTermostatonSalidaEstabaApagada ; Pasa a comprobar si tiene que encender la cargan movf TemperaturaDeseada,Wn subwf DS1820_Temperatura,W ; (W)=(DS1820_Temperatura)-(TemperaturaDeseada).
    btfsc STATUS,C ; ¿(DS1820_Temperatura)<(TemperaturaDeseada)?
    goto FinTermostato ; Sí, la deja apagada y sale.
    EnciendeCargan call Pitido ; Pitido cada vez que activa la carga.
    bsf SalidaTermostatonFinTermostaton retur

    #5989
    Avatar de Mario
    Mario
    Miembro

    En BASIC sería tan sencillo como asignarle un valor a una variable BIT (si son dos opciones: 0 y 1) o darle cualquier valor a una variable BYTE (0 a 255) y a cada cambio escribir la EEPROM así:
    nEWRITE 0, ‘Escribir en la posición cero de la EEPROM el valor de Dato
    nAl principio del listado de programa colocar, por supuesto
    nDato = EREAD 0 ‘Colocar en Dato lo que tenga la posición 0 de la EEPROM
    nEn ASM no sabría como se hace. :(rnSe que no estoy aportando nada a tu interrogante, pero quería mostrar lo sencillo que es trabajar en BASIC.
    nSaludos!rnMario

    #5991
    Avatar de Meta
    Meta
    Participante

    Me faltó poner la tercera parte.

    
    

    iveles de tensión.
    btfsc ModoPulsador ; Si es un rebote, sale fuera.
    goto FinCambiarModon call PitidoCorto ; Cada vez que pulsa se oye un pitido.
    btfss F_Termostato_ON ; Detecta si está en el último modo.
    goto ModoSiguiente ; Si no, pasa al modo siguiente.
    ModoTermostato_OFFn call Pitido ; Pitido cada vez que conmuta la carga.
    bcf SalidaTermostato ; Apaga la carga.
    movlw b'00000001' ; Actualiza el registro FlagsModos pasando aln movwf FlagsModos ; modo inicial "Termostato_OFF".
    goto BorraPantallanModoSiguiente ; Desplaza un "1" a la izquierda del registron bcf STATUS,C ; FlagsModos para ajustar secuencialmenten rlf FlagsModos,F ; cada uno de los modos de funcionamiento.
    BorraPantallan call LCD_Borra ; Borra la pantalla anterior.
    FinCambiarModon call Visualizan btfss ModoPulsador ; Ahora espera a que deje de pulsar.
    goto FinCambiarModon retur
    ; Subrutina "IncrementarTempDeseada" ----------------------------------------------------n;n; Subrutina de atención a la interrupción por cambio de la línea RB6 a la cual se ha conectadon; el pulsador "INCREMENTAR". Estando en el modo "Termostato_Ajustar" incrementa el valor den; la temperatura deseada entre unos valores máximo y mínimo.
    ;n; Al final debe guardar el valor de la temperatura deseada en memoria EEPROM de datos paran; preservar su valor en caso que desaparezca la alimentación.
    ;nTemperaturaMinima EQU .20nTemperaturaMaxima EQU .36nnIncrementarTempDeseadan call Retardo_20ms ; Espera a que se estabilice
    iveles de tensión.
    btfsc IncrementarPulsador ; Si es un rebote sale fuera.
    goto FinIncrementarn btfss F_Termostato_Ajuste ; Si no está en modo "Termostato_Ajuste" salen goto FinIncrementar ; fuera.
    call PitidoCorto ; Pitido cada vez que pulsa.
    incf TemperaturaDeseada,F ; Incrementa el valor de la temperatura deseada.
    movlw TemperaturaMaxima ; ¿Ha llegado a la temperatura máxima de ajuste?.
    subwf TemperaturaDeseada,W ; (W) = (TemperaturaDeseada) - TemperaturaMaxima.
    btfss STATUS,C ; ¿(TemperaturaDeseada)>=TemperaturaMaxima?n goto VisualizaIncremento ; No, pasa a visualizarlo.
    movlw TemperaturaMinima ; Sí, entonces inicializa el registro.
    movwf TemperaturaDeseadanVisualizaIncrementon call Visualiza ; Visualiza mientras espera a que dejen call Retardo_200ms ; de pulsar.
    btfss IncrementarPulsador ; Mientras permanezca pulsado,n goto IncrementarTempDeseada ; incrementa el dígito.
    clrw ; Salva el valor de la temperatura deseada en la
    movwf EEADR ; posición 00h de la EEPROM de datos. Se conservan movf TemperaturaDeseada,W ; aunque se apague la alimentación.
    call EEPROM_EscribeDatonFinIncrementarn retur
    ; Subrutina de pitidos ------------------------------------------------------------------n;nPitidoLargon bsf Zumbadorn call Retardo_500msnPitidon bsf Zumbadorn call Retardo_200msnPitidoCorton bsf Zumbadorn call Retardo_20msn bcf Zumbadorn returnn;n INCLUDE <BUS_1LIN.INC> ; Subrutinas de control del bus de 1 línea.
    INCLUDE <DS1820.INC> ; Subrutinas de control del termómetro digital.
    INCLUDE <RETARDOS.INC>n INCLUDE <BIN_BCD.INC>n INCLUDE <LCD_4BIT.INC>n INCLUDE <LCD_MENS.INC>n INCLUDE <EEPROM.INC>n ENDEn cuanto al BASIC, he visto que haces proyectos muy grandes. Me da la sensación que lo haces demasiado rápido. Lo manejas muy bien. El asm como que tienes que estar mucho tiempo no solo programando, sino aprendiendo.
    nHay que hechar un ojo. ¿Cómo se llama exactamente el compilador de Basic?

    #5992
    Avatar de Mario
    Mario
    Miembro

    Meta;6015 wrote: ¿Cómo se llama exactamente el compilador de Basic?

    AMICUSEs Gratuito y es para el PIC 18F25K20nnSi deseas trabajar con otros PICs está PROTON que es un software de pago. En NeoTeo lo usamos libremente porque tenemos la licencia del software. Hacemos los programas y compartimos el HEX con ustedes. Además les entregamos siempre el código fuente para aquellos que posean el programa puedan adaptarlo a sus necesidades de uso.
    nSi quieres darle un vistazo, tienes una versión gratuita (y limitada) para experimentar con 4 tipos de PICs: 12C508, 12F675, 16F628A y 16F877 en la misma página.
    La mayoría de los proyectos que hemos hecho en NeoTeo (no todos) con 16F628A están desarrollados con la versión gratuita.
    nEn todos los casos, puedes utilizar código ASM dentro del programa. Es decir, en cualquier lugar “abres” el modo ASM (@ASM) y cuando terminas de hacer el trabajo en ese lenguaje lo “cierras” (END ASM) y continuas con tu programa en BASIC. Tú que manejas bien el ASM puedes hacer TODO el programa en ASM y experimentar poco a poco instrucciones en BASIC. Con el tiempo lograrás dominar todas las instrucciones fundamentales de BASIC y usarás ASM sólo en las partes que requieran un control estricto de los tiempos. nnPor último, puedes trabajar en MPLAB con estos programas. En los enlaces que te dejo hay mucha info, hay foros y muchos ejemplos. Sólo es cuestión de buscar, leer y tener ganas de empezar. nnPor supuesto, tienes otras opciones en Basic. Yo te muestro las que utilizamos nosotros en NeoTeo.
    nSaludos! Ojalá puedas encontrar solución a ese problema que tienes.
    Mario

    #5998
    Avatar de Meta
    Meta
    Participante

    Gracias por la informació.

    #6002
    Avatar de Meta
    Meta
    Participante

    Prederterminado viene así los modos.

    #DEFINE  F_Termostato_ON        FlagsModos,2    ; Flags utilizados en el ajuste de la ; 2n#DEFINE  F_Termostato_Ajuste    FlagsModos,1    ; temperatura del termostato. ; 1n#DEFINE  F_Termostato_OFF        FlagsModos,0    ; 0

    He cambiado el 2 por el 0 y al revés.

    #DEFINE  F_Termostato_ON        FlagsModos,0    ; Flags utilizados en el ajuste de la ; 2n#DEFINE  F_Termostato_Ajuste    FlagsModos,1    ; temperatura del termostato. ; 1n#DEFINE  F_Termostato_OFF        FlagsModos,2    ; 0

    Por fin he logrado que se muestre lo primero que es el Termostato. Me ocurre una cosa, que ya no puedo cambiar de modo. Ahora te toca arreglarlo. Se quedó sólo en el modo 2 y de ahí no sale. Al menos funciona el termostato pero no puedo configurar nada.
    Saludo.

Viendo 7 publicaciones - del 1 al 7 (de un total de 7)

Debes estar registrado para responder a este debate.