Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ARQUITECTURA DE COMPUTADORAS 1
ALUMNOS:
2
1. INTRODUCCION
En este informe se mostrara como se utilizó una nueva metodología que permite
encender y apagar el LED sin usar “delay”.
1) Codificar un programa que configure un puerto E/S como salida y que cambie su
estado cada un segundo. Conectar un LED externo o utilizar el disponible para
propósito general en la placa Galileo. El LED externo debe conectarse al puerto
a través de una resistencia de 1 KΩ. No usar la función delay(), utilizar
funciones del sistema para la temporización. Ver ejemplo “BlinkWithoutDelay”
del IDE de Arduino. Explicar el funcionamiento del código y las diferencias con
la utilización de la función delay().
2) Ídem al caso anterior pero utilizando interrupciones para la temporización. Ver
el ejemplo “ISRBlink” para Galileo del IDE de Arduino. Explicar el
funcionamiento del código y las diferencias con la utilización de la función
delay() y el ejercicio 1.
3) Mejorar el desempeño del ejercicio n.º 4 de la “Actividad Práctica n.º 1”
utilizando funciones del sistema o interrupciones según considere.
3
2. DESARROLLO
void setup() {
void loop() {
4
// Un nuevo IF que cambia el estado del LED. Lo pone alto si estaba bajo y viceversa
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
5
2.1.3. Explicación:
6
2.2. RESOLUCION DEL ENUNCIADO Nº 2
void setup() {
void loop() {
7
digitalWrite( 12, digitalRead( 12 ) ^ 1 ); // Enciende y apaga el LED
8
2.2.3. Explicación:
Con este código se utiliza una interrupción. Al igual que el código del enunciado
1, se utiliza para que el procesador pueda ejecutar otras tareas; Pasado determinado
tiempo el loop se interrumpe para cambiar el estado del LED.
Dentro del setup además de configurar el pin de salida para el LED se utiliza el
objeto mencionado anteriormente; acompañado del comando “initialize” se coloca entre
paréntesis el tiempo en el cual se quiere activar la interrupción (debe estar en
microsegundos).
Luego del setup va el bucle y por último la función “timerlsr” que como se ve en
el código cambia el estado del LED utilizando un XOR binario, apagándolo si esta
encendido o viceversa.
9
2.3. RESOLUCION DEL ENUMCIADO Nº 3
void setup() {
void loop() {
10
previousMillis = currentMillis; // Si se cumple se guarda el nuevo tiempo que el LED
cambia de est.
// Un nuevo IF que cambia el estado del LED. Lo prende si estaba apagado y viceversa
if (ledState == LOW) {
ledState = HIGH;
else {
ledState = LOW;
if (buttonState == LOW) {
bandera = 1;
bandera = 0;
11
if (intervalo_on > 1500) intervalo_on = 500; // Si se superan los 1500 ms, se reinicia a
500 ms
Serial.println(intervalo_on);
2.3.3. Explicación:
12
A continuación se encuentra un IF, que realiza una comparación entre el tiempo
actual menos el tiempo previo y el intervalo establecido; En caso que dicha resta sea
mayor o igual al intervalo asigna como tiempo previo el tiempo actual (para que en el
próximo loop este valor sea mayor y se pueda restar al tiempo actual que también va a
ser mayor ya que vuelve a adoptar como valor el tiempo transcurrido).
Continuando dentro del IF, hay otro condicional encargado de asignarle un valor
bajo al estado del LED si su valor es alto o viceversa, asi como también el valor del
“intervalo_on” si esta alto o “intervalo_off” si está bajo; Según corresponda el
“digitalWrite” le da la orden que se apague o prenda al LED.
Por último, sigue otro IF que será el encargado de agregarle los 100
milisegundos al intervalo de encendido cuando el botón este arriba y la bandera es 1 (lo
que quiere decir que se presionó el pulsador para agregar tiempo). Esto lo va a hacer
siempre y cuando el “intervalo_on” sea menor a 1500, si no se cumple dicha condición
el valor de “intervalo_on” vuelve a 500 mseg. Cabe aclarar que antes de realizar una
adición o reseteo del intervalo se coloca nuevamente el valor de la bandera en 0.
13