Mostrando entradas con la etiqueta actividad 2. Mostrar todas las entradas
Mostrando entradas con la etiqueta actividad 2. Mostrar todas las entradas

lunes, 14 de noviembre de 2011

Codigo En Simuproc (Introduccion A las tecnologias de la informacion)

Autor: Rodrigo Soto Parra
Competencia: Gestion en TI (Nivel 1)

Descripcion de la actividad

Recibirán por correo un ejerció que deben resolver con ensamblador de Simuproc este ejercicio es único para cada alumno y pose un archivo .asm base para realizar el mismo.
El presente problema consiste en realizar un codigo en ensamblador del Simuproc para calcular el promedio de una lista de numeros en memoria.

Descarga el archivo http://www.inf.uct.cl/~amellado/problemas/rsotop2011.asm . En ese archivo encontraras 2 direcciones de memoria dadas, la primera contiene la cantidad de numeros para realizar el calculo del promedio y la segunda posee la lista de numeros a promediar.

Se requiere entonces, resolver el problema usando el simulador de CPU Simuproc, indicando ademas el funcionamiento de los ciclos de reloj para las primeras 4 instrucciones del codigo propuesto.


Ejemplo:

#056   <- primera direccion de memoria
  110   ;cantidad de numeros a promediar

;numeros a promediar
#061  <- segunda direccion de memoria
    10
    100
    111
    101
    100
 +  10
 ---------
 11000 / 110 = 100 -> promedio = 4


La actividad sera evaluada, deben subir 2 archivos a la seccion de tareas del Educa Moodle. Un archivo que contenga la explicacion de los ciclos de reloj y el otro que contenga el archivo rsotop2011.asm con el codigo programado.

Introduccion

La siguiente actividad cumple la funcion de estar familiarizados con la maquina o CPU en lenguaje mas cercano al computador, Gracias al programa ensamblador simuproc que creamos un codigo simple y logramos ver los cilos de reloj que este produce.

Desarrollo.

#SimuProc 1.4.3.0
# AUTOR: Rodrigo Andres Soto Parra

      mov cx,047 ;cx toma el valor de 047

#001
      mov bx,020 ; bx toma el valor de 0120
      ldb 053    ; 053 se carga en ax mas bx
      add 018    ; suma ax el valor de 018
      sta 018    ; guarda el valor de ax en 018
      inc 020    ; incrementa en 1 el valor de 020
      mov bx,020 ; copia en bx el valor de 015
      loop 001   ; cx se decrementa y repite el ciclo
      div 047    ; divide ax por el valor de 047
      msg "El promedio es"
      eap
      hlt

#047
   1000   ;cantidad de numeros a promediar



;numeros a promediar
#052
   101
   111111
   110
   1100000
   110001
   1001111
   101
   100000

Ciclos De Reloj

1º 20

*Leo en pc la próxima dirección a ejecutar:000
*Envio al MAR la próxima dirección de mem a leer
*Llevo al MDR el contenido de dicha dirección de memoria
*Le entrego al ir el dato para que lo decodifique en incremento el pc
*Leo la POS 47 de memoria el valor a copiar en cx
*Escribo 1000 en cx

*Leo en pc la próxima dirección a ejecutar:001
*Envio al MAR la próxima dirección de mem a leer
*Llevo al mdr el contenido de dicha dirección de memoria
*Le entrego al ir el dato para que lo decoodifique en incremento el pc
 *Leo la pos 020 de memoria el valor a copiar en BX
*Escribo en BX

*Leo en PC la próxima dirección a ejecutar :002
*Envio al MAR la próxima dirección de mem a leer
*Llevo al MDR el contenido de dicha dirección de memoria
*Le entrego al IR el dato para que lo decodifique en incremento el PC
*LDB: 053 a esta dirección le sumo el valor de BX:0 posiciones
*Llevo la MDR el contenido de la dirección 053
*Cargo en AX el contenido de la dirección 111111

*Leo en PC la próxima dirección a ejecutar : 003
*Envio al MAR la próxima dirección de mem a leer
*Llevo al MDR el contenido de dicha dirección de memoria
*Le entrego al IR el dato para que lo decodifique en incremento el PC

Conclusion

En conclusion logramos familiarizarnos mas con el lenguaje de maquina con numeros binarios y ya estamos al nivel de simular una maquina virtual con simuproc. Gracias a la clase que tuvimos con el profesor Alejandro Mellado logramos completar los objetivos que se nos impusieron al principio de la actividad.

domingo, 9 de octubre de 2011

Robot Dribbler (Proyecto Robotica)

Autor: Rodrigo Andres Soto Parra
Competencias: Desarrollo de Software (Nivel 1).

Descripcion De la actividad

Contexto:
Usted es el encargado de construir un robot de competencia para el nuevo juego del verano “Dribbler”.
Reglas del juego:
  1. La idea de la competencia es que un robot autónomo encuentre la mayor cantidad de “zonas de puntaje” (círculo negro) en la pista, sin chocar con los obstáculos presentes (paredes, bloques, etc), ya que cuando pase esto, termina el juego.
  2. Cuando el robot vaya a chocar, el jugador debe indicarle que existe peligro de choque, a través de una señal audible (grito, pitazo, aplauso, etc), de modo que el robot no colisione.
  3. Cada vez que el robot encuentra una zona de puntaje (círculo negro), acumula puntos, pero también aumenta su velocidad.
  4. Gana el jugador que logre el mayor puntaje, antes de chocar con algún obstáculo.
Especificaciones:
  1. El robot debe iniciar su recorrido con una potencia de 20 e iniciar un timer en 0.
  2. Mientras el robot busca zonas de puntaje se emitirá constantemente una música ad-hoc.
  3. Cuando detecte una zona de puntaje (círculo negro), el robot:
  1. Emitirá una música de anotación de puntos
  2. Registrará el puntaje obtenido en la posición correspondiente dentro de un arreglo (array)
  3. Aumenta la potencia de movimiento en 10, hasta el máximo de 100.
  4. Girará aleatoriamente sobre su eje
  5. Reiniciará el timer a 0.
  6. Seguirá su rumbo con la nueva velocidad.
  7. Volverá a su música de recorrido.
  1. El puntaje obtenido por el robot, estará dado por la siguiente función:
                P  =  - 5*t + 50              si t <= 10
                
                P = 0                        si t > 10
                Donde:
                        P= Puntaje.
                        t = Intervalo de tiempo (en segundos) para encontrar la zona de puntaje.
 
  1. Si el robot detecta una señal audible de 80 db (ud. puede ajustarla) girará en un ángulo apropiado (uds. lo definen) de modo de esquivar un obstáculo, o bien corregir su recorrido.
  2. Cuando el robot choque contra algún obstáculo se detendrá, finalizará todas las tareas y mostrará en el visor cada uno de los puntajes guardados en el arreglo y la suma total de los mismos.


Inicio de la actividad
Introducción:
Luego de realizar un gran lista de actividades el primer semestre, logramos, ahora, entrar en un área de un nivel mas avanzado, en comparación a todas las anteriores. Algunas de las funciones nuevas que implementamos en este trabajo fueron: ExitTo, Precedes, Mutex, Acquire, Release. Luego de varias clases comenzamos a entender, en que situaciones aplicar lo aprendido, ya que si estas funciones eran ejecutadas de mala manera, podrían traer consecuencias para la realización del código. En el siguiente trabajo se plantea un problema y se busca con este, que nosotros apliquemos las funciones aprendidas de manera óptima, para que el código resulte mas limpio y solido al momento de su ejecución. La actividad consistía en una competencia, en donde el robot debe encontrar la mayor cantidad de puntaje (En la pista representado con puntos negros), sin chocar con los obstáculos puestos en la pista (Ya sean paredes o Bloques ubicados en posiciones estrategicas dentro de esta). En el caso de que el robot chocara con algún tipo de obstáculo, la actividad llegaría a su fin.

Objetivos
Al momento de iniciar esta actividad, para nosotros, lo principal era entregar el informe y tener nuestra nota, pero a medida que pasaron las clases nos dimos cuenta de que nuestros objetivos no eran solo esos, sino también el lograr sacar provecho de la actividad y aprender nuevas formas de trabajar, para así lograr un mejor rendimiento en todo ámbito, tanto en la universidad, como en la entrega de trabajos. Para esto nos planteamos objetivos antes de comenzar la actividad, los cuales fueron los siguientes:
● Lograr desarrollar una solución adecuada para la actividad
● Implementar nuevas sentencias aprendidas en clases como:
ExitTo(task)
Precedes(task1,task2,...)
Mutex
Acquire(mutex)
Release(mutex)
●
Cuando comenzamos la construcciòn del informe nos dimos cuenta de que los objetivos habían sido todo un éxito y que todos los integrantes del grupo tenían una buena manipulación de las funciones y que la solución propuesta para la actividad era la correcta.
Estrategia de trabajo
El planteamiento de la actividad hizo que nos organicemos como grupo de una forma en la cual todos aportaran de una forma pareja para lograr desarrollar una solución concreta. Es por esto que llegamos al acuerdo de que cada integrante debe participar en la formación del código, y una vez finalizado dividir las tareas, quedando de la siguiente manera.
Productor multimedia: realizada por dos integrantes del grupo quienes se encargarían de la grabación y toma de imágenes del desarrollo de la actividad.
Secretario y Staff de apoyo: Igual que el cargo anterior los dos restantes integrantes del grupo se encargarían de la formulación del presente informe y envió.
Jefe de Grupo: Eligió un integrante del grupo para que imponga el orden y representarà al grupo frente a los profesores, asiéndose totalmente responsable del grupo.
Diseño y uso de sensores
El diseño del robot fue algo simple de hacer por el tipo de actividad, ya que debía ser liviano y ágil para poder moverse. Es por este motivo el uso de las ruedas grandes, junto con esto la ubicación y utilización de los sensores era fundamental, ya q para tener el registro de los puntos negros de la mesa se necesitaba que el sensor de luz, el cual debía estar ubicado en la parte inferior apuntando hacia abajo. Además el segundo sensor que se utilizo en este segundo proyecto es el sensor de sonido, el cual se ubico en la parte superior para una buena recepción del sonido y en sentido opuesto a los motores para que estos no afecten el funcionamiento de este sensor.

Código Fuente:
//autor grupo terabytes
//viernes
#define UMBRAL 40
#define DECIBEL 90
int puntos[100];
int timer=0;
int TotalTiempo;
int t=0;
int i=0;
int potencia=20;
task Tono (){
while(true){
PlayToneEx(262,400,9,0); Wait(500);
PlayToneEx(294,400,9,0); Wait(500);
PlayToneEx(330,400,9,0); Wait(500);
PlayToneEx(294,400,9,0); Wait(500);
PlayToneEx(262,1600,9,0); Wait(2000);
}
}
task Choque () {
while(true) {
if(Sensor(IN_1)!=0){
Off(OUT_AB);
Wait(60000);
ExitTo(Tono);
}
OnFwd(OUT_AB,potencia);
if(Sensor(IN_3)>DECIBEL){
OnRev(OUT_AB,50);
Wait(500);
OnFwd(OUT_B,30);
Wait(570);
} } }
task Circulo (){
timer=CurrentTick();
while(true){
if(Sensor(IN_2)<UMBRAL){
i++;
t=CurrentTick();
t=(timer-t)/1000;
PlayTone(500,300);
Wait(1000);
if(t<=10){
puntos[i]=(-5*t)+50;
NumOut(5,5,puntos[i]);
}
else puntos[i]=puntos[i]+0;
Wait(100);
if(potencia<=100){
potencia=potencia+10;}
}
}
}
task main () {
Precedes(Choque,Tono,Circulo);
SetSensorLight(IN_2);
SetSensorSound(IN_3);
SetSensorTouch(IN_1);
}

Pseudo Código:
SubTarea Tono () {
Mientras(verdadero) {
TocaMelodia(262,400); Espera(0,5 seg);
TocaMelodia(294,400); Espera(0,5 seg);
TocaMelodia(330,400); Espera(0,5 seg);
TocaMelodia(294,400); Espera(0,5 seg);
TocaMelodia(262,1600); Espera(2seg);
}
}
SubTarea Choque(){
Mientras(verdadero) {
Si(SensorTacto!=0){
Salir de TONO;
Parar Motores;
Esperar(60Seg);
}
Avanzar(potencia= 20);
Si(SensorAudio>Decibel=90){
Retrocede(Potencia);
Espera(0,5Seg);
Gira 90º(Izquierda);
}
}
SubTarea Circulo(){
variable timer= Tiempo actual;
Mientras(verdadero){
Si(SensorLuz<Umbral 40){
Contador++;
Variable t= Tiempo actual;
t= (timer-t)/1000;
TocaMelodia(500,300);
Esperar(1Seg);

Si(t<=10){
Variable Puntos[100];
Puntos[i]=(-5*t)+50;
Imprime(posX 5,PosY 5,"puntos"puntos[i];
}
Si no {
Puntos[i]=Puntos[i]+0;
}
Espera(0,1Seg);
Si (potencia<=90){
Potencia=Potencia+10;
}
}
}
}

Link del vídeo:
Conclusion:
Al momento de comenzar a subir la actividad, nos dimos cuenta de que todo había resultado como lo esperamos; un manejo adecuado del código, un pseudocodigo bien estructurado, las funciones aprendidas y utilizadas de buena manera. El buen resultado apreciado por nosotros son fruto de una buen planteamiento del problema, organización y participación de todos los integrantes del grupo.
  La actividad constaba de una series de objetivos y desafíos, resultando está muy interesante de realizar, implementando el conocimiento de las nuevas sentencias aprendidas en clases como: ExitTo(task), Precedes(task1,task2,...), junto a otras presentadas en los objetivos.