Autor Tema: TERMOSTATO con pic 16f88  (Leído 2165 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado BORIScristian

  • PIC10
  • *
  • Mensajes: 13
TERMOSTATO con pic 16f88
« en: 23 de Marzo de 2016, 13:33:11 »
Estoy intentando hacer un termostato con un pic16f88 y un lm35, cuando lo simulo en proteus me tira error en el TAD, la pata que uso para tomar el voltaje analogico es la RA3, por ahora solo estoy intentando realizar la conversion y poder leer los datos, solo necesitaria ayuda con el ADC y del resto me encargaría yo, muchas gracias
;=============================este es mi código===============================
;====================================================================



; Main.asm file generated by New Project wizard
;
; Created:   mar mar 17 2015
; Processor: PIC16F88
; Compiler:  MPASM (MPLAB)
;====================================================================

;====================================================================
; DEFINITIONS
;====================================================================

#include p16f88.inc
             ; Include register definition file
__CONFIG _CONFIG1, _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF &  _MCLR_OFF& _LVP_OFF & _INTRC_IO


;====================================================================
; VARIABLES
;====================================================================
    cblock H'70'
    TEMPE
    GRADOS
    UNIDADES
    DECENAS
    CENTENAS
    CounterA
    CounterB
    CounterC
    endc
;====================================================================
; RESET and INTERRUPT VECTORS
;====================================================================

      ORG   0x00
      goto  Start
;====================================================================
; CODE SEGMENT
;====================================================================

PGM   code


Start
;---------------------puertos--------------------------------------------------
      bsf       STATUS, RP0
      movlw    b'11111111'
      movwf    TRISA
      MOVLW     B'00000000'
      MOVWF     TRISB           ;configure entradas y salidas
      movlw     0x60
      movwf     OSCCON          ;reloj interno 4mhz
      MOVLW     B'00001000'
      MOVWF     ANSEL           ;entrada analogica ra3
;-----------------------a/d----------------------------------------------------
      MOVLW     B'10000000'
      MOVWF     ADCON1          ;SIN DIVISOR DE FRECUENCIA
      BANKSEL   ADCON0
      MOVLW     B'11011001'
      MOVWF     ADCON0
;------------------------PROGRAMA---------------------------------------------
    INICIO
      ;BANKSEL   ADCON0
      CALL      DELAY
      BSF       ADCON0,2        ;COMENZE LA CONVERSIÓN          ;ESPERO LA CONVERSIÓN
      BTFSS     ADCON0,2        ;PREGUNTO SI TERMINÓ
      CALL      CUENTA          ;SI TERMINÓ VOY A CUENTA
      CALL      MUESTRA


     
      GOTO      INICIO

 
    CUENTA
        CALL    DELAY
        CLRF    UNIDADES
        CLRF    CENTENAS
        CLRF    DECENAS
        MOVF    ADRESH,W
        ADDWF   ADRESH,W        ;DUPLICO EL VALOR PARA OBTENER GRADOS
        MOVWF   TEMPE

CENTENAS1      movlw   d'100'          ;W=d'100'
        subwf   TEMPE,W         ;Resto - d'100' (W)
        btfss   STATUS,C        ;Resto menor que d'100'?
        goto    DECENAS1        ;SI
        movwf   TEMPE           ;NO, Salva el resto
        incf    CENTENAS,1      ;Incrementa el contador de centenas BCD
        goto    CENTENAS1       ;Realiza otra resta
DECENAS1
        movlw   d'10'           ;W=d'10'
        subwf   TEMPE,W         ;Resto - d'10' (W)
        btfss   STATUS,C        ;Resto menor que d'10'?
        goto    UNIDADES1       ;Si
        movwf   TEMPE           ;No, Salva el resto
        incf    DECENAS,1       ;Incrementa el contador de centenas BCD
        goto    DECENAS1        ;Realiza otra resta
UNIDADES1
        movf    TEMPE,W         ;El resto son la Unidades BCD
        movwf   UNIDADES
        clrf    TEMPE
        RETURN

;OBTEN_ASCII                    ;Rutina que obtiene el equivalente en ASCII
;       movlw    h'30'
;       iorwf    UNIDADES,f
;       iorwf    DECENAS,f
;       iorwf    CENTENAS,f
;       return

MUESTRA
        MOVF    UNIDADES,PORTB
        RETURN

DELAY
    movlw   D'102'
      movwf   CounterC
      movlw   D'118'
      movwf   CounterB
      movlw   D'192'
      movwf   CounterA
loop      decfsz   CounterA,1
      goto   loop
      decfsz   CounterB,1
      goto   loop
      decfsz   CounterC,1
      goto   loop
      retlw   0
       

END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:TERMOSTATO con pic 16f88
« Respuesta #1 en: 23 de Marzo de 2016, 20:02:35 »
Citar
cuando lo simulo en proteus me tira error en el TAD,

Lo unico que indica eso es que puede estar mal la configuracion

Es raro que lo digas, por que el ADC posee un oscilador RC interno el cual el TAD del mismo es de 2us a 6us (tipico 4us ), lo cual esta entre los valores permitidos que posee el PIC,ya que exige un TAD mínimo de 1.6us para la versión del PIC16F88. y de 3us para la versión PIC16LF88

En tu caso tenes seleccionado el ADC con el RC incorporado que trae. Pero aun asi parece que el Proteus no te toma esa frecuencia sino la de 4Mhz, Ya que para hacerlo con 4Mhz deberías usar como mínimo un Fosc/8 ( podes ver la tabla en el datasheet donde con eso tenes hasta 5Mhz ).

Eso si realmente es el TAD, el tiempo de adquisición no creo que sea problema con ese delay que tenes tampoco.


En fin, no le encuentro un por que te esta tirando ese error, lo primero que pense es que lo tenias mal configurado pero con el oscilador RC interno no deberias jamas.

Desconectado BORIScristian

  • PIC10
  • *
  • Mensajes: 13
Re:TERMOSTATO con pic 16f88
« Respuesta #2 en: 24 de Marzo de 2016, 03:12:59 »
Gracias, voy a probarlo en el protoboard, quizás sea problema de mi pc, pruebo y cuento que tal me fue