Professional Documents
Culture Documents
Captulo V
Encender y apagar un LED Secuenciador con cuatro LED's Leer los pulsadores y encender el LED correspondiente Programa avanzado utilizando el entrenador K-061
63
64
Como la prctica hace al maestro, veremos que con la realizacin de ejemplos prcticos se pueden despejar muchas dudas. Los ejercicios se basan en el entrenador PIC K-061 de CEKIT, cuyo diagrama esquemtico se encuentra al final del captulo II Conozca el PIC16C84. Aunque lo ms conveniente es tener el entrenador, usted puede ensamblar los circuitos equivalentes en un protoboard.
EMPEZAR
Encabezado Inicializacin
Encender LED
Rutina de retardo
Apagar LED
Rutina de retardo
65
Captulo V. Programacin en PIC. Los primeros pasos ;=================================================================== Este programa prende y apaga un LED list p=16c84 ;se utiliza el PIC16C84 ;-------------------------------------------------------------ptob equ 06 ;el puerto b est en la direccin 06 de la ;memoria RAM reg1 equ 0b ;aqu se asignan nombres para reemplazar los ;registros reg2 equ 0c reg3 equ 0d valor1 equ 30 ;aqu se asignan nombres a los valores valor2 equ 40 ;constantes valor3 equ 50 ; reset org goto org movlw tris movlw movwf call movlw movwf call goto 0 ;el vector de reset es la direccin 00 inicio ;se enva al inicio del programa 7 ;empieza el programa en la posicin de ;memoria 7 00 ;se carga el registro W con el valor 00 ptob ;se programan los pines del puerto B como ;salidas 01 ;se carga el registro W con el valor 01 ptob ;se pasa ese valor al puerto B para encender ;el LED que se encuentra conectado al pin RB0 retardo ;se mantiene el LED encendido por un momento 00 ;se carga el registro W con el valor 00 ptob ;se carga el registro puerto B con cero para ;apagar el LED retardo ;se mantiene el LED apagado por un momento otra ;se contina el programa en otra, es decir que ;se queda ejecutando la misma accin ;esta rutina genera un tiempo de espera valor1 ;se carga el registro W con el nmero valor1, ;es decir con 30 reg1 ;se traslada ese nmero al registro reg1 valor2 ;se carga el registro W con el nmero valor2, ;es decir con 40 reg2 ;se traslada ese nmero al registro reg2 valor3 ;se carga el registro W con el nmero valor3, ;es decir con 50 reg3 ;se traslada ese nmero al registro reg3 reg3 ;se decrementa el registro reg3 y si el valor ;es cero se salta a la uno ;instruccin siguiente, si no es cero se ;contina decrementando reg2 ;igual que el anterior dos reg1 ;igual que el anterior tres 0
Encabezado
Iniciacin
inicio
otra
Encender LED Llamar retardo Apagar LED Llamar retardo Volver a encender el LED
retardo
tres
dos
uno
Rutina de retardo
Figura 2. Programa que enciende y apaga un LED (ejer1.asm) Consideremos este primer programa; en l se pueden observar una serie de lneas de cabecera, antes de la etiqueta inicio. Ellas, como ya lo habamos mencionado, son una herramienta que nos proporciona el ensamblador para asignar nombres
66
Curso Bsico de Microcontroladores PIC
lgicos, fcilmente memorizables, a algunas posiciones de memoria, bits, puertos y registros para utilizar stos en el cuerpo principal del programa; el ensamblador se encarga de remplazar estos nombres por los valores numricos correspondientes, formando as el programa en cdigo objeto. Con lo anterior, la direccin 06 corresponde al puerto B, al cual hemos llamado ptob, de ms fcil recordacin que un nmero. De igual manera tres posiciones auxiliares de memoria: la 0B, 0C y 0D, que contendrn valores a decrementar para establecer una rutina de retardo, las hemos llamado reg1, reg2 y reg3. Tambin se han utilizado tres cantidades a las cuales les hemos asignado nombres, con el objeto de facilitar el manejo ya que, al momento de ensamblar el programa, podemos remplazarlos rpidamente si ellos no eran los adecuados.Veamos ahora algunos bloques de instrucciones ms detalladamente: Inicio. La primera instruccin carga el registro W con 0 para configurar, con la segunda instruccin (tris), el puerto B como salidas. Se debe recordar que un cero, en el registro de trabajo W, configura el pin respectivo como salida, mientras que un uno lo hace como entrada. Esta instruccin se da, por lo regular una sola vez por puerto. Otra. Aqu se carga el registro de trabajo W con uno, con el objeto de sacar estados lgicos altos por el pin RB0 del puerto B, siendo este estado el encargado de encender el LED. Despus de configurado el puerto, ste puede ser tratado como cualquier otro registro, admitiendo transferencia de datos hacia (escribir sobre el puerto) y desde (leer el puerto) el registro de trabajo W. Tambin se pueden realizar operaciones lgicas, de rotacin, etc. La tercera lnea hace un llamado a una rutina de retardo, la cual se explicar ms adelante, retornando al programa principal tan pronto sta es ejecutada. La parte que sigue carga el registro de trabajo W con el literal cero, el cual se sacar por el puerto B, con el objeto de apagar el LED. De nuevo se hace un llamado a la rutina de retardo, para visualizar el efecto; despus de la ejecucin de la rutina, el control del programa salta a la direccin dada por la etiqueta otra para continuar realizando la primera parte del mismo.
RETARDO movlw VALOR1 movwf REG1 TRES movlw VALOR2 movwf REG2 DOS movlw VALOR3 movwf REG3 UNO decfsz REG3 goto UNO decfsz REG2 goto DOS decfsz REG1 goto TRES retlw 10
C B A
67
Retardo. En la figura 3 se muestra la rutina de retardo mencionada anteriormente. Debido a la gran velocidad con la cual se ejecutan las instrucciones en el microcontrolador (un milln por segundo, con un reloj de 4 MHz), es necesario efectuar, con mucha frecuencia, retardos que nos permitan observar algunos fenmenos lentos, tales como el encendido de LEDs, lmparas, rels, etc. Tales retardos se logran cargando, con un determinado valor, posiciones auxiliares de memoria RAM o registros, decrementndolos posteriormente y consultando el momento en el cual llegan a cero; dependiendo del resultado de la consulta, el programa puede dirigirse a dos sitios diferentes, como puede observarse en el diagrama de flujo de la figura 4. En ella se han resaltado tres pequeos bloques, que corresponden a una sola instruccin en la familia del microcontrolador PIC: decfsz. Esta instruccin decrementa un registro y consulta si el contenido de ste ha llegado a cero; si es as, omite la siguiente instruccin; si no lo es, la ejecuta. Esto permite implementar bifurcaciones de acuerdo al cumplimiento de una condicin.
EMPEZAR
Cargar REG1 con valor 1 TRES Cargar REG2 con valor 2 DOS Cargar REG3 con valor 3 UNO DEC REG3
es REG3 = 0 ? Si
No
DEC REG2
es REG2 = 0 ? Si
No
DEC REG1
es REG1 = 0 ? Si TERMINAR
No
Para conocer el tiempo que se tarda toda la rutina, podemos hacer algunos clculos, siempre expresando las cantidades en trminos de los ciclos de instruccin y para ello debemos saber cuanto tarda cada una de ellas. Afortunadamente, todas las instrucciones de los microcontroladores PIC se ejecutan en un ciclo, excepto cuando se realiza un salto, en cuyo caso la instruccin utiliza dos ciclos. Con lo anterior, debemos empezar por la rutina ms interna, marcada con la letra A en la figura 3. Mientras que no se cumpla la condicin, la instruccin decfsz reg3 consume 1 ciclo y la instruccin goto se ejecuta en dos ciclos; esta rutina interna gasta entonces tres ciclos, ejecutndose un nmero de veces que est dado por el valor contenido en el registro valor3, en este caso el valor hexadecimal 50 (observe la definicin de ste en la cabecera y recuerde que por defecto se asumen cantidades hexadecimales). El nmero total de ciclos consumidos por esta rutina ser entonces el producto: Nmero ciclos A = 3 x valor3 = 3 x 80 (el decimal de 50Hex) = 240 ciclos de instruccin
Haciendo un anlisis similar, la subrutina B (que abarca la subrutina A) tendr 245 (1 + 1 + 240 + 1 + 2) ciclos. Aqu el total de ciclos consumidos depende del registro valor2 y ella se tardar: Nmero ciclos B = 245 x valor2 = 245 x 64 (el decimal de 40Hex) = 15860 ciclos de instruccin
De igual manera, podemos considerar que para la subrutina C (que abarca tanto la A como la B) se tienen un nmero de ciclos de 15865 (15860 + 5); considerando que el nmero total de ciclos depende del registro valor1, se tiene: Nmero ciclos C = 15865 x valor1 = 15865 x 48 (el decimal de 30Hex) = 761520 ciclos de instruccin
Podemos emplear una expresin algebrica para lo anterior, resultando ms fcil realizar los clculos: Total Ciclos = ((valor3*3 + 5)*valor2 + 5)*valor1 En este caso, la constante 5 corresponde al nmero de ciclos que estn utilizando las instrucciones adicionales en las rutinas B y C, mientras que valor1, valor2 y valor3 corresponden a las constantes tomadas de la cabecera del programa. Si quiere conocer el tiempo empleado por esta rutina, debe saber que un ciclo de instruccin corresponde a cuatro ciclos del reloj oscilador; si la frecuencia del oscilador es de 4 MHz, la frecuencia del reloj de instrucciones ser entonces de 1 MHz, en cuyo
Curso Bsico de Microcontroladores PIC
69
caso el ciclo de instruccin es de 1 microsegundo. Para el ejemplo anterior, se tendra entonces que la rutina de retardo se tardara un poco ms de 765520 s, ms que suficientes para visualizar el encendido y apagado de un LED. Cuando se requiere gran precisin en el cumplimiento de rutinas de tiempo, se acude a un oscilador a cristal para el oscilador del microcontrolador. Cuando la precisin no es una preocupacin, se puede acudir a una sencilla red RC, para proporcionar la frecuencia del oscilador. En este ltimo caso, la frecuencia de oscilacin depender de las tolerancias de la resistencia y del condensador, al igual que la temperatura y el nivel de voltaje de la alimentacin. En caso de implementar una red RC, el fabricante sugiere para la resistencia valores comprendidos entre 5 K y 100 k, y para el condensador un valor mnimo de 20 pF. End. Aunque sta no es propiamente una instruccin, s es necesaria para el ensamblador; si ste no la encuentra, emite un mensaje de error. As, estara descrito todo el programa. Despus de escribirlo en el editor de textos deber ensamblarlo, con lo cual se genera el cdigo objeto propio del microcontrolador. Si no ha cometido errores de sintaxis, estar listo para fijar este cdigo en el microcontrolador por medio del sistema de desarrollo; para ste ltimo paso debe asegurarse que los fusibles posean la siguiente configuracin: Osc Watchdog CP Power-Up-Timer XT OFF OFF ON
Rotacin = 01
Rutina de retardo
Rotar a la izquierda
Fin de la Rotacin ? Si
No
Figura 5. Diagrama de flujo del ejercicio 2 Para el programa son vlidas las anotaciones hechas al anterior, salvo el hecho que se est utilizando una posicin adicional de memoria RAM para almacenar un valor que corresponde al estado de la rotacin presente en el puerto; sta es la posicin de memoria 0A, a la cual hemos llamado rota que pretende, tambin, ser de ms fcil recordacin y manejo que el nmero hexadecimal 0A. En esta oportunidad, la parte que conviene resaltar es la rotacin a la izquierda del registro rota, para ser sacado por el puerto B; si despus de la rotacin, el quinto bit an no es uno, quiere decir que la rotacin todava no ha llegado a su fin, puesto que el ejercicio se hace slo con cuatro LEDs. La instruccin que consulta la condicin es btfss rota,4; si ella se cumple (el bit es uno), el programa omite la instruccin goto hol y ejecuta la instruccin goto otra, empezando de nuevo la secuencia; si no se cumple la condicin (este bit es cero), el programa ejecuta la instruccin goto hol, procediendo a sacar el dato rotado por el puerto B. La rutina de retardo es la misma del ejemplo anterior; por lo tanto el tratamiento hecho a los registros y valores es idntico. Al momento de fijar este programa en el microcontrolador, como en el caso anterior, se deben tener los fusibles configurados de la siguiente manera: Osc Watchdog CP Power-Up-Timer XT OFF OFF ON
71
Captulo V. Programacin en PIC. Los primeros pasos ;============================================================== ;Este programa maneja una secuencia de cuatro LED's list p=16c84 ;se utiliza el PIC16C84 ;-----------------------------ptob rota equ equ 06 0a ;el puerto b sta en la direccin 06 de la ;memoria RAM ;aqu se asignan nombres para reemplazar los ;registros
reg1 equ 0b reg2 equ 0c reg3 equ 0d valor1 equ 30 ;aqu se asignan nombres a los valores valor2 equ 40 ;constantes valor3 equ 10 ;------------------------------------reset org goto org inicio movlw tris movlw movwf movf movwf call rlf btfss goto goto ;el vector de reset es la direccin 00 de la ;memoria de programa inicio ;se enva al inicio del programa 7 ;empieza el programa en la posicin de ;memoria 7 00 ;se carga el registro W con el valor 00 ptob ;se programan los pines del puerto B como ;salidas 01 ;se carga el registro W con el valor 01 rota ;se dispone el dato para la rotacin rota,0 ;mueve el contenido del registro rota al ;registro W ptob ;enciende el LED correspondiente retardo ;se mantiene el LED encendido por un momento rota ;desplaza el contenido del registro un bit ;a la izquierda rota,4 ;probar si el quinto bit se activa hol ;si no ha llegado al quinto bit se enciende ;el LED que sigue otra ;si ya se encendi el ltimo LED se inicia ;nuevamente la secuencia ;esta rutina genera un tiempo de espera valor1 ;se carga el registro W con el nmero valor1, ;es decir con 30 reg1 ;se traslada ese nmero al registro reg1 valor2 ;se carga el registro W con el nmero valor2, ;es decir con 40 reg2 ;se traslada ese nmero al registro reg2 valor3 ;se carga el registro W con el nmero valor3, ;es decir con 50 reg3 ;se traslada ese nmero al registro reg3 reg3 ;se decrementa el registro reg3 y si el valor ;es cero se salta a la uno ;instruccin siguiente, si no es cero se ;continua decrementando reg2 ;igual que el anterior dos reg1 ;igual que el anterior tres 0 0
otra hol
retardo
tres
dos
uno
EMPEZAR
Leer pulsadores
Figura 7. Diagrama de flujo del ejercicio 3 Para este tercer programa tambin son vlidas algunas de las anotaciones hechas al primero, salvo que al registro 02 o contador de programa se le ha dado el nombre de pc; a un registro auxiliar para almacenar el ltimo estado registrado de los pulsadores se le ha denominado leido (posicin de memoria RAM 0A). Al fijar este programa en el microcontrolador, hemos utilizado la siguiente configuracin de fusibles: Osc Watchdog CP Power-Up-Timer XT OFF OFF ON
No hacemos ninguna anotacin al programa, ya que consideramos que con los dos anteriores se tienen bases para ste, adems de los comentarios realizados al final de cada instruccin.
Curso Bsico de Microcontroladores PIC
73
Captulo V. Programacin en PIC. Los primeros pasos ;===================================================================== ;Este programa lee dos pulsadores y enciende dos LED's, segn el que se oprima ;se encender el LED correspondiente list p=16c84 ;se utiliza el PIC16C84 ;--------pc ptoa ;direccin del contador de programa ;el puerto a est en la direccin 05 de la ;memoria RAM ptob equ 06 ;el puerto b est en la direccin 06 de la ;memoria RAM leido equ 0a ;aqu se asignan nombres para reemplazar los ;registros ;------reset org 0 ;el vector de reset es la direccin 00 de la ;memoria de programa goto inicio ;se enva al inicio del programa org 7 ;empieza el programa en la posicin de ;memoria 7 inicio movlw 0f ;se carga el registro W con el valor 0f tris ptoa ;se programan los pines del puerto A como ;entradas movlw 00 ;se carga el registro W con el valor 00 tris ptob ;se programan los pines del puerto B como ;salidas movlw 00 ;se carga el registro W con el valor 00 movwf leido ;se dispone el dato en alto para encender los ;LED's hol movf leido,0 ;mueve el contenido del registro leido al ;registro W movwf ptob ;enciende el LED correspondiente movf ptoa,0 ;lee el puerto A y guarda el dato en el ;registro W xorlw 03 ;invierte el dato que ley andlw 03 ;deja solamente los dos bits de inters addwf pc ;el valor que se ley se suma al contador de ;programa goto hol ;si no oprimen tecla, regresa a leer nop ;no hace nada nop movwf leido ;carga valor que ley en el registro leido goto hol ;actualiza el dato de salida en el puerto B y ;vuelve a leer end ;============================================================= equ equ 02 05
;================================================================ ;Este programa realiza una secuencia luminosa en los LED's, al llegar al ;ltimo se emite un sonido. Adems, cuando se oprime una tecla se cambia ;el sentido de giro de la secuencia list p=16c84
;------------------------------------------------------------------;las que vienen a continuacin son una serie de equivalencias, las ;cuales toma el ensamblador y las reemplaza por el nmero asociado, en ;aquellos sitios en los cuales se hace referencia
carry cero bandera rtcc pc sta port_a port_b rota cuenta tiempo reg1 reg2 reg3
equ equ equ equ equ equ equ equ equ equ equ equ equ equ
;-------------------------------------------------------------------
inicio
bcf movlw tris movlw tris movlw movwf movlw movwf movlw movwf movf andlw xorlw addwf goto goto goto goto decfsz goto decfsz goto decfsz goto
sta, bandera 0 port_b 3 port_a 0feh rota 1 tiempo 2 reg3 port_a,w 3 3 pc dos_a siete_a siete_b siete_c reg1 uno reg2 uno reg3 uno
;limpiar bandera desplazamiento ;cargar a w con cero ;puerto b como salidas ;cargar a w con 3 ;dos lneas bajas como entradas ;disponer dato para la rotacin ;cargar en registro 18 ;dato del led encendido ;carga en registro 1a ;cargar a w con nmero dos ;y luego al registro 1d ;leer puerto a ;elimina la parte alta ;invierte el dato ;se suma al pc para salto ;si no hubo tecla ;si tecla derecha ;si tecla izquierda ;si las dos teclas ;decrementa ;si no cero ;decrementa ;si no cero ;decrementa ;si no cero registro y salta si cero lee de nuevo teclado registro y salta si cero lee de nuevo teclado registro y salta si cero lee de nuevo teclado
ceros
uno
75
dos_d
bsf btfsc goto rlf btfss goto incf goto rlf movlw movwf call goto
sta,carry ;activa o coloca carry en 1 sta, bandera ;salta si bandera est desactivada cuatro ;si activada bifurca a cuatro rota sta,carry tres_b tiempo seis rota 1 tiempo pito seis rota sta,carry cuatro_b tiempo seis rota 8 tiempo pito seis rota,w port_b ceros sta,bandera dos_a sta,bandera dos_a tiempo,w tiempo tiempo tiempo tiempo tiempo tiempo,w port_b cuenta base tiempo ocho 0ffh port_b pito 4 port_a ;rota a la izquierda registro de leds ;salta si carry est en 1 ;si es cero -limite rotacin- va a tres_b ;incrementa registro del led encendido ;bifurca a para sacar dato ;rota una vez ms registro de leds ;carga a w con 1 ;para indicar primer led encendido ;seal sonora por lmite rotacin ;bifurca para sacar dato ;rota a la derecha registro de leds ;salta si carry est en uno ;si cero -lmite rotacin- va a cuatro_b ;decrementa registro led encendido ;bifurca para sacar dato ;rota una vez ms registro de leds ;carga a w con 8 ;para indicar ltimo led encendido ;seal sonora por lmite rotacin ;bifurca para sacar dato ;carga a w con dato led a encenderse ;escribe dato en el puerto b ;reinicia para ir por siguiente dato ;activa bandera -rotacin derecha;bifurca a leer el teclado ;desactiva bandera -rotacin izquierda;bifurca a leer el teclado ;carga valor led encendido en w ;multiplica por dos (valor x 2) ;multiplica por dos (valor x 4) ;multiplica por dos (valor x 8) ;se suma una vez ms (valor x 9) ;se suma una vez ms (valor x 10) ;se invierte el dato y se carga en w ;se saca tiempo faltante en los leds ;se limpia registro ;se llama base de un segundo ;decrementa el tiempo y salta si cero ;si no cero vuelve a mostrar tiempo ;carga a w con b11111111' ;para apagar todos los leds ;se llama a seal sonora ;b0100' carga a w con 4 ;para activar el rel ;ir al modo de reposo
tres
tres_a
tres_b
cuatro
rrf btfss goto cuatro_a decf goto cuatro_b rrf movlw movwf cinco call goto seis movf movwf goto bsf goto bcf goto movf rlf rlf rlf addwf addwf comf movwf clrf call decfsz goto movlw movwf call movlw movwf sleep
siete_a
siete_b
siete_c
ocho
nueve
76
Captulo V. Programacin en PIC. Los primeros pasos pito movlw movwf movlw movwf call clrf retlw base clrf movlw option movf xorlw btfss goto incf movf xorlw btfss goto retlw end ;-----------; Fusibles de programacin ; Osc XT ; Watchdog OFF ; CP OFF ; Power-Up-Timer ON ;===================================================================== ;=========================================================== 8 port_a d110' cuenta base port_a 3 rtcc 5 ;b1000' cargar a w ;para activar el pito ;cargar con el decimal 110 ;para que el pito ;dure 1 segundo/(125-110) ;dejar el puerto en b0000' ;regresar de la interrupcin ;dejar en cero el rtcc ;cargar a w con b'101', para cargar el ;rtcc interno con una preescala de 64 ;leer el rtcc ;comparar con el decimal 125 ;si es igual salta ;si no igual, vuelve a leer ;incrementa la cuenta ;carga a w con valor de cuenta ;comparar con el decimal 125 ;si es igual salta ;si no igual, vuelve a configurar cuenta ;al terminar regresa
bas
Figura 9. Programa avanzado utilizando el entrenador K-061(avanzado.asm) Los ejercicios descritos en este captulo se encuentran en el disquete que acompaa al curso, tanto el listado con extensin .asm, como el archivo ensamblado con extensin .hex. El lector puede, como ejercicio, utilizarlos para comprobar su funcionamiento y, despus, hacerles los cambios que desee para modificar los tiempos de retardo, los pines de salida, etc., con el fin de profundizar en su estudio.
77
78