You are on page 1of 5

.

ARDUINO

RESUMEN: Anexo3

Arduino es una plataforma electrnica basada en 1.2 MATERIALES


hardware y software, este tiene entradas y salidas
administrables, este permite crear prototipos o medios, Computador con software Atmel Studio,
permite crear prototipos basados en hardware y software AXLoader o XLoader.
Adaptador fijo o variable de 5V a 1 A.
PALABRAS CLAVE: 1 placa Arduino (UNO, MEGA o Leonardo)
5 Resistencias de 330 Ohms a W.
Programacin, configuracin, atmel, puertos de entrada,
puertos de salida, arduino. Interrupccion, pulsador. 1 pulsador.
Protoboard (2 regletas).
ABSTRACT: Cables AWG 23 para Protoboard y cables
Jumpers.
Interrupts are signals that allow the controller to the 1 Teclado matricial.
normal flow of skit and run a particular piece of code
immediately, before continuing with what I was doing.
2 CUESTIONARIO
The core Arduino uses interrupts via software to manage
data from the Serial Monitor, to take proper account of Armar un circuito que permita conectar 8 LEDs,
the funcionesdelay () and millis () and for attachInterrupt 1 pulsador, un temporizador LM555 en modo
() function. astable y con frecuencia de 1 Hz, un rel de 5
voltios y un dipswitch de 8posiciones a una
Some libraries like Wire and Servo, use interrupts when tarjeta ARDUINO. Se armar de acuerdo tal
an event happens, so you do not have to be constantly como se especifica en la Ilustracin 1. Podrn
checking to see if the event has happened. This constant ingresar a laboratorio SOLO los alumnos que ya
check is called polling and can cause some complexity in tengan armado el circuito.
our code.

Interrupts are a very effective way to detect pulses of very Realizar operaciones matemticas bsicas
short duration. de dos nmeros de dos dgitos.
Two or more interruptions can occur before the first is Las operaciones a realizar son: suma, resta,
finished. Managing interruptions forces the first break multiplicacin y divisin.
before moving on to the second end. Los nmeros ingresados se debern
presentar en displays de 7 segmentos.
KEY WORDS: Como en cualquier calculadora de bolsillo, se
tendr una tecla que sea el igual y otra tecla
Programming, configuration, Atmel, input ports, que sea el clear data. El botn clear data
output ports, Arduino, interruption, pulse. borrar todo lo guardado anteriormente y
comenzar el proceso de ingreso de nmeros.
1 INTRODUCCIN Se utilizar un teclado matricial de 4x4 y se
realizar el barrido de 4 displays (el motivo de 4
displays es por los posibles resultados de 4
Display 7 segmentos.
dgitos en la operacin de multiplicacin)
El usuario siempre ser obligado a ingresar un
Anexo1 nmero de dos dgitos (08,11, 44, 89, etc.).
Validar resultados de restas negativos para
Es un dispositivo electrnico que permite representar evitar desbordamiento de variables.
caracteres en dispositivos electrnicos, su
funcionamiento es igual al de los leds.
Desarrollar 2 programas:
Existen dos tipos nodo comn y ctodo comn.
Detectar los pulsos del LM555 e incrementar en
una unidad (por cada pulso) una variable x.
Anexo 2 Detectar los pulsos provenientes del pulsador y
disminuir la MICROCONTROLADORES
ITEL2240-70 Perodo 2016/2 Practica N 2

1
.
.

Programacin en C e interrupciones Externas


FACULTAD DE INGENIERA Y CIENCIAS
AGROPECUARIAS Gua para prcticas de
laboratorio Electrnica Analgica misma
variable x. Se presentar el valor de la variable
x en un puerto donde estn conectados los
leds. Finalmente, condicionar que, si el valor de
x es mayor a 255, se ponga en cero el valor de
x. Condicionar que no existan valores
negativos en el registro x en el caso de que el Anexo3
pulsador se lo presione ms veces que el valor
Anexo 4
proveniente del LM555.
/*Debern copiar todo el contenido de este archivo en un
Se emular un sistema de deteccin dactilar para abrir nuevo proyecto. El programa est implementado
una puerta. para un ATMEGA2560. Este programa muestra tres
Se presiona el pulsador. dgitos ingresados a travs de un teclado matricial
al presionar una cuarta vez, se reinicia el ciclo de
Ese instante se lee una clave de 5 bits que ser
ingreso y mostrar los nuevos dgitos ingresados*/
representada con las entradas del dipswitch.
Si la clave es correcta, se activar el rel y un #define F_CPU 8000000UL
led verde por 2 segundos. #include <avr/io.h>
Si la clave es incorrecta, se activar el buzzer o #include <avr/interrupt.h>
zumbador y un led rojo por 5 segundos. #include <util/delay.h>

unsigned char tecla,bandera=0,digitos[6]={0,0,0,0,0,0},


flanco=0;
3 CONCLUSIONES unsigned char numeros_display[16]=
{63,6,91,79,102,109,125,7,127,103,119,124,57,
Como se puede constatar la bandera cumple un 94,121,113};
papel importante dentro del programa ya que es el unsigned int
que permite conocer que numero y que digito primer_numero=0,segundo_numero=0,respuesta=0;
estamos presionando y asi poder procesarlo. unsigned int
digito1=0,digito2=0,digito3=0,digito4=0,parcial=0,negativ
o=0;
//Son los valores entre 0 y 9 para conectar el display. El orden
para conectar el display en el puerto F es del tipo: PF0-a,PF1-
4 ANEXOS b... PF6-g PF7-dp
//teclado
unsigned char teclado4x4(void)
{
unsigned char columna, fila,valor=0,aux[4][4]= {
{1,2,3,10},
{4,5,6,11},
{7,8,9,12},
Anexo 1 {14,0,15,13}};
PORTK=0b11111111;

for (columna=4;columna<=7;columna++)
{
PORTK=PORTK&~(1<<columna);

for (fila=0;fila<=3;fila++)

{
if ((PINK&(1<<fila))==0)

Anexo2 valor=aux[fila][(columna-4)];
while
((PINK&(1<<fila))==0)
_delay_ms(25);

}
}
PORTK=PORTK|(1<<columna);

2
.
.

} //PRIMER NUMERO DIGITO2


PORTK=0b00001111; if(bandera==2)
//solo dejamos las pull-up {
nuevamente para //Verificaciones de
return valor; ingreso solo numero
//detectar cuando se presiona una
nueva tecla. if(numeros_display[numero]==119 ||
} numeros_display[numero]==124 ||
//inicio numeros_display[numero]==57 ||
ISR(PCINT2_vect) numeros_display[numero]==94 ||
{ numeros_display[numero]==121)
flanco++; {
if (flanco==1) bandera = 0;
{
tecla=teclado4x4(); //retorna a la variable digitos[0]=digitos[1]=digitos[2]=digitos[3]=digitos[4]=0;
global tecla el valor numrico de la tecla presionada.
bandera++; PORTD=0b00001111;
//me dir las veces que se ha presionado una tecla
} PORTF=0b11111111;
if(flanco==2) //validar
interrupcin por flanco, no por estado. _delay_ms(800);
flanco=0;
} PORTF=0b00000000;
void display(unsigned int numero)
{ }
//boton reset else
{
if(numeros_display[numero]==113&&bandera>0)
{ digitos[1]=numero;
bandera = 0;
PORTD=0X01;
digitos[0]=digitos[1]=digitos[2]=digitos[3]=digitos[4]=0;
PORTD=0b00001111; PORTF=numeros_display[digitos[1]];
PORTF=0b11111111; _delay_ms(5);
_delay_ms(800);
PORTF=0b00000000; PORTD=0X02;
}
//PRIMER NUMERO DIGITO1 PORTF=numeros_display[digitos[0]];
if(bandera==1) _delay_ms(5);
{ PORTF=0;
//Verificaciones de }
ingreso solo numero }
//OPERACION(+,-,*,/)
if(numeros_display[numero]==119 || if(bandera==3)
numeros_display[numero]==124 || {
numeros_display[numero]==57 ||
numeros_display[numero]==94 ||
numeros_display[numero]==121) digitos[2]=numero;
{
bandera = 0; PORTF=numeros_display[digitos[2]];

digitos[0]=digitos[1]=digitos[2]=digitos[3]=digitos[4]=0; PORTD=0b00000000;
_delay_ms(1);
PORTD=0b00001111; numero=0;
}
PORTF=0b11111111; //SEGUNDO NUMERO DIGITO1
if(bandera==4)
_delay_ms(800); {
//Verificaciones de
PORTF=0b00000000; ingreso solo numero
}
else if(numeros_display[numero]==119 ||
{ numeros_display[numero]==124 ||
numeros_display[numero]==57 ||
digitos[0]=numero; numeros_display[numero]==94 ||
numeros_display[numero]==121)
PORTD=0X01; {
bandera = 0;
PORTF=numeros_display[digitos[0]];
_delay_ms(5); digitos[0]=digitos[1]=digitos[2]=digitos[3]=digitos[4]=0;
}
} PORTD=0b00001111;

3
.
.

PORTF=0b11111111; //SUMA

_delay_ms(800); case 119:


{
PORTF=0b00000000;
} respuesta=primer_numero+segundo_numero;
else
{ negativo=0;
}
digitos[3]=numero;
break;
PORTD=0X01;
//RESTA
PORTF=numeros_display[digitos[3]];
_delay_ms(5); case 124:
} {
}
//SEGUNDO NUMERO DIGITO2 //Resta positiva
if(bandera==5)
{ if (primer_numero>=segundo_numero)
//Verificaciones de
ingreso solo numero {

if(numeros_display[numero]==119 || respuesta=primer_numero-
numeros_display[numero]==124 || segundo_numero;
numeros_display[numero]==57 ||
numeros_display[numero]==94 || negativo=0;
numeros_display[numero]==121)
{ }
bandera = 0;
//Resta negativa
digitos[0]=digitos[1]=digitos[2]=digitos[3]=digitos[4]=0;
else
PORTD=0b00001111;
{
PORTF=0b11111111;
respuesta=segundo_numero-
_delay_ms(800); primer_numero;

PORTF=0b00000000; negativo=1;
}
else }
{ }

digitos[4]=numero; break;

PORTD=0X01; //MULTIPLICACION

PORTF=numeros_display[digitos[4]]; case 57:


_delay_ms(5); {

PORTD=0X02; respuesta=primer_numero*segundo_numero;

PORTF=numeros_display[digitos[3]]; negativo=0;
_delay_ms(5); }
}
} break;
//Obtener el numero
//DIVISION
primer_numero=(digitos[0]*10)+digitos[1];
case 94:
segundo_numero=(digitos[3]*10)+digitos[4];
if(bandera==6) //DIVISION PARA CERO
{ if
digitos[5]=numero; (segundo_numero<=0)
{
if(numeros_display[digitos[5]]==121)
{ respuesta=9999;

switch(numeros_display[digitos[2]]) negativo=0;
{ }

4
.
.

else PORTF=0b11111111;
{ _delay_ms(800);
PORTF=0b00000000;
respuesta=primer_numero/segundo_numero; }
}
negativo=0;
} int main(void)
} {
} DDRK=0b11110000; //PK0-PK3 como entradas. PK4-
if (respuesta>0); PK7 como salida
{ PORTK=0b00001111; //resistencias pull-up en la LSB
del puerto K
digito1=respuesta/1000; PCICR=0b00000100; //1 lgico en este bit habilita el
vector de interrupcin PCI2. Este vector corresponde a los
parcial=respuesta%1000; pines PCINT23:16.
PCMSK2=0b00001111; //Se habilita las interrupciones
digito2=parcial/100; PCINT16-PCINT19
DDRA=0b11111111; //Puerto A es todo
parcial=parcial%100; salida
DDRF=0b11111111; //Puerto F como salida.
digito3=parcial/10; DDRD=255;
PORTD=0;
digito4=parcial%10; sei();
while (1)
{
PORTD=0b00001000; display(tecla);
if }
(negativo==1) }
{ 5 REFERENCIAS
PORTD=0b00001000;
[1] Carro Fernndez, G. Introduccin a Arduino (I):
PORTF=0b00001000; electrnica para todos.

_delay_ms(5); [2] Microcontroladores, P. I. C. (1999). Diseo


} Prctico de aplicaciones. Segunda Parte: EL
else PIC16F87X.
{
[3] Artero, . T. (2013). Arduino: curso prctico
PORTF=numeros_display[digito1]; de formacin. RC Libros.

_delay_ms(5);
}

PORTD=0b00000100;

PORTF=numeros_display[digito2];
_delay_ms(5);

PORTD=0b00000010;

PORTF=numeros_display[digito3];
_delay_ms(5);

PORTD=0b00000001;

PORTF=numeros_display[digito4];
_delay_ms(5);

}
}
//Repetir bucle
if(bandera==7)
{
bandera = 0;

digitos[0]=digitos[1]=digitos[2]=digitos[3]=digitos[4]=0;
PORTD=0b00001111;

You might also like