Beruflich Dokumente
Kultur Dokumente
Captulo 4
117
118
Mdulo LCD
D5 D4
+5V
PIC16C71
15
VO
5K
RB1 RB0
7 6
6 4
E RS R/W GND 1 5
Ajuste de contraste
Figura 4.1. Diagrama esquemtico del termmetro digital con PIC La mxima lectura del convertidor anlogo a digital (0FFH) se obtiene cuando la entrada anloga sea superior a 5 voltios. De tal manera, que si hacemos la divisin de 5 Voltios entre 255 (FFH), obtenemos una relacin de aproximadamente 20 mV por unidad. Por ejemplo, si la entrada anloga est en 160 mV (es decir 16C), el valor
Curso avanzado de Microcontroladores PIC
119
digital que entrega el convertidor es 8 (160/20). Dado lo anterior, el valor que entrega el convertidor se debe duplicar para compensar la diferencia (variacin de 10mV/C y resolucin de lectura de 20mV). Aunque esto hace que la lectura siempre sea un nmero par, se puede aceptar en vista de que se trata de ejercicios netamente didcticos. Para solucionar el problema de tener que duplicar el valor leido y garantizar que el resultado de la conversin corresponda a la temperatura real, se puede utilizar un amplificador operacional para amplificar la seal entregada por el sensor LM35, dicho operacional se debe configurar como amplificador no inversor de ganancia 2. De esta forma, con el valor anlogo adecuado en la entrada del convertidor y con la fuente de alimentacin como voltaje de referencia, se puede obtener una lectura precisa y directa. En la figura 4.2 se muestra el diagrama del circuito que utiliza el amplificador operacional, si se utiliza este montaje se puede obviar la parte del programa que duplica el valor ledo (la parte sombreada en el listado).
LM35 +5V 5+ +5V 8 LM358a 7 64 10F 16V + 5.1K 3 + LM358b 2 Potencimetro de 10K para ajustar la ganancia 1 Salida de voltaje equivalente al doble del valor entregado por el sensor LM35
Figura 4.2. Circuito para acople del sensor LM35 En la figura 4.3 se muestra el listado del programa, este incluye todo el programa de la interface a 4 bits con el display de cristal lquido, una seccin que se encarga de leer el convertidor anlogo a digital, y una seccin que convierte el dato hexadecimal obtenido luego de la conversin, a su equivalente en decimal, para ser mostrado en la pantalla. Pasos a seguir para hacer una conversin A/D 1. Configure los pines del puerto A, los que vayan a trabajar como entradas anlogas deben ser configurados como entradas en el registro TRISA. 2. Configure las entradas anlogas y el voltaje de referencia (interno o externo) en el registro ADCON1. 3. Seleccione el canal de entrada en el registro ADCON0. 4. Seleccione el reloj de la conversin en ADCON0. 5. Encienda el convertidor (bit ADON del registro ADCON0) para que se tome la muestra de la seal anloga. 6. Si se va a utilizar la interrupcin se debe borrar el bit ADIF del registro ADCON0 y poner en "1" el bit ADIE y el bit GIE del registro INTCON. 7. Luego de iniciar el convertidor se hace un pequeo retardo (para el muestreo). 8. Se debe iniciar la conversin mediante el bit GO/DONE del registro ADCON0.
120
Curso avanzado de Microcontroladores PIC
9. Esperar a que se termine la conversin probando el estado del bit GO/DONE o esperar el cambio en la bandera de interrupcin, es decir probando el bit ADIF del registro ADCON0. 10. El resultado se debe leer en el registro ADRES. 11. Borrar el bit ADIF. Para el caso del termmetro digital los pasos seguidos fueron los siguientes: En el primer bloque del programa principal (INICIO), adems de configurar los puertos, se programa el pin RA2/AN2 como una entrada anloga. El bloque que inicia con la etiqueta BEGIN se encarga de ubicar en la pantalla el mensaje del medidor de temperatura, utilizando la interface a 4 bits como se vi en el captulo 2. La parte del programa que inicia con la etiqueta MIDE se encarga de configurar la velocidad del convertidor anlogo a digital, de poner el bit ADIF en "0" y de poner el bit ADON del registro ADCON0 en "1" antes de empezar la conversin, luego se hace un retardo. El trabajo del convertidor se inicia cuando el bit ADCON0,GO se pone en 1, nuevamente se hace un pequeo retardo. Para saber si el convertidor ha terminado se prueba el estado del bit llamado ADCON0,ADIF. Una vez que se est seguro de tener el dato digital que resulta de la conversin, este se puede leer del registro ADRES y se debe duplicar antes de enviarlo a la pantalla. Como este nmero se encuentra en hexadecimal, se debe utilizar una rutina que se encargue de convertirlo a su equivalente en decimal. Esto se hace con la rutina llamada DECIMAL, la cual devuelve el valor obtenido en los registros CENTENA, DECENA y UNIDAD. A estos datos se les suma el valor 30h para convertirlos en su equivalente ASCII antes de enviarlos a la pantalla. Esta prctica se puede realizar con cualquier tipo de sensor cuya salida est entre 0 y 5 voltios, de lo contrario se deber utilizar algn medio para acondicionar su seal a los rangos permitidos por el microcontrolador, por ejemplo un amplificador operacional. En el momento de grabar el microcontrolador se debe tener cuidado de seleccionar el tipo correcto, ya que se ha venido trabajando con el 16F84 y esto nos puede hacer equivocar.
; este programa toma el valor entregado por el sensor de ; temperatura y lo muestra en la pantalla del modulo lcd ; ****** pic16c71 ******** ; ****** wdt = off ******* ; ****** osc = xt ******* ; ******* definiciones ******** indf equ 0h ;para direccionamiento indirecto tmro equ 1h ;contador de tiempo real pc equ 2h ;contador de programa status equ 3h ;registro de estados y bits de control fsr equ 4h ;selecccin de bancos de memoria ptoa equ 5h ;puertos ptob equ 6h adcon0 equ 8h ;registros del convertidor a/d adcon1 equ 88h adres equ 9h trisa equ 85h ;programacin de los registros
121
; ; ; ; ; ; ; ; ;seleccion de pagina ;bandera de cero ;bandera de carry ;para almacenar en w ;para almacenar en el mismo registro ;bits del registro adcon1 ;bits del registro adcon0
retardo decre
retar2 decr2
decimal
otra
sum repite
;restar 100 al valor inicial ;verifica el carry ;si es cero deja de restar 100 ;si es 1 incrementa centena ;volver a restar ;sumarle 100 ;restar 10 al valor ;verifica el carry ;si es 0 deja de restar ;si es 1 incrementa decena ;sumarle 10 al valor ;el valor de la conversion binario a ;decimal ;se devuelve en los registros centena, ;decena y unidad ;esta rutina genera las seales de control ;para escribir en el modulo lcd y ;entrega el dato a ser mostrado en la ;pantalla ;utiliza la interface a 4 bits
sum1
bcf goto bsf bsf movwf movlw andwf movf andlw iorwf
ptob,rs dato2 ptob,rs ptob,e r0e 0fh ptob,r r0e,w 0f0h ptob,r
122
tabla
inicio
begin
;seleccionar pagina 1 ;configura ptoa como entradas ; ;configura ra3 como voltaje de referencia ;y ra0-ra2 como entradas analogas ;configura ptob ; ;vuelve a pagina 0 ;inicia display a 4 bits ;display a 4 bits y 2 lineas ;activa display y desactiva cursor ;selecciona el modo de desplazamiento ;borra display y cursor a casa ;inicia contador de caracteres ;hace barrido de la tabla1
123
reta1
;sigue con la tabla ;pregunta si esta mostrando el mensaje dela ;segunda linea ; ;pregunta si es la primera vez que entra ;a la segunda linea para ir a iniciar ;el puntero de la ram del modulo lcd ; ;ubica puntero de la ram del modulo lcd ;en la segunda linea ;pregunta si termino la segunda linea ;para ir a iniciar de nuevo el mensaje o ;para continuar en la segunda lnea
linea2 line2
mide movlw movwf bsf movlw movwf decfsz goto bsf movlw movwf decfsz goto nop btfss goto bcf bcf movf movwf addwf call movlw call movf addlw call movlw call movf addlw call movlw call movf addlw call call clrf goto end b01010000' adcon0 adcon0,0 0fh r1b r1b,r dec adcon0,go 0fh r1b r1b,r de2 adcon0,adif consu adcon0,0 adcon0,adif adres,w unidad unidad,r decimal 0cbh control centena,w 30h dato 0cch control decena,w 30h dato 0cdh control unidad,w 30h dato retar2 adres mide
;se hace la conversin anlogo a digital ;configura el conver., selecciona canal, ;velocidad de conver. y lo activa ;adif=0 antes de empezar la conversin
dec
;empezar la conversion
de2 consu
; ;pregunta fin de conversion ;si no ha terminado sigue esperando ;apaga el convertidor ;si termino de convertir debe pasar ;duplicar el valor leido ;convertir el dato binario a decimal ;ubico puntero de ram donde va el numero ;primer digito = centenas
;termina
Mdulo LCD
D5 D4
+5V
PIC16C71
15
VO
5K
RB1 RB0
7 6
6 4
E RS R/W GND 1 5
Ajuste de contraste
+5V + 10F
9 8 7 6
5 4 3 2 1
Conectar al computador
125
La comunicacin se har con las mismas especificaciones del ejercicio anterior, es decir a 1200 bps, 8 bits, sin paridad y con un stop bit (1200, 8, N, 1). En la figura 4.5 se muestra el programa que se graba en el microcontrolador, los bloques ms importantes son: el que hace la conversin anlogo a digital, que inicia con la etiqueta MIDE y el que hace la transmisin serial que lo compone la subrutina llamada ENVIAR. Estas rutinas se han explicado en ejercicios anteriores. La computadora se debe encargar de leer el dato serial y de mostrarlo en la pantalla, para ello se debe utilizar el llamado modo grfico. En este modo se traza la ventana donde aparece la curva obtenida, al igual que se van ubicando punto a punto todos los datos que entrega el microcontrolador. En la figura 4.6 se muestra el programa en lenguaje C que realiza la tarea descrita, llamado ADQUISI1.C. Nuevamente se tienen dos versiones, una para utilizar el COM1 llamada ADQUISI1 y otra para usar el COM2 llamado ADQUISI2. El programa ejecutable que puede correr el usuario desde el DOS tiene los mismos nombres pero con extensin .EXE. En la figura 4.7 se tiene un pantallazo del programa ejecutable, mostrando una grfica obtenida.
; este programa toma el valor anlogo leido y lo envia ; a la computadora de forma serial ; ****** pic16c84 ******** ; ****** wdt = off ******* ; ****** osc = xt ******* ; ****** cp = on ****** ; indf tmro pc status fsr ptoa ptob adcon0 adcon1 adres trisa trisb r0c r0d r0e unidad decena centena r14 r1b r1c r1d trans rp0 z c w r pcfg0 pcfg1 adif go tx ******* definiciones ******** 0h ;para direccionamiento indirecto 1h ;contador de tiempo real 2h ;contador de programa 3h ;registro de estados y bits de control 4h ;selecccin de bancos de memoria 5h ;puertos 6h 8h ;registros del convertidor a/d 88h 9h 85h ;programacin de los registros 86h 0ch ; 0dh ; 0eh ; 10h ; 11h ; 12h ; 14h ; 1bh ; 1ch 1dh 1eh ;bits especiales ;bits del registro status 5h ;seleccion de pagina 2h ;bandera de cero 0h ;bandera de carry 0h 1h 0 1 1h 2h 2 ;para almacenar en w ;para almacenar en el mismo registro ;bits del registro adcon1 ;bits del registro adcon0 ; pines del puerto a
equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ
126
;carga para 833 s aproximadamente ;llevar valor de carga al retardo ;limpiar circuito de vigilancia ;decrementar retardo, saltar si cero ;repetir hasta terminar ;retornar ;rutina para enviar dato ;llevar el contenido de w a transmisin ;cargar con nmero de bits ;el contador ;colocar lnea de transmisin en bajo ;para generar bit de arranque ;colocar lnea de transmisin en bajo ;limpiar carry ;rotar registro de transmisin ;preguntar por el carry ;si es uno, colocar l nea en alto ;llamar retardo de 1 bit ;decrementar contador, saltar si cero ;repetir hasta transmitir todo el dato ;colocar l nea de transmisin en alto ;llamar retardo 1 bit -bit de parada;retornar
r1c redo 0
enviar movwf movlw movwf bcf call bcf bcf rrf btfsc bsf call decfsz goto bsf call retlw trans 8 r1d ptob,tx delay1 ptob,tx status,c trans status,c ptob,tx delay1 r1d xnext ptob,tx delay1 0
xnext
retardo decre
movlw movwf decfsz goto retlw movlw movwf call call decfsz goto retlw clrf clrf movlw subwf btfss goto incf goto addwf movlw subwf btfss goto incf goto addwf retlw
0ffh r1b r1b,r decre 0 0ffh r14 retardo retardo r14,r decr2 0 decena centena d100' unidad,r status,c sum centena otra unidad d10' unidad status,c sum1 decena repite unidad 0
retar2 decr2
decimal
otra
sum repite
;restar 100 al valor inicial ;verifica el carry ;si es cero deja de restar 100 ;si es 1 incrementa centena ;volver a restar ;sumarle 100 ;restar 10 al valor ;verifica el carry ;si es 0 deja de restar ;si es 1 incrementa decena ;sumarle 10 al valor ;el valor de conversion binario a decimal ;se devuelve en los registros centena, ;decena y unidad
sum1
127
dato pantalla dato2 bsf movwf movlw andwf movf andlw iorwf call bcf call bsf movlw andwf swapf andlw iorwf call bcf call retlw tabla addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw inicio bsf movlw movwf bcf bcf
128
;borra display y cursor a casa ;inicia contador de caracteres ;hace barrido de la tabla1
reta1
;sigue con la tabla ;pregunta si esta mostrando el mensaje de ;la segunda linea ; ;pregunta si es la primera vez que entra ;a la segunda linea para ir a iniciar ;el puntero de la ram del modulo lcd ; ;ubica puntero de la ram del modulo lcd ;en la segunda linea ;pregunta si termino la segunda linea ;para ir a iniciar de nuevo el mensaje o ;para continuar en la segunda lnea ;aqu hace la ;configura el ;velocidad de ;adif=0 antes conversin anlogo a digital conver., selecciona canal, conver. y lo activa de empezar conversin
linea2 line2
mide
bsf movlw movwf decfsz goto bsf movlw movwf decfsz goto nop btfss goto bcf bcf movf movwf call call movlw call
adcon0,0 0fh r1b r1b,r dec adcon0,go 0fh r1b r1b,r de2 adcon0,adif consu adcon0,0 adcon0,adif adres,w unidad enviar decimal 0cbh control
dec
;empezar la conversin
de2 consu
; ;pregunta fin de conversin ;si no ha terminado sigue esperando ;apaga el convertidor ;si termino de convertir debe pasar ;transmite el dato serialmente ;convertir el dato binario a decimal ;ubico puntero de ram donde va el numero ;leido
129
;termina
Figura 4.5. Programa que convierte el dato anlogo a digital y lo enva a la computadora
int puerto,COM1,COM2; int k,j,dato; int config; int COM1,COM2; int maxx,maxy; float x; char pattern[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; void leer (void); void leer(void) { do{ dato=bioscom(2,0x83,puerto); /*leer dato recibido*/ } while (((dato<0)|(dato>255))&(!kbhit())); } void main(void) { /* autodeteccin */ int gdriver = DETECT, gmode, errorcode; /* inicializa modo grfico */ initgraph(&gdriver, &gmode, "c:\\borlandc\\bgi\\"); errorcode = graphresult(); /* lee resultado de inicializacin */ if (errorcode != grOk) /* un error ocurri */ { printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:"); getch(); exit(1); } maxx=getmaxx(); maxy=getmaxy(); COM1=0; COM2=1; puerto=COM1 /* definir cual puerto se utiliza */
130
Figura 4.6. Programa en lenguaje C que lee el dato serial y lo grafica en la pantalla (adquisi1.C)
131
132