0% encontró este documento útil (0 votos)
4 vistas5 páginas

Adquisición de Datos A/D y RS-485

Este programa permite adquirir datos analógicos de 4 canales a 10 bits de resolución y transmitirlos vía RS-485 a una PC. El programa muestra los valores digitalizados cada segundo de forma serial.

Cargado por

ccuenin777
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
4 vistas5 páginas

Adquisición de Datos A/D y RS-485

Este programa permite adquirir datos analógicos de 4 canales a 10 bits de resolución y transmitirlos vía RS-485 a una PC. El programa muestra los valores digitalizados cada segundo de forma serial.

Cargado por

ccuenin777
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd

; Programa de la revista "Electr�nica y Computadores"-Cekit- nro.

65
; "Adquisici�n de datos a 10 bits y Tx serial via RS-485"

; Modificado por Alejandro Lavarello


; e-mail: alejol@[Link]
; web principal: [Link]
;
; Objetivo:
; ---------
; Programa simple que sirve para aprender a usar el conversor A/D
; y tambi�n la USART que contienen estos micros.
; Se arma en una plaqueta para pruebas ("protoboard") y se conecta
; a un PC que corra un emulador de terminal (l�gicamente, el PC
; tendr� un puerto serial -COM1, COM2, etc. - disponible).
; Probado OK usando "HyperTerminal" de Windows 95/98

;Resultado:
;----------
; Si est� todo OK, en la pantalla del emulador de terminal
; se ven cuatro valores hexadecimales que representan
; las tensiones en los cuatro canales de entrada usados,
; algo as�: 03A,20C,12D,000
; 03B,20A,12F,003
; etc. Renovaci�n de valores cada segundo.

; Modificaciones:
;-----------------
;El original usaba el PIC16F873. Probado OK usando un PIC16F876.
;El original usaba comunicaci�n RS485.
; Este c�digo se puede usar con: PIC16F877, PIC16F874, PIC16F873
; y con PIC16F876.

; Notas de hardware:
;-------------------
; Hay un potenci�metro de 5k con el cual se var�a la tensi�n an�logica
; de entrada en la pata RA0 (pata 2 del chip). Las dem�s entradas an�logicas
; las puse a tierra.
; Hay un MAX232 conectado a las patas 17 y 18 (TX y RX) para establecer la
comunicaci�n
; con el PC.

LIST P=16F876

INCLUDE "[Link]"
; Puede ser innecesario incluir este archivo porque
; todos los registros son definidos expl�citamente.

__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

;************* DEFINICION DE REGISTROS Y BITS UTILIZADOS

status equ 03
ptoa equ 05
ptob equ 06
ptoc equ 07
pclath equ 0a
intcon equ 0b
pir1 equ 0c
rcsta equ 18
txreg equ 19
rcreg equ 1a
adresh equ 1e
adcon0 equ 1f
trisa equ 85
trisb equ 86
trisc equ 87
txsta equ 98
spbrg equ 99
adresl equ 9e
adcon1 equ 9f
rp0 equ 5
rp1 equ 6
irp equ 7
z equ 2
c equ 0
txif equ 4
go equ 2
loops equ 20
loops2 equ 21
nibble1 equ 22
nibble2 equ 23
nibble3 equ 24
buffer equ 25
aux equ 26

;****** EMPIEZA EL PROGRAMA

org 0x00
goto inicio
;---------------------------------------------------------------------
retardo movwf loops ; rutina de retardo en milisegundos
top2 movlw d'110' ; el numero de milisegundos llega
movwf loops2 ; cargado en el registro loops
top nop
nop
nop
nop
nop
nop
decfsz loops2, F ; pregunta si termino 1 ms
goto top
decfsz loops, F ; pregunta si termino el retardo
goto top2
return
;----------------------------------------------------------------------

; Rutina de conversi�n 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 (+5V y GND)

; ADFM = 1: Justificado a la derecha


; PCFG<3..0> = 0010 --> AN7 = Digital, AN6= Digital, AN5= Digital
; AN4 = Analogico, AN3 = Analogico, AN2= Analogico
; AN1 = Analogico, AN0= Analogico
; VREF+ = Vdd (interno), VREF- = GND (interno)

movwf adcon1 ; datos en ADRESL y 2 bits en ADRESH


bcf status, rp0
nop
bsf adcon0, go ; Le doy el tiqui�azo pa que labure.
nop ; (o sea, comienzo la conversion).
nop
nop ; estas instrucciones nop dan al
nop ; micro el tiempo de adquisicion
nop ; requerido. En este caso de 7 us
nop
nop
nop
nop
consu btfsc adcon0,go ; espera que termine de convertir
goto consu

;---------------------------------------------------------------------
movf adresh,w ; pasa tres digitos hexadecimales
movwf nibble1 ; a registros individuales
movlw 0x30 ; para ser TX
addwf nibble1, F ; Al registro nibble1 se le suma 30h
bsf status, rp0 ; para convertirlo a ASCII
movf adresl,w
bcf status, rp0
movwf buffer
andlw 0x0f
movwf nibble3 ; El registro nibble3 que contiene
movlw 0x0a ; el digito menos significativo debe
subwf nibble3,0 ; probarse para ver si es un numero
movlw 0x37 ; de 0 a 9 o si es letra A hasta F
btfss status, c ; para hacer la conversion a ASCII
movlw 0x30
addwf nibble3, F
swapf buffer,0
andlw 0x0f
movwf nibble2 ; El digito nibble2 tiene el mismo
movlw 0x0a ; procedimiento que nibble3
subwf nibble2, 0
movlw 0x37
btfss status, c
movlw 0x30
addwf nibble2, F
return

;----------------------------------------------------------------------
; Esta rutina envia serialmente los datos
; obtenidos en cada conversion
enviar movf nibble1,0 ; transmite el digito hexadecimal
esper btfss pir1, txif ; de mayor peso
goto esper
movwf txreg
movf nibble2,0 ; transmite 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 ; transmite el tercer digito
esper2 btfss pir1,txif ; pero antes revisa que haya
goto esper2 ; enviado el segundo
movwf txreg
movlw d'44' ; el caracter "coma" sirve para
esper3 btfss pir1,txif ; separar el dato
goto esper3 ; de los diferentes canales
movwf txreg
return
;---------------------------------------------------------------------

;**********PROGRAMA PRINCIPAL ***************

inicio bsf status, rp0


movlw 0xFF
movwf trisa ; pto A entradas
movlw b'01111111' ;
movwf trisb ; pto B entradas salvo RB7 para led
movlw b'10111111'
movwf trisc ; pto C entradas y pin TX salida

movlw b'00100110' ; programa USART asincrono para TX


movwf txsta ; alta rata de baudios
movlw d'103' ; configura temporizador a 4 MHz
movwf spbrg ; 2400 bps (8,n,1)
bcf status, rp0
bsf pir1,txif
movlw b'10000000' ; habilita puerto serial
movwf rcsta

movlw b'10000001' ; selecciona canal 0 y reloj de conv = cristal /32


movwf adcon0 ; convertidor encendido
call conver ; llama rutina de conversion A/D
call enviar ; envia datos seriales

movlw b'10001001' ; selecciona canal 1 y reloj de conv= cristal /32


movwf adcon0 ; convertidor encendido
call conver ; llama rutina de conversion A/D
call enviar ; envia datos seriales

movlw b'10010001' ; selecciona canal 2 y reloj de conv= cristal /32


movwf adcon0 ; convertidor encendido
call conver ; llama rutina de conversion A/D
call enviar ; envia datos seriales

movlw b'10011001' ; selecciona canal 3 y reloj de conv= cristal /32


movwf adcon0 ; convertidor encendido
call conver ; llama rutina de conversion A/D
call enviar ; envia datos seriales

movlw d'13' ; la separacion entre cada bloque


esper4 btfss pir1,txif ; de 4 datos
goto esper4 ; se hace con un carriage return
movwf txreg ; y un caracter line feed
MOVLW D'10' ; sirve para separar las lineas de
; datos que se reciben
esper5 btfss pir1,txif ; en el programa terminal de Windows
goto esper5 ; Cada linea de datos tiene canal0,
; canal 1, canal 2 y canal 3
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 d'250' ; retardo entre bloques de 4 datos


call retardo ; este retardo equivale a 250 miliseg.
; el usuario puede escoger el tiempo
; deseado, maximo 255 miliseg.

movlw b'10000000' ; Hago parpadear led


xorwf PORTB, F

goto inicio ; Vuelve a empezar el ciclo para


; enviar otro paquete de datos

END

; Al programar el micro tener en cuenta


; los fusibles de configuracion
; WDT = OFF
; OSC = XT
; PWRT = ON

También podría gustarte