Академический Документы
Профессиональный Документы
Культура Документы
INSTRUMENTACIN MDICA
DIRECTOR
SAULO ANDRES GMEZ
Ingeniero Electrnico
2013
INTRODUCCIN
En el presente trabajo se explica el diseo y desarrollo para implementar un "termmetro
digital" basado en el microcontrolador PIC16F84, fabricado por Microchip, el cual se
programar en el lenguaje ensamblador del microcontrolador para el funcionamiento del
proyecto.
La importancia de realizar un termmetro digital es debido a que es muy fcil realizar
medidas de la temperatura con un sistema de adquisicin de datos, pero la realizacin de
medidas de temperatura exactas y repetibles no es tan fcil.
La temperatura es un factor de medida engaoso debido a su simplicidad. A menudo
pensamos en ella como un simple nmero, pero en realidad es una estructura estadstica
cuya exactitud y repetitividad pueden verse afectadas por la masa trmica, el tiempo de
medida, el ruido elctrico y los algoritmos de medida.
La temperatura es difcil de medir con exactitud an en circunstancias ptimas, y en las
condiciones de prueba en entornos reales es an ms difcil. Entendiendo las ventajas y
los inconvenientes de los diversos enfoques que existen para medir la temperatura,
resultar ms fcil evitar los problemas y obtener mejores resultados.
OBJETIVOS
Elaborar un programa que permita el control del pic para que deacuerdo a las
especificaciones dadas nos evidencie tanto en el display como en los leds los
cambios de temperaturas.
Utilizar
el
microcontrolador
instrumentacin diagnostica.
como
una
herramienta
fundamental
en
la
DESCRIPCIN:
El sensor que se utilizar ser el transistor LM35DZ modelo TO-92, el cual es un sensor
de temperatura con buena precisin en escala Celsius. ste dispositivo transforma la
temperatura del ambiente en voltaje, del orden de mV.
El LM35DZ entrega a la salida una resolucin de 10mV por cada grado centgrado.
Emplendolo solo sin ninguna configuracin en especial, el dispositivo presenta un rango
de medicin de 2 a 150C.
Esta configuracin es la idnea para el proyecto pues solamente la utilizaremos para
medir temperaturas puede ser hasta 99C.
Este sensor es fabricado por Fairchild y National Semiconductor.
El sensor LM35DZ nos entrega la temperatura como voltaje y como el voltaje es una
cantidad analgica, necesitamos convertirla a su equivalente en valor digital para poderla
manejar, pues los valores digitales son cantidades discretas y por lo tanto es ms fcil
trabajar con ellas que con cantidades analgicas.
El PIC16F84 convertir los valores del ADC0804 en valores equivalentes para la
visualizacin.
Como ste dispositivo es el que desarrollar el trabajo ms importante de nuestro
proyecto, pues de nada sirve tener el mejor sensor de temperatura ni el convertidor
analgico digital ms exacto sino contamos con un dispositivo que interprete los valores
correctamente, se describir brevemente a continuacin al PIC16F84:
Para las aplicaciones ms habituales (casi un 90%) la eleccin de una versin adecuada
de PIC es la mejor solucin; sin embargo, dado su carcter general, otras familias de
microcontroladores son ms eficaces en aplicaciones especficas, especialmente si en
ellas predomina una caracterstica concreta, que puede estar muy desarrollada en otra
familia.
Los detalles ms importantes de la excelente acogida que tienen los PIC son los
siguientes:
Existe una gran variedad de herramientas hardware que permiten grabar, depurar,
borrar y comprobar el comportamiento de los PIC.
Diseo rpido.
La gran variedad de modelos de PIC permite elegir el que mejor responde a los
requerimientos de la aplicacin.
Una de las razones del xito de los PIC se basa en su utilizacin. Cuando se aprende a
manejar uno de ellos, conociendo su arquitectura y su repertorio de instrucciones, es muy
fcil emplear otro modelo.
Caractersticas del PIC16F84:
ALU de 8 bits.
Stack de 8 niveles.
Inicialmente se tiene que considerar la manera como funciona el sensor LM35, que como
anteriormente se mencion, nos entrega a la salida 10mV por cada grado centgrado.
Como la salida del sensor es en mV dicha salida se convertir en una cantidad digital para
facilitar su manejo. Para esto se emplear el ADC0804.
Para la conversin analgico digital el ADC0804 se manipular de la siguiente manera:
1.- Se habilita el CAD mediante un pulso bajo aplicado a la terminal de CS, para que se
inicie la conversin.
2.- Se habilita la terminal (pulso bajo) denominada WR para que inicie el proceso de
conversin, para esto se debe esperar 100m s aproximadamente para que se lleve a cabo
la conversin.
3.- Se habilita la terminal (pulso bajo) denominada RD para que a la salida se tenga el
resultado de la conversin.
4.- Finalmente se deshabilita el convertidor.
Lo anterior se observa en el siguiente diagrama:
Etapa de Amplificacin
Simulacin amplificador de seal , en el cual podemos observar que ante una seal de
entrada de 100mV (canal B), la seal de salida del amplificador es de 1V (canal A), la
ganancia del amplificador inversor es de 1.10.
Etapa de filtrado
El amplificador operacional esta configurado como filtro pasa bajos, permitiendo el paso
de seales sin atenuacin del orden de los 10 Hz, a medida que la frecuencia de la seal
de entrada aumenta, la seal de salida se ve drsticamente atenuada, esto con el fin de
no permitir ruido elctrico que afecte la medicin proveniente de fuentes de
radiofrecuencia como equipos electrnicos o fuentes de iluminacin.
4 locations
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 179
0003: NOP
.................... #include "C:\Documents and Settings\Fracica Heyler\Escritorio\pic_c++\Conversor_ADC\Conversor_ADC.h"
.................... #include <16F877A.h>
.................... //////// Standard Header file for the PIC16F877A device ////////////////
.................... #device PIC16F877A
.................... #list
....................
.................... #device *=16
.................... #device adc=8
....................
.................... #FUSES NOWDT
.................... #FUSES XT
.................... #FUSES PUT
.................... #FUSES NOPROTECT
.................... #FUSES NODEBUG
.................... #FUSES NOBROWNOUT
//No EE protection
....................
.................... #use delay(clock=4000000,RESTART_WDT)
*
0054: MOVLW 2E
0055: MOVWF 04
0056: BCF
03.7
LCDD.C
////
.................... ////
////
////
////
////
.................... //// lcd_putc(c) Will display c on the next position of the LCD.
.................... ////
.................... ////
\f Clear display
.................... ////
.................... ////
.................... ////
////
////
////
////
////
////
.................... //// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)
////
.................... ////
////
////
////
.................... ///////////////////////////////////////////////////////////////////////////
.................... ////
////
.................... //// This source code may only be used by licensed users of the CCS C ////
.................... //// compiler. This source code may only be distributed to other
////
.................... //// licensed users of the CCS C compiler. No other use, reproduction ////
.................... //// or distribution is permitted without written permission.
////
.................... //// Derivative programs created using this software in object code
.................... //// form are not restricted in any way.
////
////
.................... ///////////////////////////////////////////////////////////////////////////
....................
.................... // As defined in the following structure the pin connection is as follows:
.................... //
D0 enable
.................... //
D1 rs
.................... //
D2 rw
.................... //
D4 D4
.................... //
D5 D5
.................... //
D6 D6
.................... //
D7 D7
.................... //
.................... // LCD pins D0-D3 are not used and PIC D3 is not used.
....................
.................... // Un-comment the following define to use port B
.................... // #define use_portb_lcd TRUE
....................
....................
.................... struct lcd_pin_map {
....................
BOOLEAN enable;
....................
BOOLEAN rs;
....................
BOOLEAN rw;
....................
BOOLEAN unused;
....................
int
....................
} lcd;
data : 4;
....................
....................
.................... #if defined use_portb_lcd
// be pin B0.
....................
....................
.................... #else
....................
....................
.................... #endif
....................
....................
.................... #define lcd_type 2
....................
....................
.................... BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
....................
....................
// to start it up.
....................
....................
....................
....................
....................
.................... struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
.................... struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
....................
....................
....................
.................... BYTE lcd_read_byte() {
....................
BYTE low,high;
....................
set_tris_lcd(LCD_READ);
*
007A: MOVLW F0
007B: BSF
03.5
007C: MOVWF 08
....................
lcd.rw = 1;
007D: BCF
03.5
007E: BSF
08.2
....................
delay_cycles(1);
007F: NOP
....................
lcd.enable = 1;
0080: BSF
08.0
....................
delay_cycles(1);
0081: NOP
....................
high = lcd.data;
lcd.enable = 0;
08.0
....................
delay_cycles(1);
0087: NOP
....................
0088: BSF
lcd.enable = 1;
08.0
....................
delay_us(1);
0089: CLRWDT
....................
low = lcd.data;
lcd.enable = 0;
008E: BCF
08.0
....................
set_tris_lcd(LCD_WRITE);
008F: MOVLW 00
0090: BSF
03.5
0091: MOVWF 08
....................
0092: BCF
....................
.................... void lcd_send_nibble( BYTE n ) {
....................
lcd.data = n;
*
006C: SWAPF 35,W
006D: ANDLW F0
006E: MOVWF 77
006F: MOVLW 0F
0070: ANDWF 08,W
0071: IORWF 77,W
0072: MOVWF 08
....................
delay_cycles(1);
0073: NOP
....................
0074: BSF
lcd.enable = 1;
08.0
....................
delay_us(2);
0075: CLRWDT
0076: NOP
....................
0077: BCF
lcd.enable = 0;
08.0
.................... }
0078: RETLW 00
....................
....................
.................... void lcd_send_byte( BYTE address, BYTE n ) {
....................
....................
0079: BCF
....................
lcd.rs = 0;
08.1
while ( bit_test(lcd_read_byte(),7) ) ;
*
009A: MOVF 78,W
009B: MOVWF 34
009C: BTFSC 34.7
009D: GOTO 07A
....................
lcd.rs = address;
08.1
00A1: BSF
....................
08.1
delay_cycles(1);
00A2: NOP
....................
00A3: BCF
....................
lcd.rw = 0;
08.2
delay_cycles(1);
00A4: NOP
....................
00A5: BCF
....................
lcd.enable = 0;
08.0
lcd_send_nibble(n >> 4);
BYTE i;
....................
set_tris_lcd(LCD_WRITE);
00B3: MOVLW 00
00B4: BSF
03.5
00B5: MOVWF 08
....................
lcd.rs = 0;
00B6: BCF
03.5
00B7: BCF
08.1
....................
00B8: BCF
lcd.rw = 0;
08.2
....................
00B9: BCF
....................
lcd.enable = 0;
08.0
delay_ms(15);
00BA: MOVLW 0F
00BB: MOVWF 2E
00BC: CALL 054
....................
for(i=1;i<=3;++i) {
00BD: MOVLW 01
00BE: MOVWF 24
00BF: MOVF 24,W
00C0: SUBLW 03
00C1: BTFSS 03.0
00C2: GOTO 0CB
....................
lcd_send_nibble(3);
00C3: MOVLW 03
00C4: MOVWF 35
00C5: CALL 06C
....................
delay_ms(5);
00C6: MOVLW 05
00C7: MOVWF 2E
00C8: CALL 054
....................
lcd_send_nibble(2);
00CB: MOVLW 02
00CC: MOVWF 35
00CD: CALL 06C
....................
for(i=0;i<=3;++i)
00CE: CLRF 24
00CF: MOVF 24,W
00D0: SUBLW 03
00D1: BTFSS 03.0
00D2: GOTO 0DC
....................
lcd_send_byte(0,LCD_INIT_STRING[i]);
00D6: CLRF 32
00D7: MOVF 25,W
00D8: MOVWF 33
00D9: CALL 079
00DA: INCF 24,F
00DB: GOTO 0CF
.................... }
00DC: BCF
0A.3
00DD: BCF
0A.4
BYTE address;
....................
....................
if(y!=1)
*
00F6: DECFSZ 2F,W
00F7: GOTO 0F9
00F8: GOTO 0FC
....................
address=lcd_line_two;
00F9: MOVLW 40
00FA: MOVWF 30
....................
else
address=0;
00FC: CLRF 30
....................
address+=x-1;
00FD: MOVLW 01
00FE: SUBWF 2E,W
00FF: ADDWF 30,F
....................
lcd_send_byte(0,0x80|address);
switch (c) {
*
00DF: MOVF 2D,W
00E0: XORLW 0C
00E1: BTFSC 03.2
00E2: GOTO 0EA
00E3: XORLW 06
00E4: BTFSC 03.2
00E5: GOTO 0F2
00E6: XORLW 02
00E7: BTFSC 03.2
00E8: GOTO 108
00E9: GOTO 10D
....................
00EA: CLRF 32
00EB: MOVLW 01
00EC: MOVWF 33
00ED: CALL 079
....................
delay_ms(2);
00EE: MOVLW 02
00EF: MOVWF 2E
00F0: CALL 054
....................
break;
break;
00F2: MOVLW 01
00F3: MOVWF 2E
00F4: MOVLW 02
00F5: MOVWF 2F
*
0107: GOTO 113
....................
0108: CLRF 32
0109: MOVLW 10
010A: MOVWF 33
010B: CALL 079
010C: GOTO 113
....................
default
: lcd_send_byte(1,c);
break;
010D: MOVLW 01
010E: MOVWF 32
010F: MOVF 2D,W
0110: MOVWF 33
0111: CALL 079
0112: GOTO 113
....................
.................... }
0113: RETLW 00
....................
.................... char lcd_getc( BYTE x, BYTE y) {
....................
char value;
....................
....................
lcd_gotoxy(x,y);
....................
....................
lcd.rs=1;
....................
value = lcd_read_byte();
....................
lcd.rs=0;
....................
return(value);
.................... }
....................
....................
.................... void main()
.................... {
*
0179: CLRF 04
017A: BCF
03.7
017B: MOVLW 1F
017C: ANDWF 03,F
017D: BSF
03.5
017E: BSF
1F.0
017F: BSF
1F.1
0180: BSF
1F.2
0181: BCF
1F.3
0182: MOVLW 07
0183: MOVWF 1C
.................... char tecla;
.................... long lectura;
....................
setup_adc_ports(NO_ANALOGS);
*
0187: BSF
03.5
0188: BSF
1F.0
0189: BSF
1F.1
018A: BSF
1F.2
018B: BCF
1F.3
....................
setup_adc(ADC_OFF);
018C: BCF
03.5
018D: BCF
1F.0
....................
setup_psp(PSP_DISABLED);
018E: BSF
03.5
018F: BCF
09.4
....................
setup_spi(SPI_SS_DISABLED);
*
0184: MOVLW FF
0185: BCF
03.5
0186: MOVWF 20
*
0190: BCF
03.5
0191: BCF
14.5
0192: BCF
20.5
03.5
0195: MOVWF 07
0196: BCF
03.5
0197: BSF
20.4
03.5
019A: MOVWF 07
019B: BCF
03.5
019C: BCF
20.3
03.5
019F: MOVWF 07
01A0: MOVLW 01
01A1: BCF
03.5
01A2: MOVWF 14
01A3: MOVLW 00
01A4: BSF
03.5
01A5: MOVWF 14
....................
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
01AA: BCF
03.5
01AB: CLRF 10
....................
setup_timer_2(T2_DISABLED,0,1);
01AC: MOVLW 00
01AD: MOVWF 78
01AE: MOVWF 12
01AF: MOVLW 00
01B0: BSF
03.5
01B1: MOVWF 12
....................
setup_comparator(NC_NC_NC_NC);
01B2: MOVLW 07
01B3: MOVWF 1C
01B4: MOVF 05,W
01B5: CLRWDT
01B6: MOVLW 02
01B7: MOVWF 77
01B8: DECFSZ 77,F
01B9: GOTO 1B8
01BA: GOTO 1BB
01BB: MOVF 1C,W
01BC: BCF
03.5
01BD: BCF
0D.6
....................
setup_vref(FALSE);
01BE: BSF
03.5
01BF: CLRF 1D
....................
01C0: BCF
lcd_init();
03.5
SETUP_ADC(AN0_VREF_VREF);
01C2: BSF
03.5
01C3: BCF
1F.6
01C4: BCF
03.5
01C5: BCF
1F.6
01C6: BCF
1F.7
01C7: BSF
03.5
01C8: BCF
1F.7
01C9: BCF
03.5
01CA: BSF
1F.0
....................
SETUP_adc(ADC_CLOCK_DIV_32);
01CB: BSF
03.5
01CC: BCF
1F.6
01CD: BCF
03.5
01CE: BCF
1F.6
01CF: BSF
1F.7
01D0: BSF
03.5
01D1: BCF
1F.7
01D2: BCF
03.5
01D3: BSF
1F.0
....................
set_adc_channel(0);
01D4: MOVLW 00
01D5: MOVWF 78
01D6: MOVF 1F,W
01D7: ANDLW C7
01D8: IORWF 78,W
01D9: MOVWF 1F
....................
delay_ms(100);
01DA: MOVLW 64
01DB: MOVWF 2E
01DC: CALL 054
....................
port_b_pullups(TRUE);
01DD: BSF
03.5
01DE: BCF
01.7
....................
while(1){
....................
lectura=read_adc();
01DF: BCF
03.5
01E0: BSF
1F.2
01E6: MOVLW 0A
01E7: MOVWF 2D
01E8: CALL 0DF
01E9: MOVLW 54
01EA: MOVWF 2D
01EB: CALL 0DF
01EC: MOVLW 3D
01ED: MOVWF 2D
01EE: CALL 0DF
01EF: MOVLW 10
01F0: MOVWF 04
01F1: MOVF 23,W
01F2: MOVWF 25
01F3: MOVF 22,W
01F4: MOVWF 24
01F5: GOTO 114
01F6: MOVLW 06
01F7: MOVWF 24
01F8: MOVF 24,W
01F9: CALL 00C
01FA: INCF 24,F
01FB: MOVWF 77
01FC: MOVWF 2D
01FD: CALL 0DF
01FE: MOVLW 10
01FF: SUBWF 24,W
0200: BTFSS 03.2
0201: GOTO 1F8
....................
delay_ms(50);
0202: MOVLW 32
0203: MOVWF 2E
0204: CALL 054
....................
0205: BSF
if(read_adc()>=38|read_adc()<=36)
1F.2
1F.2
output_high(PIN_C0);//Zumbador
20.0
03.5
0220: MOVWF 07
0221: BCF
03.5
0222: BSF
07.0
....................
else
output_low(PIN_C0);//Zumbador
0224: BCF
20.0
03.5
0227: MOVWF 07
0228: BCF
03.5
0229: BCF
07.0
....................
delay_ms(50);
022A: MOVLW 32
022B: MOVWF 2E
022C: CALL 054
....................
022D: BSF
if(read_adc()<=38)
1F.2
output_low(PIN_C2);//Led Amarillo
20.2
03.5
0237: MOVWF 07
0238: BCF
03.5
0239: BCF
07.2
....................
else
output_high(PIN_C2);//Led Amarillo
20.2
03.5
023E: MOVWF 07
023F: BCF
03.5
0240: BSF
07.2
....................
delay_ms(500);
0241: MOVLW 02
0242: MOVWF 24
0243: MOVLW FA
0244: MOVWF 2E
0245: CALL 054
0246: DECFSZ 24,F
0247: GOTO 243
....................
0248: BSF
if(read_adc()>=36)
1F.2
output_low(PIN_C3);//Led Rojo
20.3
03.5
0252: MOVWF 07
0253: BCF
03.5
0254: BCF
07.3
....................
else
output_high(PIN_C3);//Led Rojo
20.3
03.5
0259: MOVWF 07
025A: BCF
03.5
025B: BSF
07.3
....................
delay_ms(500);
025C: MOVLW 02
025D: MOVWF 24
025E: MOVLW FA
025F: MOVWF 2E
0260: CALL 054
0261: DECFSZ 24,F
0262: GOTO 25E
....................
0263: BSF
if(read_adc()>=39)
1F.2
printf(lcd_putc,"\f hipertermia");
026A: CLRF 24
026B: MOVF 24,W
026C: CALL 021
026D: INCF 24,F
026E: MOVWF 77
026F: MOVWF 2D
0270: CALL 0DF
0271: MOVLW 0E
0272: SUBWF 24,W
0273: BTFSS 03.2
0274: GOTO 26B
....................
else
if(read_adc()>=39)
1F.2
printf(lcd_putc,"\f hipertermia");
027D: CLRF 24
027E: MOVF 24,W
027F: CALL 021
0280: INCF 24,F
0281: MOVWF 77
0282: MOVWF 2D
0283: CALL 0DF
0284: MOVLW 0E
0285: SUBWF 24,W
else
if(read_adc()<=36)
1F.2
printf(lcd_putc,"\f hipotermia");
0290: CLRF 24
0291: MOVF 24,W
0292: CALL 034
0293: INCF 24,F
0294: MOVWF 77
0295: MOVWF 2D
0296: CALL 0DF
0297: MOVLW 0D
0298: SUBWF 24,W
0299: BTFSS 03.2
029A: GOTO 291
....................
else
printf(lcd_putc,"\f Normal");
029C: CLRF 24
029D: MOVF 24,W
029E: CALL 046
029F: INCF 24,F
02A0: MOVWF 77
02A1: MOVWF 2D
02A2: CALL 0DF
02A3: MOVLW 09
02A4: SUBWF 24,W
02A5: BTFSS 03.2
02A6: GOTO 29D
....................
delay_ms(50);
02A7: MOVLW 32
02A8: MOVWF 2E
02A9: CALL 054
....................
02AA: BSF
if(read_adc()>=38|read_adc()<=36)
1F.2
1F.2
output_low(PIN_C1);//Led verde
20.1
03.5
02C5: MOVWF 07
02C6: BCF
03.5
02C7: BCF
07.1
....................
else
....................
02C9: BCF
output_high(PIN_C1);//Led verde
20.1
03.5
02CC: MOVWF 07
02CD: BCF
03.5
02CE: BSF
07.1
....................
.................... }
02CF: GOTO 1E0
....................
....................
02D0: SLEEP
CONCLUSIONES
BIBLIOGRAFIA.