sábado, 2 de junio de 2012

Trabajo Práctico Nº 5: Programacion Elemental

Trabajo "en construcción"

Objetivos del Trabajo:
  • Aprender a programar "lo básico" en assembler y en C.
  • Tener mejor manejo de los programas MPLAB y Pic C
  • Conocer las instrucciones del los lenguajes. 
 Introducción Teórica:

Como este trabajo se va a realizar con el fin de aprender las instrucciones de los lenguajes, acá expondré, lo dado en clase.

Estas son las formas en las que podemos escribir las contantes: 
  • Decimal
  • Hexadecimal
  • Binario 
  • ASCII
  • Octal (casi no se usa)
Sistema Decimal:
 
El sistema de numeración decimal, también llamado sistema decimal, es un sistema de numeración posicional en el que las cantidades se representan utilizando como base aritmética las potencias del número diez.

Sistema hexadecimal:

El sistema numérico hexadecimal o sistema hexadecimal (a veces abreviado como Hex, no confundir con sistema sexadecimal) es un sistemas de numeración que emplea 16 símbolos. Su uso actual está muy vinculado a la informática y ciencias de computación, pues los computadores suelen utilizar el byte u octeto como unidad básica de memoria; y, debido a que un byte representa 2 elevado a la 8 valores posibles

Sistema binario:

El sistema binario, en matemáticos e informática, es un sistema de numeración  en el que los números se representan utilizando solamente las cifras cero y uno (0 y 1). Es el que se utiliza en las computadoras, debido a que trabajan internamente con dos niveles de voltaje, por lo cual su sistema de numeración natural es el sistema binario (encendido 1, apagado 0).

ASCII:

 El código ASCII (siglas en ingles para American Standard Code for Información Interchange, es decir Código Americano Estándar para el intercambio de Información ( se pronuncia Aski ).

Fue creado en 1963 por el Comité Estadounidense de Estándares o "ASA", este organismo cambio su nombre en 1969 por "Instituto Estadounidense de Estándares Nacionales" o "ANSI" como se lo conoce desde entonces.

Este código nació a partir de reordenar y expandir el conjunto de símbolos y caracteres ya utilizados en aquel momento en telegrafía por la compañía Bell.

En un primer momento solo incluía letras mayúsculas y números, pero en 1967 se agregaron las letras minúsculas y algunos caracteres de control, formando así lo que se conoce como US-ASCII, es decir los caracteres del 0 al 127.
Así con este conjunto de solo 128 caracteres fue publicado en 1967 como estándar, conteniendo todos lo necesario para escribir en idioma ingles.

En 1981, la empresa IBM desarrolló una extensión de 8 bits del código ASCII, llamada "pagina de código 437", en esta versión se reemplazaron algunos caracteres de control obsoletos, por caracteres gráficos. Además se incorporaron 128 caracteres nuevos, con símbolos, signos, gráficos adicionales y letras latinas, necesarias para la escrituras de textos en otros idiomas, como por ejemplo el español. Así fue como se sumaron los caracteres que van del ASCII 128 al 255.
IBM incluyó soporte a esta página de código en el hardware de su modelo 5150, conocido como "IBM-PC", considerada la primera computadora personal.
El sistema operativo de este modelo, el "MS-DOS" también utilizaba el código ASCII extendido.

Casi todos los sistemas informáticos de la actualidad utilizan el código ASCII para representar caracteres y textos (153) .

Tabla de pasaje de sistemas numéricos:


Bueno, en resumen conociendo todos estos sistemas podemos escribir las constantes de diversas como muestra la siguiente tabla sacada, del libro "Proyectos con el PIC16f84a"



 Instrucciones del ensamblador:


La utilidad y los ejemplos de las instrucciones, serán desarrollados a lo largo del trabajo practico.

Materiales a usar:

Para hacer este trabajo práctico, vamos a usar la placa entrenadora, hecha en placa:
El circuito dado de la Entrenadora: 
 
El diseño de la placa:

 Visualizacion en 3D del diseño:


Un video de como hice la placa, presentacion del trabajo armado en power point y filmado en camtasia:



 Ejercicios para hacer: 

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).



Resolucion del problema en Assembler:
                                
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


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


 Resolucion del problema en Assembler:

                             

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').



Resolucion del problema en Assembler: 
                              
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').


Resolucion del problema en Assembler:
                                     
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'
 

Resolucion del problema en Assembler:
                                    
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).


Resolucion del problema en Assembler:
                                   
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".
 
Resolucion del problema en Assembler:
                                     
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).
 
Resolucion del problema en Assembler:
                                   
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".
 
Resolucion del problema en Assembler:
                                   
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.

  
Resolucion del problema en Assembler:

 
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.
 
Resolucion del problema en Assembler:


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".


Resolucion del Problema en Assembler:
 
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: Vació (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 "Vació" 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 "Vació").
  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"). 
Resolucion del problema en Assembler: 

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.
Resolucion del problema en Assembler:

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.
Resolucion del  problema en Assembler:

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.
Resolucion del problema en Assembler: 

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)
Resolucion del problema en Assembler:

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.
Resolucion del problema en Assembler: 

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.