;***********************************************************************
;* adquisicion de datos a 10 bits - TX serial utilizando PIC 16F873 *
;***********************************************************************
LIST P=16F873
#INCLUDE "p16f873.inc"
;***********************************************************************
; DEFINICION DE BITS (ESTAN CASI TODOS EN EL INCLUDE ANTERIOR)
STATUS EQU 03H
PORT_A EQU 05H
PORT_B EQU 06H
PORT_C EQU 07H
PCLATC EQU 0AH
INTCON EQU 0BH
PIR1 EQU 0CH
RCSTA EQU 18H
TXREG EQU 19H
RCREG EQU 1AH
ADRESH EQU 1EH
ADCON0 EQU 1FH
TRISA EQU 85H
TRISB EQU 86H
TRISC EQU 87H
TXSTA EQU 98H
SPBRG EQU 99H
ADRES1 EQU 9EH
ADCON1 EQU 9FH
RP0 EQU 5
RP1 EQU 6
IRP EQU 7
Z EQU 2
C EQU 0
TXIF EQU 4
GO EQU 2
LOOPS EQU 20H
LOOPS2 EQU 21H
NIBBLE1 EQU 22H
NIBBLE2 EQU 23H
NIBBLE3 EQU 24H
BUFFER EQU 25H
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;CONFIGURO
; PARA LA GRABACION, CODE PROTECT OFF, RESET DE ENCENDIDO ,ETC
;************************* COMIENZO DEL PROGRAMA *********************
ORG 00
GOTO INICIO
;-----------------------------------------------------------------------
RETARDO MOVWF LOOPS ;RUTINA DE RETARDO EN MILISEGUNDOS
TOP2 MOVLW .110 ;EL NUMERO DE MILISEC LLEGA CARGADO
MOVWF LOOPS2 ;EN EL REGISTRO LOOPS
TOP NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ LOOPS2,1 ;PREGUNTA SI TERMINO 1 mS.
GOTO TOP
DECFSZ LOOPS,1 ;PREGUNTA SI TERMINO RETARDO
GOTO TOP2
RETLW 0
;-----------------------------------------------------------------------;
; RUTINA DE CONVERSION A/D A 10 BITS ;
; DEVUELVE 3 DATOS EN HEXADECIMAL GUARDADOS ;
; EN LOS REGISTROS NIBBLE1, NIBBLE2 Y NIBBLE3 ;
;-----------------------------------------------------------------------;
CONVER BSF STATUS,RP0
MOVLW B'10000010' ;SELECCIONA Vref INTERNO(+5 Y GND)
MOVWF ADCON1 ;DATOS EN ADRESL Y 2 BITS EN ADRESH
BCF STATUS,RP0
NOP
NOP
NOP
NOP ;ESTAS INSTRUCCIONES NOP, DAN AL
NOP ;MICRO, TIEMPO DE ADQUISICION
NOP ;REQUERIDO, EN ESTE CASO 7 MICRO SEG.
NOP
NOP
BSF ADCON0,GO ;INICIO DE CONVERSION
NOP
NOP
CONSU BTFSC ADCON0,GO ;ESPERA QUE TERMINE DE CONVERTIR
GOTO CONSU
MOVF ADRESH,W
MOVWF NIBBLE1 ;PASA TRES DIGITOS HEXADECIMALES
MOVLW 30H ;A REGISTROS INDIVIDUALES
ADDWF NIBBLE1,1 ;PARA SER TRANSMITIDO
BSF STATUS,RP0 ;AL REGISTRO NIBBLE1 LE SUMA 30H
MOVF ADRES1,W ;PARA CONVERTIRLO EN ASCII
BCF STATUS,RP0
MOVWF BUFFER
ANDLW 0FH
MOVWF NIBBLE3 ;EL REGISTRO NIBBLE3 QUE CONTIENE
MOVLW 37H ;EL DIGITO MENOS SIGNIFICATIVO DEBE
SUBWF NIBBLE3,0 ;PROBARSE PARA VER SI ES UN NUMERO
MOVLW 37H ;DE 0 A 9 O SI ES LA LETRA A HASTA F
BTFSS STATUS,C ;PARA HACER LA CONVERSION A ASCII
MOVLW 30H
ADDWF NIBBLE3,1
SWAPF BUFFER,0
ANDLW 0FH
MOVWF NIBBLE2 ;EL DIGITO NIBBLE2 TIENE EL MISMO
MOVLW 0AH ;PROCEDIMIENTO QUE NIBBLE3
SUBWF NIBBLE2,0
MOVLW 37H
BTFSS STATUS,C
MOVLW 30H
ADDWF NIBBLE2,1
RETLW 0
;-----------------------------------------------------------------------;
; ESTA RUTINA ENVIA SERIALMENTE LOS DATOS ;
; OBTENIDOS EN CADA CONVERSION ;
;-----------------------------------------------------------------------;
ENVIAR MOVF NIBBLE1,0 ;TRANSMITE EL DIGITO HEXADECIMAL
ESPER BTFSS PIR1,TXIF ;PDE MAYOR PESO
GOTO ESPER
MOVF TXREG,1
MOVF NIBBLE2,0 ;TX EL SEGUNDO DIGITO HEXA
ESPERA BTFSS PIR1,TXIF ;PERO DEBE ESPERAR QUE TERMINE DE
GOTO ESPERA ;TX EL DATO ANTERIOR
MOVWF TXREG
MOVF NIBBLE3,0 ;TX TERCER DIGITO
ESPER2 BTFSS PIR1,TXIF
GOTO ESPER2
MOVWF TXREG ;CHR$(44)=","
MOVLW .44 ;TX EL CARACTER "COMA" PARA SEPARAR
ESPER3 BTFSS PIR1,TXIF ;CADA DATO DE LOS DIFERENTES CANALES
GOTO ESPER3
MOVWF TXREG
RETLW 0
;************************** PROGRAMA PRINCIPAL **************************
INICIO BSF STATUS,RP0
MOVLW 0FFH
MOVWF TRISA
MOVWF TRISB ;PUERTOS A Y B COMO ENTRADAS
MOVLW B'10111111'
MOVWF TRISC ;PUERTO C ENTRADAS Y PIN TX SALIDA
MOVLW B'00100110' ;PROGRAMA USART ASINCRONO PARA TX
MOVWF TXSTA ;ALTA RATA DE BAUDIOS
MOVLW .103 ;CONFIGURA TEMPORIZADOR A 4MHZ
MOVWF SPBRG ;2400 BPS (8,N,1)
BCF STATUS,RP0
BSF PIR1,TXIF
MOVLW B'10000001' ;SELECCIONA CANAL 0 Y RELOJ DE CONV
MOVWF ADCON0 ;CONVERTIDOR ENCENDIDO
CALL CONVER ;LLAMA RUTINA CONVERSION A/D
CALL ENVIAR ;ENVIA DATOS SERIALES
MOVLW B'10001001' ;SELECCIONA CANAL1 Y RELOJ DE CONVERSION
MOVWF ADCON0 ;CONVERTIDOR ENCENDIDO
CALL CONVER
CALL ENVIAR
MOVWF B'10010001' ;SELECCIONA CANAL 2 Y RELOJ CONVERSION
MOVWF ADCON0
CALL CONVER
CALL ENVIAR
MOVLW B'10011001' ;SELECCIONA CANAL3 Y RELOJ CONVERSION
MOVWF ADCON0
CALL CONVER
CALL ENVIAR
;CHR$(13)=<ENTER>
MOVLW .13 ;LA SEPARACION ENTRE CADA BLOQUE
ESPER4 BTFSS PIR1,TXIF ;DE 4 DATOS
GOTO ESPER4 ;SE HACE CON EL CARRIAGE RETURN
MOVWF TXREG ;Y UN CARACTER LINE FEED
MOVLW .10 ;SIRVE PARA SEPARAR LAS LINEAS DE
;DATOS QUE SE RECIBEN, BAJA UN RENGLON
ESPER5 BTFSS PIR1,TXIF ;EN EL PROGRAMA TERMINAL DE WINDOWS
GOTO ESPER5 ;CADA LINEA DE DATOS TIENE
;CANAL0, CANAL1 , CANAL2 , CANAL3
MOVWF TXREG
NOP
NOP
ESPER6 BTFSS PIR1,TXIF ;ESTA COMPROBACION ES PARA
;GARANTIZAR QUE SE TRANSMITA
GOTO ESPER6 ;EL ULTIMO CARACTER ANTES DE SEGUIR
MOVLW .250 ;RETARDO ENTRE BLOQUES DE 4 DATOS
CALL RETARDO ;ESTE RETARDO EQUIVALE A 250 mili Sec
; SE PUEDE AUMENTAR HASTA 255 mili Sec
GOTO INICIO ;COMIENZA NUEVAMENTE PARA ENVIAR
;OTRO PAQUETE DE DATOS
END
;--------------------------------------------------------------------------------;
;EXTRAIDO DE LA REVISTA ELECTRONICA Y COMPUTADORES - CEKIT - NORBERTO PELLEGRINI;
; FIRMAT - SANTA FE - ARGENTINA - 19/03/2001 ;
;--------------------------------------------------------------------------------;