Sie sind auf Seite 1von 0

CAPITULO 2

DESARROLLO DEL PROYECTO



2.1 INTRODUCCION

En el presente capitulo, se dar a conocer el procedimiento que se ha realizado, para cumplir
con los objetivos especficos.

2.2 ESPECIFICACIN DEL SISTEMA

Para poder realizar un buen programa en el microcontrolador, tengo primero que especificar
el sistema e identificar las etapas de funcionamiento que rodean al microcontrolador. A
continuacin, expongo un primer bosquejo a lo que se desea llegar.



Figura 2.1. Diagrama de Bloques


Para la adquisicin de la seal de temperatura en el aceite mostrado en la fig. 2.1, se planea
utilizar un LM35, ya que con este tipo de sensor he tenido experiencia en circuitos anteriores
ya sea, en practicas o en proyectos de la Universidad. Pero no es una decisin definitiva
porque el aceite a medir estar dentro de un recipiente cilndrico, por lo que seria una mejor
opcin utilizar un sensor tipo varilla como por ejemplo una termocupla tipo J o tipo K.

A la temperatura del aceite al que se va a medir su viscosidad, se pretende mantener constante
su temperatura, por medio de un segundo microcontrolador que realizara un control de ngulo
de disparo (ver 2.2.1) a la niquelina como se indica en la figura 2.1, la cual proporcionara el
calentamiento del mismo.

Y por ultimo se visualiza en una pantalla lquida, los datos censados, medidos, y un men
principal para seleccionar el modo de funcionamiento, es decir a travs de la tarjeta de control
o a travs de la PC por medio del bus USB, en donde se puede realizar las mismas funciones
que se hacen de forma manual en la tarjeta de control.


2.2.1 ANGULO DE DISPARO

Para el Viscosmetro de Engler la niquelina trabajara a la mitad de su capacidad, ya que a su
mximo rendimiento se obtienen temperaturas muy elevadas en muy poco tiempo, por lo que
el sensor de temperatura NTC no responde con rapidez ante cambios de temperatura muy
rpidos, como consecuencia se obtiene un mal control para mantener constante a cierta
temperatura el aceite en prueba.

El Control de Angulo de Disparo tiene como misin de contrarrestar el rendimiento mximo
de la Niquelina y consiste bsicamente en detectar cuando la corriente de la Niquelina pasa
por cero, en la figura 2.2 se indica el circuito esquemtico para cumplir con esta condicin, y
obtener las formas de ondas necesarias para el control como se indica a continuacin.



Figura 2.2. Angulo de Disparo.


En la figura 2.3 se muestra la forma de onda que sale desde el puente de Graetz, la misma que
se repite cada 180 ya que es el resultado de una rectificacin de onda completa, sta nos sirve
para poder dar pulsos y de esta manera sincronizar el proceso.



Figura 2.3. Rectificacin de onda completa.

Esta forma de onda ingresa a la base del transistor que se muestra en la figura 2.2 en el
circuito detector del cruce por cero, y en el colector se obtiene la forma de onda que se indica
en la figura 2.4.



Figura 2.4. Detector del cruce por cero.

La forma de onda de la figura 2.4 ingresa al pin RB0 del pic, el cual por medio de la
interrupcin del RB0 por flanco de subida se sabe cuando la corriente en la carga esta
cruzando por cero

INTCON=%10010000 'Habilita la interrupcin B0
OPTION_REG.6=1 'Habilito la interrupcin de RB0, por flanco de subida

Ya que en la figura 2.3 es una onda completa la misma que se repite cada 180 entonces el
tiempo que demora la seal en cruzar por cero ser cada 8.333ms y como la Niquelina
trabajara a la mitad de su capacidad entonces el control de Angulo de Disparo trabajara cada
4.16ms como se indica en la figura 2.5.



Figura 2.5. Disparo a 90


La onda de salida que se observa en la figura 2.5, es la que alimentara a la Niquelina
obtenindose como resultado que sta trabaje al 50% de su capacidad mxima, y por
consiguiente se consigue un buen control a la hora de querer mantener constante la
temperatura en el aceite que este a prueba.


2.3 SOFTWARE DEL MICROCONTROLADOR

Una vez definido el sistema que se va a disear, tal como en la figura 2.1, entonces el
siguiente paso es realizar el programa del microcontrolador, el cual se encargara de gobernar a
todos los dispositivos que lo rodean, como es el caso de un motor de corriente continua, en el
cual se acoplara a su eje unas paletas, las mismas que nos ayudaran a mantener homognea la
temperatura en el recipiente en donde se encuentra el aceite a prueba, adems se tiene tambin
la opcin de manejar un sistema de cuatro bombas en donde se encuentran diferentes tipos de
aceites para realizar las pruebas correspondientes.

Como se menciono antes, para la adquisicin de la seal de temperatura en el aceite mostrado
en la fig.2.1, he planeado utilizar un LM35, pero dado que el sensor que se utilice, debe de
estar en contacto con el aceite, y el LM35 por su tamao no es fcil de aislar, se a optado por
utilizar un Termistor NTC, mostrado en la figura 2.6, el cual tiene un coeficiente de
temperatura negativo, por lo que su resistencia decrece a medida que se incrementa la
temperatura.



Figura 2.6. Termistor NTC

Entonces el programa del microcontrolador principal es el siguiente:

'******************************************************************************
'* Name : VISCOSIMETRO DE ENGLER *
'* Author : IVAN PARRA P. *
'* Notice : Copyright (c) 2006 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 16/05/2006 *
'* Version : 1.0 *
'* Notes : Utilizo un LCD de 4 Lineas, y el Tiempo esta con *
'* centecimas *
'*******************************************************************************
DEFINE OSC 48
DEFINE LOADER_USED 1

USBBufferSizeMax con 35 ' maximum buffer size
USBBufferSizeTX con 35 ' input
USBBufferSizeRX con 35 ' output

' the USB buffer...
USBBuffer Var Byte[USBBufferSizeMax]
USBBufferCount Var Byte


' ************************************************************
' * main program loop - remember, you must keep the USB *
' * connection alive with a call to USBService every couple *
' * of milliseconds or so... *
' ************************************************************
usbinit ' initialise USB...


Hasta aqu es el cdigo generado por EasyHID, el cual me sirve para codificar los buffers de
entrada y salida. A continuacin esta el cdigo en si del programa hecho para el pic 128f2550

'+-+-+-+-+-+-+-+-+-+-+-+-+- PROGRAMA +-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-

ADCON1=%00001110 ;El puerto A.0 es conversor, los dems Digitales
'ADCON1=%0000 ;Todas el PORTA es Analgico
TRISA=%11000011
TRISB=%00000001
TRISC=%00101111

dato var BYTE
error var byte
calibrar var byte
VALOR VAR BYTE
TIEM VAR WORD
conta VAR BYTE
posicion var byte
actualizado var bit

Th1 var byte
Th2 var byte
Th3 var byte
Th4 var byte
T1 var byte
T2 var byte
T3 var byte
T4 var byte

T1a var byte
T1b var byte
T1c var byte
T1d var byte

T2a var byte
T2b var byte
T2c var byte
T2d var byte

T3a var byte
T3b var byte
T3c var byte
T3d var byte

T4a var byte
T4b var byte
T4c var byte
T4d var byte

tiem1 var word
tiem2 var word
tiem3 var word
tiem4 var word

Deci1 var byte
Deci2 var byte
Deci3 var byte
Deci4 var byte

TH VAR BYTE
T VAR BYTE

x var byte
y var byte
z var byte

X1 VAR BYTE

B var byte
C var word

U1 var BYTE
D1 var BYTE
C1 var BYTE
M1 var BYTE
L1 VAR BYTE

U2 var BYTE
D2 var BYTE
C2 var BYTE
M2 var BYTE
L2 VAR BYTE

U3 var BYTE
D3 var BYTE
C3 var BYTE
M3 var BYTE
L3 VAR BYTE

U4 var BYTE
D4 var BYTE
C4 var BYTE
M4 var BYTE
L4 VAR BYTE

N1 VAR WORD
N2 VAR WORD
N3 VAR WORD
N4 VAR WORD

TX VAR WORD
Agua var word

resp_a var word

Cmayor var WORD
Cmenor VAR WORD
Cdeci var WORD

USB VAR BYTE
CAL VAR BYTE

usb_save var byte
Motor_usb var byte

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
PITO VAR PORTA.1
LedNiq VAR PORTA.2
MEM_SCL VAR PORTA.3
MEM_SDA VAR PORTA.4
MOTOR VAR PORTA.5

DmuxA var PORTB.1
DmuxB VAR PORTC.6
DmuxC VAR PORTC.7

P1 VAR PORTC.0 'UP
P2 VAR PORTC.1 'DOWN
P3 VAR PORTC.2 'ENTER

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
;*************** Inicializacion LCD ****************************************
define LCD_LINES 4 ;define el LCD de 2 lneas
define LCD_DREG PORTB ;define pines del LCD D4 a D7
DEFINE LCD_DBIT 4 ;empezando desde elpuerto D4 hasta el D7
DEFINE LCD_RSREG PORTB ;defino el PIN para<conectaaar el RS MI PROTO
DEFINE LCD_RSBIT 3 ;en el B3
DEFINE LCD_EREG PORTB ;defino el pin para conectar el bit Enable
DEFINE LCD_EBIT 2 ;en el B2
;-------------------------------------------------------------------------------
EEPROM 0,[0] ;memoria 0 con el valor inicial 0 , sirve para
;indicar que nunca ha corrido este programa
READ 0,actualizado ;carga el valor de la memoria EEPROM direccin 0

IF actualizado =0 THEN conta=0 :write 0,1 :write 1,conta
READ 1,conta
;-------------------------------------------------------------------------------
ON INTERRUPT GOTO PARO 'En caso de aber interrupcion ir a PARO
INTCON=%10010000 'Abilita la interrupcion B0
INTCON2.6=0 'Habilito la interrupcin de RB0, por flanco de bajada [ No hay el PORTC.3 en el
18F4550 - 18F2550]
;-------------------------------------------------------------------------------
main:
tiem=0
T=0
T1=0
T2=0
T3=0
T4=0
y=0
B=0
X1=0
USB=0
CAL=0
Motor_usb=0

HIGH DmuxA
HIGH DmuxB
HIGH DmuxC

high LedNiq
LOW PITO
LOW MOTOR

lcdout $FE,1
LCDOUT $FE,$C0,"VISCOSIMETRO UPS"
gosub puntos
'********************** MODO DE FUNSIIONAMIENTO ********************************
MENU:
enable
lcdout $FE,1,"***** MENU *****"
LCDOUT $FE,$C0,"NORMAL ----->P1"
LCDOUT $FE,$90,"COMUNIC PC ->P2"
LCDOUT $FE,$D0,"SELEC.BOMBA->P3"
MENU_:
IF P1==0 THEN GOSUB REBOTE :goto NORMAL
if P2==0 then GOSUB REBOTE :goto INTERFAZ_USB
IF P3==0 THEN gosub REBOTE :GOTO SELEC_BOMBA
GOTO MENU_
'******************************** NORMAL ***************************************
NORMAL:
lcdout $FE,1,"**** NORMAL ****"
lcdout $FE,$C0,"AJ USTAR SISTEMA"
LCDOUT $FE,$90,"ACTIVAR CONTROL"
LCDOUT $FE,$D0,"SIS->P1 CONT->P3"
NORMAL_:
IF P1==0 THEN GOSUB REBOTE :goto AJ USTAR_SISTEMA
IF P2==0 THEN GOSUB REBOTE :goto MENU
if p3==0 then GOSUB REBOTE :goto ACTIVAR_CONTROL
GOTO NORMAL_
'*************************** AJ USTAR SISTEMA ***********************************
AJ USTAR_SISTEMA:
lcdout $FE,1,"**AJ US SISTEMA**"
LCDOUT $FE,$C0,"TEMPERATURA->P1"
LCDOUT $FE,$90,"MEMORIA----->P2"
LCDOUT $FE,$D0,"VISCOSIDAD-->P3"
AJ USTAR_SISTEMA_:
IF P1==0 THEN GOSUB REBOTE :goto MOD_TEMPERATURA
if P2==0 then GOSUB REBOTE :goto MOD_MEMORIA
IF P3==0 THEN GOSUB REBOTE :goto CALCULA
GOTO AJ USTAR_SISTEMA_
'*************************** MOD TEMPERATURA ***********************************
MOD_TEMPERATURA:
lcdout $FE,1,"ING. TEMPERATURA"
LCDOUT $FE,$C0,"ERR. TEMPERATURA"
LCDOUT $FE,$90,"ING->P1 ERR->P2"
LCDOUT $FE,$D0,"Regresar ---->P3"
MOD_TEMPERATURA_:
IF P1==0 THEN GOSUB REBOTE :goto ING_TEMPERATURA
if P2==0 then GOSUB REBOTE :goto ERR_TEMPERATURA
IF P3==0 THEN GOSUB REBOTE :goto NORMAL
GOTO MOD_TEMPERATURA_
'*************************** ING TEMPERATURA ***********************************
ING_TEMPERATURA:
lcdout $FE,1,"Ingresando T.max"
LCDOUT $FE,$90,"Up->P1 Down->P2"
LCDOUT $FE,$D0,"Regresar---->P3"
VALOR=0
Tmax_cont:
GOSUB SELECCIONAR
if valor>99 then VALOR=0
if valor==255 then VALOR=99
TH=VALOR
GOSUB REFRESCAR
GOTO Tmax_cont

SUBIR:
VALOR=VALOR+1
RETURN

BAJ AR:
VALOR=VALOR-1
RETURN

SELECCIONAR:
IF P1==0 THEN PAUSE 25 :gosub SUBIR
IF P2==0 THEN PAUSE 25 :GOSUB BAJ AR
IF P3==0 THEN PAUSE 25 :gosub REBOTE :GOTO MOD_TEMPERATURA
RETURN

REFRESCAR:
LCDOUT $FE,$C0,"T.max =",DEC2 TH,"gC"
PAUSE 4
RETURN
'*************************** ERR TEMPERATURA ***********************************
ERR_TEMPERATURA:
lcdout $FE,1,"Ingresando error"
LCDOUT $FE,$90,"Up->P1 Down->P2"
LCDOUT $FE,$D0,"Regresar---->P3"
VALOR=0
cont:
GOSUB SELEC
if valor>20 then VALOR=00
if valor==255 then VALOR=20
error=VALOR
GOSUB RefrescarError
GOTO cont
SELEC:
IF P1==0 THEN PAUSE 25 :gosub SUBIR
IF P2==0 THEN PAUSE 25 :GOSUB BAJ AR
IF P3==0 THEN PAUSE 25 :gosub REBOTE :GOTO MOD_TEMPERATURA
RETURN
RefrescarError:
LCDOUT $FE,$C0,"error=",DEC2 error
PAUSE 4
RETURN
'****************************** MOD MEMORIA ************************************
MOD_MEMORIA:
lcdout $FE,1,"VER MEMORIA"
LCDOUT $FE,$C0,"BORRAR MEMORIA"
LCDOUT $FE,$90,"VER->P1 BORR->P2"
LCDOUT $FE,$D0,"RegresaR ---->P3"
MOD_MEMORIA_:
IF P1==0 THEN GOSUB REBOTE :goto VER_MEMORIA
if P2==0 then GOSUB REBOTE :goto BORRAR_MEMORIA
IF P3==0 THEN GOSUB REBOTE :goto AJ USTAR_SISTEMA
GOTO MOD_MEMORIA_
'****************************** VER MEMORIA ************************************
VER_MEMORIA:
lcdout $FE,1,"LEER MEMORIA"
LCDOUT $FE,$C0,"POSICION MEMORIA"
LCDOUT $FE,$90,"LEER->P1 POS->P2"
LCDOUT $FE,$D0,"Regresar ---->P3"
VER_MEMORIA_:
IF P1==0 THEN GOSUB REBOTE :goto LEER_MEMORIA
if P2==0 then GOSUB REBOTE :goto POSICION_MEMORIA
IF P3==0 THEN GOSUB REBOTE :goto MOD_MEMORIA
GOTO VER_MEMORIA_
'****************************** LEER MEMORIA ***********************************
LEER_MEMORIA:
if USB==1 OR CAL==1 THEN GOTO UsbLeer
y=0
lcdout $FE,1
lcdout $FE,$C0,"Accediendo a Mem"
GOSUB puntos
UsbLeer:
for x=1 to 24
i2cread MEM_SDA,MEM_SCL,%10100001,y,[dato]
pause 4 ' tiempo necesario para la correcta lectura
if x==1 then Th1=dato
if x==2 then T1a=dato
if x==3 then T1b=dato
if x==4 then T1c=dato
if x==5 then T1d=dato
if x==6 then Deci1=dato

if x==7 then Th2=dato
if x==8 then T2a=dato
if x==9 then T2b=dato
if x==10 then T2c=dato
if x==11 then T2d=dato
if x==12 then Deci2=dato

if x==13 then Th3=dato
if x==14 then T3a=dato
if x==15 then T3b=dato
if x==16 then T3c=dato
if x==17 then T3d=dato
if x==18 then Deci3=dato

if x==19 then Th4=dato
if x==20 then T4a=dato
if x==21 then T4b=dato
if x==22 then T4c=dato
if x==23 then T4d=dato
if x==24 then Deci4=dato

y=y+1
next
tiem1=(T1d*1000)+(T1c*100)+(T1b*10)+T1a
tiem2=(T2d*1000)+(T2c*100)+(T2b*10)+T2a
tiem3=(T3d*1000)+(T3c*100)+(T3b*10)+T3a
tiem4=(T4d*1000)+(T4c*100)+(T4b*10)+T4a
if USB==1 THEN GOTO ACTIVAR_CONTROL
IF CAL==1 THEN GOTO CALCULA_R
lcdout $FE,1
lcdout $FE,$C0,"Datos Cargados!" :GOSUB t2s
for x=1 to 4
lcdout $FE,$C0,"Temp",DEC1 x,":"," Tiempo",DEC1 x,":"
if x==1 then
lcdout $FE,$90,DEC Th1,"gC ",DEC tiem1,",",dec2 deci1,"seg"
gosub pitillo
PAUSE 1500
endif
if x==2 then
lcdout $FE,$90,DEC Th2,"gC ",DEC tiem2,",",dec2 deci2,"seg"
gosub pitillo
PAUSE 1500
endif
if x==3 then
lcdout $FE,$90,DEC Th3,"gC ",DEC tiem3,",",dec2 deci3,"seg"
gosub pitillo
PAUSE 1500
endif

if x==4 then
lcdout $FE,$90,DEC Th4,"gC ",DEC tiem4,",",dec2 deci4,"seg"
gosub pitillo
PAUSE 1500
endif
lcdout $FE,1
next
goto main
'*************************** POSICION MEMORIA **********************************
POSICION_MEMORIA:
if conta>=0 and conta<6 then posicion=1
if conta>=6 and conta<12 then posicion=2
if conta>=12 and conta<18 then posicion=3
if conta>=18 and conta<24 then posicion=4
lcdout $FE,1,"La posicion act."
LCDOUT $FE,$90,"Normal ---->P3"
LCDOUT $FE,$C0,"Memoria: ",dec posicion
POS_CONT:
IF P3==0 THEN GOSUB REBOTE :goto NORMAL
GOTO POS_CONT
'**************************** BORRAR MEMORIA ***********************************
BORRAR_MEMORIA:
lcdout $FE,1,"----------------"
lcdout $FE,$C0,"Borrar Memoria?"
LCDOUT $FE,$90,"P1->si P2->no"
lcdout $FE,$D0,"----------------"
BorrarCont:
IF P1==0 THEN GOSUB REBOTE :goto Borrar
if P2==0 then GOSUB REBOTE :goto MOD_MEMORIA
goto BorrarCont
Borrar:
for conta=0 to 23
TH=0
I2CWRITE MEM_SDA,MEM_SCL,%10100000,conta,[TH]
pause 4 'tiempo necesario para la correcta escritura
next
conta=0
WRITE 1,conta 'Guardo en la EEPROM 1 el valor de conta
lcdout $FE,1
LCDOUT $FE,$C0,"Borrando..."
gosub puntos

goto main

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

DoUSBIn:
USBBufferCount =34
USBBufferCount =USBBufferSizeRX ' RX buffer size
USBService ' keep connection alive
USBIn 1, USBBuffer, USBBufferCount, DoUSBIn ' read data, if available



TH=USBBUFFER(0) ;Se guarda el dato del buffer 0 en TH
error=USBBUFFER(1) ;Se guarda el dato del buffer 1 en error

return
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
DoUSBOut:
USBBufferCount =USBBufferSizeTX ' TX buffer size
USBService ' keep connection alive

USBBuffer(3)=T4 'x1000
USBBuffer(4)=T3 'x100
USBBuffer(5)=T2 'x10 ;TIEM
USBBuffer(6)=T1 'x1
USBBuffer(7)=dato


USBBUFFER(8) =TH1
USBBUFFER(9) =T1d
USBBUFFER(10)=T1c
USBBUFFER(11)=T1b
USBBUFFER(12)=T1a
USBBUFFER(13)=deci1

USBBUFFER(14)=TH2
USBBUFFER(15)=T2d
USBBUFFER(16)=T2c
USBBUFFER(17)=T2b
USBBUFFER(18)=T2a
USBBUFFER(19)=deci2

USBBUFFER(20)=TH3
USBBUFFER(21)=T3d
USBBUFFER(22)=T3c
USBBUFFER(23)=T3b
USBBUFFER(24)=T3a
USBBUFFER(25)=deci3

USBBUFFER(26)=TH4
USBBUFFER(27)=T4d
USBBUFFER(28)=T4c
USBBUFFER(29)=T4b
USBBUFFER(30)=T4a
USBBUFFER(31)=deci4

USBBUFFER(32)=22


USBOut 1, USBBuffer, USBBufferCount, DoUSBOut'if bus available, transmit data

return
'*******************************************************************************
'*************************** ACTIVAR CONTROL ***********************************
'*******************************************************************************
ACTIVAR_CONTROL:

y=0
lcdout $FE,1
lcdout $FE,$D0,"On-->P1 Off-->P2"

Temper:

ADCON0=%00000001 ;configuro el modulo ADCON0 channel 0
pauseus 50 ;pausa para setear el canal
ADCON0.1=1 ;inicio de conversion
pauseus 50 ;pausa para la conversion

resp_a =(62*ADRESH)-520
dato=resp_a/100 ;Ecuaion encontrada por la regresion de Minimos
;cuadrados, con una R=100 ohm (cafe negro cafe).
C =resp_a//100
C =C*10
C =C/100

salto:
'''''''''''''''''''''''''''''''''''''''''

calibrar=dato+error

lcdout $FE,$80,"Temp.Act.:",dec2 DATO,",",DEC C,"gC"
lcdout $FE,$C0,"Temp.Max.: ",dec2 TH,"gC"
'lcdout $FE,$C0,"ADRESH: ",dec3 ADRESH

if TH==101 then GOSUB REBOTE :HIGH MOTOR :goto sal
IF TH==102 then GOSUB REBOTE :LOW MOTOR :goto sal

'''''''''''''''
if P1==0 THEN GOSUB REBOTE :HIGH MOTOR
IF P2==0 THEN GOSUB REBOTE :LOW MOTOR

sal:
'''''''
IF DATO>=TH THEN error=0 :y=1 ;:gosub pitillo

if calibrar>50 and calibrar<61 then high DmuxC :high DmuxB :high DmuxA :goto nex

IF calibrar>=TH THEN high DmuxC :high DmuxB :high DmuxA :high LedNiq ;off niq, on V2
if calibrar <TH THEN high DmuxC :high DmuxB :low DmuxA :low LedNiq ;on niq, off V2
nex:
if USB==1 and y==1 then goto TiempoUSB
IF y==1 THEN GOSUB TIEMPO
if USB==1 then goto TRANSMICION
if y==0 then gosub t1s ;;;;;;;;;;;;;;;;;
goto Temper

TRANSMICION:
gosub DoUSBIn
gosub DoUSBOut
goto Temper
'''''''''''''''''''''''''' RECIBIENDO '''''''''''''''''''''''''''''''''
INTERFAZ_USB:
COMPU:
lcdout $FE,1,"Comunicacion PC"
LCDOUT $FE,$C0,"IniciandoSistema"
GOSUB puntos

USB=1
y=0
GOTO SELEC_BOMBA
USB_R:
goto LEER_MEMORIA


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
REBOTE:
gosub pitillo

IF P1==0 THEN GOTO REBOTE
IF P2==0 THEN GOTO REBOTE
IF P3==0 THEN GOTO REBOTE

for x=0 to 255
pauseus 45
next
low pito
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pitillo:
high pito
for T=1 to 40
pause 1
next
low pito
return
'********************* Tiempo Para Aproximar 1 seg. **************************
TIEMPO:
FOR X1=0 TO 99 ;Pausa de 9 mseg. por 100 veces me
PAUSEus 1930 ;da un total de 900 mseg. El cual
''''''' ;se complementa con el tiempo de las
if P1==0 THEN HIGH MOTOR ;demas subrutinas o bucles.
IF P2==0 THEN LOW MOTOR
IF TIEM>999 THEN lcdout $FE,$9B,",",dec2 X1,"s"
IF TIEM<=999 THEN lcdout $FE,$9A,",",dec2 X1,"s"

NEXT
TIEM=TIEM+1
IF TIEM>999 THEN LCDOUT $FE,$90,"Tiempo:",DEC4 TIEM
IF TIEM<=999 THEN LCDOUT $FE,$90,"Tiempo:",DEC3 TIEM
RETURN
;;;;;;;;;;;;
TiempoUSB:
FOR X1=0 TO 99 ;Pausa de 9 mseg. por 100 veces me
PAUSEus 1900 ;da un total de 900 mseg. El cual
''''''' ;se complementa con el tiempo de las
if P1==0 THEN gosub t1s :HIGH MOTOR ;demas subrutinas o bucles.
IF P2==0 THEN gosub t1s :LOW MOTOR
IF TIEM>999 THEN lcdout $FE,$9B,",",dec2 X1,"s"
IF TIEM<=999 THEN lcdout $FE,$9A,",",dec2 X1,"s"

UsbDecimal:
' USBBufferCount =3
USBBufferCount =USBBufferSizeTX ' TX buffer size
USBService ' keep connection alive

USBBuffer(2)=X1 ;decimales

USBOut 1, USBBuffer, USBBufferCount, UsbDecimal ' if bus available, transmit data

GOSUB DoUSBIn

NEXT
TIEM=TIEM+1
LCDOUT $FE,$90,"Tiempo:",DEC3 TIEM
T4=TIEM DIG 3
T3=TIEM DIG 2
T2=TIEM DIG 1
T1=TIEM DIG 0

GOTO TRANSMICION
'********************* Tiempo Para Aproximar 0,5 seg. **************************
t1s:
for x=0 to 200
pause 1
NEXT
return
'********************* Tiempo Para Aproximar 2 seg. **************************
t2s:
for x=0 to 200
pause 1
NEXT
for x=0 to 200
pause 1
NEXT

return
'********************* Tiempo Para Aproximar 4 seg. **************************
t4s:
for x=0 to 200
pause 1
NEXT

for x=0 to 200
pause 1
NEXT

for x=0 to 200
pause 1
NEXT

for x=0 to 200
pause 1
NEXT

return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;; SELECCIONAR BOMBA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SELEC_BOMBA:
disable
lcdout $FE,1,"SELECCION BOMBA"
lcdout $FE,$C0,"Bomba: "
LCDOUT $FE,$90,"Up->P1 OK->P2"
lcdout $FE,$D0,"Salir ------>P3"
VALOR=1

selBomba:
HIGH DmuxA
HIGH DmuxB
HIGH DmuxC

if USB==1 THEN SelecBombaUSBout
;;;;;;;;;;;;;;;;;;;;;;;; IF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF P1==0 THEN
for x=0 to 100
pause 1
NEXT
VALOR=VALOR+1
ENDIF

IF P2==0 THEN goto ok
reg:
IF P3==0 THEN GOTO MAIN

if usb==0 then goto contimanual

'''''''''''''''''''
SelecBombaUSBout:

HIGH DmuxA
HIGH DmuxB
HIGH DmuxC

USBBufferCount =USBBufferSizeTX ' TX buffer size
USBService ' keep connection alive

USBBuffer(32)=12


USBOut 1, USBBuffer, USBBufferCount, SelecBombaUSBout ' if bus available, transmit data

SelecBombaUSBin:
USBBufferCount =1
'USBBufferCount =USBBufferSizeRX 'RX buffer size
USBService 'keep connection alive
USBIn 1, USBBuffer, USBBufferCount, SelecBombaUSBin 'read data, if available

usb_save=USBBUFFER(0)

if usb_save==101 then gosub REBOTE :VALOR=VALOR+1
IF usb_save==102 THEN goto ok
IF usb_save==103 THEN gosub REBOTE :GOTO LEER_MEMORIA

IF VALOR >4 THEN VALOR=1
lcdout $FE,$C7,Dec1 VALOR

goto SelecBombaUSBout

''''''''''''''''''''''''''''''''''''''''
contimanual:
IF VALOR >4 THEN VALOR=1

lcdout $FE,$C7,Dec1 VALOR
GOTO selBomba

ok:
if VALOR==1 THEN
LOW DmuxC
LOW DmuxB
LOW DmuxA
ENDIF

if VALOR==2 THEN
LOW DmuxC
LOW DmuxB
HIGH DmuxA
ENDIF

if VALOR==3 THEN
LOW DmuxC
HIGH DmuxB
LOW DmuxA
ENDIF

if VALOR==4 THEN
LOW DmuxC
HIGH DmuxB
HIGH DmuxA
ENDIF

for x=1 to 100
pause 1
next
goto reg
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CALCULAR VISCOSIDAD ;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CALCULA:
disable
Agua=52
CAL=1
GOTO LEER_MEMORIA
CALCULA_R:
;;;;;;;;;;;;;;;;;;;;;;;;
X=1
TX=tiem1
GOSUB ComenzarCalculo
X=2
TX=tiem2
GOSUB ComenzarCalculo
X=3
TX=tiem3
GOSUB ComenzarCalculo
X=4
TX=tiem4
GOSUB ComenzarCalculo
GOTO main


ComenzarCalculo:
if Agua==0 then goto infinito
IF TX>=Agua THEN GOTO TX_MAYOR

TX_MENOR:
TX=TX*10
Cmenor=TX/Agua
goto vis_menor

TX_MAYOR:

Cmayor=TX/Agua

Cdeci=TX//Agua
Cdeci=Cdeci*10
Cdeci=Cdeci/Agua

vis_mayor:
lcdout $FE,1,"----------------"
lcdout $FE,$C0," Visicosidad:"
lcdout $FE,$D0,"----------------"

LCDOUT $FE,$90," V",DEC1 X,"=",DEC Cmayor,",",dec Cdeci," gE"
gosub pitillo

ver:
for z=1 to 15
for x=1 to 100
pause 1
next
next
return

vis_menor:
lcdout $FE,1,"----------------"
lcdout $FE,$C0," Visicosidad:"
lcdout $FE,$D0,"----------------"

LCDOUT $FE,$90," V",DEC1 X,"=","0,",dec Cmenor," gE"
gosub pitillo
GOTO ver

infinito:
lcdout $FE,1,"----------------"
lcdout $FE,$C0," Visicosidad:"
lcdout $FE,$D0,"----------------"

LCDOUT $FE,$90," V",DEC1 X,"=","error"
gosub pitillo: gosub pitillo: gosub pitillo
GOTO ver

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
''''''''''''''''''''''''' HANDLER ''''''''''''''''''''''''''''''''''''''''
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

DISABLE 'Deshabilita las interrupciones en el handler
PARO: 'Handler de la interrupcion

high DmuxC :high DmuxB :high DmuxA :high LedNiq
LOW MOTOR

b=1
y=0
usb_save=0

lcdout $FE,1,"----------------"
lcdout $FE,$C0," FIN DE PROCESO"
LCDOUT $FE,$90,"Tiempo:",dec TIEM,",",dec2 X1,"seg"
LCDOUT $FE,$D0,"----------------"

T4=TIEM DIG 3
T3=TIEM DIG 2
T2=TIEM DIG 1
T1=TIEM DIG 0


fin_cont:

FOR x=1 TO 5

HIGH PITO
for z=1 to 100
pause 1
next
;;;;;;;;;;;;;;;;;;;;;;;;
if USB==1 THEN UsbInterruptIN
goto paso

UsbInterruptIN:
USBBufferCount =2
'USBBufferCount =USBBufferSizeRX 'RX buffer size
USBService 'keep connection alive
USBIn 1, USBBuffer, USBBufferCount, UsbInterruptIN 'read data, if available


UsbInterruptOUT:
' USBBufferCount =3
USBBufferCount =USBBufferSizeTX ' TX buffer size
USBService ' keep connection alive

USBBuffer(32)=11

USBOut 1, USBBuffer, USBBufferCount, UsbInterruptOUT ' if bus available, transmit data

;;;;;;;;;;;;;;;;;;;;;;;;;;;

paso:

LOW PITO
for z=1 to 100
pause 1
next

NEXT


lcdout $FE,1,"----------------"
lcdout $FE,$C0," Guardar Datos?"
LCDOUT $FE,$90,"P1->si P2->no"
lcdout $FE,$D0,"----------------"

IF USB==1 THEN GOTO SaveUSBout
GOTO G_D
'''''''''''''''''''
SaveUSBout:
' USBBufferCount =3
USBBufferCount =USBBufferSizeTX ' TX buffer size
USBService ' keep connection alive

USBBuffer(32)=11


USBOut 1, USBBuffer, USBBufferCount, SaveUSBout ' if bus available, transmit data

if usb_save==101 then goto SAVE
IF usb_save==102 THEN GOTO salir

SaveUSBin:
USBBufferCount =1
'USBBufferCount =USBBufferSizeRX 'RX buffer size
USBService 'keep connection alive
USBIn 1, USBBuffer, USBBufferCount, SaveUSBin 'read data, if available

usb_save=USBBUFFER(0)

if usb_save==101 then goto SAVE
IF usb_save==102 THEN GOTO salir

goto SaveUSBout
''''''''''''''''''''''''''''''''''''''''
G_D:
if P1==0 THEN goto SAVE
IF P2==0 then GOTO salir
goto G_D

SAVE:
lcdout $FE,1
LCDOUT $FE,$C0," Guardando..."

puntos:

for x=1 to 30
pause 1
next
LCDOUT $FE,$90,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$91,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$92,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$93,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$94,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$95,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$96,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$97,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$98,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$99,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$9A,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$9B,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$9C,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$9D,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$9E,"."
for x=1 to 30
pause 1
next
LCDOUT $FE,$9F,"."
for x=1 to 30
pause 1
next

if b==1 then goto punt_cont

return

punt_cont:
I2CWRITE MEM_SDA,MEM_SCL,%10100000,conta,[TH]
pause 4 ' tiempo necesario para la correcta escritura
conta=conta+1
I2CWRITE MEM_SDA,MEM_SCL,%10100000,conta,[T1]
pause 4 ' tiempo necesario para la correcta escritura
conta=conta+1
I2CWRITE MEM_SDA,MEM_SCL,%10100000,conta,[T2]
pause 4 ' tiempo necesario para la correcta escritura
conta=conta+1
I2CWRITE MEM_SDA,MEM_SCL,%10100000,conta,[T3]
pause 4 ' tiempo necesario para la correcta escritura
conta=conta+1
I2CWRITE MEM_SDA,MEM_SCL,%10100000,conta,[T4]
pause 4 ' tiempo necesario para la correcta escritura
conta=conta+1
I2CWRITE MEM_SDA,MEM_SCL,%10100000,conta,[X1]
pause 4 ' tiempo necesario para la correcta escritura

conta=conta+1
if conta >23 then conta=0
WRITE 1,conta 'Guardo en la EEPROM 1 el valor de conta

lcdout $FE,1
LCDOUT $FE,$C0,"Datos Guardados"
for x=0 to 200
pause 1
NEXT
for x=0 to 200
pause 1
NEXT

salir:
TIEM=0
X1=0
INTCON=%10010000 'Abilita la interrupcion B0

enable 'Habilita las interrupciones despues del handler

if USB==1 THEN goto LEER_MEMORIA
goto main

END


Al momento de terminar con el proceso se guardan los datos obtenidos si as lo decide el
usuario.

Ahora se presenta la codificacin del segundo microcontrolador que comandara a la
Niquelina, y que tambin cuenta con la opcin de multiplexar cuatro bombas las mismas que
podrn transportar el aceite hacia el contenedor del viscosmetro de Engler.

'*****************************************************************************
'* Name : DEMUX.BAS *
'* Author : IVAN PARRA P. *
'* Notice : Copyright (c) 2007 [set under view...options] *
'* : All Rights Reserved *
'* Date : 29/12/2007 *
'* Version : 1.0 *
'* Notes : Programa para demultiplexar las 4 bombas realizar *
'* : el control de angulo de disparo *
'*****************************************************************************
CMCON=7
TRISA=%00111100
TRISB=%00000001
X var byte
DmuxA var PORTA.2
DmuxB var PORTA.3
DmuxC var PORTA.4

BOMBA1 VAR PORTA.1
BOMBA2 VAR PORTA.0
BOMBA3 VAR PORTA.7
BOMBA4 VAR PORTA.6
SHOT VAR PORTB.1
disp var byte
low BOMBA1
low BOMBA2
low BOMBA3
low BOMBA4
low shot
'*******************************************************************************
ON INTERRUPT GOTO DISPARO 'En caso de aber interrupcion ir a DISPARO
INTCON=%10010000 'Abilita la interrupcion B0
OPTION_REG.6=1 'Habilito la interrupcin de RB0, por flanco de subida
'*******************************************************************************
INICIO:
IF DMUXC==0 AND DMUXB==0 AND DMUXA==0 THEN
disp=1
low shot
HIGH BOMBA1
LOW BOMBA2
LOW BOMBA3
LOW BOMBA4
ENDIF

IF DMUXC==0 AND DMUXB==0 AND DMUXA==1 THEN
disp=1
low shot
LOW BOMBA1
HIGH BOMBA2
LOW BOMBA3
LOW BOMBA4
ENDIF

IF DMUXC==0 AND DMUXB==1 AND DMUXA==0 THEN
disp=1
low shot
LOW BOMBA1
LOW BOMBA2
HIGH BOMBA3
LOW BOMBA4
ENDIF

IF DMUXC==0 AND DMUXB==1 AND DMUXA==1 THEN
disp=1
low shot
LOW BOMBA1
LOW BOMBA2
LOW BOMBA3
HIGH BOMBA4
ENDIF
goto INICIO

''''''''''''''''''''''''' HANDLER ''''''''''''''''''''''''''''''''''''''''
DISABLE 'Deshabilita las interrupciones en el handler
DISPARO: 'Handler de la interrupcion
IF DMUXC==1 AND DMUXB==1 AND DMUXA==1 THEN goto salir
if disp=1 then goto salir

FOR X=1 TO 125 'El bucle FOR es para contar los grados deceado para que se cierre el Triac
PAUSEUS 36 '36 'En el calculo deberia ser el paso del grado de 46us pero en la practica con un
cristal de 12MHz se da con 39us
NEXT
HIGH SHOT 'Disparo al triac
pauseus 5
salir:
low shot
low BOMBA1
low BOMBA2
low BOMBA3
low BOMBA4
disp=0

INTCON=%10010000 'Abilita la interrupcion B0
resume 'Retorna a programa principal donde ocurrio la inte
enable 'Habilita las interrupciones despues del handler
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
END
2.4 SOFTWARE DE LA PC

El software es hecho en el entorno de Labview 7.1, ya que es una herramienta muy amigable a
la hora de programar, dado que es un lenguaje de programacin grfico que utiliza iconos en
lugar de lneas de texto para crear las aplicaciones. En contraste con los lenguajes de
programacin basados en texto, donde las instrucciones determinan la ejecucin del
programa, en LabVIEW el flujo de los datos, determinan la ejecucin.

En LabVIEW se crea una interfaz de usuario utilizando un conjunto de herramientas y
objetos. La interfaz del usuario es llamada el panel frontal. Posteriormente, se adiciona el
cdigo utilizando representaciones grficas de funciones para controlar los objetos del panel
frontal. El diagrama de bloques contiene dicho cdigo. En ocasiones, el diagrama de bloques
parece un diagrama de flujo.

Los instrumentos virtuales (VIs) tienen tres partes principales: el panel frontal, el diagrama
de bloques y el icono/conector. El panel frontal, que es la interfaz al usuario del VI, especifica
las entradas y despliega las salidas del VI. El diagrama de bloques contiene el cdigo fuente
grfico compuesto de nodos, terminales y cables.

En el diagrama de bloques, la programacin es netamente grafica, en donde se ha utilizado los
siguientes conceptos:

2.4.1 ESTRUCTURA CASE

Una estructura Case, mostrada a la izquierda, tiene dos o mas
subdiagramas, o casos. Solo uno de ellos es visible a la vez, al igual que
su ejecucin. Un valor de entrada determina que subdiagrama ejecutar.
La estructura Case es anloga a la instruccin Case o a las instrucciones
if...then...else en lenguajes de programacin convencionales basados en
texto.

El selector de caso identifica la estructura Case, mostrado a la
izquierda, a su vez contiene botones de flecha de incremento a cada
lado. Emplee los botones con flechas de decremento o incremento para
pasar a travs de los casos disponibles.

Terminal de seleccin, mostrado a la izquierda, determina que caso se
est ejecutando. Usted puede posicionar el selector terminal en
cualquier borde de la estructura Case. Si el tipo de dato es Booleano, la
estructura se basa en un caso Verdadero y un caso Falso. Si el tipo de
dato es numrico, la estructura puede tener hasta 2
31
casos.


2.4.2 CICLO WHILE

Un ciclo While de LabVIEW, mostrado a la izquierda, ejecuta un
subdiagrama hasta que se cumple alguna condicin especial. El ciclo
While se encuentra en la paleta FunctionsStructures.


El ciclo While ejecuta el subdiagrama hasta que se cumpla la condicin
terminal, una terminal de entrada recibe un valor booleano especfico.
Por defecto, la apariencia y el comportamiento de la condicin terminal
que termina la ejecucin del ciclo While es (contine si es verdadero),
mostrada a la izquierda. Cuando la condicin terminal es Continue If
True, el ciclo While ejecuta el subdiagrama hasta que se recibe el valor
FALSE.

La terminal de iteracin (Un terminal de salida), mostrada a la
izquierda, contiene el nmero de iteraciones completas. El contador de
iteraciones siempre arranca en cero.

2.4.3 ESTRUCTURA DE SECUENCIA

Una estructura de secuencia, mostrada a la izquierda, contiene uno o
ms subdiagramas o marcos que se pueden ejecutar en un orden de
secuencia. La estructura de secuencia es el mecanismo que permite a
LabVIEW controlar el orden en el que se ejecutan los nodos. El
diagrama que va a ser ejecutado primero, se coloca dentro de un marco
0, luego el 1, despus el 2, y as sucesivamente. Al igual que la
estructura Case, solamente un marco es visible a la vez.

Los tneles de las estructuras Sequence solo pueden tener una fuente de datos, a diferencia de
las estructuras Case. La salida puede ser emitida de cualquier marco, pero el dato abandona la
estructura de Sequence solo cuando todos los marcos se hayan ejecutado y no cuando un
marco individual lo haya hecho. Al igual que las estructuras Case, los datos en los tneles de
entrada estn disponibles para todos los marcos.

2.4.4 FUNCIONES DE ARREGLOS

Utilice las funciones de arreglos, localizadas en la paleta Functions>>5Array, para crear y
manipular arreglos. Entre las funciones de arreglos se encuentran las siguientes:

Array Size. -(tamao del arreglo) regresa el nmero de elementos en cada dimensin
de un arreglo. Si el arreglo de entrada es de n dimensiones, la salida size es un arreglo
de n elementos. Por ejemplo, en la figura 2.7, la funcin Array size retorna un valor
de 4 para el arreglo array.


Figura 2.7. Array Size

Initialize Array. -Crea un arreglo con el nmero de elementos especificados en
dimensin size, cada elemento del arreglo es iniciado con el valor de la terminal
element. El tamao de la funcin se puede cambiar para que corresponda al nmero
de dimensiones del arreglo de salida. Por ejemplo, en la figura 2.8, la funcin
Initialize Array retorna el siguiente arreglo para un element de 4, y una dimensin size
de 3.



Figura 2.8. Initialize Array

Build Array.- mltiples arreglos, aade elementos a un arreglo de n dimensiones, ud.
puede cambiar el tamao de esta funcin para incrementar el nmero de elementos en
el arreglo de salida. Por ejemplo, si usted une dos arreglos, la funcin Build Array
retorna el arreglo que se muestra en la figura 2.9.


Figura 2.9. Build Array

Para unir las entradas en un arreglo ms grande de la misma dimensin, como se muestra en
la figura 2.10, haga click con el botn derecho del mouse en el nodo de la funcin y
seleccione la opcin Concatenate Inputs del men.


Figura 2.10. Concatenate Inputs

Array Subset.- Retorna una parte de un arreglo, empezando en el nmero index y
conteniendo el nmero de elementos expresado en lenght. Por ejemplo, si se utiliza el
arreglo como entrada, como se muestra en la figura 2.11, la funcin Array Subset
retorna el siguiente arreglo para index de 2 y length de 4.



Figura 2.11. Array Subset


Index Array.- Retorna un elemento de un arreglo apuntado por index. Por ejemplo, en la fig.
2.12, la funcin Index Array retorna 7 para un index de 2. Tambin se puede utilizar la
funcin Index Array para extraer una fila o una columna de un arreglo 2D para crear un
subarreglo del original. Para hacer esto, cablee un arreglo 2D a la entrada de la funcin. Dos
terminales index estn disponibles. La terminal index superior indica la fila y la segunda
terminal indica la columna. Se pueden cablear entradas a ambas terminales index para apuntar
a un solo elemento o se puede cablear nicamente una terminal para extraer una fila o una
columna de datos. Por ejemplo, cablee el siguiente arreglo a la entrada de la funcin.



Figura 2.12. Index Array, arreglo apuntado

La funcin Index Array retorna el siguiente arreglo para un index de 1 (en filas).


Figura 2.13. Index Array, arreglo en 2D


2.4.5 CADENAS DE CARACTERES

Una cadena de caracteres es una coleccin de caracteres ASCII desplegables o no
desplegables. Las Cadenas de Caracteres proveen un formato de plataforma-independiente
para informacin y datos. Entre las aplicaciones de la Cadena de Caracteres se encuentran:

Creacin de un mensaje de texto simple.
Para controlar un instrumento, los datos numricos pasan como cadenas de caracteres
y despus hay que convertirlos en valores numricos.
En muchas ocasiones se requiere almacenar datos numricos en disco; para hacer
esto, primero hay que convertirlos a cadenas de caracteres.
Instruyendo o incitando al usuario con cajas de dilogo. En el panel frontal, las
cadenas de caracteres aparecen en tablas, cajas de texto y etiquetas.

Coloque la Funcin Format into String localizada en la paleta Functions>>
String. Esta funcin convierte el argumento Numeric en una cadena de
caracteres.

2.4.6 OPERACIONES DE ENTRADA/SALIDA CON ARCHIVOS

Las operaciones de entrada y salida (E/S) de archivos permiten almacenar y obtener
informacin de los archivos que se encuentran almacenados en disco. Estos se encuentran
localizados en la paleta Functions>>File I/O, all se encuentran aspectos como los siguientes:

Abrir y cerrar datos de archivos.
Leer y escribir datos para archivar.
Leer y escribir archivos para hojas de clculo.
Mover y renombrar archivos y directorios.
Cambiar caractersticas de un archivo.
Crear, modificar y leer una configuracin de un archive.

Una operacin tpica de manejo de acciones I/O en archivos involucra los siguientes procesos.

1. Crear o abrir un archivo.

Indicar donde se encuentra un archivo existente o donde se desea crear un nuevo archivo
especificando la ruta o introducindola como respuesta a una caja de dilogo con el fin
reindicarle a LabVIEW la localizacin del archivo. Luego que el archivo abre, un nmero de
referencia denominado refnum lo representa.

2. Leer o escribir en el archivo.

3. Cerrar el archivo.

Use los siguientes VI`s y funciones para desarrollar las operaciones bsicas de I/O en
archivos:


Open/Create/Replace File.- Abre o reemplaza un archivo existente
ocrea uno nuevo. Si el parmetro File Path est vaco, el VI despliega
una caja de dilogo en la cual se debe seleccionar el archivo nuevo o
existente.

Read File.- Lee datos desde el archivo especificado por el parmetro
refnum y los entrega en la salida date, adems count es la cantidad de
datos ledos. La lectura comienza en la posicin indicada por pos mode
y poss offset y depende el formato del archivo en particular.

Write File.- Escribe datos en el archivo especificado por el parmetro
refnum. La escritura comienza en la posicin indicada por pos mode y
poss offset para archivos de cadena de bytes y al final del archivos para
los de tipo datalog.


Close File.- Cierra el archivo especificado por el parmetro refnum.




2.4.7 GRABANDO DATOS EN UN ARCHIVO NUEVO O EXISTENTE

Es posible escribir cualquier tipo de dato en un archivo que abra o cree con las funciones y
VI`s para operaciones de I/O. Si otros usuarios o aplicaciones necesitan acceso al archivo,
escriben cadenas de datos en formato ASCII. Usted puede acceder archivos tanto por medio
del programa o a travs de una caja de dilogo.




En la tabla 2.1, se muestra como se construye el nombre de una ruta.

Tabla 2.1.
Plataforma

Nombre de la ruta

Windows

Consiste del nombre del dispositivo, dos puntos, backslash
separando los nombres de los directorios y del archivo. Por
ejemplo, c:\testdata\test1.dat es el nombre de ruta para el
archivo llamado test1.dat en el directorio testdata.

UNIX

Consiste de slash separando los nombres de los directorios y
del archivo. Por ejemplo, /home/testdata/test1.dat es el
nombre de ruta para el archivo llamado test1.dat en el
directorio testdata del directorio /home. Los nombres de
archivo y ruta son sensitivos a la escritura.

Macintosh

Consiste del nombre de volumen (nombre de la unidad), dos
puntos separando los nombres de los folders y del archivo.
Por ejemplo, Hard Disk:testdata:test1.dat es el nombre de ruta
para el archivo tets1.dat en el folder llamado tetsdata de la
unidad Hard Disk.



2.4.8 VISA VIs

Las funciones VISA que se utilizan para comunicarse con instrumentos GPIB frecuentemente
son VISA Write y VISA Read. Muchos instrumentos GPIB requieren que se envi o se lea
informacin.

VISA Configure Serial Port VI, localizado en FunctionsInstrument
I/OSerial. Este VI inicializa el puerto serial y a la vez se confgura
como el NI Istrument Simulator.

Simple Error Handler, localizado en la paleta FunctionsTime &
Dialog. Este VI es el encargado de desplegar una caja de dialogo si
ocurre algun error.

La funcin VISA Write escribe la cadena de caracteres write buffer
para la tarjeta especificada por VISA resources name dup VISA
resources name retornando a la misma seccion. Asincronicamente es
escrita para todas las plataformas.
La funcin VISA Read lee la cadena de caracteres para la tarjeta
especificada por VISA resources name dup VISA resources name
retorna el sensor a la misma seccin. En plataformas de UNIX los datos
son leidos sincronicamente. Asincronicamente es leida para todas las
plataformas. return count contiene el numero de bytes que actualmente
estan siendo transferidos por la GPIB.

GPIB es un bus de 8 bits. Puede transferir nicamente un byte cada vez.

Visa Enable Event, habilita un tipo de evento especificado

VISA Wait on Event, Suspende la ejecucin de un hilo de aplicacin y
espera por un tipo de evento para no exceder un perodo de tiempo
especificado por la interrupcin. Usted puede poner esta funcin para
realizar los funcionamientos de I/O sncronamente o asincrnicamente.
Por defecto, la funcin se ocupa de funcionamientos de I/O
asincrnicamente.

VISA Get USB Interrupt Data, Recupera los datos de la interrupcin
que se guardan en una VISA USB.


2.4.9 IMPLEMENTACION EN LABVIEW

Labview consta de dos ventanas principales para llevar a cabo la programacin, que son el
Panel Frontal y, el Diagrama de bloques o Flujos.


2.4.9.1 PANEL FRONTAL

El Panel Frontal es la interfaz con el usuario, en donde se transmiten y reciben todos los datos
del computador al microcontrolador, adems de respaldar los datos obtenidos por el
microcontrolador en una memoria eeprom.



Figura 2.14. Interfaz con el usuario.

En la figura 2.14, se muestra el entorno en el que se trabajara cuando se utilice la interfaz de
comunicacin con una PC a travs del bus USB. A continuacin se especifica las funciones
que realiza cada uno de los elementos del panel frontal que se aprecia en la fig 2.14.
En la figura 2.15, que se expone abajo cuenta con las siguientes funciones:

Ingreso de la Temperatura mxima a la que funcionaran las Niquelinas.
Ingreso del Error de Temperatura al que se accionaran las Niquelinas.
Un cuadro de comentarios, en donde se indican las funciones actuales.
Tres pulsantes, que sirven para decidir si se guardan los datos obtenidos a la
memoria Eeprom, y para seleccionar las bombas en donde se encuentran los
diferentes aceites.


Figura 2.15. Funciones de envo de datos al PIC.

Las funciones de la recepcin de los datos se muestra en la figura 2.16, y consta de:

Un selector en donde se visualiza los datos de cierta medicin.
Visualizacin de la temperatura de la medicin seleccionada, en C.
Visualizacin del tiempo de la medicin seleccionada, en segundos.
Visualizacin del tiempo actual que demora el proceso en segundos.


Figura 2.16. Recepcin de datos.

La siguiente figura 2.17 se muestra el cambio de temperatura en tiempo real, observndose a
travs de un graficador y un termmetro, y se muestra tambin un pulsante de paro general.


Figura 2.17. Indicador visual de la Temperatura actual.

2.4.9.2 DIAGRAMA DE FLUJOS

Es el cdigo de programacin, conocido como Diagrama de Flujos o, Diagrama de Bloques
ya que es una programacin de tipo grafico.

A continuacin se describe el diagrama de flujos por etapas en el cual se indica las diferentes
conexiones por medio de conectores marcados de color rojo (A-E), as en la fig. 2.18 se
muestra la etapa de transmisin de la PC al PIC, en donde los datos que se envan son los
necesarios para que el microcontrolador pueda trabajar de acuerdo a las utilidades del usuario,
tales como son, el Error de Temperatura y, la Temperatura mxima la cual se deben tratar de
mantener constante en la Niquelina.





Figura 2.18. Transmisin de datos Pc Pic


En la figura 2.19, se observa la etapa de recepcin de la PC al PIC, en donde el
microcontrolador transmite al computador secuencialmente un paquete de 18 Buffer, en
donde a este paquete de datos se los transforma a una cadena de datos de tipo String, por
medio del convertidor Number To Decimal String



Figura 2.19. Recepcin de datos Pc Pic


La siguiente etapa se encarga de escoger o seleccionar el nmero de medicin que se ha hecho
con el dispositivo, la misma que se encuentra en la memoria Eeprom de la tarjeta de control.
En la fig. 2.20 muestra una Estructura Case, en donde se encuentra un Index Array que
retorna un elemento del arreglo apuntado por index 8, 9 y 10, que se refiere a la temperatura
mxima ingresada, el tiempo que duro el proceso y los centesimal de ese tiempo, a estos
valores se los convierte en valores de tipo numrico, por medio del Decimal String To
Number, as en el index 10, o Buffer 10, es posible dividirlo para 100 para poder tener el dato
centesimal del tiempo, y luego sumarlo al valor numrico del index 9 y como resultado se
tiene el tiempo total del proceso expresado en un numero de punto flotante.


Figura 2.20. Seleccin de la Medicin

La figura 2.20, se repite para las mediciones 1,3 y 4, ya que se hace el mismo procedimiento
seleccionando los Buffers del 5 al 16 a travs del Index Array.


En la figura 2.21 se muestran, los mensajes de comentarios que se visualizan en el Panel
Frontal, de acuerdo a los eventos que sucedan a la hora de correr el programa proveniente del
index 17. Tambin se expone en la fig. 2.21, la temperatura actual que proviene del index 4 y
el tiempo actual, que se procede de la misma manera que en la figura 2.20.






Figura 2.21. Comentarios y visualizacin de la temperatura y tiempo real

Por medio del index 17, el microcontrolador avisa a la PC si hubo o no interrupcin a causa
del Fin de Proceso, es decir cuando el aceite se haya llenado en el recipiente de 200 cc luego
de que la Niquelina se haya mantenido en la temperatura constante ingresada por el usuario.
Una ves que se haya finalizado el proceso, el sistema o el programa le pregunta el usuario si
desea guardar los datos obtenidos en la presente medicin, por medio de de dos pulsantes
mostrados en la figura 2.22, al pulsar cualquiera de estos dos pulsantes, el computador
transmitir esta decisin al microcontrolador para que ste responda a lo que se desea hacer.



Figura 2.22. Transmisin


En la figura 2.23, se muestra el mismo procedimiento que en la fig. 2.20, es decir entre los
buffers del 5 al 16, los datos que se encuentran en tipo string se los convierte a valores de tipo
numrico para poder ser procesados, y luego se los vuelve a convertir en datos de tipo string
por medio del Number To Decimal String.


Figura 2.23. Procesamiento de los valores transmitidos por el Pic


2.5 COMUNICACIN USB DEL DISPOSITIVO A LA PC

Para poder hacer una correcta comunicacin entre el PIC y la PC, es necesario seguir los
siguientes pasos:

1. Realizar el cdigo en MicroCode Studio por medio del EasyHID


Figura 2.24. EasyHID introduccin.


En la figura 2.24 se debe completar los casilleros Copany Name y Product Name, con las
etiquetas que mas nos convenga, luego se hace clic en Next.


En la siguiente ventana se hace clic en Next, porque no es necesario modificar nada. Si se
requiere obtener ayuda de cmo se debe hacer las conexiones alrededor de un PIC para USB,
se hace clic en Tell me more about using Vendor and Products IDs, mostrado en la
figura 2.25


Figura 2.25. EasyHID Vendor y Producto.


En la figura 2.26, se observa una ventana en donde indica el tiempo mximo, en que la
interfaz usb debe hacerse como entrada y como salida, tambin se tiene el nmero de Buffer
de entrada y salida disponibles, claro que se puede modificar de acuerdo al nmero de
variables que se necesite enviar a la PC. Luego se hace clic en Next.



Figura 2.26. EasyHID Configuracin de Detalles

En la ventana siguiente se debe dar un nombre a al proyecto en Project Name y dar la
ubicacin en Location. Tambin se debe indicar que tipo de microcontrolador se va a usar
por ejemplo el pic 18F2550, y despus se da clic en Next.



Figura 2.27. EasyHID Nombre del Proyecto y Localizacin.

Y por ultimo se genera automticamente el cdigo fuente necesario para trabajar en
MicroCode Studio Plus, mostrado en la figura 2.28, el mismo que se genero en la ubicacin
que se designo en la figura 2.27.



Figura 2.28. EasyHID Generando el Proyecto.


2. Reconocer el PIC como interfaz humana.

Para esto se usa el programa VISA Driver Development Wizard de Nacional
Instruments\VISA mostrado en la figura 2.29.



Figura 2.29. Visa Wizard

Aqu obviamente se debe pinchar en USB y luego se hace clic en Siguiente.


Figura 2.30. Informacin sobre el Dispositivo.

En la figura 2.30, se debe ingresar el nmero del Vendor ID del microcontrolador ya grabado
con el cdigo fuente que se genero por medio del EasyHID, al igual que el nmero del
Product ID. Dichos nmeros o direcciones se puede verificar al ingresar a la ventana del
administrador de dispositivos.

Tambin se debe dar nombre a las etiquetas de Manufaturer Name y Model Name, y a
continuacin se hace clic en Siguiente.


Figura 2.31. Archivo de Salida

Luego se da un nombre a la carpeta donde se creara el instalador USB Instrument Prefix, y
despus se especifica la direccin en donde se creara dicha carpeta Directory for Output
Files, y por ultimo se puede dar clic en Siguiente.

3. Configuracin en Labview

Para esto se debe utilizar el programa Measurement & Automation de Nacional Instrumets



Figura 2.32. Measurement & Automation Exploration.

En la ventana de Measurement & Automation, como se muestra en la figura 2.33, en
Configuracin ubicado en la parte izquierda, se da clic en USB Devices, y aparece los detalles
del dispositivo usb en la parte central, donde se puede dar un nombre o etiqueta en VISA
Alias, y luego se hace clic en Save.



Figura 2.33. Measurement & Automation

Al hacer clic en Opern VISA Test Panel, ubicado en la parte superior de la figura 2.33,
aparece una ventana como el de la figura 2.34, en donde en la pestaa de Property Node
(Get), se debe de configurar con Resourse Name y dar clic en Execute, y en las pestaas de
Enable Event, Disable Event, Discard Event y Wait on Event, se tienen que configurar en
USB Interupt y luego hacer clic en Execute en cada una de las pestaas.


Figura 2.34. Visa Test Panel.

Una vez cumplido con estos tres pasos, la tarjeta de control esta lista para interactuar con el
computador.

Das könnte Ihnen auch gefallen