Actividad 5 - Programación Elemental

Introducción
Los sistemas embebidos son dispositivos electrónicos que resuelven una o varias tareas específicas. Cuentan con entradas y salidas, y las acciones que realizan se pueden programar. Los lenguajes de programación más empleados son el ensamblador o assembler y el C.


Objetivo de la actividad

  • Conocer el repertorio de instrucciones del microcontrolador.
  • Aprender a programar en lenguaje ensamblador.
  • Aprender a programar en lenguaje C.

Desarrollo
  • Resolver los siguientes problemas en los dos lenguajes ASM y C .
  • Simular su funcionamiento usando el simulador del MPLAB y usando el simulador ISIS de PROTEUS.
  • Armar el circuito y probar el funcionamiento real.
  • Publicar en el blog los programas fuente.
  • Archivo del simulador ISIS.
  • Fotografia del circuito armado.
  • Video de corta duración donde se resuelve el ejercicio 19.

Manejo de PORTS
Ejercicio 1
Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A al que está conectado un array de interruptores. Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "xxx11001" (el valor de las tres líneas superiores no importa).

Funciones Matemáticas
Ejercicio 2
Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A, al que está conectado un array de interruptores, sumándole el valor de una constante, por ejemplo 74.
Es decir: (PORTB)=(PORTA)+Constante
 

Ejercicio 3
Por el Puerto B se obtiene el dato del Puerto A multiplicado por 2.
Es decir: (PORTB)=2(PORTA)=(PORTA)+(PORT A).

Máscaras
Ejercicio 4
Por el Puerto B obtiene el dato del Puerto A, pero en la salida los bits pares se fijan siempre a "1". El orden de los bits será "b7 b6 b5 b4 b3 b2 b1 b0", siendo los pares el b6, b4, b2 y el b0.
Por ejemplo, si por el Puerto A se introduce el dato b'---01100', por el Puerto B se visualiza  b'01011101'. Observar que los bits pares están a "1" (efectivamente: Puerto B = b'x1x1x1x1') y los impares permanecen con el dato del puerto de entrada (efectivamente: Puerto A = b'---x1x0x' y Puerto B = b'xxxx1x0x').

Ejercicio 5 
Por el Puerto B obtiene el dato del Puerto A, pero en las salida los bits impares se fijan siempre a "0". El orden de los bits será "b7 b6 b5 b4 b3 b2 b1 b0", siendo los impares el b7, b5, b3 y b1.
Por ejemplo si por el Puerto A se introduce el dato b'---01100', por el Puerto B se visualiza  b'00000100'. Observar que los bits impares están a "0" (efectivamente: Puerto B = b'0x0x0x0x') y los pares permanecen con el dato del puerto de entrada (efectivamente: Puerto A = b'---0x1x0' y Puerto B = b'---0x1x0').

Ejercicio 6
Por el Puerto B se obtiene el dato del Puerto A invirtiendo los bits pares. Los impares se dejan como en la entrada. El orden de los bits será "b7 b6 b5 b4 b3 b2 b1 b0", siendo los pares el b6, b4, b2 y el b0.
Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "xxx01100".  Observar que los bits pares están invertidos (efectivamente: Puerto A = "---1x0x1" y Puerto B = "xxxx0x1x0") y en los impares permanece el dato del puerto de entrada (efectivamente: Puerto A = "---x1x0x' y Puerto B = b'xxxx1x0x').
Ayuda: Utiliza la función XOR y la máscara b'01010101'

Funciones lógicas
Ejercicio 7
Por el Puerto B se obtiene el dato del Puerto A invertidos los unos y ceros. Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "xxx00110" (no importa el estado de los tres bits superiores del Puerto B).

Ejercicio 8
Por el Puerto B obtiene el dato del Puerto A intercambiando los nibbles alto y bajo. Por ejemplo, si por el Puerto A se introduce "---11001" por el Puerto B aparecerá "1001xxx1".

Ejercicio 9
Por el Puerto B obtiene el dato del Puerto A desplazando un bit hacia la izquierda, por la derecha entrará un "1". Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "xx110011" (no importa el estado de los dos bits superiores del Puerto B).

Ejercicio 10
Por el Puerto B se obtiene el dato del Puerto A desplazando un bit hacia la derecha, por
la izquierda entrará un "0". Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "0xxx1100".

Funciones especiales

Ejercicio 11
Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A al que están conectado un array de interruptores. Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "xxx11001" (el valor de las tres líneas superiores no importa).
Esta operación la realizará una única vez. Después el programa entrará en modo "Standby" o de bajo consumo del cual no podrá salir después.

Comparaciones
Ejercicio 12
Compara el dato del puerto de entrada PORTA con un "Numero". Tres posibilidades:
  - Si (PORTA) = Numero se encienden todos los LEDs de salida.
  - Si (PORTA) > Numero se activan los LEDs pares de salida.
  - Si (PORTA) < Numero se encienden los LEDs del nibble alto y se apagan los del bajo.
Hay que destacar que al no haber instrucciones de comparación, estas se realizan mediante restas.

BCD
Ejercicio 13
Un número binario de 8 bits es convertido a BCD. El resultado se guarda en tres posiciones de memorias llamadas Centenas, Decenas y Unidades. Además al final las unidades estarán en el nibble bajo del registro W y las decenas en el nibble alto. En los diodos LEDs conectados al puerto de salida se visualizarán las decenas y las unidades.
El máximo número a convertir será el 255 que es el máximo valor que puede adquirir el número binario de entrada de 8 bits.
El procedimiento utilizado es mediante restas de 10 tal como se explica en el siguiente ejemplo que trata de la conversión del número 124 a BCD:


(Centenas)    (Decenas)    (Unidades)    ¿(Unidades)<10?     ¿(Decenas)=10?
----------    ---------    ----------    --------------    -------------------------
       0               0              124          NO, resta 10       Incrementa (Decenas).
       0               1              114          NO, resta 10       NO. Incrementa (Decenas).
       0               2              104          NO, resta 10       NO. Incrementa (Decenas).
       0               3              94           NO, resta 10        NO. Incrementa (Decenas).
       0               4              84           NO, resta 10        NO. Incrementa (Decenas).
       0               5              74           NO, resta 10        NO. Incrementa (Decenas).
       0               6              64           NO, resta 10        NO. Incrementa (Decenas).
       0               7              54           NO, resta 10        NO. Incrementa (Decenas).
       0               8              44           NO, resta 10        NO. Incrementa (Decenas).
       0               9              34           NO, resta 10        NO. Incrementa (Decenas).
       1               0              24           NO, resta 10        Sí. (Decenas)=0, y además
                                                                               incrementa (Centenas)
       1               1              14           NO, resta 10        NO. Incrementa (Decenas)
       1               2              4             SÍ, se acabó.
El número a convertir será la constante "Numero".

Salto Indexado
Ejercicio 14
Controla el nivel de un depósito de líquido. Utiliza (entre paréntesis las líneas del microcontrolador a la que se han conectado): 

  • Tres sondas detectoras: SV, Sonda de Vacío (RA0); SLL, Sonda de LLenado (RA1); SR, Sonda de Rebose (RA2).
  • Dos bombas de agua: B1 (RB5), B2 (RB6). 
  • Cinco indicadores: Vacio (RB0), Llenandose (RB1), Lleno (RB2), Rebose (RB3), Alarma (RB4).
Su funcionamiento:
  • Cuando ninguna de las sondas está mojada se entiende que el depósito está vacío y se accionarán las dos bombas. El indicador "Vacio" se iluminará.
  • Cuando el nivel del líquido toque la sonda de vacío "SV" seguirá llenándose el depósito con las dos bombas. El indicador "Llenandose" se ilumina.
    Cuando el nivel del líquido toca la sonda de llenado "SLL", para la bomba B2, quedando B1 activada en modo mantenimiento. El indicador "Lleno" se ilumina. 
  • Si el nivel del líquido moja la sonda de rebose "SR" se apaga también la bomba B1, quedando las dos bombas fuera de servicio. El indicador "Rebose" se enciende. 
  • Cuando se produce un fallo o mal funcionamiento en las sondas de entrada (por ejemplo que se active la sonda de rebose y no active la de vacío) se paran las dos bombas. El indicador "Alarma" se ilumina.

Según el enunciado del problema, teniendo en cuenta las conexiones citadas y poniendo la salida no utilizada (RB7) siempre a cero, la tabla de verdad resultante es:

 RA2.. RA0 | RB7 ...                   ... RB0
 ----------|------------------------------------------------------------------
  0   0   0  |  0   1   1   0   0   0   0   1    (Configuración 0. Estado "Vacio").
  0   0   1  |  0   1   1   0   0   0   1   0    (Configuración 1.Estado "Llenandose").

  0   1   0  |  0   0   0   1   0   0   0   0    (Configuración 2. Estado "Alarma").
  0   1   1  |  0   0   1   0   0   1   0   0    (Configuración 3. Estado "Lleno").
  1   0   0  |  0   0   0   1   0   0   0   0    (Configuración 4. Estado "Alarma").
  1   0   1  |  0   0   0   1   0   0   0   0    (Configuración 5. Estado "Alarma").
  1   1   0  |  0   0   0   1   0   0   0   0    (Configuración 6. Estado "Alarma").
  1   1   1  |  0   0   0   0   1   0   0   0    (Configuración 7. Estado "Rebose").
 


Tablas
Ejercicio 15
Por el display de 7 segmentos conectado al Puerto B se visualiza una de las 26 letras del alfabeto internacional: de la "A" a la "Z". La letra a visualizar lo determina el orden leído por el Puerto A. Así por ejemplo:

  • Si por el Puerto A se lee "---0000"  (cero) la letra visualizada será la "A" que es la que está en el orden cero.
  • Si por el Puerto A se lee "---1101" (veinticinco) la letra visualizada será la "Z" que es la que está en el orden veinticinco.

Por ahora no se contempla la posibilidad que el número de entrada sea mayor de 25.

Retardos
Ejercicio 16

Los diodos pares conectados al puerto de salida se encienden durante 0,5 segundos y los impares permanecen apagados. Después al contrario durante el mismo tiempo.

Ejercicio 17
Por la barra de diodos leds conectada al puerto de salida, un led encendido rota a la izquierda 0,3 s en cada posición. Cuando llega al final se apagan todos los leds y repite de nuevo la operación.

Ejercicio 18
Por la barra de LEDs conectada al puerto de salida un LED encendido rota a la izquierda durante 0.5 s en cada posición empezando por la línea RB0. El número de posiciones a desplazar lo fija el valor de las tres primeras líneas del Puerto A entrada.
Así por ejemplo, si (PORTA)=b'---00011' (3 decimal), la secuencia de salida sería:
00000000, 00000001, 00000010, 00000100, 00000000, 00000001, 00000010,... ( y repite)

Ejercicio 19
Por la barra de diodos LEDs conectada al puerto de salida se visualizará un juegos de luces que al lector le resulte divertido. Hay que utilizar una tabla de datos.

Ejercicio 20
Si la línea RA0 del Puerto A es "0", por el display se visualiza un contador descendente (9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, ..) con una cadencia de 0,5 segundos.
Si la línea RA0 del Puerto A es "1", por el display se visualizará un contador ascendente (0, 1, 2, 3, 5, 6, 7, 8, 9, 0, 1, 2, ..) con una cadencia de 0,5 s.