Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lab No 4 Programacion en Lenguaje C
Lab No 4 Programacion en Lenguaje C
2. EQUIPOS Y MATERIALES
✓ PC equipado con: MikroC Pro for PIC v.7.6, Proteus última versión y otros
✓ Guía de laboratorio y manual de Microcontrolador Pic18F4550
✓ Grabador Bootloader
✓ Otros
3. MARCO TEÓRICO
3.1. COMPILADOR MIKROC PRO
1
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
5) ‘Configuración del Proyecto’: llenar los datos como indica la figura y luego presionar ‘Open Edit Project
window to set Configuration bits’. Next
6) ‘Añadir archivos’: Si se disponen de librerías o módulos adicionales se pueden agregar en este punto. Las
prácticas de laboratorio no incluyen dichos elementos por lo que basta con presionar. Finish
7) ‘3. Librerías’: Se usará la opción por omisión ‘Include All (Default)’ en las prácticas de laboratorio.
Presionar
8) El Wizard ha terminado y MikroC genera la plantilla para iniciar todos los proyectos a realizar en esta
asignatura.
9) El Wizard ha terminado y MikroC genera la plantilla para iniciar todos los proyectos a realizar en esta
asignatura
2
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
10) Compilar el programa seleccionando del menú ‘Build – Build ‘ (también se puede digitar Ctrl+9 o hacer
click en el ícono)
11) En la ventana de Mensajes (parte inferior de la pantalla) aparecerá el resultado de la compilación. En caso
de no existir errores, indicará un mensaje de Compilación Exitosa (se genera el archivo .hex en el folder
del proyecto), así como el tamaño en ROM y RAM del código resultante. Si existen errores de sintaxis
se indicarán en líneas rojas indicando el número de línea y el tipo de error. Además, en el editor aparecerán
las líneas de código donde se encontraron errores de sintaxis.
3
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
4
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
OSCILLATOR (oscilador): Se debe especificar la velocidad de operación del microcontrolador. Por supuesto,
este valor depende del oscilador utilizado. El compilador la necesita para compilar rutinas, lo que requiere
información del tiempo (por ejemplo, la función Delay_ms). Más tarde, el programador necesitará esta
información también. La velocidad de operación se configura de modo que permita al oscilador interno del
microcontrolador funcionar a una frecuencia seleccionada.
BUILD/DEBUGGER TYPE: Todo el proceso de compilar (building) está compuesto por análisis sintáctico
(parsing), compilar, enlazar (linking) y generar los archivos .hex. El tipo de compilación le permite ajustar el
modo de compilación. Dependiendo del modo seleccionado, difieren los archivos generados a cargar en el
microcontrolador. Release: Al elegir esta opción, el compilador no puede afectar más a la ejecución de programa
después de la compilación. El programa a cargar en el microcontrolador no será modificado de ninguna manera.
ICD debug: Al elegir esta opción, una vez completado el proceso de la compilación y cargado el programa en
la memoria del microcontrolador, el compilador se queda conectado al microcontrolador por medio del cable
USB y el programador, y todavía puede afectar a su funcionamiento. El archivo .hex generado contiene los
datos adicionales que permiten el funcionamiento del depurador. Una herramienta denominada mikroICD
(Depurador en circuito - In Circuit Debugger) permite ejecutar el programa paso a paso y proporcionar un acceso
al contenido actual de todos los registros de un microcontrolador real. El simulador no utiliza los dispositivos
reales para simular el funcionamiento del microcontrolador, así que algunas operaciones no pueden ser
reproducidas (por ejemplo, interrupción). De todos modos, resulta más rápido depurar un programa por medio
de un simulador. Además, no se requiere ningún dispositivo destino. Note que es posible modificar cualquier
configuración en cualquier momento mientras se edita el programa. No se olvide de recompilar y reprogramar
su dispositivo después de modificar una configuración.
5
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
Al escribir un programa, no espere que termine la redacción del programa para compilarlo. Compile su código
de forma regular con el propósito de corregir cuánto más errores de sintaxis. Asimismo usted puede compilar
su programa cada vez que se complete la redacción de una nueva función así como probar su comportamiento
al utilizar modo de depuración (ver la próxima sección). De este modo, resulta más fácil solucionar los errores
de programa para no “tomar un camino erróneo” en redactar su programa. De lo contrario, usted tendrá que
editar el programa entero.
CODE EXPLORER (EXPLORADOR DEL CÓDIGO), La ventana Code Explorer le permite localizar
funciones y procedimientos dentro de los programas largos. Por ejemplo, si usted busca una función utilizada
en el programa, basta con pulsar dos veces sobre su nombre en esta ventana, y el cursor estará automáticamente
posicionado en la línea apropiada en el programa.
COMPILAR Y SOLUCIONAR LOS ERRORES, Para compilar su código, pulse sobre la opción Build en
el menú Project. En realidad, el proyecto entero se ha compilado, y si la compilación se ha realizado con éxito,
se generarán los archivos de salida (asm, .hex etc.). Una compilación se ha realizado con éxito si no se ha
encontrado ningún error. Durante el proceso de compilación se generan muchos mensajes que se visualizan en
la ventana Messages. Estos mensajes consisten en información, advertencia y errores. Cada error encontrado se
asocia con su línea de programa y su descripción. Como un error en su código puede generar mucho más errores,
simplemente debe intentar solucionar el primer error en la lista y después recompile su programa. En otras
palabras, es recomendable solucionar los errores uno a uno.
DEPURAR EL PROGRAMA
La depuración es un paso muy importante ya que permite probar el programa después de una compilación
realizada con éxito, o solucionar los errores descubiertos mientras se ejecuta el programa. Como ya hemos visto,
hay dos modos de depurar: un depurador software que simula el funcionamiento del microcontrolador (modo
por defecto) y depurador hardware (mikroICD) que lee directamente el contenido de la memoria del
microcontrolador. El procedimiento de depuración es el mismo sin reparar en el modo elegido. En caso de elegir
la opción ICD debug, hay que cargar el programa en el microcontrolador antes de depurarlo. Para iniciar la
depuración, pulse sobre la opción Start debugger del menú Run. El editor del código será ligeramente
modificado automáticamente y aparecerá una ventana denominada Watch Values. El principio de depuración se
basa en ejecutar el programa paso a paso y monitorear el contenido de los registros y los valores de las variables.
De este modo, es posible comprobar el resultado de un cálculo y ver si algo inesperado ha ocurrido. Al ejecutar
el programa paso a paso, podrá localizar los problemas con facilidad. Durante una depuración el programa será
modificado, por lo que usted siempre debe recompilar el programa después de cada corrección, y reiniciar el
depurador para comprobar qué ha sido modificado.
6
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
- Step Over - Se ejecuta una sola instrucción. Cuando la instrucción es una llamada a una rutina, el depurador
no hará un salto a la rutina, sino que se ejecutará toda la rutina. El depurador se detiene a la primera
instrucción después de la llamada a la rutina.
- Run To Cursor - El programa se ejecuta hasta la línea en la que se encuentre el cursor.
- Step out - Se ejecutan las demás instrucciones dentro de la rutina. El depurador se detiene inmediatamente
al salir de la rutina.
Para visualizar esta ventana es necesario seleccionar la opción View/Debug Windows/Watch Values. Entonces
usted puede hacer una lista de registros/variables que quiere monitorear y la manera de visualizarlos.
STOPWATCH (CRONÓMETRO)
Si quiere saber cuánto tiempo tarda un microcontrolador en ejecutar una parte del programa, seleccione la opción
Run/View Stopwatch. Aparecerá una ventana como se muestra en la figura a la derecha. ¿Cómo funciona un
cronómetro? Eso es pan comido... El tiempo que tarda un comando (step into, step over, run/pause etc.) en
ejecutarse por el depurador se mide automáticamente y se visualiza en la ventana Stopwatch. Por ejemplo, se
mide tiempo para ejecutar un programa, tiempo para ejecutar el último paso etc.
7
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
8
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
Donde x, se refiere al puerto del microcontrolador (RA, RB, RC, RD o RE). El registro TRIS indica si el puerto
será de Entrada o Salida. Al poner Ceros en los bits de TRIS, los correspondientes bits del puerto serán de Salida
y al poner Unos, los bits del puerto serán de Entrada.
Ejemplos:
TRISB=255; //RB será de Entrada (255 equivale a 11111111 en binario)
TRISC.F2=0; //El bit 2 del puerto RC será de Salida
TRISD=0x0F; //El nibble inferior de RD es Entrada y el superior es Salida
Ejemplo 2: Instrucción de decisión sin ‘else’. Esta es una variante muy utilizada cuando se desea condicionar
la ejecución de un grupo de instrucciones. Las dos instrucciones se ejecutarán únicamente si la variable
‘contador’ es igual a 2, de lo contrario la ejecución continúa a partir de la línea //Aquí
9
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
if (contador==2) {
RB6_bit=~RB6_bit;
contador=0;
}
//Aquí
Ejemplo 3: Similar al caso anterior, pero con una sola instrucción. Si la variable ‘horas’ es igual a 24 se asigna
a esta variable con un valor de cero.
if (horas==24) horas=0;
Nota: Las condiciones se obtienen por medio de los operadores de relación y los operadores lógicos.
✓ OPERADORES DE RELACIÓN:
> Mayor que
>= Mayor o igual que
< Menor que
<= Menor o igual que
== Igual a (nótese la diferencia con el operador de asignación =)
!= No es igual a
Ejemplo 1: La variable ‘i’ tiene un valor inicial de 7 (i=7) y un valor de condición final de 1 (i>=1). Esta variable
va disminuyendo de 1 en 1 (i--). Por lo tanto, las dos instrucciones se ejecutarán en 7 ocasiones. La primera vez
cuando i=7, la segunda cuando i=6, la tercera cuando i=5 y así sucesivamente hasta la séptima vez cuando i=1.
Luego la ejecución continúa en //Aquí
for (i=7; i>=1; i--) {
PORTB=PORTB<<1;
Delay_ms(500);
}
//Aquí
10
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
Ejemplo 1: La ejecución del programa permanece indefinidamente en esta línea mientras el bit menos
significativo del puerto RB sea igual a cero (Falso). Como caso particular no se ejecuta ninguna instrucción (la
cual debería estar antes del punto y coma).
while ( !PORTB.F0 ) ;
Ejemplo 2: Ejemplo de un lazo infinito. En MikroC, cualquier valor distinto de cero se considera
VERDADERO, y un valor igual a cero se considera FALSO. Al valor en RA se le suma 65 y el resultado se
envía hacia RB. Este proceso es infinito ya que la condición siempre es verdadera (1).
while (1)
LATB=PORTA+65;
Ejemplo 3: Las cuatro instrucciones encerradas por { } se ejecutarán indefinidamente mientras el valor del bit
RD7 sea igual a 1 (Verdadero).
while (PORTD.F7) {
RB1_bit=1;
Delay_ms(500);
RB1_bit=0;
Delay_ms(200);
}
Nota: A diferencia de ‘while’, en ‘do...while’ las instrucciones se ejecutan por lo menos una vez.
Ejemplo 1: La variable tipo byte ‘kp’ tiene un valor inicial de cero (FALSO). La instrucción kp++; se ejecuta y
luego se revisa la condición (kp). Mientras kp sea distinto de cero la condición será VERDADERA. Como
resultado se tendrá un lazo infinito mientras la variable kp sea verdad (distinto de cero). Cuando la variable kp
llegue nuevamente a cero, la condición será FALSA (después de 256 ciclos) y la ejecución continuará en la
línea //Aquí
char kp=0;
do
kp++;
while (kp);
//Aquí
11
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
Ejemplo 1: Si ‘digito’ es igual a 0, ‘valor’ es 0x3F. Si ‘digito’ es igual a 1, ‘valor’ es 0x06. Si ‘digito’ no es 0 o
1 entonces valor será 0.
switch (digito)
{
case 0: valor=0x3F; break;
case 1: valor=0x06; break;
default: valor=0;
}
4. PRE INFORME
4.1. Objetivos de laboratorio.
4.2. Resumen para flujo de programa: La sentencia condicional if e if else, la sentencia switch case, el ciclo
iterativo while y do while.
12
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
5. PROCEDIMIENTO
5.1. Diseño de programa en mikroC de LED INTERMITENTE que muestre por el puerto RB (RB.0 al RB.7) y
demostrar su funcionamiento en plataforma virtual y en hardware.
DIAGRAMA DE FLUJO
///////////////////////////////////////////////////////////////
// UNIVERSIDAD PUBLICA DE EL ALTO
// CARRERA: INGENIERIA DE SISTEMAS
// MATERIA: INGENIERIA DE CONTROL
// PROYECTO: LED INTERMITENTE
// AUTOR: M.Sc. GREGORIO MAMANI M:
/////////////////////////////////////////////////////////////////
void main(){ // INICIO DE PROGRAMA
TRISB=0;
while(1)
{
LATB = ~ LATB; // PUERTO RB COMO SALIDA
Delay_ms(250); // TIEMPO DE ESPERA
}
}
13
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
14
UPEA - INGENIERÍA DE CONTROL M.Sc. Gregorio Mamani M.
5.4. Diseñar un programa en lenguaje C para mostrar en hardware los procesos básicos de control doméstico e
industrial a elección del estudiante.
6. CUESTIONARIO
6.1. Manual de referencia rápida a MIKROC PRO PIC
7. CONCLUSIONES:
8. BIBLIOGRAFÍA
15