Tarea1HectorLopezMontiel.docx

22
Tarea 1. Caracteristicas Basicas y sintaxis en procesadores y microcontroladores. Características Procesadores Intel Pentium Caracteriasticas Microcontroladores AVR de ATMEL Tecnología Intel® Turbo Boost Tecnología Intel® Hyper-Threading Tecnología de virtualización Intel® (VT- x) Tecnología de virtualización Intel® para E/S dirigida (VT-d) Tecnología Intel® Trusted Execution Nuevas instrucciones de AES Intel® Arquitectura Intel® 64 Estados de inactividad Tecnología Intel Speedstep® mejorada Conmutación según demanda Intel Tecnologías de monitoreo térmico El bit de desactivación de ejecución Información de caché Identificación de chipset Estado de interrupción mejorada Frecuencia prevista gigatransferencias por segundo (GT/s) Controlador de memoria integrado Intel® QuickPath Interconnect Tecnología Intel SpeedStep® mejorada Overclock Información sobre paquetes Guía de compatibilidad de plataforma Nombre de marca del procesador Familia de procesadores Modelo de procesador Número de procesador Revisión del procesador Versión del procesador Tipo de procesador Frecuencia informada Las Extensiones SIMD Bus de sistema overclocking Alto desempeño, baja potencia. * Arquitectura RISC avanzada: -120 instrucciones poderosas, la mayoría con ejecución de un solo ciclo de reloj. -32x8 registros de trabajo de propósito general. -operación totalmente estática. * Programa y Memoria de Datos no volátiles: -2/4/8 kbytes de Memoria Flash Programable en el sistema, con duración: 10000 ciclos de escritura/borrado. -128/256/512 bytes de EEPROM programable en el sistema, con duración: 100000 ciclos de escritura/borrado. -128/256/512 bytes de SRAM interna. -Cerrojo de programación para autoprogramar la Memoria Flash y Seguridad de Datos de EEPROM. * Características Periféricas: -Contador/Temporizador de 8 bits con Prescaler y dos canales PWM. -Contador/Temporizador de Alta Velocidad de 8 bits con Prescaler separado: ·Dos Salidas PWM de Alta Frecuencia con Registros de Comparación de Salida separados. ·Generador Programable de Tiempo Muerto. -Interfaz Serie Universal con Detector de Condición de Comienzo. -ADC de 10 bits: ·Cuatro Canales de Una Sola Salida. ·Dos Pares de Canales ADC Diferenciales con Ganancia Programable (1x, 20x). -Temporizador Programable de Vigilancia con Oscilador separado dentro del integrado. -Comparador Analógico dentro del integrado. * Características Especiales del Microcontrolador: -Sistema de Depuración debugWIRE dentro del integrado.

Transcript of Tarea1HectorLopezMontiel.docx

Tarea 1. Caracteristicas Basicas y sintaxis en procesadores y microcontroladores.

Características Procesadores Intel Pentium Caracteriasticas Microcontroladores AVR de ATMEL

Tecnología Intel® Turbo Boost Tecnología Intel® Hyper-Threading Tecnología de virtualización Intel® (VT-x) Tecnología de virtualización Intel® para E/S

dirigida (VT-d) Tecnología Intel® Trusted Execution Nuevas instrucciones de AES Intel® Arquitectura Intel® 64 Estados de inactividad Tecnología Intel Speedstep® mejorada Conmutación según demanda Intel Tecnologías de monitoreo térmico El bit de desactivación de ejecución Información de caché Identificación de chipset Estado de interrupción mejorada Frecuencia prevista gigatransferencias por segundo (GT/s) Controlador de memoria integrado Intel® QuickPath Interconnect Tecnología Intel SpeedStep® mejorada Overclock Información sobre paquetes Guía de compatibilidad de plataforma Nombre de marca del procesador Familia de procesadores Modelo de procesador Número de procesador Revisión del procesador Versión del procesador Tipo de procesador Frecuencia informada Las Extensiones SIMD Bus de sistema overclocking

Alto desempeño, baja potencia.* Arquitectura RISC avanzada:-120 instrucciones poderosas, la mayoría con ejecución de un solo ciclo de reloj.-32x8 registros de trabajo de propósito general.-operación totalmente estática.* Programa y Memoria de Datos no volátiles:-2/4/8 kbytes de Memoria Flash Programable en el sistema, con duración: 10000 ciclos de escritura/borrado.-128/256/512 bytes de EEPROM programable en el sistema, con duración: 100000 ciclos de escritura/borrado.-128/256/512 bytes de SRAM interna.-Cerrojo de programación para autoprogramar la Memoria Flash y Seguridad de Datos de EEPROM.* Características Periféricas:-Contador/Temporizador de 8 bits con Prescaler y dos canales PWM.-Contador/Temporizador de Alta Velocidad de 8 bits con Prescaler separado:·Dos Salidas PWM de Alta Frecuencia con Registros de Comparación de Salida separados.·Generador Programable de Tiempo Muerto.-Interfaz Serie Universal con Detector de Condición de Comienzo.-ADC de 10 bits:·Cuatro Canales de Una Sola Salida.·Dos Pares de Canales ADC Diferenciales con Ganancia Programable (1x, 20x).-Temporizador Programable de Vigilancia con Oscilador separado dentro del integrado.-Comparador Analógico dentro del integrado.* Características Especiales del Microcontrolador:-Sistema de Depuración debugWIRE dentro del integrado.-Programable dentro del Sistema a través del Puerto SPI.-Fuentes de Interrupción Externas e Internas.-Modos de Descanso en Baja Potencia, de Reducción de Ruido de ADC, y de Reducción de Potencia.-Circuito Mejorado de Reinicialización de Encendido.-Circuito Programable de Detección de Brown-out (estado en que la tensión es entre un 8 y un 12% inferior al valor típico) .-Oscilador Calibrado interno.

Sintaxis del lenguaje ensamblador procesador Intel Pentium.

Proceso de creación de un programaPara la creación de un programa es necesario seguir cinco pasos: diseño del algoritmo, codificación del mismo, su traducción a lenguaje máquina, la prueba del programa y la depuración. La etapa de diseño se plantea el problema a resolver y se propone la mejor solución, creando diagramas esquemáticos utilizados para el mejor planteamiento de la solución. La codificación del programa consiste en escribir el programa en algún lenguaje de programación; en este caso específico en ensamblador, tomando como base la solución propuesta en el paso anterior. La traducción al lenguaje máquina es la creación del programa objeto, esto es, el programa escrito como una secuencia de ceros y unos que pueda ser interpretado por el procesador. La prueba del programa consiste en verificar que el programa funcione sin errores, o sea, que haga lo que tiene que hacer. La última etapa es la eliminación de las fallas detectadas en el programa durante la fase de prueba. La corrección de una falla normalmente requiere la repetición de los pasos comenzando desde el primero o el segundo. Para crear un programa en ensamblador existen dos opciones, la primera es utilizar el MASM (Macro Assembler, de Microsoft), y la segunda es utilizar el debugger, en esta primera sección utilizaremos este último ya que se encuentra en cualquier PC con el sistema operativo MS-DOS, lo cual lo pone al alcance de cualquier usuario que tenga acceso a una máquina con estas características. Debug solo puede crear archivos con extensión .COM, y por las características de este tipo de programas no pueden ser mayores de 64 kb, además deben comenzar en el desplazamiento, offset, o dirección de memoria 0100H dentro del segmento específico.

Registros de la UCPComo lo mencionamos en el capitulo 4 la UCP tiene 14 registros internos, cada uno de 16 bits. Los primeros cuatro, AX, BX, CX, y DX son registros de uso general y también pueden ser utilizados como registros de 8 bits, para utilizarlos como tales es necesario referirse a ellos como por ejemplo: AH y AL, que son los bytes alto (high) y bajo (low) del registro AX. Esta nomenclatura es aplicable también a los registros BX, CX y DX. Es posible visualizar los valores de los registros internos de la UCP utilizando el programa Debug. Para empezar a trabajar con Debug digite en el prompt de la computadora: C:\> Debug [Enter] En la siguiente línea aparecerá un guión, éste es el indicador del Debug, en éste momento se pueden introducir las instrucciones del Debug. Utilizando el comando: - r [Enter] Se desplegaran todos los contenidos de los registros internos de la UCP; una forma alternativa de mostrarlos es usar el comando "r" utilizando como parámetro el nombre del registro cuyo valor se quiera visualizar. Por ejemplo: - rbx Esta instrucción desplegará únicamente el contenido del registro BX y cambia el indicador del Debug de " - " a " : " Estando así el prompt es posible cambiar el valor del registro que se visualizo tecleando el nuevo valor y a continuación [Enter], o se puede dejar el valor anterior presionando [Enter] sin teclear ningún valor. Es posible cambiar el valor del registro de banderas, así como utilizarlo como estructura de control en nuestros programas como se verá más adelante. Cada bit del registro tiene un nombre y significado especial, la lista dada a continuación describe el valor de cada bit, tanto apagado como prendido y su relación con las operaciones del procesador:

Overflow  

NV = no hay desbordamiento; OV = sí lo hay

Direction  

DI = desactivadas; EI = activadas

Sign

  PL = positivo; NG = negativo

Zero  

NZ = no es cero; ZR = si lo es

Auxiliary Carry  

NA = no hay acarreo auxiliar; AC = hay acarreo auxiliar

Parity  

PO = paridad non; PE = paridad par;

Carry  

NC = no hay acarreo; CY = si lo hay

La estructura del ensambladorEn el lenguaje ensamblador las líneas de código constan de dos partes, la primera es el nombre de la instrucción que se va a ejecutar y la segunda son los parámetros del comando u operandos. Por ejemplo: add ah bh Aquí "add" es el comando a ejecutar (en éste caso una adición) y tanto "ah" como "bh" son los parámetros. El nombre de las instrucciones en éste lenguaje está formado por dos, tres o cuatro letras. A estas instrucciones también se les llama nombres mnemónicos o códigos de operación, ya que representan alguna función que habrá  de realizar el procesador. Existen algunos comandos que no requieren parámetros para su operación, así como otros que requieren solo un parámetro. Algunas veces se utilizaran las instrucciones como sigue: add al,[170] Los corchetes en el segundo parámetro nos indican que vamos a trabajar con el contenido de la casilla de memoria número 170 y no con el valor 170, a esto se le conoce como direccionamiento directo.

Nuestro primer programaVamos a crear un programa que sirva para ilustrar lo que hemos estado viendo, lo que haremos será una suma de dos valores que introduciremos directamente en el programa: El primer paso es iniciar el Debug, éste paso consiste únicamente en teclear debug [Enter] en el prompt del sistema operativo. Para ensamblar un programa en el Debug se utiliza el comando "a" (assemble); cuando se utiliza éste comando se le puede dar como parámetro la dirección donde se desea que se inicie el ensamblado. Si se omite el parámetro el ensamblado se iniciará en la localidad especificada por CS:IP, usualmente 0100H, que es la localidad donde deben iniciar los programas con extensión .COM, y será la localidad que utilizaremos debido a que debug solo puede crear éste tipo específico de programas. Aunque en éste momento no es necesario darle un parámetro al comando "a" es recomendable hacerlo para evitar problemas una vez que se haga uso de los registros CS:IP, por lo tanto tecleamos: - a0100 [Enter] Al hacer esto aparecerá en la pantalla algo como: 0C1B:0100 y el cursor se posiciona a la derecha de éstos números, nótese que los primeros cuatro dígitos (en sistema hexagesimal) pueden ser diferentes, pero los últimos cuatro deben ser 0100, ya que es la dirección que indicamos como inicio. Ahora podemos introducir las instrucciones: 0C1B:0100 mov ax,0002; coloca el valor 0002 en el registro ax 0C1B:0103 mov bx,0004; coloca el valor 0004 en el registro bx 0C1B:0106 add ax,bx ;le adiciona al contenido de ax el contenido de bx 0C1B:0108 int 20 ; provoca la terminación del programa. 0C1B:010A No es necesario escribir los comentarios que van después del ";". Una vez digitado el último comando, int 20, se le da [Enter] sin escribir nada mas, para volver al prompt del debuger.

La última línea escrita no es propiamente una instrucción de ensamblador, es una llamada a una interrupción del sistema operativo, estas interrupciones ser n tratadas más a fondo en un capítulo posterior, por el momento solo es necesario saber que nos ahorran un gran número de líneas y son muy útiles para accesar a funciones del sistema operativo. Para ejecutar el programa que escribimos se utiliza el comando "g", al utilizarlo veremos que aparece un mensaje que dice: "Program terminated normally". Naturalmente con un mensaje como éste no podemos estar seguros que el programa haya hecho la suma, pero existe una forma sencilla de verificarlo, utilizando el comando "r" del Debug podemos ver los contenidos de todos los registros del procesador, simplemente teclee: - r [Enter] Aparecerá en pantalla cada registro con su respectivo valor actual: AX=0006BX=0004CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000 DS=0C1BES=0C1BSS=0C1BCS=0C1BIP=010A NV UP EI PL NZ NA PO NC 0C1B:010A 0F DB oF Existe la posibilidad de que los registros contengan valores diferentes, pero AX y BX deben ser los mismos, ya que son los que acabamos de modificar. Otra forma de ver los valores, mientras se ejecuta el programa es utilizando como parámetro para "g" la dirección donde queremos que termine la ejecución y muestre los valores de los registros, en éste caso sería: g108, esta instrucción ejecuta el programa, se detiene en la dirección 108 y muestra los contenidos de los registros. También se puede llevar un seguimiento de lo que pasa en los registros utilizando el comando "t" (trace), la función de éste comando es ejecutar línea por línea lo que se ensambla— mostrando cada vez los contenidos de los registros. Para salir del Debug se utiliza el comando "q" (quit).

Guardar y cargar programasNo sería práctico tener que digitar todo un programa cada vez que se necesite, para evitar eso es posible guardar un programa en el disco, con la enorme ventaja de que ya ensamblado no ser  necesario correr de nuevo debug para ejecutarlo. Los pasos a seguir para guardar un programa ya almacenado en la memoria son: Obtener la longitud del programa restando la dirección final de la dirección inicial, naturalmente en sistema hexadecimal. Darle un nombre al programa y extensión Poner la longitud del programa en el registro CX Ordenar a Debug que escriba el programa en el disco. Utilizando como ejemplo el programa del capítulo anterior tendremos una idea más clara de como llevar éstos pasos: Al terminar de ensamblar el programa se vería así: 0C1B:0100 mov ax,0002 0C1B:0103 mov bx,0004 0C1B:0106 add ax,bx 0C1B:0108 int 20 0C1B:010A - h 10a 100 020a 000a - n prueba.com - rcx CX 0000 :000a -w Writing 000A bytes Para obtener la longitud de un programa se utiliza el comando "h", el cual nos muestra la suma y resta de dos números en hexadecimal. Para obtener la longitud del nuestro le proporcionamos como parámetros el valor de la dirección final de nuestro programa (10A) y el valor de la dirección inicial (100). El primer resultado que nos muestra el comando es la suma de los parámetros y el segundo es la resta. El comando "n" nos permite poner un nombre al programa.

El comando "rcx" nos permite cambiar el contenido del registro CX al valor que obtuvimos del tamaño del archivo con "h", en éste caso 000a, ya que nos interesa el resultado de la resta de la dirección inicial a la dirección final. Por último el comando w escribe nuestro programa en el disco, indicándonos cuantos bytes escribió. Para cargar un archivo ya guardado son necesarios dos pasos: Proporcionar el nombre del archivo que se cargará. Cargarlo utilizando el comando "l" (load). Para obtener el resultado correcto de los siguientes pasos es necesario que previamente se haya creado el programa anterior. Dentro del Debug escribimos lo siguiente: - n prueba.com - l - u 100 109 0C3D:0100 B80200 MOV AX,0002 0C3D:0103 BB0400 MOV BX,0004 0C3D:0106 01D8 ADD AX,BX 0C3D:0108 CD20 INT 20 El último comando, "u", se utiliza para verificar que el programa se carga— en memoria, lo que hace es desensamblar el código y mostrarlo ya desensamblado. Los parámetros le indican a Debug desde donde y hasta donde desensamblar. Debug siempre carga los programas en memoria en la dirección 100H, a menos que se le indique alguna otra. Condiciones, ciclos y bifurcacionesEstas estructuras, o formas de control le dan a la máquina un cierto grado de decisión basado en la información que recibe. La forma más sencilla de comprender éste tema es por medio de ejemplos. Vamos a crear tres programas que hagan lo mismo: desplegar un número determinado de veces una cadena de caracteres en la pantalla. - a100 0C1B:0100 jmp 125 ; brinca a la dirección 125H 0C1B:0102 [Enter] - e 102 'Cadena a visualizar 15 veces si 0d 0a '$' - a125 0C1B:0125 MOV CX,000F ; veces que se desplegará la cadena 0C1B:0128 MOV DX,0102 ; copia cadena al registro DX 0C1B:012B MOV AH,09 ; copia valor 09 al registro AH 0C1B:012D INT 21 ; despliega cadena 0C1B:012F LOOP 012D ; si CX>0 brinca a 012D 0C1B:0131 INT 20 ; termina el programa. Por medio del comando "e" es posible introducir una cadena de caracteres en una determinada localidad de memoria, dada como parámetro, la cadena se introduce entre comillas, le sigue un espacio, luego el valor hexadecimal del retorno de carro, un espacio, el valor de línea nueva y por último el símbolo '$' que el ensamblador interpreta como final de la cadena. La interrupción 21 utiliza el valor almacenado en el registro AH para ejecutar una determinada función, en éste caso mostrar la cadena en pantalla, la cadena que muestra es la que está almacenada en el registro DX. La instrucción LOOP decrementa automáticamente el registro CX en uno y si no ha llegado el valor de éste registro a cero brinca a la casilla indicada como parámetro, lo cual crea un ciclo que se repite el número de veces especificado por el valor de CX. La interrupción 20 termina la ejecución del programa. Otra forma de realizar la misma función pero sin utilizar el comando LOOP es la siguiente: - a100 0C1B:0100 jmp 125 ; brinca a la dirección 125H 0C1B:0102 [Enter] - e 102 'Cadena a visualizar 15 veces si 0d 0a '$' - a125 0C1B:0125 MOV BX,000F ; veces que se desplegará la cadena

0C1B:0128 MOV DX,0102 ; copia cadena al registro DX 0C1B:012B MOV AH,09 ; copia valor 09 al registro AH 0C1B:012D INT 21 ; despliega cadena 0C1B:012F DEC BX ; decrementa en 1 a BX 0C1B:0130 JNZ 012D ; si BX es diferente a 0 brinca a 012D 0C1B:0132 INT 20 ; termina el programa. En éste caso se utiliza el registro BX como contador para el programa, y por medio de la instrucción "DEC" se disminuye su valor en 1. La instrucción "JNZ" verifica si el valor de B es diferente a 0, esto con base en la bandera NZ, en caso afirmativo brinca hacia la dirección 012D. En caso contrario continua la ejecución normal del programa y por lo tanto se termina. Una ultima variante del programa es utilizando de nuevo a CX como contador, pero en lugar de utilizar LOOP utilizaremos decrementos a CX y comparación de CX a 0. - a100 0C1B:0100 jmp 125 ; brinca a la dirección 125H 0C1B:0102 [Enter] - e 102 'Cadena a visualizar 15 veces 0d 0a '$' - a125 0C1B:0125 MOV DX,0102 ; copia cadena al registro DX 0C1B:0128 MOV CX,000F ; veces que se desplegará la cadena 0C1B:012B MOV AH,09 ; copia valor 09 al registro AH 0C1B:012D INT 21 ; despliega cadena 0C1B:012F DEC CX ; decrementa en 1 a CX 0C1B:0130 JCXZ 0134 ; si CX es igual a 0 brinca a 0134 0C1B:0132 JMP 012D ; brinca a la dirección 012D 0C1B:0134 INT 20 ; termina el programa En éste ejemplo se usa la instrucción JCXZ para controlar la condición de salto, el significado de tal función es: brinca si CX=0 El tipo de control a utilizar dependerá de las necesidades de programación en determinado momento. Instrucciones para ciclos El lenguaje ensamblador cuenta con una instrucción muy poderosa que permite la programación de ciclos finitos, la instrucción LOOP. Esta instrucción trabaja en forma conjunta con el registro contador CX. El formato general de esta instrucción es:Mov CX,No_VecesEtiqueta:-------Loop EtiquetaLa instrucción LOOP ejecuta las instrucciones que se encuentran entre la Etiqueta: y Loop Etiqueta el número de veces que indique el campo No_Veces.Por ejemplo, el siguiente grupo de instrucciones incrementa en 1 el registro AX, esto lo repite 10 veces.Mov CX,10 ;10 vecesOtro:Inc AX ; AX=AX+1Loop OtroLa instrucción Loop decrementa el registro CX en cada iteración y se detiene cuando CX es igual a cero.El siguiente programa da un ejemplo más ilustrativo:.COMMENT*Programa: Loop.ASM Descripción: Este programa calcula la sucesión de Fibonacci para los 10 primeros términos de la serie, utilizando para ello unciclo controlado por la instrucción Loop.La sucesión está formada por números, de modo tal que cada número es la suma de los dos anteriores-

Ejemplo:1,1,2,3,5,8,13,21,34,55....*.MODEL tiny.CODEInicio: ;Punto de entrada al programaMov AX,0 ;AX=0Mov BX,1 ;BX=1 Estos son los dos primeros elementos 0+1=1Mov CX,10 ;Repetir 10 vecesRepite:Mov DX,AX ;DX=AXAdd DX,BX ;DX=AX+BXMov AX,BX ;Avanzar AXMov BX,DX ;Avanzar BXLoop Repite ;siguiente númeroMov AX,4C00h ;Terminar programa y salir al DOSInt 21h ;END InicioEND Interrupciones Una interrupción es una instrucción que detiene la ejecución de un programa para permitir el uso de la UCP a un proceso prioritario. Una vez concluido éste último proceso se devuelve el control a la aplicación anterior. Una interrupción es un estado en el cual el microprocesador detiene la ejecución de un programa para atender una petición especial solicitada por el propio programa o por un dispositivo físico conectado al microprocesador externamente. Las interrupciones fueron creadas para facilitar al programador el acceso a los diferentes dispositivos de la computadora (puertos de comunicaciones, terminales, impresoras, etc.).Por ejemplo, cuando estamos trabajando con un procesador de palabras y en ese momento llega un aviso de uno de los puertos de comunicaciones, se detiene temporalmente la aplicación que estábamos utilizando para permitir el uso del procesador al manejo de la información que está llegando en ese momento. Una vez terminada la transferencia de información se reanudan las funciones normales del procesador de palabras. A continuación se muestra un ejemplo utilizando la interrupción para mostrar información en pantalla: Utilizando Debug tecleamos: - a100 2C1B:0100 JMP 011D 2C1B:0102 [ENTER] - E 102 'Hola, como estas.' 0D 0A '$' - A011D 2C1B:011D MOV DX,0102 2C1B:0120 MOV AH,09 2C1B:0122 INT 21 2C1B:0123 INT 20 En éste programa la interrupción 21H manda al monitor la cadena localizada en la dirección a la que apunta el registro DX. El valor que se le da a AH determina cual de las opciones de la interrupción 21H será utilizada, ya que esta interrupción cuenta con varias opciones. En lo directo de interrupciones es una de las partes más fuertes del lenguaje ensamblador, ya que con ellas es posible controlar eficientemente todos los dispositivos internos y externos de una computadora gracias al completo control que se tiene sobre operaciones de entrada y salida.

Ejecución de una interrupciónCuando durante la ejecución de un programa se produce una interrupción, el microprocesador realiza los siguientes pasos:1.- Detiene la ejecución del programa2.- Almacena los registros CS, IP y Banderas en la pila3.- Modifica el CS y el IP para que apunten a la dirección donde se encuentra la rutina de interrupción.4.- Ejecuta las instrucciones de la rutina de interrupción.5.- Restablece usando la instrucción RETI los valores originales de los registros CS, IP y Banderas.6.- Continua con la ejecución del programa en el punto donde fue interrumpido.Las rutinas se almacenan en la memoria de la computadora cada vez que ésta es inicializada, a esto se le conoce como vector de interrupciones.Tipos de interrupcionesEl microprocesador puede atender dos tipos de interrupciones: interrupciones por software e interrupciones por hardware. Las interrupciones por software son llamadas desde los programas y son proporcionadas por el sistema operativo (MS-DOS). Existen dos tipos de estas: las interrupciones del DOS y las interrupciones del BIOS (Basic Input Output System o Sistema Básico de Entrada/Salida). Estas interrupciones son invocadas con la instrucción INT del ensamblador. Por otro lado, las interrupciones por Hardware son proporcionadas por el propio microprocesador y también existen dos tipos: interrupciones por hardware internas y las interrupciones por hardware externas. Las interrupciones internas son invocadas por el microprocesador cuando se produce alguna operación incorrecta, como por ejemplo, un intento de dividir por cero o una transferencia de datos entre registros de diferentes longitudes.Las interrupciones externas son provocadas por los dispositivos periféricos conectados al microprocesador. Para lograr esto, a cada dispositivo periférico se le asigna una línea física de interrupción que lo comunica con el microprocesador por medio de un circuito integrado auxiliar, el cual se conoce como controlador programable de interrupciones (PIC). Las computadoras basadas en el microprocesador 8086/8088 cuentan solamente con un PIC, con lo cual pueden proporcionar hasta 8 líneas de interrupción (IRQ), las cuales son llamadas IRQ0 a IRQ7, por otro lado, las computadoras basadas en el microprocesador 80286 y posteriores cuentan con dos chips controladores, con los cuales pueden proporcionar hasta un máximo de 16 líneas IRQ, las cuales son llamadas IRQ0 a IRQ15.La siguiente es una lista de las interrupciones por software disponibles por el sistema operativo.Interrupciones del BIOSManejo de dispositivos periféricos

INT 10H Manejo de la pantalla. INT 13H Manejo de unidades de disco. INT 14H Manejo de los puertos de comunicaciones(RS232). INT 15H Manejo de cinta magnética. INT 16H Manejo del teclado. INT 17H Manejo de la impresora.

Manejo del estado del equipo INT 11H Servicios de la lista de elementos de la computadora. INT 12H Servicios para el cálculo del tamaño de la memoria.

Servicios de fecha y hora INT 1AH Manejo del reloj.

Impresión de pantalla INT 5H Impresión de la información contenida en la pantalla.

Servicios especiales

INT 18H Activación del lenguaje Interprete Basic de la ROM. INT 19H Activación de la rutina de arranque de la computadora.

Interrupciones del DOS INT 20H Termina la ejecución de un programa. INT 22H Dirección de terminación. Guarda la dirección donde se transfiere el control

cuando termina la ejecución del programa. INT 23H Dirección de la interrupción que se ejecuta cuando se presiona Ctrl-Break. INT 24H Manejo de errores críticos. INT 25H Lectura directa de sectores del disco. INT 26H Escritura directa de sectores del disco. INT 27H Terminar un programa y devolver el control al DOS sin borrar el programa de la

memoria. INT 21H Esta interrupción proporciona una gran cantidad de funciones, las cuales deben

ser invocadas en conjunto con el registro AH. 1. Terminación de un programa. 2. Entrada de carácter con eco. 3. Salida a pantalla. 4. Entrada por el puerto serie. 5. Salida por el puerto serie. 6. Salida a la impresora. 7. E/S directa por pantalla. 8. Entrada directa de carácter sin eco. 9. Entrada de carácter sin eco. 10. Visualizar cadenas de caracteres. 11. Entrada desde el teclado. 12. Comprobación del estado de entrada. 13. Borrar registro de entrada. 14. Inicializar unidad de disco.

A continuación se mostrarán algunos programas que utilizan llamadas a diferentes interrupciones por software tanto del BIOS como del DOS. El siguiente programa utiliza la función 09h de la interrupción 21 del DOS para mostrar en la pantalla un mensaje..COMMENT*Programa: ejem.ASM Descripción: Imprime una cadena de caracteres en la pantalla por medio de la función 09h de la interrupción 21h del DOS.*.MODEL tiny.DATAMensaje db 'Interrupciones 21h del DOS',13,10,'$'.CODEInicio:Lea DX,MensajeMov Ah,09hInt 21hMov ax,4C00hInt 21hEND InicioENDEl siguiente programa exhibe dos cadenas de caracteres en la pantalla, pero a diferencia del anterior éste no regresa al DOS inmediatamente, espera a que cualquier tecla sea presionada y entonces termina, para ello se utiliza la función 10h de la interrupción 16h del BIOS.

.COMMENT*Programa: ejem1.ASM Descripción: Imprime dos cadenas de caracteres en la pantalla por medio de la función 09h de la interrupción 21h del DOS y después espera a que una tecla sea presionada, esto por medio de la interrupción 16h del BIOS con la función 10h.*.MODEL tiny.DATAMensaje db 'Mas interrupciones',13,10,'$'Mensaje2 db 'Presione cualquier tecla...',13,10,'$'.CODEInicio:Lea DX,MensajeMov Ah,09hInt 21hLea DX,Mensaje2Mov Ah,09hInt 21hMov Ah,10hInt 16hMov ax,4C00hInt 21hEND InicioENDComo último ejemplo de esta sección, se mostrará un programa que utiliza otra función del BIOS, pero esta vez para posicionar el cursor en diferentes coordenadas de la pantalla, esto con el fin de tener mejor control sobre el lugar en el que los mensajes son visualizados..COMMENT*Programa: ejem3.ASM

Descripción: Imprime dos cadenas de caracteres en la pantalla, controlando su posición por medio de la función 02h de la Int 10h del BIOS.*.MODEL tiny.DATAMensaje db 'Mas interrupciones',13,10,'$'Mensaje2 db 'Presione cualquier tecla...','$'.CODEInicio:Mov Bh,0 ;Pagina de video 0Mov dl,30 ;X=30Mov dh,5 ;Y=5Mov Ah,02h ;Posicionar cursorInt 10h ;Lea DX,Mensaje ;Mov Ah,09h ;Imprime Mensaje

Int 21h ;Mov Bh,0 ;Pagina de videoMov dl,40 ;X=40Mov dh,24 ;Y=24Mov Ah,02h ;Colocar cursorInt 10h ;Lea DX,Mensaje2 ;Mov Ah,09h ;Imprimir Mensaje2Int 21h ;Mov Ah,10h ;Esperar teclaInt 16h ;Mov ax,4C00h ;Terminar programa y salir al DOSInt 21h ;END InicioEND.

Sintaxis del lenguaje ensamblador Microprocesador AVR de ATMEL

Lenguaje de programación Arduino

La plataforma Arduino se programa mediante el uso de un lenguaje propio basado en el

lenguaje de programación de alto nivel Processing. Sin embargo, es posible utilizar otros

lenguajes de programación y aplicaciones populares en Arduino,21 debido a que Arduino usa la

transmisión serial de datos soportada por la mayoría de los lenguajes mencionados. Para los

que no soportan el formato serie de forma nativa, es posible utilizar software intermediario que

traduzca los mensajes enviados por ambas partes para permitir una comunicación fluida.

Algunos ejemplos son:

3DVIA Virtools: aplicaciones interactivas y de tiempo real.

Adobe Director

BlitzMax (con acceso restringido)

C

C++ (mediante libSerial o en Windows)

C#

Cocoa/Objective-C (para Mac OS X)

Flash (mediante ActionScript)

Gambas

Isadora (Interactividad audiovisual en tiempo real)

Instant Reality (X3D)

Java

Liberlab (software de medición y experimentación)

Mathematica

Matlab

Hector Montiel, 11/05/14,

MaxMSP: Entorno gráfico de programación para aplicaciones musicales, de audio y

multimedia

Minibloq: Entorno gráfico de programación, corre también en las computadoras OLPC

Perl

Php

Physical Etoys: Entorno gráfico de programación usado para proyectos de robótica

educativa

Processing

Pure Data

Python

Ruby

Scratch for Arduino (S4A): Entorno gráfico de programación, modificación del entorno para

niños Scratch, del MIT)

Squeak: Implementación libre de Smalltalk

SuperCollider: Síntesis de audio en tiempo real

VBScript

Visual Basic .NET

VVVV: Síntesis de vídeo en tiempo real

Funciones básicas y operadores

Arduino está basado en C y soporta todas las funciones del estándar C y algunas de C++.22 A

continuación se muestra un resumen con la estructura y sintaxis del lenguaje Arduino:

Sintaxis Básica

Delimitadores:;, {}

Comentarios: //, /* */

Cabeceras: #define, #include

Operadores aritméticos: +, -, *, /, %

Asignación: =

Operadores de comparación: ==, !=, <, >, <=, >=

Operadores Booleanos: &&, ||, !

Operadores de acceso a punteros: *, &

Operadores de bits: &, |, ^, ~, <<, >>

Operadores compuestos:

Incremento y decremento de variables: ++, --

Asignación y operación: +=, -=, *=, /=, &=, |=

Condicionales: if, if...else, switch case

Bucles: for, while, do... while

Bifurcaciones y saltos: break, continue, return, goto

Variables

En cuanto al tratamiento de las variables también comparte un gran parecido con el lenguaje

C.

Constantes

HIGH/LOW: representan los niveles alto y bajo de las señales de entrada y salida. Los

niveles altos son aquellos de 3 voltios o más.

INPUT/OUTPUT: entrada o salida.

false (falso): Señal que representa al cero lógico. A diferencia de las señales HIGH/LOW, su

nombre se escribe en letra minúscula.

true (verdadero): Señal cuya definición es más amplia que la de false. Cualquier número

entero diferente de cero es "verdadero", según el álgebra de Boole, como en el caso de -

200, -1 o 1. Si es cero, es "falso".

Tipos de datos

void, boolean, char, unsigned char, byte, int, unsigned int, word, long, unsigned long, float,

double, string, array.

Conversión entre tipos

Estas funciones reciben como argumento una variable de cualquier tipo y devuelven una

variable convertida en el tipo deseado.

char(), byte(), int(), word(), long(), float()

Cualificadores y ámbito de las variables[editar]

static, volatile, const

Utilidades

sizeof()

Funciones Básicas

E/S Digital

pinMode(pin, modo)

digitalWrite(pin, valor)

int digitalRead(pin)

E/S Analógica

analogReference(tipo)

int analogRead(pin)

analogWrite(pin, valor)

E/S Avanzada

shiftOut(dataPin, clockPin, bitOrder, valor)

unsigned long pulseIn(pin, valor)

Tiempo

unsigned long millis()

unsigned long micros()

delay(ms)

delayMicroseconds(microsegundos)

Matemáticas

min(x, y), max(x, y), abs(x), constrain(x, a, b), map(valor, fromLow, fromHigh, toLow,

toHigh), pow(base, exponente), sqrt(x)

Trigonometría

sin(rad), cos(rad), tan(rad)

Números aleatorios

randomSeed(semilla), long random(máx), long random(mín, máx)

Bits y Bytes

lowByte(), highByte(), bitRead(), bitWrite(), bitSet(), bitClear(), bit()

Interrupciones externas

attachInterrupt(interrupción, función, modo)

detachInterrupt(interrupción)

Interrupciones

interrupts(), noInterrupts()

Comunicación por puerto serie

Las funciones de manejo del puerto serie deben ir precedidas de la palabra "Serial" aunque no

necesitan ninguna declaración en la cabecera del programa. Por esto se consideran funciones

base del lenguaje.23 Estas son las funciones para transmisión serial:

begin(), available(), read(), flush(), print(), println(), write()

Manipulación de puertos

Los registros de puertos permiten la manipulación a más bajo nivel y de forma más rápida de

los contactos de entrada/salida del microcontrolador de las placas Arduino.24 Los contactos

eléctricos de las placas Arduino están repartidos entre los registros B(0-7), C (analógicos) y

D(8-13). Mediante estas variables ser observado y modificado su estado:

DDR[B/C/D]: Data Direction Register (o dirección del registro de datos) del puerto B, C ó D.

Es una variable de Lectura/Escritura que sirve para especificar cuales contactos serán

usados como entrada y salida.

PORT[B/C/D]: Data Register (o registro de datos) del puerto B, C ó D. Es una variable de

Lectura/Escritura.

PIN[B/C/D]: Input Pins Register (o registro de pines de entrada) del puerto B, C ó D. Variable

de sólo lectura.

Por ejemplo, para especificar los contactos 9 a 13 como salidas y el 8 como entrada (puesto

que el puerto D usa los pines de la placa Arduino 8 al 13 digitales) bastaría utilizar la siguiente

asignación:

DDRD = B11111110;

Como se ha podido comprobar, el conocimiento del lenguaje C, permite la programación en

Arduino debido a la similitud entre éste y el lenguaje nativo del proyecto, lo que implica el

aprendizaje de algunas funciones específicas de que dispone el lenguaje del proyecto para

manejar los diferentes parámetros. Se pueden construir aplicaciones de cierta complejidad sin

necesidad de muchos conceptos previos. Los programas compilados con Arduino (salvo en las

placas con CorteX M3) se enlazan contra AVR Libc22 por lo que tienen acceso a algunas de sus

funciones. AVR Libc es un proyecto de software libre con el objetivo de proporcionar

una biblioteca C de alta calidad para utilizarse con el compilador GCC sobre microcontroladores

Atmel AVR. Se compone de 3 partes:

avr-binutils

avr-gcc

avr-libc

La mayoría del lenguaje de programación Arduino está escrita con constantes y funciones de

AVR y ciertas funcionalidades sólo se pueden obtener haciendo uso de AVR.25

Interrupciones

Las señales de interrupción son las siguientes:

cli(): desactiva las interrupciones globales

sei(): activa las interrupciones

Esto afectará al temporizador y a la comunicación serial. La función delayMicroseconds()

desactiva las interrupciones cuando se ejecuta.

Temporizadores

La función delayMicroseconds() crea el menor retardo posible del lenguaje Arduino que ronda

los 2μs. Para retardos más pequeños se debe utilizar la llamada de ensamblador 'nop' (no

operación). Cada sentencia 'nop' se ejecutará en un ciclo de máquina (16 MHz) de

aproximadamente 62.5ns.

Manipulación de puertos

La manipulación de puertos con código AVR es más rápida que utilizar la función digitalWrite()

de Arduino.

Establecer Bits en variables cbi y sbi son mecanismos estándar (AVR) para establecer o limpiar

bits en PORT y otras variables.Diferencias con Processing

La sintaxis del lenguaje de programación Arduino es una versión simplificada de C/C++ y tiene

algunas diferencias respecto de Processing.26 27 Debido a que Arduino está basado en C/C++

mientras que Processing se basa en Java, existen varias diferencias en cuanto a la sintaxis de

ambos lenguajes y el modo en que se programa:

Arreglos

Arduino Processing

int bar[8];

bar[0] = 1;

int[] bar = new int[8];

bar[0] = 1;

int foo[] = { 0, 1, 2 };

int foo[] = { 0, 1, 2 };

o bien

int[] foo = { 0, 1, 2 };

Impresión de cadenas

Arduino Processing

Serial.println("hello world"); println("hello world");

int i = 5;

Serial.println(i);

int i = 5;

println(i);

int i = 5;

Serial.print("i = ");

Serial.print(i);

Serial.println();

int i="5;"

println("i =" + i);

Ejemplo sencillo de programación en Arduino

El primer paso antes de comprobar que la instalación es correcta y empezar a trabajar con

Arduino, es usar ejemplos prácticos que vienen disponibles con el dispositivo. Se recomienda

abrir el ejemplo “led_blink” el cual crea una intermitencia por segundo en un led conectado en

el pin 13. El código necesario es el siguiente:

# define LED_PIN 13void setup () {

// Activado del contacto 13 para salida digital pinMode (LED_PIN, OUTPUT);}// Bucle infinitovoid loop () { // Encendido del diodo LED enviando una señal alta digitalWrite (LED_PIN, HIGH); // Tiempo de espera de 1 segundo (1000 ms) delay (1000); // Apagado del diodo LED enviando una señal baja. digitalWrite (LED_PIN, LOW); // Tiempo de espera de 1 segundo delay (1000);}

Envío y recepción de datos sobre una red de dispositivos o sensores mediante Two Wire

Interface (TWI/I2C).36

Las bibliotecas Matrix y Sprite de Wiring son totalmente compatibles con Arduino y sirven para

manejo de matrices de diodos LED. También se ofrece información sobre diversas bibliotecas

desarrolladas por diversos colaboradores que permiten realizar muchas tareas.Creación de bibliotecas

Los usuarios de Arduino tienen la posibilidad de escribir sus propias bibliotecas.37 Ello permite

disponer de código que puede reutilizarse en otros proyectos, mantener el código fuente

principal separado de las bibliotecas y la organización de los programas construidos es más

clara.

Ejemplo de biblioteca

El siguiente ejemplo permite el envío de caracteres mediante el código Morse:

Se crea el archivo Morse.h que incluye la definición de la clase Morse que tiene 3 funciones: un

constructor (Morse()), una función para enviar 1 punto (dot()) y una función para enviar una

raya (dash()). La variable _pin permite indicar el contacto a usar./* Morse.h - Biblioteca para el envío de Código Morse. Creado por David A. Mellis, el 2 de Noviembre de 2007. Liberado al dominio público.*/ # ifndef Morse_h# define Morse_h # include "WProgram.h" class Morse{ public: Morse(int pin); void dot();

void dash(); private: int _pin;}; # endif

Debe ser creado el archivo Morse.cpp con el código, es decir con la implementación de los

métodos declarados:

/* Morse.cpp - Biblioteca para el envío de Código Morse. Creado por David A. Mellis, el 2 de Noviembre de 2007. Liberado al dominio público.*/

# include "WProgram.h"# include "Morse.h"Morse::Morse(int pin){ pinMode(pin, OUTPUT); _pin = pin;}void Morse::dot(){ digitalWrite(_pin, HIGH); delay(250); digitalWrite(_pin, LOW); delay(250);}void Morse::dash(){ digitalWrite(_pin, HIGH); delay(1000); digitalWrite(_pin, LOW); delay(250);}

La biblioteca creada así puede ser usada mediante el comando #include. Si se desea enviar

una petición de quxilio SOS por el contacto 13 bastaría con llamar a Morse(13) y ejecutar la

siguiente secuencia:

morse.dot(); morse.dot(); morse.dot();

morse.dash(); morse.dash(); morse.dash();

morse.dot(); morse.dot(); morse.dot();

Bibliografia:

http://www.intel.com/support/sp/processors/sb/cs-031505.htm

http://www.clubse.com.ar/DIEGO/NOTAS/2/nota18.htm

http://www.cedip.edu.mx/tesinas/archivos_tesis/ISCEE/ISCEE_2029.doc

http://www.nuevaelectronica.com/pdf/productos/KM2107.pdf

http://es.wikipedia.org/wiki/Arduino