FAQ FAQ  •  Buscar Buscar  •  Registrarse Registrarse  •  Entre para ver sus mensajes privados Entre para ver sus mensajes privados  • Login Login

1, 2  Siguiente

Grabar en la EEPROM el modo.

Índice de los Foros Electronica Facil » FOROS ELECTRONICA » Microcontroladores PIC
Publicar nuevo tema   Responder al tema
Ver tema anteriorEntre para ver sus mensajes privadosVer tema siguiente
AutorMensaje
Meta
Asunto: Grabar en la EEPROM el modo. MensajePublicado: 21 Dic, 2010 - 02:42
Experto
Experto


Registrado: 03 Sep, 2008
Mensajes: 125

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?

Código:
;********************************** INT_Temporizador.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 temporizador digital de precisión. La programación del tiempo
; de temporización se realiza mediante dos pulsadores: "AJUSTE" y "ON/INCREM". Funcionamiento:
;     -    En estado de reposo la salida del temporizador está apagada y el pantalla aparece el
;        tiempo deseado para la próxima temporización.
;     - Si se pulsa "ON/INCREM" comienza la temporización.
;     - Cuando acaba la temporización pasa otra vez a reposo.
;     -    Si pulsa "AJUSTE" antes que haya acabado el tiempo de temporización actúa como pulsador
;        de paro: interrumpe la temporización, apaga la carga y pasa al estado de reposo.
;
; Para ajustar la temporización al tiempo deseado.
;     -    Pulsa "AJUSTE" y ajusta el tiempo deseado mediante el pulsador "ON/INCREM".
;     -    Se vuelve a pulsar "AJUSTE" y pasa a modo de reposo.
;
; Al apagar el sistema debe conservar el tiempo de temporización deseado 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
    ModoDeseado
    TiempoDeseado                ; El tiempo deseado de temporización.
    Tiempo                        ; Tiempo que resta de temporización.
    FlagsModos                    ; Guarda los flags con los diferentes
    ENDC                        ; modos de funcionamiento.

    ORG    0x2100                    ; Corresponde a la dirección 0 de la zona
                                ; EEPROM de datos. Aquí se va a guardar el
    DE    0x00                    ; tiempo de temporización deseado.

#DEFINE  F_Temporizador_ON        FlagsModos,2
#DEFINE  F_Temporizador_Ajuste    FlagsModos,1
#DEFINE  F_Temporizador_OFF        FlagsModos,0

#DEFINE  SalidaTemporizador     PORTB,1        ; Salida donde se conecta la carga.
#DEFINE  Zumbador                 PORTB,2        ; Salida donde se conecta el zumbador.
#DEFINE  AjustePulsador            PORTB,7        ; Los pulsadores están conectados a estas
#DEFINE  IncrementarPulsador    PORTB,6        ; líneas del Puerto B.

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

    ORG     0
    goto    Inicio
    ORG    4
    goto    ServicioInterrupcion

Mensajes
    addwf    PCL,F
Mensaje_ON
    DT "   En MARCHA", 0x00
Mensaje_Ajuste
    DT "Tiempo  deseado:", 0x00
Mensaje_OFF
    DT "     PARADO", 0x00

; Instrucciones de inicialización. ------------------------------------------------------
;
Inicio
    call    LCD_Inicializa
    bsf        STATUS,RP0
    movlw    b'10000111'                    ; Prescaler de 256 asignado al TMR0.
    movwf    OPTION_REG
    bsf        AjustePulsador                ; Configurados como entradas.
    bsf        IncrementarPulsador
    bcf        SalidaTemporizador            ; Configurados como salidas.
    bcf        Zumbador
    bcf        STATUS,RP0
    clrw                                ; Lee la posición 0x00 de memoria EEPROM de datos
    call    EEPROM_LeeDato                ; donde se guarda el tiempo deseado de la última vez
    movwf    TiempoDeseado                ; que se ajustó.
    call    ModoTemporizador_OFF        ; Modo de funcionamiento inicial.
    movlw    b'10001000'                    ; Activa interrupciones RBI.
    movwf    INTCON
Principal
    goto    Principal

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

ServicioInterrupcion
    btfsc    INTCON,T0IF
    call    Temporizador
    btfss    INTCON,RBIF                    ; Si es una interrupción RBI lee los pulsadores.
    goto    FinInterrupcion
    btfss    AjustePulsador                ; ¿Está presionado el pulsador de "AJUSTE"?.
    call    CambiarModo                    ; Sí, pues salta a la subrutina correspondiente.
    btfsc    IncrementarPulsador            ; ¿Pulsado "ON/INCREM"?.
    goto    FinInterrupcion                ; No, pues salta al final y sale.
;
    call    Retardo_20ms                ; Espera que se estabilice el nivel de tensión.
    btfsc    IncrementarPulsador            ; Si es un rebote del pulsador "ON/INCREM" sale fuera.
    goto    FinInterrupcion
    btfsc    F_Temporizador_OFF            ; ¿Estaba en reposo cuando pulsó "ON/INCREM"?
    call    ModoTemporizador_ON            ; Sí, pues comienza la temporización.
    btfsc    F_Temporizador_Ajuste        ; ¿Estaba ajustando tiempo?
    call    IncrementarTiempoDeseado    ; Sí, pues pasa a incrementar el tiempo deseado.
FinInterrupcion
    bcf        INTCON,RBIF                    ; Limpia los flags de reconocimiento.
    bcf        INTCON,T0IF
    retfie

; Subrutinas "CambiarModo" y todas las de MODO de funcionamiento ------------------------
;
; Subrutina de atención a la interrupción producida al presionar el pulsador "AJUSTE" que
; cambia el modo de funcionamiento.

; Hay identificados tres modos de funcionamiento que se diferencian mediante los tres flags:
;    A)    Modo "Temporizador_OFF" o estado inicial. A él se pasa en el estado inicial cada vez
;        que termina una temporización o cuando se aborta la temporización sin esperar a que
;        finalice. Reconocido por el flag F_Temporizador_OFF, bit 0 del registro FlagsModos.
;         una temporización  o cada vez que se aborta la temporización sin esperar a que finalice.
;    B)    Modo "Temporizador_Ajuste", donde se ajusta la temporización deseada cuando funcione
;        como temporizador. Reconocido por el flag F_Temporizador_Ajuste, bit 1 del FlagsModos.
;    C)    Modo "Temporizador_ON", la salida está activada mientras dure la temporización.
;        Reconocido por el flag F_Temporización_ON, que es el bit 2 del registro FlagsModos.
;
; El programa consigue que esté activado uno sólo de los flags anteriores.

; El contenido del registro (FlagsModos) diferencia los siguientes modos de funcionamiento:
; - (FlagsModos)=b'00000001'. Está en el modo "Temporizador_OFF", en reposo.
; - (FlagsModos)=b'00000010'. Está en el modo "Temporizador_Ajuste", ajustando tiempo deseado.
; - (FlagsModos)=b'00000100'. Está en el modo "Temporizador_ON", activa la carga y temporizador.
;
; Al pulsar "AJUSTE" pueden darse tres casos:
; - Si estaba en modo "Temporizador_OFF", pasa a modo "Temporizador_Ajuste".
; - Si estaba en modo "Temporizador_Ajuste", pasa a modo "Temporizador_OFF", pero antes salva
;   el tiempo de temporización deseado en la EEPROM de datos.     
; - Si estaba en modo "Temporizador_ON", pasa a modo "Temporizador_OFF". (Interrumpe la
;   temporización).

CambiarModo
    call    PitidoCorto                    ; Cada vez que pulsa origina un pitido.
    btfsc    AjustePulsador                ; Si es un rebote sale fuera.
    goto    EsperaDejePulsar
    btfsc    F_Temporizador_OFF            ; ¿Está en reposo?
    goto    ModoTemporizador_Ajuste        ; Sí, pues pasa a ajustar la temporización.
    btfss    F_Temporizador_Ajuste        ; ¿Está ajustando?
    goto    ModoTemporizador_OFF        ; No, pues pasa a reposo.
                                        ; Sí, pues antes de pasar a reposo salva en la
    clrw                                ; posición 00h de memoria EEPROM de datos el tiempo
    movwf    EEADR                        ; de temporización deseado. Se conserva aunque se
    movf    TiempoDeseado,W                ; apague la alimentación.
    call    EEPROM_EscribeDato
ModoTemporizador_OFF
    bcf        SalidaTemporizador            ; Apaga la carga y resetea tiempo deseado.
    call    Pitido
    movlw    b'00000001'                ; Actualiza el registro FlagsModos pasando al
    movwf    FlagsModos                ; modo inicial "Temporizador_OFF".
    bcf        INTCON,T0IE                ; Prohíbe las interrupciones del TMR0.
    movf    TiempoDeseado,W            ; Repone otra vez el tiempo que se desea para la
    movwf    Tiempo                    ; próxima temporización.
    call    LCD_Borra                ; Borra la pantalla.
    movlw    Mensaje_OFF                ; En pantalla el mensaje correspondiente.
    goto    FinCambiarModo

ModoTemporizador_Ajuste
    bcf        SalidaTemporizador        ; Apaga la carga
    movlw    b'00000010'                ; Actualiza el registro FlagsModos pasando al
    movwf    FlagsModos                ; modo "Temporizador_Ajuste".
    clrf    Tiempo                    ; Resetea el tiempo.
    clrf    TiempoDeseado
    bcf        INTCON,T0IE                ; Prohíbe las interrupciones del TMR0.
    call    LCD_Borra
    movlw    Mensaje_Ajuste            ; En pantalla el mensaje correspondiente.
    goto    FinCambiarModo

ModoTemporizador_ON
    movf    TiempoDeseado,W            ; Si el tiempo deseado es cero pasa a modo
    btfsc    STATUS,Z                ; de trabajo "Temporizador_OFF".
    goto    ModoTemporizador_OFF
    movwf    Tiempo
    call    PitidoCorto
    movlw    b'00000100'                ; Actualiza el registro FlagsModos pasando al
    movwf    FlagsModos                ; modo "Temporizador_ON".
    movlw    TMR0_Carga50ms            ; Carga el TMR0.
    movwf    TMR0
    movlw    CARGA_1s                ; Y el registro cuyo decremento contará los
    movwf    Registro50ms            ; segundos.
    bsf        INTCON,T0IE                ; Autoriza las interrupciones de TMR0.
    call    LCD_Borra
    bsf        SalidaTemporizador        ; Enciende la carga.
    movlw    Mensaje_ON                ; En pantalla el mensaje correspondiente.
FinCambiarModo
    call    LCD_Mensaje
    call    VisualizaTiempo
EsperaDejePulsar
    btfss    AjustePulsador            ; Espera deje de pulsar.
    goto    EsperaDejePulsar
    return

; Subrutina "Temporizador" ----------------------------------------------------------------
;
; Esta subrutina va decrementando el tiempo de temporización y visualizándolo en la pantalla.
; Se ejecuta debido a la petición de interrupción del Timer 0 cada 50 ms exactos, comprobado
; experimentalmente con la ventana "Stopwatch" del simulador del MPLAB.

    CBLOCK
    Registro50ms                    ; Guarda los incrementos cada 50 ms.
    ENDC

TMR0_Carga50ms    EQU    d'256'-d'195'            ; Para conseguir la interrupción cada 50 ms.
CARGA_1s        EQU    d'20'            ; Leerá cada segundo (20 x 50ms = 1000 ms).   

Temporizador
    call    Retardo_50micros        ; Ajuste fino de 71 microsegundos para
    call    Retardo_20micros        ; ajustar a 50 milisegundos exactos.
    nop
      movlw    TMR0_Carga50ms            ; Carga el Timer0.
    movwf    TMR0
    decfsz    Registro50ms,F            ; Decrementa el contador.
    goto    FinTemporizador            ; No ha pasado 1 segundo y por tanto sale.
    movlw    CARGA_1s                ; Repone el contador nuevamente.
    movwf    Registro50ms
    btfss    F_Temporizador_ON        ; Si no está en modo "Temporizador_ON" sale
    goto    FinTemporizador            ; fuera.
    decfsz    Tiempo,F
    goto    VisualizaContador        ; Visualiza el tiempo restante.
    bcf        SalidaTemporizador        ; Apaga la salida
    call    VisualizaTiempo            ; Visualiza cero segundos en la pantalla.
    call    Pitido                    ; Tres pitidos indican final de la temporización.
    call    Retardo_500ms
    call    Pitido
    call    Retardo_500ms
    call    PitidoLargo
    call    Retardo_500ms
    call    ModoTemporizador_OFF    ; Acabó la temporización.
    goto    FinTemporizador
VisualizaContador
    call    VisualizaTiempo
FinTemporizador
    return

; Subrutina "VisualizaTiempo" -----------------------------------------------------------------
;
; Visualiza el registro Tiempo en formato "Minutos:Segundos". Así por ejemplo, si
; (Tiempo)=124 segundos en la segunda línea de la pantalla visualiza " 2:04", ya que 124
; segundos es igual a 2 minutos más 4 segundos.
;
VisualizaTiempo
    movlw    .5                        ; Para centrar visualización en la
    call    LCD_PosicionLinea2        ; segunda línea.
    movf    Tiempo,W                ; Convierte el tiempo deseado (y expresado sólo en
    call    MinutosSegundos            ; segundos) a minutos y segundos.
    movf    TemporizadorMinutos,W    ; Visualiza los minutos.
    call    BIN_a_BCD                ; Lo pasa a BCD.
    call    LCD_Byte
    movlw    ':'                        ; Visualiza dos puntos.
    call    LCD_Caracter
    movf    TemporizadorSegundos,W    ; Visualiza los segundos.
    call    BIN_a_BCD                ; Lo pasa a BCD.
    goto    LCD_ByteCompleto
    return

; Subrutina "MinutosSegundos" -----------------------------------------------------------
;
; Una cantidad expresada exclusivamente en segundos y contenida en el registro W es
; convertida a minutos y segundos. El resultado se guarda en dos posiciones de memoria
; llamadas TemporizadorMinutos y TemporizadorSegundos.
;
; El máximo número a convertir será el 255 que es el máximo valor que puede adquirir el
; número binario de entrada de 8 bits. (255 segundos = 4 minutos + 15 segundos)
;
; El procedimiento utilizado es mediante restas de 60 tal como se explica en el siguiente
; ejemplo que trata de la conversión del 124 segundos a minutos y segundos.
; 124 segundos = 2 minutos + 4 segundos.
;
; Minutos        Segundos     ¿(Segundos)<60?
; -------        --------    ------------------------------------------------
;     0              124        NO. Resta 60 a (Segundos) e incrementa (Minutos).
;     1               64         NO. Resta 60 e (Segundos) e incrementa (Minutos).
;     2                4        Sí, se acabó.
;
; Entrada:    En el registro W el número de segundos a convertir.
; Salidas:    En (TemporizadorMinutos) y (TemporizadorSegundos) el resultado.

    CBLOCK
    TemporizadorMinutos
    TemporizadorSegundos
    ENDC
;
MinutosSegundos
    movwf    TemporizadorSegundos    ; Carga el número de segundos a convertir.
    clrf    TemporizadorMinutos        ; Carga los registros con el resultado inicial.
Resta60
    movlw    .60                        ; Resta 60 en cada pasada.
    subwf    TemporizadorSegundos,W    ; (W)=(TemporizadorSegundos)-60.
    btfss    STATUS,C                ; ¿(W) positivo?, ¿(TemporizadorSegundos)>=60?.
    goto     FinMinutosSegundos        ; No, es menor de 60. Acabó.
    movwf    TemporizadorSegundos    ; Sí, por tanto, recupera lo que queda por restar.
    incf    TemporizadorMinutos,F    ; Incrementa los minutos.
    goto    Resta60                    ; Y vuelve a dar otra pasada.
FinMinutosSegundos
    return

; Subrutina "IncrementarTiempoDeseado" --------------------------------------------------
;
; 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 "Temporizador_Ajustar" incrementa el valor del tiempo deseado
; expresado en segundos en intervalos de 5 segundos y hasta un máximo de 255 segundos.
;
SALTO_INCR    EQU    .5

IncrementarTiempoDeseado
    call    PitidoCorto                ; Cada vez que pulsa se oye un pitido.
    movlw    SALTO_INCR                ; Incrementa el tiempo deseado de temporización
    addwf    Tiempo,F                ; saltos de SALTO_INCR segundos.
    btfsc    STATUS,C                ; Si pasa del valor máximo lo inicializa.
    clrf    Tiempo
    call    VisualizaTiempo            ; Visualiza mientras espera que deje de pulsar.
    call    Retardo_200ms
    btfss    IncrementarPulsador        ; Mientras permanezca pulsado,
    goto    IncrementarTiempoDeseado ; incrementa el dígito.
    movf    Tiempo,W                ; Actualiza el tiempo deseado.
    movwf    TiempoDeseado            ; Este es el tiempo deseado.
    return
   
; Subrutinas "PitidoLargo", "Pitido" y "PitidoCorto" -------------------------------------
;
PitidoLargo
    bsf        Zumbador
    call    Retardo_500ms
Pitido
    bsf        Zumbador
    call    Retardo_200ms
PitidoCorto
    bsf        Zumbador
    call    Retardo_20ms
    bcf        Zumbador
    return
;
    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
;    ===================================================================
Felices fiestas 2010.
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
Meta
Asunto:  MensajePublicado: 21 Dic, 2010 - 04:29
Experto
Experto


Registrado: 03 Sep, 2008
Mensajes: 125

Corrijo, me el código es un termoestato y arriba puse el temporizador.

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?

Código:
;********************************* DS1820_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 DS1820 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
    ERRORLEVEL    -302

    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 ; 2
#DEFINE  F_Termostato_Ajuste    FlagsModos,1    ; temperatura del termostato. ; 1
#DEFINE  F_Termostato_OFF        FlagsModos,0    ; 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 "Electronica PIC", 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'00000111'                ; Prescaler de 256 para el TMR0 y habilita
    movwf    OPTION_REG                ; resistencias de Pull-Up del Puerto B.
    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    DS1820_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    DS1820_LeeTemperatura    ; Lee la temperatura.
    call    DS1820_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:
;      -    (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 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    DS1820_TemperaturaSigno,7 ; ¿Temperatura negativa?
    goto    TemperaturaPositiva        ; No, es positiva.
TemperaturaNegativa:
    movlw     '-'                        ; Visualiza el signo "-" de temperatura negativa.
    call    LCD_Caracter
TemperaturaPositiva
    movf    DS1820_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    DS1820_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:
;         -    (DS1820_Temperatura), temperatura medida en valor absoluto.
;         -    (TemperaturaDeseada), temperatura a partir de la cual se tomarán
;            decisiones sobre la salida.
;         -    (DS1820_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    DS1820_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    DS1820_Temperatura,W
    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.
ApagaCarga
    bcf        SalidaTermostato        ; Apaga la salida y sale.
    goto    FinTermostato
SalidaEstabaApagada                    ; Pasa a comprobar si tiene que encender la carga
    movf    TemperaturaDeseada,W
    subwf    DS1820_Temperatura,W    ; (W)=(DS1820_Temperatura)-(TemperaturaDeseada).
    btfsc    STATUS,C                ; ¿(DS1820_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  <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>
    INCLUDE  <BIN_BCD.INC>
    INCLUDE  <LCD_4BIT.INC>
    INCLUDE  <LCD_MENS.INC>
    INCLUDE  <EEPROM.INC>
    END
   

Felices fiestas 2010.




Prederterminado viene así los modos.

Código:
#DEFINE  F_Termostato_ON        FlagsModos,2    ; Flags utilizados en el ajuste de la ; 2
#DEFINE  F_Termostato_Ajuste    FlagsModos,1   ; temperatura del termostato. ; 1
#DEFINE  F_Termostato_OFF        FlagsModos,0    ; 0
He cambiado el 2 por el 0 y al revés.

Código:
#DEFINE  F_Termostato_ON        FlagsModos,0    ; Flags utilizados en el ajuste de la ; 2
#DEFINE  F_Termostato_Ajuste    FlagsModos,1    ; temperatura del termostato. ; 1
#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.
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
rina
Asunto:  MensajePublicado: 23 Dic, 2010 - 03:44
Fanatico de la Electronica
Fanatico de la Electronica


Registrado: 14 Ago, 2005
Mensajes: 1894

anda meta en este no me avia fijado na me parece que el nivel que tas pidiendo ya queda un poco mas alto de lo que se encuentra aqui... pero no ta mal
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
Meta
Asunto:  MensajePublicado: 23 Dic, 2010 - 03:54
Experto
Experto


Registrado: 03 Sep, 2008
Mensajes: 125

He conseguido que aparezca el último modo directamente a cambio de otro problema. Que no puedo cambiar de modo, se queda fijo.

Lo que he hecho hasta el momento es usar este código que está al principio y invertirle los modos.

Cita:
#DEFINE F_Temporizador_ON FlagsModos,2
#DEFINE F_Temporizador_Ajuste FlagsModos,1
#DEFINE F_Temporizador_OFF FlagsModos,0


Le cambié el 2 por el 0 y viceversa.

Código:
#DEFINE  F_Temporizador_ON        FlagsModos,0
#DEFINE  F_Temporizador_Ajuste    FlagsModos,1
#DEFINE  F_Temporizador_OFF        FlagsModos,2


Me funciona el termostato, mide bien pero no puedo cambiar de modo y se queda así condenado.

Más abajo hay una única instrucción llamad rlf. No cambiarla por rrf funciona.

Si se les ocurre una nueva idea la suelta por aquí. Se me ocurrió una, usar un botón externo por cada modo, su desventaja que debo usar cada botón externo.

Cuando consiga mi ojetivo, empezaré a hacer la PCB y se lo muestro, después la insoladora casera.

Ver vídeo:
http://www.youtube.com/watch?v=R5863PaHnRk

Saludo.
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
rina
Asunto:  MensajePublicado: 23 Dic, 2010 - 03:56
Fanatico de la Electronica
Fanatico de la Electronica


Registrado: 14 Ago, 2005
Mensajes: 1894

y al programa sele ve descaradamente una lijera errata hayuna parte donde ace una parada un bugle que se queda hay.
despues de degrarar las variables etc, entras en el programa principal o el de inicio solo que le falta un goto inicio u automatucamente se queda repitiendose en la parte de
Principal
goto Principal

me imajino que hay se quedra la cosa...

no se nin eso simplemente es un fallo un poco visible de primeras porlodemas no chano ese lenguaje pero con cosas asi de esplicadas se puede aprender rapido..
un saludo
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
rina
Asunto:  MensajePublicado: 23 Dic, 2010 - 03:59
Fanatico de la Electronica
Fanatico de la Electronica


Registrado: 14 Ago, 2005
Mensajes: 1894

na pero que no tengo yo nada pa saver que defines hay ni nada aparte que nunca consegui unos manuales curiosos dl mplab ni en ingles..
y lo unico que tengo echo es en picbasic y me limita vastante las pisivilidades del pic porcierto
un saludo
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
Meta
Asunto:  MensajePublicado: 23 Dic, 2010 - 04:03
Experto
Experto


Registrado: 03 Sep, 2008
Mensajes: 125

Lo del...

Principal
goto Principal


... se queda ahí porque está en reposo es perando que hay algún evento com pulsar un botón y salta a este código.

ORG 4
goto ServicioInterrupcion


Jejej.

Aquí hay un mini tutorial del MPLAB para novaros de uso rápido.

http://electronica-pic.blogspot.com/201 ... apido.html

Saludo.
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
rina
Asunto:  MensajePublicado: 23 Dic, 2010 - 04:10
Fanatico de la Electronica
Fanatico de la Electronica


Registrado: 14 Ago, 2005
Mensajes: 1894

o que si que con tanto comentario me pierdo en la estructura en la que vasas su flujo de comandos..
me refiero alo que es el programa principal subrrutinas o partes inependientes del programa principal( eso lo denominaria una series de funciones que solo se acen devez en cuendo y o es necesario que esten dentro del fujo principal del programa que si saltaria con un goto se quedaria en esa zona el programa funcionando asta que alla que salir y regresar con un goto pero estaria al final del todo del pic y del flujo de trabajo normal)
si me esplico te curas un rceptor de mando a distancia que controla el termostato ese etc pero quiers que pueda fincionar con cualquier mando y le das la posivilidad de identificar en codigo y guardarlo en la epron para despues siempre usar el mando a distancia que escojiste eso me refiero un programa secundario realmente nunca funciona en el flujo del programa principal que es detectar la tecla pulsada del mando y acer una funcion con el termostato simplemente es una funcion que se puede usal aguna vez por canviar de mando..
nose si con las esplicaciones toavia te liare mas
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
rina
Asunto:  MensajePublicado: 23 Dic, 2010 - 04:20
Fanatico de la Electronica
Fanatico de la Electronica


Registrado: 14 Ago, 2005
Mensajes: 1894

hombre un video no ta mal aunque prestaba mas por escrito.. vamos lo que hace cada comando y como actua.
y porcierto en reposo asi no se queda sequeda parado mas bien ya pone por hay que si se pone en reposo se apagan la funcion del timer y mas istorias paraaorrar energia.

o porcierto en la parte del principio:
ORG 0
goto Inicio
ORG 4
goto ServicioInterrupcion

no tengo ni dea que ace el comando org.. jejej
y lo que no entiendo como esta el goto antes que el programa principal
que se supone que es esa la parte principal del programa???
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
rina
Asunto:  MensajePublicado: 23 Dic, 2010 - 04:39
Fanatico de la Electronica
Fanatico de la Electronica


Registrado: 14 Ago, 2005
Mensajes: 1894

nda pues fijeme ahora na pues guai la guia la descargue de la pajina lo malo que bueno en ingles.... igual un dia seme da por provar algo simple de primeras que ests cosas son de pasito en pasito ya des pues teniendo partes de programas y subrutinas si se puede correr un poco copia y pega de aqui para alla..

un saludo
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
Mostrar mensajes anteriores:     
Cambiar a:  
Todas las horas son GMT
Publicar nuevo tema   Responder al tema
Ver tema anteriorEntre para ver sus mensajes privadosVer tema siguiente
1, 2  Siguiente
 Índice de los Foros Electronica Facil » FOROS ELECTRONICA »  Microcontroladores PIC
powered by phppowered by MySQLPOWERED BY APACHEPOWERED BY CentOS© 2004 - 2025Información Legalpoliticas de cookiesipv6 ready