martes, 22 de octubre de 2019

Laboratorio 9_2019


Laboratorio 9
"Programación básica con bucles de control"

1.- Marco teórico

BUCLES DE CONTROL

La estructura condicional if ... else
En la gran mayoría de los programas será necesario tomar decisiones sobre qué acciones realizar. Esas decisiones pueden depender de los datos que introduzca el usuario, de si se ha producido algún error o de cualquier otra cosa.
La estructura condicional if ... else es la que nos permite tomar ese tipo de decisiones. Traducida literalmente del inglés, se la podría llamar la estructura "si...si no", es decir, "si se cumple la condición, haz esto, y si no, haz esto otro".
Un ejemplo sencillo sería el siguiente (no se trata de un programa completo, sino tan sólo una porción de código):
if (edad < 18)
               printf("No puedes acceder.\n");
        else
               printf("Bienvenido.\n");


La estructura condicional abierta y cerrada switch ... case
La estructura condicional switch ... case se utiliza cuando queremos evitarnos las llamadas escaleras de decisiones. La estructura if nos puede proporcionar, únicamente, dos resultados, uno para verdadero y otro para falso. Una estructura switch ... case, por su parte, nos permite elegir entre muchas opciones. Ejemplo:
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
        int dia;
 
        printf("¿Qué número de día de la semana es?");
        scanf("%i",&dia);
 
        switch(dia) {
               case 1 :
                       printf("Lun, Lunes");
                       break;
               case 2 :
                       printf("Mar, Martes");
                       break;
               case 3 :
                       printf("Mier, Miercoles");
                       break;
               case 4 :
                       printf("Jue, Jueves");
                       break;
               case 5 :
                       printf("Vie, Viernes");
                       break;
               case 6 :
                       printf("Sab, Sabado");
                       break;
               case 7 :
                       printf("Dom, Domingo");
                       break;
               default :
                       printf("No existe");
}
return 0;
}

La estructura anterior, de realizarse con sentencias if, necesitaría cuatro de ellas, resultando un enorme bloque muy difícil de leer. En la mayoría de los casos, además, la sentencia switch proporciona una ganancia en velocidad del código, pues permite al compilador trabajar en base a que se trata de una decisión múltiple para una única variable, cosa que con sentencias if el compilador no tiene por qué detectar.

El bucle while
El bucle while sirve para ejecutar código reiteradas veces.
while (/*condicion*/) {
        /* Código */
}
La condición debe de ser una expresión lógica, similar a la de la sentencia if. Primero se evalúa la condición. Si el resultado es verdadero, se ejecuta el bloque de código. Luego se vuelve a evaluar la condición, y en caso de dar verdadero se vuelve a ejecutar el bloque. El bucle se corta cuando la condición da falso.
Ejemplo: imprimir los números de 0 a 99:
int i = 0;
while (i < 100) {
        printf("%d\n", i);
        i = i + 1;
}
Inicialmente se declara que la variable i tiene un valor de 0. Al iniciar el bucle, se cumple la condición i < 100, por lo que se procede a la instrucción de imprimir dicho número (cero, en el caso inicial). Posteriormente i cambiará su valor de uno en uno por la instrucción i = i + 1 y seguidamente dicho valor nuevo, será evaluado en la condicion while hasta que i llegue al valor 100, donde debido a la condicional, éste será un valor falso, dando fin al código.
El bucle for
El bucle for es un bucle muy flexible y a la vez muy potente ya que tiene varias formas interesantes de implementarlo, su forma más tradicional es la siguiente:

for (/* inicialización */; /* condición */; /* incremento */) {
        /* código a ejecutar */
}
Inicialización: en esta parte se inicia la variable que controla el bucle y es la primera sentencia que ejecuta el bucle. Sólo se ejecuta una vez ya que solo se necesita al principio del bucle.
Expresión condicional: al igual que en el bucle while, esta expresión determina si el bucle continuará ejecutándose o no.
Incremento: es una sentencia que ejecuta al final de cada iteración del bucle. Por lo general, se utiliza para incrementar la variable con que se inicio el ciclo. Luego de ejecutar el incremento, el bucle revisa nuevamente la condición, si es verdadera tiene lugar una ejecución más del cuerpo del ciclo, si es falsa se termina el ciclo y así.

2.- Vídeo


Simulación 

Código



3.-Conclusiones
  • Reconocimos los comandos del software de programación de CCS C COMPILER. 
  • Realizamos la simulación en ISIS PROTEUS del mismo programa.
  • Realizamos un programa para el funcionamiento de un semáforo tomando como base el ejemplo del laboratorio.

Laboratorio 8_2019


"Herramientas de Programación Hardware y Software"

1.- Marco teorico
  • Se denomina microcontrolador a un dispositivo programable capaz de realizar diferentes actividades que requieran del procesamiento de datos digitales y del control y comunicación digital de diferentes dispositivos. Los microcontroladores poseen una memoria interna que almacena dos tipos de datos; las instrucciones, que corresponden al programa que se ejecuta, y los registros, es decir, los datos que el usuario maneja, así como registros especiales para el control de las diferentes funciones del microcontrolador. Los micro controladores se programan en Assembler y cada microcontrolador varía su conjunto de instrucciones de acuerdo a su fabricante y modelo. De acuerdo al número de instrucciones que el microcontrolador maneja se le denomina de arquitectura RISC (reducido) o CISC (complejo). Los microcontroladores poseen principalmente una ALU (Unidad Lógico Aritmética), memoria del programa, memoria de registros, y pines I/O (entrada y/0 salida). La ALU es la encargada de procesar los datos dependiendo de las instrucciones que se ejecuten (ADD, OR, AND), mientras que los pines son los que se encargan de comunicar al microcontrolador con el medio externo; la función de los pines puede ser de transmisión de datos, alimentación de corriente para l funcionamiento de este o pines de control especifico. En este proyecto se utilizó el PIC 16F877. Este microcontrolador es fabricado por MicroChip familia a la cual se le denomina PIC. El modelo 16F877 posee varias características que hacen a este microcontrolador un dispositivo muy versátil, eficiente y práctico para ser empleado en la aplicación que posteriormente será detallada. Algunas de estas características se muestran a continuación: 
  • Soporta modo de comunicación serial, posee dos pines para ello. 
  • Amplia memoria para datos y programa. 
  • Memoria reprogramable: La memoria en este PIC es la que se denomina FLASH; este tipo de memoria se puede borrar electrónicamente (esto corresponde a la "F" en el modelo). 
  • Set de instrucciones reducidas (tipo RISC), pero con las instrucciones necesarias para facilitar su manejo.
Características
16F877
Frecuencia máxima
DX-20MHz
Memoria de programa flash palabra de 14 bits
8KB
Posiciones RAM de datos
368
Posiciones EEPROM de datos
256
Puertos E/S
A, B, C, D, E
Número de pines
40
Interrupciones
14
Timers
3
Módulos CCP
2
Comunicaciones Serie
MSSP, USART
Comunicaciones paralelo
PSP
Líneas de entrada de CAD de 10 bits
8
Juego de instrucciones
35 instrucciones
Longitud de la instrucción
14 bits
Arquitectura
Harvard
CPU
Risc
Canales Pwm
2


2.- Vídeo




3.- Conclusiones
  • Reconocimos los comandos del software de programación de CCS C COMPILER. 
  • Realizamos la simulación en ISIS PROTEUS del mismo programa.
  • Realizamos un programa para el funcionamiento de un semáforo tomando como base el ejemplo del laboratorio.



miércoles, 2 de octubre de 2019

Evaluación de sesión 7

Evaluación

1.- Marco teórico:

Random()

Descripción: La función random() genera números pseudo aleatorios.
Sintaxis
  • random(max)
  • random(min, max)
Parámetros
  • min - el límite inferior del valor aleatorio, incluso este (opcional)
  • max - el límite superior del valor aleatorio, incluso este
Retornos
Un número aleatorio entre min and max-1 (long)
Nota:
Si es importante que una secuencia de valores generados por ramdom() pueda variar, en posteriores ejecuciones de un programa, utilice ramdomSeed () para inicializar el generador de números aleatorios con una entrada bastante aleatoria, como analogRead () en un pin desconectado . A la inversa, puede ser ocasionalmente útil el uso de secuencias pseudoaleatorias que se repiten exactamente. Esto se puede conseguir llamando a tandomSeed () con un número fijo, antes de iniciar la secuencia aleatoria.
2.-Código:






3.- Vídeo: 


4.- Conclusiones:
  • Realizamos el ejercicio planteado por el profesor cambiando el código de arduino.
  • Utilizamos la función RAMDOM para generar números aleatorios.