Sunteți pe pagina 1din 14

INTRODUCCIN

En este ensayo de laboratorio se realiz la programacin de un microcontrolador


Atmega 2560 (montado sobre una placa Arduino Mega) mediante el lenguaje ensamblador y
el lenguaje C en vista de solucionar 2 problemticas planteadas por la ctedra. Adems, se
realiz el montaje en una placa de pruebas para verificar el correcto funcionamiento del
cdigo diseado para finalmente contrastar con la depuracin que puede realizarse del mismo
por computadora.

EQUIPAMIENTO UTILIZADO

-Placa Arduino Mega 2560


-LEDs varios
-Motor CC
-Protoboard
-Resistores varios
-Cables puente
-ULN2003
-Micro switch
-Fuente de alimentacin
-Puente H basado en L293D

SOFTWARE UTILIZADO

Atmel Studio 7.0


Microsoft Visio 2016
Microsoft Word 2016

DESARROLLO

Experiencia 1: Contador de pulsos en BCD (en assembler)

Enunciado:
Realizar un programa que permita contar cclicamente de 00 a 99 e indique el
conteo a travs de LEDs que indicando cada dgito como un cdigo BCD. El circuito del
contador posee dos pulsadores, P1 que permite ingresar los pulsos a contar y P2 para borrar
la cuenta en cualquier momento. El programa desarrollado tambin deber realizar un barrido
inicial de todos los LEDs cuando se energiza el circuito, permitiendo esto verificar si todos
los LEDs estn en buen estado antes de iniciar el conteo. El barrido mencionado debe
consistir en el encendido secuencial de todos los LEDs, como se indica en la siguiente figura.
En la cual, se muestra tambin los pulsadores con sus correspondientes resistencias de pull-
up conectadas al microcontrolador y el buffer necesario para proveer la corriente utilizada
por los LEDs.

Figura 1.1: Esquema de conexin y barrido inicial de los LEDs de la experiencia 1.

Desarrollo del ejercicio:

Para resolver este ejercicio, se empez por realizar un diagrama de flujo (figura 1.2)
que indica el funcionamiento del programa. El mismo sirvi de punto de partida para realizar
la programacin del microcontrolador en trminos de definir la cantidad de variables
necesarias y la estructura del programa. El cdigo en lenguaje assembler se encuentra en el
anexo, al final del informe.
Cada funcin del programa se fue probando por separado en el simulador para
comprobar el correcto funcionamiento de las mismas, una vez finalizadas las pruebas con el
simulador se procedi a grabar el programa en el microcontrolador y se arm el circuito que
se muestra a continuacin.
En la figura 1.3 se esquematiza el puerto A del microcontrolador, el cual se utiliza
como salida del contador, conectado a las entradas de dos circuitos integrados ULN2003.
Estos CI son usados para suministrar la corriente necesaria para prender los 8 LEDs, ya que
si se conectan directamente al puerto del microcontrolador la corriente superara el lmite
mximo soportado por el mismo.
Figura 1.2: diagrama de flujo ejercicio 1
Figura 1.3: diagrama de conexin del ejercicio 1

Los resistores de pull-up se calculan con la finalidad de que se asegure que a la entrada
haya un nivel de tensin mnima que sea reconocible como un estado lgico alto ( ). El
diagrama de conexin de este resistor se aprecia en la figura 1.4

Figura 1.4: esquema de conexin del resistor pull-up

(5 3,3)
= =
1
= 1,7
Con que la resistencia de pull-up sea de una valor menor al hallado era suficiente, por lo que se
utiliz un valor de 10.
Experiencia 2: Automatismo para barrera (en lenguaje C).

Enunciado:

Se quiere automatizar un sistema de control de paso con barrera. El mismo consta de los
siguientes elementos:
Una barrera accionada por un motor con freno M.
Dos finales de carrera FS y FB para indicar si la barrera est arriba o abajo,
respectivamente.
Un pulsador P para que el encargado pueda subir y bajar la barrera.
Un semforo de dos colores: VERDE y ROJO.
Disear un sistema que permita accionar la barrera cumpliendo con el siguiente
funcionamiento:
El sentido de giro del motor M (subir o bajar la barrera) se controla a travs de un
cdigo de dos bits segn: 00 Apagado; 01 Subir; 10 Bajar.
La barrera normalmente est arriba. Si al arrancar el sistema de control la barrera no
estuviera arriba, el sistema debe subir la misma.
Cuando el encargado decide bajar la barrera, el mismo pulsa P. La barrera baja y
permanece as hasta que se pulse nuevamente P haciendo que la barrera suba.
Mientras la barrera est arriba, el semforo est en verde. En cualquier otro caso est
en rojo.

Desarrollo del ejercicio:

De la misma manera que para la primera experiencia, se comenz por realizar un


diagrama de flujo (figura 2.1). En el mismo se puede observar que luego de la inicializacin
se comprueba si la barrera se encuentra arriba y de no ser as, se activa el motor para subirla.
Luego, se inicia un bucle infinito en el cual constantemente se comprueba la condicin de
los finales de carrera y del pulsador para tomar las decisiones correspondientes al estado de
los semforos y del motor.
A modo de simplificar el diagrama, se omiti la condicin que comprueba el instante
en el cual deja de estar presionado el final de carrera superior, al momento de bajar la barrera,
para apagar el semforo verde y prender el rojo. Esta condicin se puede apreciar en el cdigo
que se encuentra en el anexo de este informe.
En la figura 2.2 se muestra el esquema de conexin del circuito implementado, donde
las resistencias de pull-up utilizadas para los finales de carrera y para el pulsador tienen los
mismos valores que las resistencias de pull-up del ejercicio anterior. De la misma manera,
para las resistencias limitadoras de los LEDs se utiliza el valor calculado en el ejercicio
anterior. Para activar el motor y controlar el sentido de giro del mismo, se utiliz un puente
H implementado con un circuito integrado L293, al cual se le conectan los dos pines PA0 y
PA1 del microcontrolador. Cuando PA0 y PA1 tienen un estado lgico bajo, el motor se
encuentra detenido, cuando PA0 se encuentra en alto y PA1 en bajo, el motor hace que suba
la barrera y cuando PA0 se encuentra en bajo y PA1 en alto, se activa el motor para bajar la
barrera.

Figura 2.1: diagrama de flujo del ejercicio 2


El diagrama de conexin del circuito puede apreciarse en la figura 2.2. El diagrama
de conexin del L293 queda expuesto en la figura 2.3. En el mismo tiene la posibilidad de
comandar 2 motores para realizar la inversin del sentido de giro, por lo que simplemente se
utiliz un driver.

Figura 2.2: diagrama de conexin del ejercicio 2

Figura 2.3: esquema de conexionado del L293 sealando la conexin para giro en ambos sentidos
CONCLUSIONES

Con la resolucin de los ejercicios se pudo obtener una mayor comprensin del
manejo de los puertos de entrada y salida digitales del microcontrolador ATmega2560.
Un aspecto a destacar fue la practicidad de trabajar sobre la placa Arduino Mega para
realizar la programacin del microcontrolador ya se encuentra montado con los componentes
necesarios para su funcionamiento y se tiene un fcil acceso a los pines del mismo.
Adems, la programacin en lenguaje C result ser ms fcil de realizar puesto que
es un lenguaje de mas alto nivel que el assembler, pero se pierde el control directo sobre los
registros y los espacios de memoria que se utilizan.
ANEXO: Cdigos de los ejercicios

Ejercicio 1.

;
; Lab1Ej1.asm
;
; Created: 29/09/2017 09:07:02 a.m.
; Author : Fabrizio Novello
;
.INCLUDE "m2560def.inc"
;DEFINICIONES
.EQU VAL=10
.EQU VAL_1=0X10
.EQU VAL_2=0XC6
.EQU VAL_3=0XC9 ;VALORES PARA EL DELAY
.EQU VAL_4=0X50 ;VAL_4=0X2C
.EQU VAL_5=0X5E ;VAL_5=0X4E
.EQU VAL_6=0XEF ;VAL_6=0XDF VALORES PARA EL DELAY2

.EQU SWITCH_BORRA=0
.EQU SWITCH_SUMA=1
.DEF SUMADOR=R18 ;DEFINO EL REGISTRO QUE ALMACENA LA SUMA
.DEF TEMP=R16 ;REGISTRO TEMPORAL
.DEF BORRAR=R17 ;REGISTRO PARA BORRAR
.DEF TEMP1=R23
.DEF TEMP2=R24
.DEF SAL=R25
.DEF CONT1=R19
.DEF CONT2=R20
.DEF CONT3=R21

.ORG 0x0000

//Configurar puertos
//El puerto A tiene todos los bits como salida
//El puerto C tiene los bits 0 y 1 como entrada, dems como salida
LDI TEMP,0XFF
OUT DDRA,TEMP
CLR TEMP
OUT PORTA,TEMP
LDI TEMP,0XFC
OUT DDRC,TEMP

;------------------------------------------------------------------------
/////////////////////////PROGRAMA PRINCIPAL//////////////////////////////
CLR BORRAR
CLR TEMP1
CLR TEMP2
CALL BARRE
//Con SBIS prueba si el pulsador para borrar est activado o
//si el pulsador para realizar la suma est activado
BUCLE: SBIS PINC,SWITCH_BORRA
CALL BORRA
SBIS PINC,SWITCH_SUMA
CALL SUMA
RJMP BUCLE

;------------------------------------------------------------------------
////////////////////////SUBRUTINAS///////////////////////////////////////

;BORRAR

BORRA: OUT PORTA,BORRAR


CLR TEMP1
CLR TEMP2
RET

;BARRIDO DE LOS LED DEL PUERTO A


;genera un desplazamiento de los led del puerto A para ver si
;estn funcionando correctamente
BARRE: LDI TEMP,0X80
OUT PORTA,TEMP
SALTO: CALL DELAY
LSR TEMP
OUT PORTA,TEMP
BRNE SALTO
RET

;DELAY EXTENSO PARA HACER EL BARRIDO DE LOS LED


;Primero realiza el decremento de CONT3
;luego decrementa CONT2
;luego decrementa CONT1

DELAY: LDI CONT1,VAL_1


ACA0: LDI CONT2,VAL_2
ACA1: LDI CONT3,VAL_3
ACA2: DEC CONT3
BRNE ACA2
DEC CONT2
BRNE ACA1
DEC CONT1
BRNE ACA0
RET

;DELAY PARA LA SUMA


;Primero realiza el decremento de CONT3
;luego decrementa CONT2
;luego decrementa CONT1

DELAY2: LDI CONT1,VAL_4


ACA3: LDI CONT2,VAL_5
ACA4: LDI CONT3,VAL_6
ACA5: DEC CONT3
BRNE ACA5
DEC CONT2
BRNE ACA4
DEC CONT1
BRNE ACA3
RET
;SUMA 1 A LA SALIDA DEL PUERTO A

//Se realiza la suma y se muestra en el puerto, cuando la variable que se incrementa


(TEMP2)
//supera el valor de 9 en la unidad, se incrementa un segundo registro (TEMP1) al
que
//luego se invierten los nibbles y luego de resetear TEMP2 se suman y muestran en el
puerto

SUMA: CALL DELAY2


CPI TEMP2,9
BRNE SALTA
CPI TEMP1,9
BRNE SALTA
CALL BORRA
RJMP SALIR
SALTA:
INC TEMP2
MOV SAL, TEMP1
SWAP SAL
ADD SAL,TEMP2
CPI TEMP2,VAL
BRGE DECENA
OUT PORTA,SAL
CLR SAL
RET

DECENA: CLR TEMP2


INC TEMP1
MOV SAL,TEMP1
SWAP SAL
ADD SAL,TEMP2
OUT PORTA,SAL
CPI TEMP1,VAL
SALIR: RET
Ejercicio 2.

/*
* Ej 2.c
*
* Created: 07/10/2017 06:57:47 p.m.
* Author : Fabrizio Novello
*/

//definiciones
#define m0 PA0 //bit 0 motor
#define m1 PA1 //bit 1 motor
#define fca PA2 //final de carrera alto
#define fcb PA3 //final de carrera bajo
#define puls PA4 //pulsador para activar la barrera
#define sv PA5 //semaforo verde
#define sr PA6 //semaforo rojo
#define F_CPU 16000000UL
//macros de usuario:

#define sbi(x,y) x|= _BV(y) //sbi(x,y) setea el bit y de x


#define cbi(x,y) x&=~(_BV(y)) //cbi(x,y) borra el bit y de x
#define is_high(x,y) (x&_BV(y))==_BV(y) //is_high(x,y) testea si el bit y de x es 1
#define is_low(x,y) (x&_BV(y))==0 //is_low(x,y) testea si el bit y de x es 0

#include <avr/io.h>
#include <util/delay.h>

//El sentido de giro del motor M (subir o bajar la barrera) se controla a travs de
//un cdigo de dos bits segn:
//00 Apagado; 01 Subir; 10 Bajar.

int main(void)
{
DDRA=0b11100011; //configura puerto A 4 entradas y 2 salidas (MSB no se
//usa, se deja como salida)

cbi(PORTA,m0); //valores iniciales:


cbi(PORTA,m1); //motor parado
cbi(PORTA,sv); //semarofo verde apagado
cbi(PORTA,sr); //semaforo rojo apagado

//testea si la barrera est alta. si no lo esta, la sube

while(is_high(PINA,fca))
{
sbi(PORTA,sr);
sbi(PORTA,m0);
}

cbi(PORTA,m0); //para el motor


cbi(PORTA,sr); //apaga el semaforo rojo
sbi(PORTA,sv); //prende el semaforo verde

while (1) //Bucle que testea el pulsador y sube o baja la barrera


{
if(is_high(PINA,fca))//si el final de carrera alto no est activado
{
cbi(PORTA,sv); //se apaga el semaforo verde
sbi(PORTA,sr); //se prende el rojo
}
else //si el final de carrera alto est activado:
{
cbi(PORTA,sr); //se apaga el semaforo rojo
sbi(PORTA,sv); //se prende el verde
}
if(is_high(PINA,fca)&&is_high(PINA,fcb)&&is_low(PINA,puls)) //testea
//si por algun motivo ningun final de carrera
//esta activado y se presiona el pulsador, en ese caso
//sube la barrera
{
cbi(PORTA,sv); //apaga el semaforo verde
sbi(PORTA,sr); //prende el semaforo rojo

while(is_high(PINA,fca)) //sube la barrera hasta que se


//active el final de carrera
sbi(PORTA,m0);

cbi(PORTA,m0); //para el motor


cbi(PORTA,sr); //apaga el semaforo rojo
sbi(PORTA,sv); //prende el semaforo verde

if(is_low(PINA,fca)&&is_low(PINA,puls)) //testea si la barrera est


//alta y se activa el pulsador
{

while(is_high(PINA,fcb)) //baja la barrera hasta que se


//active el final de carrera
{
if(is_high(PINA,fca)) //testea si el final de
//carrera en alto est
//desactivado
{
cbi(PORTA,sv); //apaga el semaforo verde
sbi(PORTA,sr); //prende el semaforo rojo
}
sbi(PORTA,m1);
}

cbi(PORTA,m1); //para el motor

}
if(is_low(PINA,fcb)&&is_low(PINA,puls)) //testea si la barrera est
//baja y se activa el pulsador
{
while(is_high(PINA,fca)) //sube la barrera hasta que se active
//el final de carrera
sbi(PORTA,m0);

cbi(PORTA,m0); //para el motor


cbi(PORTA,sr); //apaga el semaforo rojo
sbi(PORTA,sv); //prende el semaforo verde
}

}
}