Cargando...

domingo, 28 de agosto de 2011

Prácticas de Programación

En esta entrada publicaremos unos ejercicios que hicimos como práctica de programacion tanto en Assembler (usando el MPLab 8.1) como en C (Usando el CCS C v 4.114).
En caso de querer comprobar estos programas o usarlos como base para otros más complejos, dejamos a disposición el siguiente link, en que se encuentran todos los archivos que utilizamos en las prácticas:



Elemental_01:
Por el Puerto B se obtiene el dato de las 5 líneas del Puerto A, al que está conectado un array de interruptores, sumándole el valor de una constante.
La constante que le sumamos es 20, quedando así (despues de definir la configuración, las etiquetas y el lugar que ocupan, y la configuración de entrada/salida de los puertos) el código en Assembler:


Debido a problemas con el editor de texto de Blogger, y para presentar el programa de forma ordenada, decidimos utilizar una imagen sacada desde el MPLAB; utilizaremos este recurso en toda la entrada.

En C el programa es aún mas sencillo, requiriendo tan solo de las siguientes líneas:

#include <Elemental01.h>

void main()
{
   while (1) {
      output_b( input_a() + 10);
   }
}

El "Elemental01.h" al que hace referencia es un header, un archivo que contiene la configuración del microcontrolador sobre el que se va a programar y otras opciones, y a su vez incluye otro header que contiene la información específica del microcontrolador. Estos archivos son completamente necesarios para el funcionamiento del programa a ser grabado.
Como ejemplo, mostramos la forma en que configuramos el header que usamos en estas prácticas:

#include <16F84A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                             //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                           //Power Up Timer
#FUSES NOPROTECT           //Code not protected from reading

#use delay(clock=4000000)


Elemental_02:
Por el Puerto B se obtiene el dato del Puerto A multiplicado por 2.

En Assembler:
A pertir de este ejercicio, para no hacer muy engorrosa la entrada, dejamos tan solo la parte del programa que varía de acuerdo al ejercicio propuesto, estando el mismo completo tanto en la carpeta descargable a través del link de arriba como en el link individual de cada ejercicio.


En C:
void main()
{
   while(1) {
      output_b (input_a()*2);
   }     
}

Elemental_03:
Por el Puerto B se obtiene el dato introducido por el Puerto A, pero los bits pares de la salida se fijan siempre a "1". El orden de los bits será "b7 b6 b5 b4 b3 b2 b1 b0", siendo los pares "b6 b4 b2 b0". Observar que:
  • Los bits pares están a "1", efectivamente: (Puerto B)= 'x1x1x1x1'.
  • Los impares permanecen con el dato del puerto de entrada.
En Assembler:
En C:
void main()
{
   while (1) {
      output_b ( input_a () | 0b01010101);
   }
}

Elemental_04:
Por el Puerto B se obtiene el contenido del Puerto A, pero los bits impares de la salida se fijan siempre a "0". El orden de los bits será "b7 b6 b5 b4 b3 b2 b1 b0", siendo los impares "b7 b5 b3 b1".
Observar que:
  •  Los bits impares están a "0", efectivamente: (Puerto B)= '0x0x0x0x'.
  •  Los pares permanecen con el dato del puerto de entrada.
En Assembler:

En C:
void main()
{
  while(1)  {
       output_b (input_a () & 0b01010101);
   }
}


Elemental_05:
Por el Puerto B se obtiene el dato del Puerto A invertidos los unos y los ceros.

En Assembler:
En C:
void main()
{
   while (1)   {
      output_b (~ input_a () );
   }
}

Elemental_06:
Por el Puerto B se obtiene el dato del Puerto A intercambiando los nibbles alto y bajo.

En Assembler:
En C:
void main()
{
   while (1)   {
      output_b ( swap(input_a () )); 
   }
}

Elemental_07:
Por el puerto B se obtiene el dato del Puerto A desplazando un bit hacia la izquierda, por la derecha entrará un "1".

En Assembler:

En C:
void main()
{
   while(1) {
      output_b (rotate_left (input_a() ));
   }
}

Elemental_08:
Por el Puerto B se saca el dato del puerta A desplazando un bit hacia la derecha, por la izquierda entrará un "0".

En Assembler:
En C:
void main()
{
   while(1) {
      output_b (rotate_right (input_a() ));
   }
}


Elemental_09:
Por el Puerto B se saca el dato del puerto A invirtiendo los bits pares. Los impares se dejan como en la entrada.

En Assembler:


En C:
void main()
{
   while (1) {
      output_b(input_a()^0b01010101);
   }
}

Elemental_10:
Por el Puerto B se obtiene el dato de las 5 líneas del Puerto A al que está conectado un array de interruptores. 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.

En Assembler:
En C:
void main()
{
   while (1) {
      output_b (input_a());
      sleep();
   }
} 

1 comentario:

  1. Muy buena la explicación de estas practicas y interesante la comparación entre lenguajes asembler y C Felicitaciones.

    ResponderEliminar