Artículos

Medidor ADC infrarrojo por RS232 - Página 3


Circuito Receptor y RS232



El circuito empleado para la recepción emplea el módulo infrarrojo TSOP1738 y un MAX232N que adapta los voltajes TTL recibidos por el TSOP1738 a voltajes de ±8.5V, que son los necesarios para realizar una conexión con el puerto RS232 de una PC.

La comunicación realizada es solo de recepción de parte de la PC ya que no se implementó la transmisión hacia el pic.


Programa en ensamblador del PIC16F877A

A continuación se muestra el programa completo del pic, compilado con MPLAB 8.0.

              LIST P=16f877a
              __config       B'11111100111001'
;CRISTAL 4MHz
;FUSIBLES CONFIGURADOS EN MPLAB (CONFIG BITS)
;OSCILADOR XT, NO WDT, POWER UP TIMER, NO LVP, NO CODE PROTECT
 
              include "p16f877a.inc"
 
;Santiago Villafuerte
;Septiembre 2008
 
;Programa que obtiene la medición de lo que esté conectado
;en la terminal RA0 mediante el ADC.
;Posteriormente toma los 10 bits que el ADC genera y
;los envía por el puerto serie TX.
;La transmisión infrarroja se logra generando una portadora de
;38kHz gracias al PWM y conectando un led emisor infrarrojo
;entre las terminales RC2 y RC6 con su resistencia de 330ohms.

;La recepción se hace en una computadora con puerto serie y
;conectando un MAX232 junto con un TSOP1738 para demodular la
;señal infrarroja, todo esto a una velocidad de 2400bps, que es
;el ancho de banda que recomienda el fabricante del TSOP1738

;TERMINALES
;Salida PWM a 38kHz -> RC2
;Salida TX -> RC6
;Entrada ADC -> RA0
 
;CALCULOS PWM
;f=38kHz
;Tpwm=26.3157us
;duty time= 13.1578us
;Tpwm=(PR2+1)4 Tosc PRtm2
;Tpwm=(25+1)(4)(1/4MHz)(1)=26us
;fpwm=1/26us=38.461kHz
;duty time=CCP Tosc PRtm2
;duty time=52(1/4MHz)(1)=13us
;Res=[log(4MHz/38.461KHz)/log 2]=6.7bit=6bit
;52d=0x34=110100b O.K.

;VARIABLES
CONTEO        EQU  0X20
 
            ORG 0X0000
            
;CONFIGURA ENTRADAS Y SALIDAS
;TRISC
              BSF      STATUS,RP0         ;BANCO 1
              MOVLW    B'10111011'        ;RC2 Y RC6 SALIDA
              MOVWF    TRISC
;TRISA
              MOVLW    B'11111111'        ;RA0 ENTRADA
              MOVWF    TRISA
 
;CONFIGURA ENTRADAS ANALÓGICAS Y ADC
              MOVLW    B'10001111'        ;JUST DER,F0SC/32,RA0 VREF +A3 Y -A2
              MOVWF    ADCON1
              BCF      STATUS,RP0         ;BANCO 0
              MOVLW    B'10000001'        ;F0SC/32,CANAL A0,ADON
              MOVWF    ADCON0

;CONFIGURA TIMER 0 PARA SUBRUTINA DE RETARDO
              BSF      STATUS,RP0         ;BANCO 1
              MOVLW    B'11010111'        ;T0CS INTERNO, TOSE ALTO A BAJO
              MOVWF    OPTION_REG         ;PRESCALER EN TMR0 Y 1:256
            
;CONFIGURA PWM
              MOVLW    D'25'
              MOVWF    PR2
              BCF      STATUS,RP0         ;BANCO 0
              MOVLW    B'00001101'        ;DUTY = B'00001101 00'=52D
              MOVWF    CCPR1L
              MOVLW    B'00000100'        ;1:1 POST, TM2 ON, 1:1 PRE
              MOVWF    T2CON            
              MOVLW    B'00001111'        ;DUTY = B'00001101 00',PWM
              MOVWF    CCP1CON
 
;CONFIGURA RS232
              BSF      STATUS,RP0         ;BANCO 1
              MOVLW    D'25'              ;25 GENERA 2403.84bps
              MOVWF    SPBRG
              BCF      TXSTA,SYNC         ;HABILITA MODO ASINC
              BCF      STATUS,RP0         ;BANCO 0
              BSF      RCSTA,SPEN         ;SERIAL PORT ACTIVADO      
              BSF      STATUS,RP0         ;BANCO 1
              BSF      TXSTA,TXEN         ;HABILITA TRANSMISION
              BCF      STATUS,RP0         ;BANCO 0

;ESPERA 3 SEGUNDOS APROX PARA QUE SE ESTABILICE EL ENCENDIDO
              CALL RETARDO
              CALL RETARDO
              CALL RETARDO
 
;ENVIA NOMBRE POR TX
;             MOVLW    D'9'          ;9 CARACTERES
;             MOVWF    CONTEO
;LEETABLA CALL     TABLA              ;COPIA LETRA
;TXBUF        BTFSS    PIR1,TXIF      ;VERIFICA SI PUEDE ESCRIBIR EN BUFFER
;             GOTO     TXBUF
;             MOVWF    TXREG
;             DECFSZ   CONTEO,F      ;SIG. LETRA
;             GOTO SIG2          ;TABLA PENDIENTE
;             GOTO SIG                ;TABLA TERMINADA
;SIG2         MOVF CONTEO,W
;             GOTO     LEETABLA
;SIG     CALL RETARDO
 
;TOMA LA MEDICION DE VOLTAJE EN RA0 Y LA ENVIA POR RS232
CICLO_INF BSF      ADCON0,GO      ;INICIA MEDICION
AD_ESPERA BTFSC    ADCON0,GO
              GOTO AD_ESPERA
              BCF      PIR1,ADIF      ;LIMPIA BANDERA AD
              MOVF ADRESH,W      ;COPIA LOS 2 BITS MS DE LA MEDICION
              MOVWF    TXREG
TXBUF2        BTFSS    PIR1,TXIF      ;VERIFICA SI PUEDE ESCRIBIR EN BUFFER
              GOTO     TXBUF2
              BSF      STATUS,RP0         ;BANCO 1
              MOVF ADRESL,W      ;COPIA LOS 8 LSb DE LA MEDICION
              BCF      STATUS,RP0         ;BANCO 0
              MOVWF    TXREG
              CALL     RETARDO            ;ESPERA 960ms
              GOTO     CICLO_INF      ;CICLO INFINITO   

;///////////////////////////////////////////////////////////////
;SUBRUTINA DE TIEMPO DE 960ms
RETARDO       MOVLW    D'15'              ;15 X 64ms = 960ms
              MOVWF    CONTEO
CICLO         MOVLW    D'06'              ;GENERA 64ms
              MOVWF    TMR0
CICLO2        BTFSS    INTCON,T0IF        ;ESPERA EL DESBORDE
              GOTO CICLO2
              BCF      INTCON,T0IF        ;LIMPIA BANDERA
              DECFSZ   CONTEO,F      ;BRINCA SI YA ES CERO
              GOTO CICLO
              RETURN

              END