Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

31/01/2012 #1

Avatar de Meta

Cambiar de sensor con PIC
Hola:

Con este proyecto de ejemplo con código fuente y simulador incluido. Quiero saber si hay una manera de poder poner varios sensores de humedad y que cambie de sensor cuando pulse un botón que ahí aún no está incluido.

También pueden dar alguna idea.

Saludo.
31/01/2012 #2


Con un Multiplexor podría ser.
Ya que te sobran 4 salidas podrías conectar hasta 8. Uno para el pulsador y 3 para comandar el multiplexor.
31/01/2012 #3

Avatar de dragondgold

Como dice sansos un multiplexor haría el trabajo, en un pin colocas el pulsador y en los otros 3 pines los usas para colocar el multiplexor y la salida del mismo la llevas a RB3.
Cualquier multiplexor será suficiente porque el One-Wire no es muy rápido un 74LS138 o un CD4051 debería funcionar :P.

Saludos !!
01/02/2012 #4

Avatar de Meta

Hola:

Con un multiplexor 74LS138 puedo poner hasta 8 sensores. Vamos a analizar un poco la idea que por ahora me parece muy interesante y creé parecer más complicado de realizarlo el proyecto.



Mirando el proyecto de abajo funciona de esta manera. Vamos haber por dónde colocamos el multiplexor.



Si es posible, quiero hacer cambiar de sensor con un pulsador y poner 3 sensores como máximo, si es posible poner 8 mejor, para que lo quiero voy a usar unos tres por ahora.

La idea es que al pulsar el pulsador escoja el sensor 1 y analice la temperatura,pulso otra vez y me muestra la temperatura del sensor 2 que está colocado en otro sitio, así sucesivamente hasta llegar a todos los sensores. Me imagino que al pulsarlo el pulsador será desde el multiplexor 74SL138 ya que desde el PIC sólo muestra 3 modos, temperatura, ajustar temperatura y modo termostato.

Si lo hago desde el PIC, hay que programarlo de tal manera que diga, sensor 1 con su temperatura 23ºC, pulso otro botón y diga Sensor 2 - 27ºC. Ahí será más complejo. Si lo hago de la manera sin modificar el ASM del PIC, el termostato salta si cualquier sensor esté seleccionado en ese momento.

Pueden dar ideas, sugerencias para poder coger más información y hacer el proyecto primero con simulación en Proteus. Luego lo hago realidad y lo muestro aquí con fotos y vídeos.

Hace tiempo me funcionó en una protoboard, este es el vídeo que subí.


Salu2.
01/02/2012 #5

Avatar de dragondgold

Si no querés modificar el programa del PIC podrías conectar el común del MUX a la entrada que sería RB3, cada salida de la 0 a la 7 conectas un sensor en cada una, para cambiar la entrada seleccionada, en A,B,C colocás las salidas A,B,C de un contador (CD4029) y el clock del contador se lo das con un pulsador pasado por un circuito antirrebotes con un Schmit Trigger y un capacitor y ya tenes el sistema armado.
Como adicional podés conectar las mismas salidas del contador a un decodificador BCD-7SEG (CD4511) para ir mostrando en un 7 segmentos el número de sensor que tenes seleccionado porque en el LCD no te va a indicar.

Saludos !!

PD: los integrados CD4511 y CD4029 son CMOS entonces tendrías que usar un MUX CMOS también como el CD4051, si conseguís TTL mejor pero yo no pude conseguir un contador TTL así que tiene que ser todo CMOS igual con 5V andarían bien.

-----------------------------------------------------------------------------------------
Edito: te adjunto una imagen con la idea del circuito :P
-----------------------------------------------------------------------------------------
Imágenes Adjuntas
Tipo de Archivo: jpg Circuito.JPG (97,3 KB (Kilobytes), 260 visitas)
01/02/2012 #6


Amigos el 74LS138 no les va a servir es solo un decodificador/demultiplexor, el otro CD4051 si te va a servir como multiplexor, que es el que puso dragondgold en su esquematico.
01/02/2012 #7

Avatar de Meta

Buenas:



Por lo que veo en el esquema, pongo los tres sensores DS1820 en X0 (sensor 1), X1 (sensor 2) y X2 (sensor 3) en el integrado 4051. (Buscaré IC que sean TTL que los habrá).

Luego en la salida del 4051 llamado X del pin 3 debo conectar a la entrada del PIC ya programado.

¿Es como digo?

En el display de 7 segmentos está bien que me diga el sensor 1, sensor 2, etc, es muy buena idea . Lo ideal es cada temperatura sea indicada en el LCD y de modo intependiente. Ahora la programación sobre el PIC es muy engorroso en ASM, por eso prefiero esa idea del 7-seg. .

Por lo que veo y no se si el esquema de arriba es el adecuado, tengo que hacer de alguna manera que al pulsar un botón me seleccione el sensor 2 y muestra el número 2 en el display de 7-seg y la temperatura en el LCD, si lo vuelvo a pulsar que haga lo mismo al sensor 3, pulso una vez más y vuelve al sensor 1. Los datos del sensor de temperatura DS1820 tiene que detectarlo el PIC.

Si no encuentro TTL también se puede hacer con otro PIC, sólo hay que programarlo y hay ejemplos de ellos al menos contar del 1 al 3, al mismo tiempo que cambie de sensor con el mismo PIC (de 28 pines).

Muchas gracias por las respuestas, ideas y ayudas. Pueden seguir dando sugerencias.
01/02/2012 #8

Avatar de reyvilla

Hola disculpa la intromisión pero creo que puedes hacerlo de manera mas fácil y económica sin darte tantos dolores de cabeza, si no quieres cambiar el programa y esta diseñado para leer un solo sensor y lo que quieres es intercambiar varios sensores a la misma entrada, lo mejor no seria un swicht selector al fin y al cabo no vas a leer los tres al mismo tiempo y la diferencia entre el pulsador y el swicht selector en este caso no creo que sea tanta como para diseñar algo tan complejo pudiendo hacerlo de manera mas simple...saludoss

Quedaria algo asi...
Imágenes Adjuntas
Tipo de Archivo: jpg 6d5fg46sd41.jpg (197,3 KB (Kilobytes), 44 visitas)
01/02/2012 #9

Avatar de dragondgold

Sí ese método es más sencillo es el básico, no se si le servirá porque el quería seleccionarlos con un pulsador :P

Saludos !!
01/02/2012 #10

Avatar de Meta

Amigo, gracias por compartir, es el más fácil que he visto. No te estás intrometiendo, estás colaborando y es de agradecer.

Pues sí, es más fácil así, buena idea, lo que le falta el display de 7-segmentos y que sea con pulsador.

En realidad si quiero cambiar el código fuente, lo que pasa que no vale la pena porque es un PIC de 18 pines. Lo ideal sería usar uno de 28 pines como el 16F886, claro que me llevaré un tiempazo adaptar el original del 16F84A al 16F886, después hacer el cambio en el código fuente y en ASM te pegas media vida. Tendré que intestigar si me funciona a la primera con solo la adaptación en ASM que no es lo mismo de facilidad como el C. Ahora en C estoy verde para PIC, de todas forma no me he puesto aún.

Si puedo haré con un LCD de 20x4 que me indique varios sensores a la vez, eso es lo ideal pero más largo y complicado de hacer en estos momentos. Tres sensores y tres relés de carga, por ejemplo ventiladores.

Lo más fácil y pronto es el truco que mensionaron arriba con display de 7 segmentos, más el tuyo propio del conmutador y me lee los sensores de uno en uno, pero funciona. En este método son con tres sensores DS1820 y un único relé, porque sea 3 o sea 8 DS1820, funciona como un solo sensor y seleccionado por ti mismo el más indicado. Así que cualquier temperatura de cualquier sensor activado en este momento se activará el único relé. Por ahora esta es la prioridad, lo más fácil.

La idea general que no podré hacer por falta de conocimiento en este mismo momento, es poner tres sensores en tres disipadores con ventilador para detectar la temperatura. Por poner un ejemplo. El sensor 3 ha detectado una cierta temperatura y me lo visualiza en el LCD más un led y un zumbador a parte que está muy caliente y salta el termoestato, ese termoestato tiene su relé número 3 y activa un ventilador. Cuando se refresque de nuevo la temperatura adecuada se vuelve a desactivar, es lo que hace el ejemplo del libro arriba pero con un único sensor. también puede ser que el ventilador siempre esté a 7.5Vdc y cuando aumente la temperatura se ponga a 12Vdc como indica el esquema de abajo.



Muchísimas gracias por las sugerencias, me están ayudando a tener ideas geniales cons vuestas colaboraciones.
01/02/2012 #11

Avatar de reyvilla

Si el código estuviera en pic basic pro te ayudaría con el código ya que lo manejo bastante bien, no se si te sirve un ejemplo de lo que tu quieres, es mas vi las características del sensor y es one-wire no lo he trabajado con el PBP, voy a ver si lo pongo en practica y así te hecho una mano, claro esta el código va estar en PBP...saludoss
01/02/2012 #12

Avatar de Meta

A lo mejor cojo el truco rápido del PIC BASIC. Hay que tener claro el código del ASM que puedes descargar gratis para que haga los menús igual. Ya es un reto.

---------- Actualizado después de 10 minutos ----------

No olvides hay que tener claro el diseño del circuito acabado para luego progrmar.

¿Cuál montaje tienes en mente?
02/02/2012 #13

Avatar de reyvilla

Fíjate en este circuito ya tiene el código y puedes ser modificado a gusto y es con el mismo sensor lo unico es que lo tienen con un lcd serial seria cuestión de cambiar un poco el codigo y listo, apenas pueda me pongo en eso para ir avanzando mas en el tema.

http://www.rentron.com/PicBasic/one-wire3.htm
02/02/2012 #14

Avatar de Meta

Que interesante.

Este LCD de 20x4 me interesa como se ve en la imagen, claro que si muestra 3 Sensores al mismo tiempo y en ºC está de calidad. Parece complciado programar en PIC Basic.



Muchas gracias por el apoyo. Ya me dirás la idea que tienes, manejar los 3 sensores a la vez independiente y mostrado en el LCD o mostrar uno a uno.

Saludo.
02/02/2012 #15

Avatar de mnicolau

La forma más sencilla que tenés de realizarlo es utilizar un PIC como el 16F886 (barato, y con pines y memoria de sobra). Conectás los 3 sensores directo al PIC (no te va a servir ese sensor en este caso, podría ser un LM35) y con el pulsador controlás qué medición enviás al LCD (o la forma que quieras de presentarlo), además de cualquier lógica que quieras realizar con las mediciones.

La otra opción, manteniendo ese mismo sensor y el esquema que te pasaron, es hacer la lógica del control del multiplexor y del display con el PIC (eliminando el 4029), y de paso controlar con el mismo las indicaciones del LCD en cada caso.

Eso sí... programando en assembler vas a tener varias horas para terminarlo; en cambio con un lenguaje como C te va a llevar muy pocas líneas. Así que te aconsejo ampliamente seguir aprendiendo C (o basic) y te vas a sorprender con la velocidad que podés desarrollar este tipo de proyectos (te lo digo por experiencia propia).

Saludos
02/02/2012 #16

Avatar de dragondgold

Meta mi recomendación de acuerdo a que veo que hay varias modificaciones que hacer no te va a ser demasiado fácil con el código en ASM y habría que ver que tanta memoria te queda porque el 16F84 dispone de tan solo 1K.
Como recomiendo Mariano te diría que te pases a un 16F886 o 16F876A y aprendas a programar en C, no se cual es la urgencia del proyecto pero C te va a servir de mucho en todos los ámbitos.

Si quieres empezar con algo mas bien práctico y rápido te recomiendo programar en C de CCS, tiene muchas librerías, muy fácil de aprender, un excelente foro y mucha info en internet.
Por el otro lado si quieres algo más definitivo y estándar a cualquier C te recomiendo los compiladores de Hi-Tech o C de Microchip (C18, C30, C32).
En particular para la gama 16F vas a tener que usar los Hi-Tech pero que son iguales a los de Microchip debido a que trabajan en el estándar de ANSI C.

Te repito no se cuál es tu urgencia por terminarlo pero sino, mira al proyecto como una excusa para aprender C, te puedo asegurar que te va a ser muy fácil escribirlo en tan sólo unas pocas líneas, cualquier ayuda que necesites en cualquiera de los 3 compiladores estoy para ayudarte.

Saludos !!
02/02/2012 #17

Avatar de Meta

Con el mismo funcionamiento del ASM del ejemplo de arriba. ¿Cuánto tiempo se pasa de ASM al C18?

Sobre todo al 16F886 que tiene más pines y memoria para C.

Sin contar con estas librerías qu ehay que usar y todas en ASM.
INCLUDE <DS18B20.INC> ; Subrutinas de control del termómetro digital.
INCLUDE <BUS_1LIN.INC> ; Subrutinas de control del bus de 1 línea.
INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <EEPROM.INC>

El programa principal es este también en ASM. ¿Realmente es tan fácil como parece?
Código:
;********************************* DS18B20_Termostato.asm ******************************
;
;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
;
; Programa de control para un termómetro y termostato digital. Utiliza el sensor de
; temperatura DS18B20 que transmite la información vía serie a través de un bus de una
; sola línea según un protocolo del fabricante de semiconductores Dallas Semiconductors.
;
; El ajuste de la temperatura a la que conmuta el termostato se logra mediante dos
; pulsadores: "MODO" e "INCREMENTAR", que se conectan a pines del Puerto B y cuyo
; funcionamiento se basa en interrupción por cambio en la línea del Puerto B.
;
; Se maneja de la siguiente forma:
; -    En estado de reposo funciona sólo como termómetro. Aparece la temperatura en pantalla
;    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 menor
;    que la deseada enciende la carga, que puede ser un calefactor. Si la temperatura 
;    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.
;
; Así pues, en el circuito se distinguen tres modos de funcionamiento que se identifican
; mediante tres flags:
; A)    Modo "Termostato_OFF", donde funciona como termómetro normal sin termostato. Se
;        reconoce por el flag F_Termostato_OFF.
; B)    Modo "Termostato_Ajuste", donde se ajusta la temperatura deseada cuando funcione
;        como termostato. Se reconoce por el flag F_Termostato_Ajuste.
; C)    Modo "Termostato_ON", donde funciona como termómetro normal con termostato. Se
;        reconoce por el flag F_Termostato_ON.
;
; El programa consigue que esté activado uno solo de los flags anteriores.
;
; Al apagar el sistema debe conservar el valor de la temperatura deseada en el termostato
; para la próxima vez que se encienda.
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

    CBLOCK    0x0C
    TemperaturaDeseada
    Registro50ms                            ; Guarda los incrementos cada 50 ms.
    FlagsModos                                ; Guarda los flags para establecer los
    ENDC                                    ; modos de trabajo.

    ORG    0x2100                                ; Corresponde a la dirección 0 de la zona
                                            ; EEPROM de datos. Aquí se va a guardar el
    DE    .24                                    ; la temperatura deseada. En principio 24 ºC.

#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 estos
#DEFINE  IncrementarPulsador    PORTB,6        ; pines del puerto B.
#DEFINE  F_Termostato_ON        FlagsModos,2    ; Flags utilizados en el ajuste de la
#DEFINE  F_Termostato_Ajuste    FlagsModos,1    ; temperatura del termostato.
#DEFINE  F_Termostato_OFF        FlagsModos,0

TMR0_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.    

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0
    goto    Inicio
    ORG    4
    goto    ServicioInterrupcion

Mensajes
    addwf    PCL,F
MensajePublicitario
    DT "IES. ISAAC PERAL", 0x00
MensajeTermostato_ON
    DT "Termostato: ", 0x00
MensajeTermostato_Ajuste
    DT "Temper. deseada", 0x00
MensajeGradoCentigrado
    DT "ºC  ", 0x00                    ; En pantalla LCD: "ºC  "

Inicio    
    call    LCD_Inicializa
    bsf        STATUS,RP0
    movlw    b'10000111'                ; Prescaler de 256 para el TMR0.
    movwf    OPTION_REG
    bsf        ModoPulsador            ; Se configuran como entrada.
    bsf        IncrementarPulsador
    bcf        SalidaTermostato        ; Se configuran como salida.
    bcf        Zumbador
    bcf        STATUS,RP0
    call    LCD_Linea1                ; Se sitúa al principio de la primera línea.
    movlw    MensajePublicitario
    call    LCD_Mensaje
    call    DS18B20_Inicializa        ; Comienza la conversión del termómetro y pone
    call    ModoTermostato_OFF        ; este modo de funcionamiento.
    movlw    TMR0_Carga50ms            ; Carga el TMR0 en complemento a 2.
    movwf    TMR0
    movlw    CARGA_2s                    ; Y el registro cuyo decremento contará los 2 s.
    movwf    Registro50ms
    clrw                            ; Lee la posición 0x00 de memoria EEPROM de datos
    call    EEPROM_LeeDato            ; donde se guarda la temperatura deseada de la última
    movwf    TemperaturaDeseada        ; vez que se ajustó.
    movlw    b'10101000'                ; Activa interrupción del TMR0 (T0IE), por cambio de
    movwf    INTCON                    ; líneas del Puerto B (RBIE) y la general (GIE)
;
; 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.

Principal
    goto    Principal

; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
; Detecta qué ha producido la interrupción y ejecuta la subrutina de atención correspondiente.

ServicioInterrupcion
    btfsc    INTCON,T0IF                ; Si es una interrupción producida por el Timer 0
    call    Termometro                ; lee el termómetro y actualiza termostato.
    btfss    INTCON,RBIF                ; Si es una interrupción RBI lee los pulsadores.
    goto    FinInterrupcion
    btfss    ModoPulsador            ; ¿Está presionado el pulsador de "AJUSTE"?
    call    CambiarModo                ; Sí. Ajusta la temperatura deseada en el termostato.
    btfss    IncrementarPulsador        ; ¿Pulsado "INCREMENTAR"?
    call    IncrementarTempDeseada    ; Sí, pasa a incrementar la temperatura deseada.
FinInterrupcion
    bcf        INTCON,RBIF                ; Limpia los flags de reconocimiento.
    bcf        INTCON,T0IF
    retfie

; Subrutina "Termometro" ----------------------------------------------------------------
;
; Esta subrutina lee y visualiza el termómetro cada 2 segundos aproximadamente. Se ejecuta
; debido a la petición de interrupción del Timer 0, cada 50 ms. Para conseguir una
; temporización de 2 s, habrá que repetir 40 veces el lazo de 50 ms (40x50ms=2000ms=2s).
;
; También actúa sobre la salida del termostato posicionándola adecuadamente.

Termometro
    movlw    TMR0_Carga50ms
    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    Registro50ms
    call    DS18B20_LeeTemperatura    ; Lee la temperatura.
    call    DS18B20_Inicializa        ; Comienza conversión para la siguiente lectura.
    call    Termostato                ; Actúa sobre el termostato.
;    call    Visualiza                ; Como esta subrutina se escribe a continuación
;    return                            ; se ahorra estas dos instrucciones y ahorra 
                                    ; también espacio en la pila.
; Subrutina "Visualiza" -----------------------------------------------------------------
;
; Visualiza el termómetro en tres formatos posibles:
; A)    Con el termostato desactivado, modo "Termostato_OFF". Por ejemplo:
;                 "IES. Isaac Peral" (Primera línea)
;                "       24.5ºC   " (Segunda línea).
;        Donde en la primera línea se visualiza un mensaje publicitario y en la
;        segunda línea la temperatura medida actual.
; B)    Ajuste del termostato, modo "Termostato_Ajuste". Por ejemplo:
;                 "Temper. deseada" (Primera línea)
;                "        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:
;                 "Termostato: 25ºC" (Primera línea)
;                "      23.5ºC    " (Segunda línea).
;         Donde en la primera línea se visualiza la temperatura que se desea
;        ajustar y en la segunda línea la temperatura medida actual.
Visualiza
    btfsc    F_Termostato_OFF
    goto    VisualizaTermometro
    btfsc    F_Termostato_Ajuste
    goto    VisualizaTermostato_Ajuste
    btfsc    F_Termostato_ON
    goto    VisualizaTermostato_ON
    return

; "VisualizaTermostato_ON" --------------------------------------------------------------
;
; Visualiza el valor de la temperatura deseada en la primera línea y el valor de la
; temperatura medida en la segunda línea.
; 
VisualizaTermostato_ON
    call    LCD_Linea1
    movlw    MensajeTermostato_ON
    call    LCD_Mensaje
    call    VisualizaTemperaturaDeseada
    call    VisualizaTemperaturaMedida
    return

; "VisualizaTermostatoAjuste" y "VisualizaTemperaturaDeseada" ---------------------------
;
; Visualiza en la pantalla el formato propio de este modo.
; 
; Entradas:    (TemperaturaDeseada) temperatura ajustada en la subrutina Incrementar.

VisualizaTermostato_Ajuste
    call    LCD_Linea1                    ; Se sitúa al principio de la primera línea.
    movlw    MensajeTermostato_Ajuste    ; Visualiza mensaje en la primera línea.
    call    LCD_Mensaje
    movlw    .6                            ; Se coloca para centrar visualización en la 
    call    LCD_PosicionLinea2            ; segunda línea.
VisualizaTemperaturaDeseada
    movf    TemperaturaDeseada,W
    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_Mensaje
    return

; "VisualizaTermometro" y ""VisualizaTemperaturaMedida" ---------------------------------
;
; En la primera línea se visualiza un mensaje publicitario y en la segunda línea la
; temperatura medida
;
; Entradas:
;      -    (DS18B20_Temperatura), temperatura medida en valor absoluto.
;     -    (DS18B20_TemperaturaDecimal), parte decimal de la temperatura medida.
;     -    (DS18B20_Signo), registro con el signo de la temperatura. Si es igual a
;        b'00000000' la temperatura es positiva. Si es b'11111111' resulta que
;        la temperatura es negativa.
;
VisualizaTermometro
    call    LCD_Linea1                ; Se sitúa al principio de la primera línea.
    movlw    MensajePublicitario
    call    LCD_Mensaje
VisualizaTemperaturaMedida
    movlw    .5                        ; Se coloca para centrar visualización en la
    call    LCD_PosicionLinea2        ; segunda línea.
    btfss    DS18B20_TemperaturaSigno,7 ; ¿Temperatura negativa?
    goto    TemperaturaPositiva        ; No, es positiva.
TemperaturaNegativa:
    movlw     '-'                        ; Visualiza el signo "-" de temperatura negativa.
    call    LCD_Caracter
TemperaturaPositiva
    movf    DS18B20_Temperatura,W
    call    BIN_a_BCD                ; La pasa a BCD.
    call    LCD_Byte                ; Visualiza apagando los ceros no significativos.
    movlw    '.'                        ; Visualiza el punto decimal.
    call    LCD_Caracter
    movf    DS18B20_TemperaturaDecimal,W ; Visualiza la parte decimal.
    call    LCD_Nibble
    movlw    MensajeGradoCentigrado    ; En pantalla LCD aparece "ºC  ".
    call    LCD_Mensaje
    return

; Subrutina "Termostato" ----------------------------------------------------------------
;
; Controla una carga en función del valor de la temperatura medida respecto de la temperatura
; 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 la
; 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 estado
; anterior, tanto si está encendida como apagada.
;
; Para temperaturas negativas la salida se debe activar siempre.
;
; Entradas:
;         -    (DS18B20_Temperatura), temperatura medida en valor absoluto.
;         -    (TemperaturaDeseada), temperatura a partir de la cual se tomarán
;            decisiones sobre la salida.
;         -    (DS18B20_Signo), registro con el signo de la temperatura medida. Si es cero
;            la temperatura es positiva y todos sus bits son "1", es negativa.
;
; Salida:    -    Su funcionamiento:
;              -    Estando apagada, si la temperatura medida desciende por debajo de la
;                temperatura deseada la salida se activará.
;             -    Estando encendida, si la temperatura medida supera la deseada la
;                salida se apagará.
;             -    Si las temperaturas medidas y deseada son iguales se queda en estado
;                anterior, tanto si está encendida como si está apagada.
;             -    Para temperaturas negativas la salida se debe activar siempre.
Termostato
    btfss    F_Termostato_ON            ; Si el termostato no está activado salta a
    goto    ApagaCarga                ; apagar la carga.
    btfsc    DS18B20_TemperaturaSigno,7    ; Con temperaturas negativas pasa a activar
    goto    EnciendeCarga            ; la carga.
    btfss    SalidaTermostato        ; Comprueba el estado actual de la salida para
    goto    SalidaEstabaApagada        ; actuar en consecuencia.
SalidaEstabaActivada                ; Pasa a comprobar si tiene que apagar la carga.
    movf    DS18B20_Temperatura,W
    subwf    TemperaturaDeseada,W    ; (W)=(TemperaturaDeseada)-(DS18B20_Temperatura).
    btfsc    STATUS,C                ; ¿(TemperaturaDeseada)<(DS18B20_Temperatura)?    
    goto    FinTermostato            ; Sí, por tanto, lo deja encendido y sale.
    call    Pitido                    ; Pitido cada vez que conmuta la carga.
ApagaCarga
    bcf        SalidaTermostato        ; Apaga la salida y sale.
    goto    FinTermostato
SalidaEstabaApagada                    ; Pasa a comprobar si tiene que encender la carga
    movf    TemperaturaDeseada,W
    subwf    DS18B20_Temperatura,W    ; (W)=(DS18B20_Temperatura)-(TemperaturaDeseada).
    btfsc    STATUS,C                ; ¿(DS18B20_Temperatura)<(TemperaturaDeseada)?    
    goto    FinTermostato            ; Sí, la deja apagada y sale.
EnciendeCarga
    call    Pitido                    ; Pitido cada vez que activa la carga.
    bsf        SalidaTermostato
FinTermostato
    return

; Subrutinas "CambiarModo" y "ModoTermostato_OFF" -----------------------------------------
;
; Subrutina de atención a la interrupción producida por el pulsador "MODO" que cambia el modo
; de funcionamiento. Cada vez que pulsa pasa por los modos "Termostato_Ajuste", "Termostato_ON",
; "Termostato_OFF" y vuelta repetir.
;
; El ajuste de la temperatura deseada en el termostato se logra mediante dos pulsadores: "MODO"
; e "INCREMENTAR" conectados a pines del Puerto B.

; Al principio aparecerá sólo el termómetro y el termostato estará desactivado: modo
; "Termostato_OFF"
;
; Para comprender el funcionamiento de esta subrutina, hay que saber que el registro FlagsModos
; contiene 3 flags que permiten diferenciar cada uno de los modos de funcionamiento:
; A)    Modo "Termostato_OFF", donde funciona como termómetro normal sin termostato. Se
;        reconoce por el flag F_Termostato_OFF, que es el bit 0 del registro FlagsModos.
; B)    Modo "Termostato_Ajuste", donde se ajusta la temperatura deseada cuando funcione
;        como termostato. Se reconoce por el flag F_Termostato_Ajuste, que es el bit 1 del
;        registro FlagsModos.
; C)    Modo "Termostato_ON", donde funciona como termómetro normal y, además, como termostato.
;        Se reconoce por el flag F_Termostato_ON, que es el bit 2 del registro FlagsModos.
;
; Así pues, el contenido del registro (FlagsModos) identifica los siguientes modos de
; funcionamiento:
; - (FlagsModos)=b'00000001'. Está en el modo "Termostato_OFF".
; - (FlagsModos)=b'00000010'. Está en el modo "Termostato_Ajuste".
; - (FlagsModos)=b'00000100'. Está en el modo "Termostato_ON".

; Pueden darse dos casos:
; -    Que pulse "AJUSTE" estando en el modo más alto, "Termostato_ON",
;    (FlagsModos)=b'00000100'. En este caso debe pasar al modo inicial 
;    "Termostato_OFF" poniendo (FlagsModos)=b'00000001'.
; -    Que pulse "AJUSTE" estando ya en cualquiera de los otros dos modos, en cuyo caso debe
;    pasar al siguiente modo. Esto lo hace mediante un desplazamiento a izquierdas. Así, por
;    ejemplo, si antes estaba en modo "Termostato_OFF", (FlagsModos)=b'00000001', pasará a
;    (FlagsModos)=b'00000010' que identifica al modo "Termostato_Ajuste".
;
CambiarModo
    call    Retardo_20ms            ; Espera a que se estabilicen niveles de tensión.
    btfsc    ModoPulsador            ; Si es un rebote, sale fuera.
    goto    FinCambiarModo
    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_OFF
    call    Pitido                    ; Pitido cada vez que conmuta la carga.
    bcf        SalidaTermostato        ; Apaga la carga.
    movlw    b'00000001'                ; Actualiza el registro FlagsModos pasando al
    movwf    FlagsModos                ; modo inicial "Termostato_OFF".
    goto    BorraPantalla
ModoSiguiente                        ; Desplaza un "1" a la izquierda del registro
    bcf        STATUS,C                ; FlagsModos para ajustar secuencialmente
    rlf        FlagsModos,F            ; cada uno de los modos de funcionamiento.
BorraPantalla
    call    LCD_Borra                ; Borra la pantalla anterior.
FinCambiarModo
    call    Visualiza
    btfss    ModoPulsador            ; Ahora espera a que deje de pulsar.
    goto    FinCambiarModo
    return

; Subrutina "IncrementarTempDeseada" ----------------------------------------------------
;
; Subrutina de atención a la interrupción por cambio de la línea RB6 a la cual se ha conectado
; el pulsador "INCREMENTAR". Estando en el modo "Termostato_Ajustar" incrementa el valor de
; la temperatura deseada entre unos valores máximo y mínimo.
;
; Al final debe guardar el valor de la temperatura deseada en memoria EEPROM de datos para
; preservar su valor en caso que desaparezca la alimentación.
;
TemperaturaMinima   EQU    .20
TemperaturaMaxima   EQU    .36

IncrementarTempDeseada
    call    Retardo_20ms            ; Espera a que se estabilicen niveles de tensión.    
    btfsc    IncrementarPulsador        ; Si es un rebote sale fuera.
    goto    FinIncrementar
    btfss    F_Termostato_Ajuste        ; Si no está en modo "Termostato_Ajuste" sale
    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?
    goto    VisualizaIncremento        ; No, pasa a visualizarlo.
    movlw    TemperaturaMinima        ; Sí, entonces inicializa el registro.
    movwf    TemperaturaDeseada
VisualizaIncremento
    call    Visualiza                ; Visualiza mientras espera a que deje
    call    Retardo_200ms            ; de pulsar.
    btfss    IncrementarPulsador        ; Mientras permanezca pulsado,
    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 conserva
    movf    TemperaturaDeseada,W    ; aunque se apague la alimentación.
    call    EEPROM_EscribeDato
FinIncrementar
    return

; Subrutina de pitidos ------------------------------------------------------------------
;
PitidoLargo
    bsf        Zumbador
    call    Retardo_500ms
Pitido
    bsf        Zumbador
    call    Retardo_200ms
PitidoCorto
    bsf        Zumbador
    call    Retardo_20ms
    bcf        Zumbador
    return
;
    INCLUDE  <DS18B20.INC>            ; Subrutinas de control del termómetro digital.
    INCLUDE  <BUS_1LIN.INC>            ; Subrutinas de control del bus de 1 línea.
    INCLUDE  <RETARDOS.INC>
    INCLUDE  <BIN_BCD.INC>
    INCLUDE  <LCD_4BIT.INC>
    INCLUDE  <LCD_MENS.INC>
    INCLUDE  <EEPROM.INC>
    END
    
;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
02/02/2012 #18

Avatar de dragondgold

C18 no te va a servir porque solo es para PIC18F, vas a tener que usar Hi-Tech PIC16 o CCS.

Pasar un programa de ASM a C (en mi experiencia) no conviene es mejor reescribirlo porque sus estructuras son diferentes, sí podes guiarte pero no más. Para pasar esto a CCS sabiendolo no te toma demasiado, muy poco diría yo, el protocolo de bus de 1 línea no viene incluido en ninguno de los dos compiladores pero está en la red, las librerías de LCD ambos poseen, la librería del DS18B20 creo es la única que deberías escribir pero es muy sencilla porque son solo los comando a través del protocolo One-Wire, lo demás es programar.

El problema de los programas en ASM es precisamente este, es difícil o engorroso modificarlos o ampliarlos. Si quieres puedo empezarte algo en CCS, particularmente C18-C30-C32 así como toda la línea Hi-Tech solo los uso para gamas más alta como PIC24F o dsPIC, yo siempre recomendé para PIC16 CCS porque su código es muy eficiente y es fácil desarrollar programas para esta gama de PICs, aunque CCS no tenga todo el potencial de C tampoco es muy explotable el mismo en la gama 16F por eso lo recomiendo, en 18F hay casos en que no es suficiente y hay que pasarse a C18 o a PIC18.

Si quieres puedo darte una mano con el programa en CCS es bastante sencillo ese programa, como lectura te recomiendo el libro "COMPILADOR C CCS Y SIMULADOR PROTEUS PARA MICROCONTROLADORES PIC". No es básico ni avanzado sino un intermedio, es un muy buen libro podes descargarlo o comprarlo, explica muy bien los aspectos del CCS.

http://www.cuspide.com/isbn/9701513975

Cualquier ayuda que necesites no dudes en preguntarme .

Saludos !!!
02/02/2012 #19

Avatar de Meta

Lo del C18 lo digo porque me bajé el MPLAB X y el C18 que ya instalé. También por el tema que aquí hay tutoriales del C18 suky y libros también como este en ASM y C18.

Probaré el CCS por curiosidad e intenar hacer pruebas con esos ejemplos del ASM al C.
02/02/2012 #20

Avatar de dragondgold

Perfecto Meta pero si quieres usar C18 obligadamente tendrás que usar un PIC18F, Microchip dejó de lado los compiladores C para 16F y se los dejó a Hi-Tech que también anunció que no los iba a actualizar más y se iban a dedicar a las gamas 18F,24F,30F,33F y 32.

Es por eso que por lo que he probado CCS es lo mejor con respecto a 16F.

Saludos !!
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.