GUIA1
GUIA1
GUIA1
LABORATORIO: Sesión 1
I. OBJETIVO
Aprender a desarrollar programas elementales con el microcontrolador Atmega8, utilizando
instrucciones básicas.
Aprender a manejar el entorno de desarrollo VMLAB y AvrPUCP para editar, compilar, simular un
programa y luego grabar el código del programa en el microcontrolador.
IV. PROCEDIMIENTO
Ejemplo 1
Se desea escribir un programa para prender 2 diodos leds, que están conectados a 2 pines de un
mismo puerto del microcontrolador ATmega8. Se pide
a) Dibuje el circuito esquemático simplificado.
b) Utilizando el entorno VMLAB, edite el programa en lenguaje ensamblador y compruebe su
funcionamiento.
c) Compruebe su funcionamiento usando la herramienta de desarrollo AvrPUCP para grabar el
programa en el microcontrolador que se encuentra en el módulo AvrPUCP-Mega8
Desarrollo
a) Circuito esquemático
Procedimiento:
5.1.1 Ejecutar el entorno VMLAB, y aparecerá una pantalla similar a las siguiente figura:
5.1.2 En la barra del menú principal, hacer clic en Proyect, luego en la opción New Proyect
para crear un nuevo proyecto y aparecerán las figuras 3 y 4:
Figura 4: Pasos para definir unl nuevo proyecto Figura 5: Creación del proyecto Ejemplo1
5.1.3 Siga los siguientes pasos para definir el proyecto, tal como se muestra en la Figura 5:
1er.paso: Crear una carpeta de trabajo en la unidad C donde se guardarán los archivos generados
por el VMLAB, para esto haga un clic en la pestaña:
La carpeta de trabajo contendrá el nombre del curso, el horario, el número de laboratorio y el nombre
del proyecto, por ejemplo, establezca las siguientes carpetas en el orden indicado:
Luego de crear las carpetas observará en la pestaña la ruta y el nombre del proyecto como se
aprecia en la Figura 5, por ejemplo:
C:\iee256\H0528\Lab1\ejemplo1.prj
(El nombre del proyecto debe tener hasta 8 caracteres, si desea un nombre más largo,
regrese al menú principal del VMLAB, ingrese a Options, luego haga clic en Code Maker y
marque el botón que corresponde a la opción de nombres grandes: allow long names.
Luego, vuelva al paso anterior).
2do.paso: Ahora seleccione el código del microcontrolador: Atmega8 (se observa en la Figura 5)
4to.paso: Añada el archivo ejemplo1.asm en la caja de archivos (Code files list), haciendo clic en el
botón Add this. (Se observa en la Figura 5)
5to.paso: Una vez completados todos los datos se hace clic en el botón OK, y aparecerán 3
ventanas de trabajo con líneas de texto predeterminadas (ver la Figura 6).
• Ejemplo1.prj: Esta ventana nos permite escribir líneas de texto para representar el
hardware del circuito, para los cuáles debemos conocer la sintaxis de cada
dispositivo, lo estudiaremos mas adelante. Observe también, en la parte superior nos
indica alguna de sus características: trabaja a 5 voltios, la frecuencia es de 1 Mhz.
Figura 6: Ventanas para editar el programa, definir el circuito esquemático y ver los mensajes
5.2 Edición del Hardware: Se escribe las líneas de texto que definen el circuito en la ventana
generada ejemplo1.prj
Figura 7: Se muestra una lista de componentes electrónicos que dispone el entorno VMLAB
Debemos hacer clic en un componente en particular y estudiaremos la sintaxis respectiva, tales como:
Componente Sintaxis
Los diodos leds (en total 8), los pulsadores/interruptores (en total 16 botones) se pueden observar en
la siguiente Figura 8, cuando se activa la ventana de Control Panel del VMLAB
5.3 Considerando el circuito de la Figura 1, escribiremos el nombre de cada elemento del circuito y
sus respectivos nodos (en una hoja aparte), tal como se muestra en la Figura 9:
Figura 9
5.4 Continuemos con el VMLAB, en la ventana que corresponde al archivo ejemplo1.prj, escriba las
siguientes líneas de texto que representan el circuito esquemático (en la figura siguiente el texto se
encuentra resaltado, se agregó algunas líneas de comentario partir del ;).
Figura 10
Figura 11
Figura 12
Si alguna línea de texto NO está correcto, al presionar la tecla F9 de la PC, aparece una(s) línea(s)
de texto resaltada donde se encuentra el error, mostrándose en la ventana de mensajes una “carita
triste”, , por tanto debemos corregir y compilar otra vez, hasta que salga la “carita feliz”.
¿Un símbolo de una carita feliz , significa que está bien definido el circuito? ¿Por qué?
Abra la ventana de trabajo ejemplo1.hex, para escribir el siguiente programa que se muestra en
la Figura 14.
(Antes de escribir el siguiente programa borre todas las líneas de texto que se observaron por
defecto al crear el proyecto).
Consideraciones importantes:
Cada línea de instrucción, está formado por uno o más de los siguientes campos:
Campo de etiqueta, campo de nemónicos (representan a las instrucciones) y campo de
comentarios.
Figura 15
1. Panel de control: Permite observar el estado lógico de los 8 diodos leds (D1…D8), muestra
los 16 botones (0, 1,2…F) para simular el funcionamiento de los interruptores/pulsadores, 3
potenciómetros (S1, S2, S3), etc. Nuestra programa sólo usa 2 leds, que se a definido en la
ventana ejemplo1.prj
2. I/O ports: Para observar los valores actuales de los puertos B, C y D y sus registros
asociados DDRx, PORTx, PINx (donde x=B, C ó D).
Para nuestro ejemplo, nos interesa solo los registros asociados al puerto B: DDRB, PORTB
3. Register/flags: Para ver los valores de los registros de propósito general (R0 a R31), el
contador de programa(PC), el puntero de Pila(SP), el registro de banderas (SREG), etc.
En nuestro ejemplo 1, sólo usamos los registros R16 y R18, por tanto podemos ver sus
valores cuando se ejecuta cada instrucción.
Los valores de los registros, también se pueden visualizar en los siguientes formatos:
Finalmente, luego de hacer clic en las opciones indicadas, obtenemos la siguiente figura:
Figura 16: Se muestran los cuadros: Control Panel, Registros de propósito general y puertos B, C y D.
Ejercicio 1: Active la opción Program memory (ver la siguiente Figura 18) y responda:
¿Explique que información brinda cada columna?
¿Escriba el código máquina que corresponde a la instrucción ldi R18,$03?
¿Cuántos registros de la memoria flash ocupa el programa y que indica el registro PC?
¿Qué valor ocupa en el espacio de datos el registro PORTB, DDRB?
¿En el programa, La CPU deja de funcionar en la última línea del programa?Explique
¿Es posible cambiar la primera instrucción por otra que no sea rjmp?
Ejercicio 2. Se desea prender 3 diodos leds del puerto D y 4 diodos leds del puerto C.
a) Dibuje el circuito esquemático
b) Escriba el programa y demuestre su funcionamiento con el VMLAB
Ejemplo No, 2:
Desarrollo
De acuerdo a los pasos anteriores del ejemplo 1, cree un proyecto y edite el siguiente programa para
luego comprobar su funcionamiento.
Ejemplo 2
INICIO
Configurar Puertos
Salida: 2 leds
Entrada: 1 interruptor
SI Interruptor NO
a) Circuito esquemático cerrado?
b) Diagrama de Flujo
Figura 19
Programa:
Archivo que define el circuito esquemático del proyecto (escriba en la ventana *.prj):
Luego de ensamblar el código y las líneas de texto, active las ventanas del panel de control
y de los puertos, ejecute el programa presionando la tecla F5 ó haciendo un clic en la pestaña
semáforo , observará que una porción del programa se pinta de amarillo, dado que el pin
PB7, aún no es “0”, es decir aún no se cerró el interruptor, por lo tanto los leds están
apagados, ver la Figura 20.
Cuando se cierra el interruptor (haga clic en el botón K0), PB7 es “0” lógico y el programa
continúa pintándose de amarillo el código faltante, por tanto de acuerdo a la lógica del
programa los diodos leds D1 y D2, se prenden. Ver la Figura 21
Presione repetidas veces el botón K0 y observe que sucede. Resetee el programa y en lugar de K0,
escriba KF y verifique su funcionamiento. Resetee el programa, parar crear un nuevo proyecto.
Ejercicio 3
Ejecute nuevamente el programa pero borre antes la palabra latched en el archivo *.prj. con lo cuál
obtendremos el botón (KF) funcionará como un pulsador, es decir sólo se prenderá los leds, cuando
se tenga presionado el botón, si se suelta están apagados.
Ejercicio 4
El pulsador está conectado a PC4, y los diodos led están conectados a PD6 y PD7.
Cuando el pulsador está presionado se prenden los diodos leds, si se suelta se apagan. Inicialmente
el pulsador se encuentra sin presionar y los leds están apagados. Además, considere que los diodos
leds se prenden cuando la salida por los puertos es “1” lógico, como en el ejemplo 1.
a) Dibuje el circuito esquemático
b) Dibuje el diagrama de flujo.
c) Escriba el programa
d) Demuestre su funcionamiento con el entorno VMLAB
Ejemplo No. 3:
El objetivo de este proyecto es controlar 2 diodos leds usando un pulsador. Los leds, se prenden
luego de presionar y soltar un pulsador con resistencia de 10 K “pull down” conectado a tierra.
Considere:
Entrada: 1 pulsador “pull down”, conectado al pin PC5
Salida: 2 diodos leds conectados a PB0 y PB1
Inicialmente el pulsador se encuentra sin presionar y los leds están apagados.
Desarrollo
Para solucionar el problema dibujamos el circuito esquemático y el diagrama de flujo del problema, lo
cuál mostramos a continuación:
a) Circuito esquemático
b) Diagrama de Flujo
Ejemplo3.prj
D1 VDD N1 ;define Diodo led D1 en serie con R1 de 330 Oh.
R1 N1 N2 330
X1 ND2 VDD PB0 N2 ; Definen el inversor NOT, conectado al puerto PB0 y PB1
X2 ND2 VDD PB1 N4
ejemplo3.asm
; *******************************************************************************************
;***** Nombre: Ejemplo 3 *****
;***** Autor: Zenón Cucho M. *****
;***** Horario: 0522 *****
;***** Fecha: marzo 2010 *****
;***** Descripción del programa: al presionar y soltar el pulsador debe prender *****
;***** 2 diodos leds. El pulsador está conectado a PC5 y los diodos Leds a PB0 y PB1 *****
;********************************************************************************************
.include "C:\VMLAB\include\m8def.inc";
.cseg
.org $0
rjmp inicio
inicio:
ldi R16,0b00000011 ; Configuro PB0 y PB1 como salida
out DDRB,R16 ;utilizando el registro DDRB
ldi R18,0 ;inicialmente los leds están apagados
out PORTB,R18
SoltarPulsador:
in r20,PINC ;lectura del pulsador, para ver si soltó el pulsador
andi R20,0b00100000 ; se filtra solo el pin PC5
cpi R20,0 ;¿Soltó el pulsador?
brne SoltarPulsador ; todavía el pulsador sigue presionado, dado que PC5=”1”.
;***********************************************************************************
;Salida
ldi R18,0b00000011 ;Se escribe "1" lógico para prender los leds,
out PORTB,R18
lazo: rjmp lazo
Ejercicio 5
Ejemplo No, 4
Se tiene 2 interruptores K0 y K1 conectados a los pines PC0 y PC1 del microcontrolador ATmega8,
de tal manera que cuando se cierra K0, se prende el led D1, y cuando se abre K0 se apaga D1. De la
misma manera cuando se cierra el interruptor K1 se prende el diodo D2 y cuando se abre se apaga.
Inicialmente los interruptores están abiertos y los diodos leds están apagados.
Escriba el programa y demuestre su funcionamiento
Desarrollo
En el circuito se observa que los interruptores no tienen ninguna resistencia externa, como en el
ejemplo 2. ¿Cuál es el valor de PC0, cuando el interruptor K0 está abierto? ¿Cuál es el valor de PC1
cuando el interruptor K1 está cerrado?.
Para resolver este problema activaremos por software la resistencia interna que tiene el
microcontrolador en cada pin de sus puertos. ¿Cuántos pines son usados como lineas E/S en el
Atmega8?
¿Qué importancia tiene usar estas resistencias internas que vienen dentro del chip Atmega8?
1er. Paso: El pin debe ser declarado como entrada (Por defecto todos los pines son entradas):
Para el circuito, los pines de entrada son PC0 y PC1. La instrucción será:
Ldi R16, 0b00000000
Out DDRC,R16
Ejemplo4.asm
;*********************************************************************************************
;***** Nombre: Ejemplo 4 *****
;***** Autor: Zenón Cucho M. *****
;***** Horario: 0522 *****
;***** Fecha: agosto 2008 *****
;***** Descripción del programa: Se controla el encendido/apagado *****
;***** de 2 diodos leds con 2 interruptores *****
;******* K0 (PC0) controla a D1(PB0) y K1(PC1) controla a D2(PB1) *****
;*********************************************************************************************
.include "C:\VMLAB\include\m8def.inc";
.cseg
.org $0
rjmp inicio
inicio:
;Se procede a activar las resistencias "pull up" internas del Atmega8
ldi R16,0b00000000 ;se define el puerto C como entrada (interesa DDR0 y DDR1)
out DDRC,R16
ldi R18,0b00000011 ; Se escribe "1" lógico en los bits 0 y 1 del puerto PORTC
out PORTC,R18
;*******************************************************************************************
; se define como salida el bit b0 y b1 del puerto B
ldi R20,$03
out DDRB,R20
;*******************************************************************************************
;lectura de los interruptores K0 y K1
Lectura: in R16,PINC
andi R16,$03 ; se filtra sólo PC0 y PC1
out PORTB,R16 ; muestra el valor de la lectura
rjmp Lectura
********************************************************************************************
Ejemplo4.prj
D1 VDD N1 ;define Diodo led D1
R1 N1 N2 330
X1 ND2 VDD PB0 N2 ; Definen el inversor NOT, conectado al puerto PB0 y PB1
X2 ND2 VDD PB1 N4
Módulo con el microcontrolador Atmega8 con comunicación serial a una PC, a través del C.I.
MAX232 que contiene la tarjeta. Adicionalmente dispone de un cristal de 8Mz y de un conector
rectangular macho de 10 pines usado para la programación de la memoria flash.
Módulo de entrada y salida: tiene como entradas: 8 interruptores, 8 pulsadores, y 8 diodos leds
bicolores.
El diagrama simplificado del circuito de pulsador, del interruptor y del diodo led, se
muestra a continuación:
Importante: Los interruptores (en total 8) que dispone el módulo E/S del laboratorio, para que
funcionen correctamente, necesitan que se active por software la resistencia “pull up” interno del
puerto respectivo (Revisar el ejemplo 4).
1. Conectar los puertos de entrada/salida con los periféricos involucrados en la solución del problema
como los interruptores, pulsadores, leds, etc., usando el cable de E/S que tiene 2 hilos con
conector hembra en ambos extremos (Figura 26a.)
Figura 26
2. Conectar el cable de programación ISP (Figura 26.b) entre el puerto paralelo dB25 de la PC y el
módulo AvrPUCP-Mega8 que dispone de un conector rectangular de 10 pines para ello.
El chip del microcontrolador debe ser detectado como se indica en la pantalla de mensajes (ver
también el texto final: sincronizado con el microcontrolador). Si el microcontrolador no es
detectado, aparecerá un mensaje de error; tal como:
Figura 29
Figura 30
Problema Propuesto: