TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: JohnMacklo en 07 de Octubre de 2009, 15:18:43
-
Amigos del foro
Hace un par de meses se me encomendo el proyecto de muestrear voltajes auxiliandome de un multimetro. La cosa hasta ahi es sencilla, el problema es que esos voltajes necesitaban ser almacenados en una base de datos. El multimetro que tenía a la mano es un MUL-600 de Steren. Ese es el nombre con el que se le conoce en México, pero en el resto de America, el multimetro es un UT60e y en Europa es un V80.
Despues de mucho investigar, me di cuenta de que las hojas de datos que vienen en el multimetro no funcionan, ya que en ellas te especifican lo siguiente.
Baud Rate 2400
Start bit 1 (always 0)
End bit 1 (always 1)
Data bits 7
Parity NONE.
Cabe aclarar que esto NO es correcto. Lo correcto es:
Baud Rate 2400
Start bit 1 (always 0)
End bit 1 (always 1)
Data bits 8
Parity NONE.
Luego de varias pruebas con el puerto serial del multimetro, me di cuenta de que, este tiene tres señales de entrada y una de salida (datos). Construi el siguiente circuito y la habilitación por hardware del multimetro funciono bien, pero a la hora de intentar leer los datos, me di cuenta de que la decodificación de realiza de manera no estandar, lo que involucra conocer el string que llega perfectamente.
Aqui les dejo los datos de como hice el circuito y la decodificación del mismo.
El programa lo relice en PicBasic Pro.
Si alguien tiene alguna duda, por favor, hagamela saber. No soy ningun experto, ni mucho menos, pero creo que el asunto de la comunicación de este multimetro, esta sanjado.
Cabe aclarar, que no decodifique todas las unidades que puede medir el multimetro en este programa, debido a que yo unicamente iba a leer voltajes, pero, si necesitan las otras opciones, con gusto se las pasare a todos.
' CONEXIONES ENTRE LA PIC Y LOS ADAPTADORES MAX232.
' CONSULTAR HOJA DE DATOS DE MAX232 PARA CONEXIONADO DE CAPACITORES DE DESACOPLAMIENTO Y ALIMENTACION
' CONSULTAR HOJA DE DATOS DE PIC18F452 PARA CONEXIONADO DE ALIMENTACION Y CIRCUITO DE RESONADOR
' |
' |
' +----------+ +---------+ +---+ | +---+
' | |26<-<-<-<-<-9| MAX |8<-<-<-<-<-| 2 | | | 2 |
' | |25->->->->-10| 232 |7->->->->->| 7 | | | 7 |
' | |23->->->->-11| |14>->->->->| 3 | | | 3 |
' | | +---------+ | | | | |
' | | | | | | |
' | PIC | +---------+ | | | | |
' | 18F452 |17->->->->-10| MAX |7->->->->->| 4 | | | 4 |
' | | | 232 | | | | | |
' | | | | | | | | |
' | | +---------+ GND----| 5 | | | 5 |
' | | +---+ | +---+
' | | CONECTOR | CONECTOR
' +----------+ DB9 MACHO | DB9 HEMBRA
' |(CABLE DEL MULTIMETRO)
' |
' PIN 26 = RX
' PIN 25 = RTS
' PIN 23 = TX
' PIN 17 = DTR
'
' PARA COMUNICAR EL MULTIMETRO CON EL PUERTO SERIAL, SE NECESITAN 3 PINES DE SALIDA Y
' UN PIN DE ENTRADA. EL CI MAX232, SOLO PROVEE 2 ENTRADAS Y DOS SALIDAS, POR LO QUE SE USARON
' 2 DE ESTOS CIRCUITOS PARA CONSTRUIR LA INTERFACE. cONSULTE LA HOJA DE DATOS DEL MAX232 PARA
' REEMPLAZAR ESTOS DOS CI´S POR UNO MAS ROBUSTO.
PRINCIPAL: INICIAL = 0
FINAL = 3
PUNTO = 0
DIGITO = 0
I = 0
J = 0
PTR = 0
PORTE = %00000000
PORTB = %00000000
TARJETA = %00000000
CELDA = %00000000
Low RTS1
'HABILITA TX. SE HABLITA LA INTERFACE DEL OPTOACOPLADOR DEL MULTIMETRO.
High TX
'HABILITA RTS. CON ESTA SEÑAL Y DTR, SE ALIMENTA EL OPTOACOPLADOR DEL MULTIMETRO.
High RTS
'HABILITA DTR. CON ESTA SEÑAL Y RTS, SE ALIMENTA EL OPTOACOPLADOR DEL MULTIMETRO.
Low DTR
DECODE: Pause 3000 'ESPERA 3 SEGUNDOS A QUE EL MULTIMETRO SE ESTABILISE PARA OBTENER DATOS
'SE INTRODUCEN DATOS DEL MULTIMETRO CON FORMATO 24008N1
Serin2 RX,396,3000,TIMEOUT,[WAIT ($17), STR BUFRS\13]
'CHECA SI EL MULTIMETRO ESTA EN MODO AUTOMATICO, RS232 ACTIVADO, CD Y LECTURA DE VOLTAJES.
'COMIENZA A DECODIFICAR LA CADENA DE CARACTERES QUE LE ENVIO EL MULTIMETRO.
'EJEMPLO 1
'EL MULTIMETRO ENVIA:
'17 2F 3D 47 5D 60 75 8F 9F A0 B8 C1 D4 E8
'ESTO SIGNIFICA:
'AUTO; RS232; DC: -001.8 mV
'EJEMPLO 2
'EL MULTIMETRO ENVIA:
'15 25 3B 40 55 67 7D 8F 9E A0 B0 C0 D1 E1
'ESTO SIGNIFICA:
'RS232; DC: 210.6
' BIT | 17 | 2F 3D | 47 5D | 60 75 | 8F 9F | A0 | B8 | C1 | D4 | E8
' bit0 | RS232 | | | | | DIODO | BEEP | HOLD | BAT | N/A
' bit1 | AUTO | | | | | k | M | DELTA | Hz | N/A
' bit2 | DC | | | | | n | % | OHM | V | N/A
' bit3 | AC | | | | | u | m | F | A | N/A
' | | -0 | 0 | 1 | .8 | | | | |
' | RANGO | 1ER DIGITO | 2DO DIGITO | 3ER DIGITO | 4TO DIGITO | | | | |
'
' b5
' ------ MSB LSB
' | |
' b6 | | b1 DIGITO = b8 b7 b6 b5 b4 b3 b2 b1
' b8 | b2 |
' --- ------
' | |
' b7 | | b3
' | |
' b8 . ------
' b4
'
' I = 0 'PUNTERO DE DIGITOS POR LECTURA (4 DIGITOS POR LECTURA)
For J = 0 To 7 Step 2
BYTE1 = ((BUFRS[J] & $07)<< 4) 'OBTIENE EL PRIMER DATO, SE HACE UNA MASCARA CON $07 Y LO RECORRE 4 ESPACIOS A LA IZQUIERDA
'-001.8 = 2F 3D 47 5D 60 75 8F 9F
' 00101111 = $2F
' & 00000111 = $07
' = 00000111 = 01110000 (BYTE1)
Byte2 = BUFRS[J+1] & $0F 'OBTIENE EL SEGUNDO DATO, SE HACE UNA MASCARA CON $0F
' 00111101 = $3D
' & 00001111 = $0F
' = 00001101 = 00001101 (BYTE2)
DIGITO = BYTE1 | BYTE2 'SUMA DE BYTE1 Y BYTE2
' 01110000 = $70
' + 00001101 = $0D
' = 01111101 = $7D (DIGITO)
PUNTO = ((BUFRS[J] & $08)>> 3) 'DEL PRIMER DATO HACE UNA MASCARA CON $08 PARA OBTENER EL PUNTO DEIMAL O EL SIGNO
' 00101111 = $2F
' & 00001000 = $08
' = 00001000 = 00000001 (PUNTO)
Select Case DIGITO
Case $7D '$7D = 0 ; $FD = 0 CON SIGNO o PUNTO DECIMAL
DIGITO = 0
Case $05 '$05 = 1 ; $85 = 1 CON SIGNO o PUNTO DECIMAL
DIGITO = 1
Case $5B '$5B = 2 ; $DB = 2 CON SIGNO o PUNTO DECIMAL
DIGITO = 2
Case $1F '$1F = 3 ; $9F = 3 CON SIGNO o PUNTO DECIMAL
DIGITO = 3
Case $27 '$27 = 4 ; $A7 = 4 CON SIGNO o PUNTO DECIMAL
DIGITO = 4
Case $3E '$3E = 5 ; $BE = 5 CON SIGNO o PUNTO DECIMAL
DIGITO = 5
Case $7E '$7E = 6 ; $FE = 6 CON SIGNO o PUNTO DECIMAL
DIGITO = 6
Case $15 '$15 = 7 ; $95 = 7 CON SIGNO o PUNTO DECIMAL
DIGITO = 7
Case $7F '$7F = 8 ; $FF = 5 CON SIGNO o PUNTO DECIMAL
DIGITO = 8
Case $3F '$3F = 9 ; $BF = 9 CON SIGNO o PUNTO DECIMAL
DIGITO = 9
Case $68
DIGITO = 0
Case Else
DIGITO = 0
End Select
CHAIN[PTR] = DIGITO 'GUARDA EL VALOR DE DIGITO
FLOAT[PTR] = PUNTO 'GUARDA EL VALOR DE PUNTO
PTR = PTR + 1
Next J
ESCALA = BUFRS[9]
Select Case ESCALA
Case $B8
ESCALA = "m" 'MILIS
Case Else
ESCALA = " "
End Select
UNIDADES = bufrs[11]
Select Case UNIDADES
Case $D4
UNIDADES = "V" 'VOLTS
Case Else
UNIDADES = " "
End Select
SCALE = ESCALA 'GUARDA LA ESCALA
UNIT = UNIDADES 'GUARDA LAS UNIDADES
I = i + 1
Pause 500
Return
-
Primero que nada bienvenido al Foro.
:-/ :-/ gracias por compartir estos datos, me seran muy útiles, ya que poseo un UT60E...
Aunque no comprendi bien tu problema (Ademas no uso Basic), te adjunto un pdf que alguna ves encontre por ahi donde se detalla el protocolo de comunicación.
Muchas Gracias JohnMacklo..
P/D: Eres todo un artista del ASCII. :mrgreen:
-
Enhorabuena por conseguirlo y gracias por compartirlo. Bienvenido.
-
JohnMacklo y Ema, muchas gracias!! :-/ :-/ :-/ :-/ :-/ :-/ :-/
Tengo un UT60A y me viene al pelo vuestro avance!!
Gracias por compartir la investigación :-) :-)
-
Primero que nada bienvenido al Foro.
:-/ :-/ gracias por compartir estos datos, me seran muy útiles, ya que poseo un UT60E...
Aunque no comprendi bien tu problema (Ademas no uso Basic), te adjunto un pdf que alguna ves encontre por ahi donde se detalla el protocolo de comunicación.
Muchas Gracias JohnMacklo..
P/D: Eres todo un artista del ASCII. :mrgreen:
Antes que nada, gracias por darme la bienvenida al foro. Es bueno saber que la información que uno reune le sirve a alguien para hacer más llevadera su vida.
Ahora, quisiera hacer una fé de erratas.
Cuando dije en mi post original
El multimetro que tenía a la mano es un MUL-600 de Steren. Ese es el nombre con el que se le conoce en México, pero en el resto de America, el multimetro es un UT60e y en Europa es un V80.
Realmente quise decir:
El multimetro que tenía a la mano es un MUL-600 de Steren. Ese es el nombre con el que se le conoce en México, pero en el resto de America, el multimetro es un UT60e de UNI-TREND y en Europa es un VC-840 de VoltCraft.
Creo, sin lugar a dudas, que por la emoción de compartir mi hallazgo, no establecí correctamente lo que queria hacer.
El proyecto consistía en hacer un sistema de muestreo de 85 voltajes diferentes con una PIC. Eso lo solucioné rápidamente haciendo un decodificador modular de 15 relevadores por tarjeta. lo que implica que necesitaba 6 tarjetas para muestrear los 85 voltajes requeridos. Cada vez que activara un relevador, este tenía que conmutar el voltaje que tuviera en sus puntas, hacia un multimetro, para que este último se encargara de la medición. Para obtener los datos en la PC, el multimetro debería tener comunicación serial. A mis manos llego el antes mencionado aparato y ahi fue donde comenzó el peregrinar.
Desarticule el cable de comunicaciones del multimetro, y con ayuda del osciloscopio, me pude dar cuenta de que utilizaba tres pines de entrada y uno de salida. Cada uno con una señal RS232 diferente (Esas señales estan explicadas anteriormente). Lo facíl fue hacer una interface con la pic y dos max232 y decirle a la pic que habilitara debidamente sus pines para obtener datos.
Ema: Te agradezco infinitamente el documento. Cuando comencé a intentar desarrollar la comunicación con el multimetro, dicho documento llegó a mis manos, pero realmente no fue de mucha ayuda. Buscando en la red, me encontré el siguiente blog:
http://blog.lionelsacks.com/2007/06/exercies-reading-out-unit-trend-ut60e.html
Ese fue mi verdadero punto de partida para realizar el programa que les mostré. Luego de comunicarme con Lionel, él amablemente me dijo que ya no tenía info al respecto, por lo que, me di a a la tarea de seguir buscando y encontré una pagina en checoslovaco que, si bien no entendí nada del lenguaje coloquial, si entendí algo de ceros y unos, y eso tambien me ayudó bastante.
http://www.elektroda.pl/rtvforum/topic404247.html
Luego de que los gráficos me explicaran algo (Una imagén vale más que mil palabras). Decidí hacer un intento más con consecuencias nada agradables, el string que me enviaba el multimetro lo recibía correctamente, pero no sabía como decodificarlo. Lo que es peor, a veces, recibía el string incorrectamente, y ahi es donde torcía la marrana el rabo.
Realmente estaba desesperado, pero por ahi, en alguna pagina leí que en Alemania, dicho multimetro era manufacturado por VOLTCRAFT. Luego de una intensa busqueda, encontré el siguiente enlace:
http://www.hjberndt.de/soft/vc840.html
Ahi encontraran programas de ejemplo y una cantidad enorme de documentación de dicho aparato. Ahi es donde se darán cuenta que los revendedores falsean la información acerca de los datos de comunicación seriales a fin de que solo puedas utilizar su software para comunicación con la PC.
Espero que ahora con esta info, les sea más util mi primer aportación y espero poder seguir haciendo más aportaciones al foro.
-
Hola, muy buen proyecto, me gustaría que me expliques bien como armas los dígitos ya que no entiendo.
muchas gracias :)