http://wikitronica.labc.usb.ve/api.php?action=feedcontributions&user=Francjsalanova&feedformat=atomWikitronica - Contribuciones del usuario [es]2024-03-29T07:38:16ZContribuciones del usuarioMediaWiki 1.26.3http://wikitronica.labc.usb.ve/index.php?title=Freescale_Codewarrior_6.3&diff=2434Freescale Codewarrior 6.32012-12-01T01:45:52Z<p>Francjsalanova: </p>
<hr />
<div>[[Archivo:CodeWarrior-image2.jpg|thumb|right|400px|Freescale CodeWarrior]]<br />
<br />
CodeWarrior es una herramienta basada en un entorno IDE (Integrated Development Environment). Desarrollado por Metrowerks, CodeWarrior integra edición de archivos, compilación optimizada, simulación de código, depuración y programación de diferentes dispositivos tales como el MPU, MCU, DSP, entre otros.<br />
<br />
Este programa trae la versatilidad de programar en lenguaje ensamblador, C, C++ e incluso permite combinaciones de código en los tres tipos mencionados.<br />
<br />
Los productos clasicos de CodeWarrior fueron lanzados originalmente para Macintosh (Mac), Microsoft Windows, Linux, Solaris, PlayStation 2, Nintendo GameCube, Nintendo DS, Nintendo Wii, Palm OS, Symbian OS e incluso BeOs. Sin embargo, a partir de CodeWarrior Pro 10 se descontinuo la version para Macintosh.<br />
<br />
== Instalación ==<br />
<br />
La instalacion de este software no es gratuita. Se debe poseer una licencia para poder ser instalado y para esto se debe comprar el software directamente o se debe adquirir algun dispositivo con el cual viene un CD con el programa para su instalacion. CodeWarrior originalmente es creado para computadoras cuyo sistema operativo es de 32-bit. <br />
<br />
=== Windows 7 de 64-bit ===<br />
<br />
En el caso de Windows 7 de 64-bit se encontraran con que el escudo de instalacion (install shield) abortara la instalacion al detectar que el sistema operativo es de 64-bit. Para arreglar esto se tienen las siguientes propuestas.<br />
<br />
==== Propuesta de Freescale ====<br />
<br />
Freescale propone descargar un programa de Microsoft llamado Windows virtual PC para trabajar con el sistema operativo Windows XP que es compatible con casi todos los programas que se desean instalar y que no sean compatibles con Windos 7 de 64-bit.<br />
<br />
Para esta propuesta de Freescale puede que se encuentren con el problema de que es necesario tener Windows 7 Professional, Enterprise o Ultimate para que sea compatible, pero el Windows 7 mas comun es el Home Premium por lo que surte un segundo problema.<br />
<br />
Si logra descargar esta maquina virtual, Instale ahi el CodeWarrior y podra utilizarlo cuando desee.<br />
<br />
==== Propuesta personal 1 ====<br />
<br />
Una mas sencilla opcion, y mas eficiente, es seguir los siguientes pasos:<br />
<br />
1.- Crear una carpeta llamada Freescale dentro de '''C:\Program Files(x86)'''<br />
2.- Descargar el siguiente archivo y descomprimirlo en la carpeta creada [https://dl.dropbox.com/u/43803714/codewarrior%20V6.3.rar '''CodeWarrior for Microcontrollers V6''']<br />
3.- Ubicar el archivo '''Mwregsvr.exe''' dentro de la carpeta bin<br />
4.- Seleccionar el archivo y con click derecho entrar a '''propiedades'''<br />
5.- Seleccionar la etiqueta de '''Compatibilidad''' y configurar de la siguiente manera:<br />
[[Archivo:Compatibilidad-Windos7.jpg]]<br />
y presionar aceptar.<br />
6.- En esa misma carpeta, ejecute el archivo '''regservers.bat'''(acepte todos los permisos de Windows)<br />
7.- Ahora, en la misma carpeta, ubique el archivo '''IDE.exe''' y cree un acceso directo al escritorio<br />
8.- Listo!! Ahora pueden utilizar el CodeWarrior V6.3 en Windows 7 de 64-bit directamente de su PC sin utilizar maquinas virtuales<br />
<br />
==== Propuesta personal 2 ====<br />
<br />
En caso de querer trabajar con una maquina virtual, recomiendo descargar una llamada Virtual Box, de Oracle, que es compatible con todos los sistemas operativos y ademas te da la capacidad de instalar cualquier sistema operativo que desees (MacOS, todo tipo de Windows, Linux, etc..) sin importar que sea de 64-bit o 32-bit. <br />
<br />
Luego de poseer esta maquina virtual, Instale ahi el CodeWarrior y podra utilizarlo cuando desee.<br />
<br />
== Proyectos ==<br />
<br />
CodeWarrior, como muchos programas, trabaja mediante la creación de proyectos y para esto se tienen una gran variedad de opciones para la codificacion tales como elegir que lenguaje se utilizara ( C, C++, ensamblador o Mixto), Elegir el microcontrolador a utilizar, entre otra serie de diferentes especificaciones. Para hacer su vida un poco mas facil, aqui tienen un tutorial para la creacion de los projectos.<br />
<br />
=== Lenguajes de programación ===<br />
<br />
Anteriormente, CodeWarrior tambien funcionaba con lenguajes como Pascal,Object Pascal, Objective-C y java, pero en la actualidad cuenta con lenguaje C, C++ y lenguaje ensamblador. Lo bueno de contar con un compilador para lenguaje C, C++ y ensamblador es que se puede codificar dependiendo de que nivel se necesite manejar. Ademas de esto, se pueden crear codigos mixtos de modo que se pueden realizar codigos mas rapidos y mas efectivos.<br />
<br />
==== Lenguaje Ensamblador ====<br />
<br />
Para hacer uso de lenguaje ensamblador en CodeWarrior aqui les dejo un link hacia el instruction set en donde podran encontrar la información especifica sobre cuales instrucciones maneja y cuales son sus funciones, ademas de explicar la sintaxis de programación. [http://cache.freescale.com/files/microcontrollers/doc/ref_manual/HCS08RMV1.pdf Manual y set de Instrucciones] <br />
<br />
==== Combinación de lenguajes ====<br />
<br />
Para hacer uso de una combinacion de lenguaje C y lenguaje ensamblador, debemos crear un proyecto en lenguaje C y luego si hay necesidad de utilizar lenguaje ensamblador usaremos el comando '''_ASM''' para cada instrucción o simplemente colocamos el comando seguido de unos corchetes en donde colocaremos todas las instrucciones que deseemos en este lenguaje.<br />
<br />
<br />
<br />
=== Creacion de un proyecto ===<br />
<br />
Para crear un nuevo proyecto deben abrir el CodeWarrior V6.3 (Haciendo doble click el CodeWarrior IDE) y lo primero que veran sera esta ventana: <br />
<br />
[[Archivo:CrearProyecto1.jpg|275px|Primera Ventana]]<br />
Aqui seleccionaran la primera opción que dice '''Create New Proyect''' en donde ahora aparecera la segunda ventana:<br />
<br />
[[Archivo:CrearProyecto2.jpg|thumb|right|400px|Segunda Ventana]]<br />
<br />
<br />
<br />
Aqui van a seleccionar primero la '''serie''' a la que pertenece su microcontrolador (HC08, HCS08, RS08, ColdFire V1 o Flexis), en nuestro caso sera flexis, esta se expandera y mostrara las diferentes familias de micros que se pueden seleccionar. Seleccionen la '''familia''' a la cual pertenece su micro, en nuestro caso la familia QE, y finalmente seleccionen su '''micro''', en nuestro caso el MC9S08QE128.<br />
Observaran que al seleccionar su micro, arriba a la derecha en el recuadro blanco aparecieron varias opciones. Escogan siempre '''Full Chip Simulation''' como su conección y den click en '''next'''.<br />
<br />
<br />
<br />
[[Archivo:CrearProyecto3.jpg|thumb|left|400px|Tercera Ventana]]<br />
Se abrira esta tercera ventana en la cual seleccionaremos el lenguaje, el nombre del proyecto y la localizacion donde se desea guardar el archivo:<br />
<br />
<br />
<br />
Primero observaremos 4 opciones para el lenguaje '''Absolute Assembly''' para codificar unicamente en lenguaje ensamblador, '''Relocatable Assembly''' para codificar principalmente en lenguaje ensamblador, '''C''' para codificar principalmente en lenguaje C y '''C++''' para codificar principalmente en C++. Con estos ultimos 3 seleccionas el lenguaje principal pero permites la codificacion mixta.<br />
La seleccion de nombre y localizacion del proyecto son a gusto del consumidor. <br />
<br />
<br />
<br />
[[Archivo:CrearProyecto5.jpg|right|Cuarta Ventana]]<br />
Al finalizar den click en '''next''' y aparecera una cuarta ventana para añadir proyectos ya existentes desde tu computadora hacia el CodeWarrior Donde solo deberas buscar los archivos que quieras añadir y luego hacer click en '''add'''. Luego de finalizar (hallan añadido o no algun proyecto) hagan click en '''next'''.<br />
<br />
<br />
<br />
[[Archivo:CrearProyecto4.jpg|thumb|left|Quinta Ventana]]<br />
Aparecera la quinta ventana en donde apareceran 3 opciones '''None''', '''Device Inicialization''' y '''Processor Expert''' que sirven para un inicializado rapido en el main. Para nuestro proyecto no es necesaria ninguna inicialización por lo que se debe seleccionar '''None''' y luego dar click en '''next'''.<br />
<br />
<br />
Por ultimo tendremos una sexta ventana en la que no le aplicaremos ningun cambio y simplemente haremos click en '''Finish''' y de esta manera estara listo nuestro proyecto para ser codificado.<br />
<br />
<br />
<br />
Por si no quedo muy clara la explicacion de como crear el proyecto, aqui dejo un video de youtube en donde explican exactamente lo mismo que aqui solo que en video: [http://www.youtube.com/watch?v=EZG9FF0bX78 Tutorial en youtube]<br />
<br />
==== Depuracion del Proyecto ====<br />
<br />
Para depurar el programa codificado, solo hace falta hacer click en el boton [[Archivo:BotonDebug.jpg]] con la que pueden suceder 2 cosas (Utilizando la conexion en '''Full Chip Simulation'''):<br />
<br />
1.- Aparecera la ventana de error diciendo que lineas del código tienen algun error o warning. Tambien pueden aparecer comentarios que hace el compilador.<br />
<br />
2.- El programa se depurara y se abrira la ventana '''True-time Simulator & Real-time Debugger'''.<br />
<br />
Si nos encontramos en el segundo caso, observaremos los siguientes puntos en la ventana que abrira:<br />
<prev><br />
1.- Icono para correr el programa completo o hasta hallar una parada (breakpoint).<br />
2.- Icono para correr el programa instruccion por instrucción.<br />
3.- Icono para saltar una instrucción.<br />
4.- Icono para salir de una instrucción.<br />
5.- Icono para correr instrucción por instrucción en ensamblador.<br />
6.- Icono para detener la corrida del programa.<br />
7.- Icono para detener y reiniciar el programa.<br />
8.- Indicador de una parada (breakpoint). Este se puede colocar haciendo click derecho en la instrucción en que deseas parar<br />
seleccionando '''Set breakpoint'''.<br />
<br />
[[Archivo:VentanaSimulacion.jpg]]<br />
<br />
En el caso de estar conectado al microcontrolador, para depurar el programa debemos tener configurada la conexión en '''P&E Multilink/Cyclone Pro''' y al hacerlo observaremos 2 ventanas adicionales, la primera preguntandonos si queremos conectar y descargar nuestro programa hacia el micro (Borrando el programa que este tenia anteriormente), y una segunda ventana en la que nos pedira una ultima confirmación. A partir de ahi, las herramientas para correr el programa son exactamente las mismas que cuando no se tiene el micro conectado.<br />
<br />
==== Carpetas iniciales ====<br />
<br />
Al finalizar la creación del proyecto aparecerán varias carpetas iniciales como se ve en la imagen<br />
[[Archivo:CarpetasIniciales.jpg|thumb|left|250px|Carpetas Iniciales]]<br />
1.- El main.c es el archivo sobre el cual haremos nuestro código. <br />
2.- El derivative.h es un archivo que se encarga de incluir la definición del micro.<br />
3.- El archivo que posee el nombre de nuestro micro (MC9HCS08QE128.h) Contiene la inicialización y definición<br />
de todos los registros, máscaras, tipos, puertos, vectores, entre otros referentes, de nuestro micro. Si se requiere <br />
saber el nombre que se da para algún dato necesitado, aquí se puede encontrar. <br />
4.- El resto de las carpetas y archivos son importantes para nosotros, sin embargo no deben ser modificadas ya<br />
que son las bases para nuestro proyecto.<br />
<br />
==== Añadir Archivos ====<br />
<br />
Para introducir un archivo al programa en necesario crearlo haciendo click arriba a la izquierda en el boton [[Archivo:BotonCrearArchivo.jpg]]. Una vez creado el archivo y guardado, éste se puede añadir a nuestro main al realizar los siguientes pasos:<br />
* Guardar el proyecto .c en caso de ser un programa y .h en caso de ser una declaración. <br />
Nota: Todo archivo .c debe tener un archivo de nombre idéntico .h en donde sea declarado.<br />
* Hacer click arriba en la barra donde dice Proyecto<br />
* Hacer click en la primera opción '''add (nombre del proyecto) to Project'''<br />
* Colocar en el main<br />
#include "nombre.h"<br />
<br />
=Device Initialization=<br />
<br />
[[Archivo:Device.jpg|thumb|right|800px|Carpetas Iniciales]]<br />
<br />
Codewarrior posee más de una sola manera de diseñar un proyecto, así como herramientas que facilitan la completación del mismo. El device initialization es una de estas herramientas.<br />
<br />
==Descripción==<br />
<br />
Existe una serie de características que hacen que el uso del device initialization sea eficiente.<br />
<br />
*Posee una interfaz gráfica con el usuario. Le permite al usuario literalmente "ver" el microcontrolador y en donde van conectados sus pines.<br />
<br />
*Si colocas el mouse en algún parámetro o puerto que vaya a ser modificado con el código de diseño, el programa inmediatamente resaltara los registros que se están usándo en el puerto señalado.<br />
<br />
*Es un método fácil para inicializar los periféricos. Así como están mostrados en el gráfico del microcontrolador el 'device initialization' permite inicializarlos automáticamente, en otras palabras puede generar código para la inicialización de los periféricos, y se puede elegir si se quiere generar código en C o en ASSEMBLER.<br />
<br />
==Inicialización==<br />
<br />
*Crear un proyecto como ya se explicó anteriormente<br />
<br />
*Ir a la barra principal del CODEWARRIOR y presionar 'DEVICE INITIALIZATION', saldrá un pequeño menú donde se seleccionará 'initialize device'.<br />
<br />
* Ahora se puede ver la interfaz gráfica del microcontrolador, seleccionar los valores de los parámetros, que se desean cambiar, puertos, Módulos IRQ, etc. Al seleccionarlos se podrán cambiar los valores predeterminados.<br />
<br />
*Ya elegidos los parámetros, se debe seleccionar 'GENERATE CODE', ésto generara el código de las inicializaciones de los periféricos. Elegir si se desea código en C o ASSEMBLER. El código generado sera guardado en el proyecto en una carpeta llamada "generated code".<br />
<br />
= Links Externos =<br />
* [http://disenodigital.unlugar.com/articulos/METROWERKS%20CODEWARRIOR.pdf Que es CodeWarrior], por Metrowerks<br />
* [http://cache.freescale.com/files/soft_dev_tools/doc/app_note/AN3936.pdf Instalación en Windows 7 64-bit], Propuesta de Freescale<br />
* [http://www.ezebrizzio.com.ar/?p=95 Instalación en Windows 7 64-bit], Propuesta personal 1<br />
<br />
<br />
<br />
[[Categoría:Freescale]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Freescale_Codewarrior_6.3&diff=2431Freescale Codewarrior 6.32012-12-01T01:44:30Z<p>Francjsalanova: </p>
<hr />
<div>[[Archivo:CodeWarrior-image2.jpg|thumb|right|400px|Freescale CodeWarrior]]<br />
<br />
CodeWarrior es una herramienta basada en un entorno IDE (Integrated Development Environment). Desarrollado por Metrowerks, CodeWarrior integra edición de archivos, compilación optimizada, simulación de código, depuración y programación de diferentes dispositivos tales como el MPU, MCU, DSP, entre otros.<br />
<br />
Este programa trae la versatilidad de programar en lenguaje ensamblador, C, C++ e incluso permite combinaciones de código en los tres tipos mencionados.<br />
<br />
Los productos clasicos de CodeWarrior fueron lanzados originalmente para Macintosh (Mac), Microsoft Windows, Linux, Solaris, PlayStation 2, Nintendo GameCube, Nintendo DS, Nintendo Wii, Palm OS, Symbian OS e incluso BeOs. Sin embargo, a partir de CodeWarrior Pro 10 se descontinuo la version para Macintosh.<br />
<br />
== Instalación ==<br />
<br />
La instalacion de este software no es gratuita. Se debe poseer una licencia para poder ser instalado y para esto se debe comprar el software directamente o se debe adquirir algun dispositivo con el cual viene un CD con el programa para su instalacion. CodeWarrior originalmente es creado para computadoras cuyo sistema operativo es de 32-bit. <br />
<br />
=== Windows 7 de 64-bit ===<br />
<br />
En el caso de Windows 7 de 64-bit se encontraran con que el escudo de instalacion (install shield) abortara la instalacion al detectar que el sistema operativo es de 64-bit. Para arreglar esto se tienen las siguientes propuestas.<br />
<br />
==== Propuesta de Freescale ====<br />
<br />
Freescale propone descargar un programa de Microsoft llamado Windows virtual PC para trabajar con el sistema operativo Windows XP que es compatible con casi todos los programas que se desean instalar y que no sean compatibles con Windos 7 de 64-bit.<br />
<br />
Para esta propuesta de Freescale puede que se encuentren con el problema de que es necesario tener Windows 7 Professional, Enterprise o Ultimate para que sea compatible, pero el Windows 7 mas comun es el Home Premium por lo que surte un segundo problema.<br />
<br />
Si logra descargar esta maquina virtual, Instale ahi el CodeWarrior y podra utilizarlo cuando desee.<br />
<br />
==== Propuesta personal 1 ====<br />
<br />
Una mas sencilla opcion, y mas eficiente, es seguir los siguientes pasos:<br />
<br />
1.- Crear una carpeta llamada Freescale dentro de '''C:\Program Files(x86)'''<br />
2.- Descargar el siguiente archivo y descomprimirlo en la carpeta creada [https://dl.dropbox.com/u/43803714/codewarrior%20V6.3.rar '''CodeWarrior for Microcontrollers V6''']<br />
3.- Ubicar el archivo '''Mwregsvr.exe''' dentro de la carpeta bin<br />
4.- Seleccionar el archivo y con click derecho entrar a '''propiedades'''<br />
5.- Seleccionar la etiqueta de '''Compatibilidad''' y configurar de la siguiente manera:<br />
[[Archivo:Compatibilidad-Windos7.jpg]]<br />
y presionar aceptar.<br />
6.- En esa misma carpeta, ejecute el archivo '''regservers.bat'''(acepte todos los permisos de Windows)<br />
7.- Ahora, en la misma carpeta, ubique el archivo '''IDE.exe''' y cree un acceso directo al escritorio<br />
8.- Listo!! Ahora pueden utilizar el CodeWarrior V6.3 en Windows 7 de 64-bit directamente de su PC sin utilizar maquinas virtuales<br />
<br />
==== Propuesta personal 2 ====<br />
<br />
En caso de querer trabajar con una maquina virtual, recomiendo descargar una llamada Virtual Box, de Oracle, que es compatible con todos los sistemas operativos y ademas te da la capacidad de instalar cualquier sistema operativo que desees (MacOS, todo tipo de Windows, Linux, etc..) sin importar que sea de 64-bit o 32-bit. <br />
<br />
Luego de poseer esta maquina virtual, Instale ahi el CodeWarrior y podra utilizarlo cuando desee.<br />
<br />
== Proyectos ==<br />
<br />
CodeWarrior, como muchos programas, trabaja mediante la creación de proyectos y para esto se tienen una gran variedad de opciones para la codificacion tales como elegir que lenguaje se utilizara ( C, C++, ensamblador o Mixto), Elegir el microcontrolador a utilizar, entre otra serie de diferentes especificaciones. Para hacer su vida un poco mas facil, aqui tienen un tutorial para la creacion de los projectos.<br />
<br />
=== Lenguajes de programación ===<br />
<br />
Anteriormente, CodeWarrior tambien funcionaba con lenguajes como Pascal,Object Pascal, Objective-C y java, pero en la actualidad cuenta con lenguaje C, C++ y lenguaje ensamblador. Lo bueno de contar con un compilador para lenguaje C, C++ y ensamblador es que se puede codificar dependiendo de que nivel se necesite manejar. Ademas de esto, se pueden crear codigos mixtos de modo que se pueden realizar codigos mas rapidos y mas efectivos.<br />
<br />
==== Lenguaje Ensamblador ====<br />
<br />
Para hacer uso de lenguaje ensamblador en CodeWarrior aqui les dejo un link hacia el instruction set en donde podran encontrar la información especifica sobre cuales instrucciones maneja y cuales son sus funciones, ademas de explicar la sintaxis de programación. [http://cache.freescale.com/files/microcontrollers/doc/ref_manual/HCS08RMV1.pdf Manual y set de Instrucciones] <br />
<br />
==== Combinación de lenguajes ====<br />
<br />
Para hacer uso de una combinacion de lenguaje C y lenguaje ensamblador, debemos crear un proyecto en lenguaje C y luego si hay necesidad de utilizar lenguaje ensamblador usaremos el comando '''_ASM''' para cada instrucción o simplemente colocamos el comando seguido de unos corchetes en donde colocaremos todas las instrucciones que deseemos en este lenguaje.<br />
<br />
<br />
<br />
=== Creacion de un proyecto ===<br />
<br />
Para crear un nuevo proyecto deben abrir el CodeWarrior V6.3 (Haciendo doble click el CodeWarrior IDE) y lo primero que veran sera esta ventana: <br />
<br />
[[Archivo:CrearProyecto1.jpg|275px|Primera Ventana]]<br />
Aqui seleccionaran la primera opción que dice '''Create New Proyect''' en donde ahora aparecera la segunda ventana:<br />
<br />
[[Archivo:CrearProyecto2.jpg|thumb|right|400px|Segunda Ventana]]<br />
<br />
<br />
<br />
Aqui van a seleccionar primero la '''serie''' a la que pertenece su microcontrolador (HC08, HCS08, RS08, ColdFire V1 o Flexis), en nuestro caso sera flexis, esta se expandera y mostrara las diferentes familias de micros que se pueden seleccionar. Seleccionen la '''familia''' a la cual pertenece su micro, en nuestro caso la familia QE, y finalmente seleccionen su '''micro''', en nuestro caso el MC9S08QE128.<br />
Observaran que al seleccionar su micro, arriba a la derecha en el recuadro blanco aparecieron varias opciones. Escogan siempre '''Full Chip Simulation''' como su conección y den click en '''next'''.<br />
<br />
<br />
<br />
[[Archivo:CrearProyecto3.jpg|thumb|left|400px|Tercera Ventana]]<br />
Se abrira esta tercera ventana en la cual seleccionaremos el lenguaje, el nombre del proyecto y la localizacion donde se desea guardar el archivo:<br />
<br />
<br />
<br />
Primero observaremos 4 opciones para el lenguaje '''Absolute Assembly''' para codificar unicamente en lenguaje ensamblador, '''Relocatable Assembly''' para codificar principalmente en lenguaje ensamblador, '''C''' para codificar principalmente en lenguaje C y '''C++''' para codificar principalmente en C++. Con estos ultimos 3 seleccionas el lenguaje principal pero permites la codificacion mixta.<br />
La seleccion de nombre y localizacion del proyecto son a gusto del consumidor. <br />
<br />
<br />
<br />
[[Archivo:CrearProyecto5.jpg|right|Cuarta Ventana]]<br />
Al finalizar den click en '''next''' y aparecera una cuarta ventana para añadir proyectos ya existentes desde tu computadora hacia el CodeWarrior Donde solo deberas buscar los archivos que quieras añadir y luego hacer click en '''add'''. Luego de finalizar (hallan añadido o no algun proyecto) hagan click en '''next'''.<br />
<br />
<br />
<br />
[[Archivo:CrearProyecto4.jpg|thumb|left|Quinta Ventana]]<br />
Aparecera la quinta ventana en donde apareceran 3 opciones '''None''', '''Device Inicialization''' y '''Processor Expert''' que sirven para un inicializado rapido en el main. Para nuestro proyecto no es necesaria ninguna inicialización por lo que se debe seleccionar '''None''' y luego dar click en '''next'''.<br />
<br />
<br />
Por ultimo tendremos una sexta ventana en la que no le aplicaremos ningun cambio y simplemente haremos click en '''Finish''' y de esta manera estara listo nuestro proyecto para ser codificado.<br />
<br />
<br />
<br />
Por si no quedo muy clara la explicacion de como crear el proyecto, aqui dejo un video de youtube en donde explican exactamente lo mismo que aqui solo que en video: [http://www.youtube.com/watch?v=EZG9FF0bX78 Tutorial en youtube]<br />
<br />
==== Depuracion del Proyecto ====<br />
<br />
Para depurar el programa codificado, solo hace falta hacer click en el boton [[Archivo:BotonDebug.jpg]] con la que pueden suceder 2 cosas (Utilizando la conexion en '''Full Chip Simulation'''):<br />
<br />
1.- Aparecera la ventana de error diciendo que lineas del código tienen algun error o warning. Tambien pueden aparecer comentarios que hace el compilador.<br />
<br />
2.- El programa se depurara y se abrira la ventana '''True-time Simulator & Real-time Debugger'''.<br />
<br />
Si nos encontramos en el segundo caso, observaremos los siguientes puntos en la ventana que abrira:<br />
<prev><br />
1.- Icono para correr el programa completo o hasta hallar una parada (breakpoint).<br />
2.- Icono para correr el programa instruccion por instrucción.<br />
3.- Icono para saltar una instrucción.<br />
4.- Icono para salir de una instrucción.<br />
5.- Icono para correr instrucción por instrucción en ensamblador.<br />
6.- Icono para detener la corrida del programa.<br />
7.- Icono para detener y reiniciar el programa.<br />
8.- Indicador de una parada (breakpoint). Este se puede colocar haciendo click derecho en la instrucción en que deseas para y seleccionando<br />
'''Set breakpoint'''.</prev><br />
<br />
[[Archivo:VentanaSimulacion.jpg]]<br />
<br />
En el caso de estar conectado al microcontrolador, para depurar el programa debemos tener configurada la conexión en '''P&E Multilink/Cyclone Pro''' y al hacerlo observaremos 2 ventanas adicionales, la primera preguntandonos si queremos conectar y descargar nuestro programa hacia el micro (Borrando el programa que este tenia anteriormente), y una segunda ventana en la que nos pedira una ultima confirmación. A partir de ahi, las herramientas para correr el programa son exactamente las mismas que cuando no se tiene el micro conectado.<br />
<br />
==== Carpetas iniciales ====<br />
<br />
Al finalizar la creación del proyecto aparecerán varias carpetas iniciales como se ve en la imagen<br />
[[Archivo:CarpetasIniciales.jpg|thumb|left|250px|Carpetas Iniciales]]<br />
1.- El main.c es el archivo sobre el cual haremos nuestro código. <br />
2.- El derivative.h es un archivo que se encarga de incluir la definición del micro.<br />
3.- El archivo que posee el nombre de nuestro micro (MC9HCS08QE128.h) Contiene la inicialización y definición<br />
de todos los registros, máscaras, tipos, puertos, vectores, entre otros referentes, de nuestro micro. Si se requiere <br />
saber el nombre que se da para algún dato necesitado, aquí se puede encontrar. <br />
4.- El resto de las carpetas y archivos son importantes para nosotros, sin embargo no deben ser modificadas ya<br />
que son las bases para nuestro proyecto.<br />
<br />
==== Añadir Archivos ====<br />
<br />
Para introducir un archivo al programa en necesario crearlo haciendo click arriba a la izquierda en el boton [[Archivo:BotonCrearArchivo.jpg]]. Una vez creado el archivo y guardado, éste se puede añadir a nuestro main al realizar los siguientes pasos:<br />
* Guardar el proyecto .c en caso de ser un programa y .h en caso de ser una declaración. <br />
Nota: Todo archivo .c debe tener un archivo de nombre idéntico .h en donde sea declarado.<br />
* Hacer click arriba en la barra donde dice Proyecto<br />
* Hacer click en la primera opción '''add (nombre del proyecto) to Project'''<br />
* Colocar en el main<br />
#include "nombre.h"<br />
<br />
=Device Initialization=<br />
<br />
[[Archivo:Device.jpg|thumb|right|800px|Carpetas Iniciales]]<br />
<br />
Codewarrior posee más de una sola manera de diseñar un proyecto, así como herramientas que facilitan la completación del mismo. El device initialization es una de estas herramientas.<br />
<br />
==Descripción==<br />
<br />
Existe una serie de características que hacen que el uso del device initialization sea eficiente.<br />
<br />
*Posee una interfaz gráfica con el usuario. Le permite al usuario literalmente "ver" el microcontrolador y en donde van conectados sus pines.<br />
<br />
*Si colocas el mouse en algún parámetro o puerto que vaya a ser modificado con el código de diseño, el programa inmediatamente resaltara los registros que se están usándo en el puerto señalado.<br />
<br />
*Es un método fácil para inicializar los periféricos. Así como están mostrados en el gráfico del microcontrolador el 'device initialization' permite inicializarlos automáticamente, en otras palabras puede generar código para la inicialización de los periféricos, y se puede elegir si se quiere generar código en C o en ASSEMBLER.<br />
<br />
==Inicialización==<br />
<br />
*Crear un proyecto como ya se explicó anteriormente<br />
<br />
*Ir a la barra principal del CODEWARRIOR y presionar 'DEVICE INITIALIZATION', saldrá un pequeño menú donde se seleccionará 'initialize device'.<br />
<br />
* Ahora se puede ver la interfaz gráfica del microcontrolador, seleccionar los valores de los parámetros, que se desean cambiar, puertos, Módulos IRQ, etc. Al seleccionarlos se podrán cambiar los valores predeterminados.<br />
<br />
*Ya elegidos los parámetros, se debe seleccionar 'GENERATE CODE', ésto generara el código de las inicializaciones de los periféricos. Elegir si se desea código en C o ASSEMBLER. El código generado sera guardado en el proyecto en una carpeta llamada "generated code".<br />
<br />
= Links Externos =<br />
* [http://disenodigital.unlugar.com/articulos/METROWERKS%20CODEWARRIOR.pdf Que es CodeWarrior], por Metrowerks<br />
* [http://cache.freescale.com/files/soft_dev_tools/doc/app_note/AN3936.pdf Instalación en Windows 7 64-bit], Propuesta de Freescale<br />
* [http://www.ezebrizzio.com.ar/?p=95 Instalación en Windows 7 64-bit], Propuesta personal 1<br />
<br />
<br />
<br />
[[Categoría:Freescale]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Freescale_Codewarrior_6.3&diff=2429Freescale Codewarrior 6.32012-12-01T01:43:21Z<p>Francjsalanova: </p>
<hr />
<div>[[Archivo:CodeWarrior-image2.jpg|thumb|right|400px|Freescale CodeWarrior]]<br />
<br />
CodeWarrior es una herramienta basada en un entorno IDE (Integrated Development Environment). Desarrollado por Metrowerks, CodeWarrior integra edición de archivos, compilación optimizada, simulación de código, depuración y programación de diferentes dispositivos tales como el MPU, MCU, DSP, entre otros.<br />
<br />
Este programa trae la versatilidad de programar en lenguaje ensamblador, C, C++ e incluso permite combinaciones de código en los tres tipos mencionados.<br />
<br />
Los productos clasicos de CodeWarrior fueron lanzados originalmente para Macintosh (Mac), Microsoft Windows, Linux, Solaris, PlayStation 2, Nintendo GameCube, Nintendo DS, Nintendo Wii, Palm OS, Symbian OS e incluso BeOs. Sin embargo, a partir de CodeWarrior Pro 10 se descontinuo la version para Macintosh.<br />
<br />
== Instalación ==<br />
<br />
La instalacion de este software no es gratuita. Se debe poseer una licencia para poder ser instalado y para esto se debe comprar el software directamente o se debe adquirir algun dispositivo con el cual viene un CD con el programa para su instalacion. CodeWarrior originalmente es creado para computadoras cuyo sistema operativo es de 32-bit. <br />
<br />
=== Windows 7 de 64-bit ===<br />
<br />
En el caso de Windows 7 de 64-bit se encontraran con que el escudo de instalacion (install shield) abortara la instalacion al detectar que el sistema operativo es de 64-bit. Para arreglar esto se tienen las siguientes propuestas.<br />
<br />
==== Propuesta de Freescale ====<br />
<br />
Freescale propone descargar un programa de Microsoft llamado Windows virtual PC para trabajar con el sistema operativo Windows XP que es compatible con casi todos los programas que se desean instalar y que no sean compatibles con Windos 7 de 64-bit.<br />
<br />
Para esta propuesta de Freescale puede que se encuentren con el problema de que es necesario tener Windows 7 Professional, Enterprise o Ultimate para que sea compatible, pero el Windows 7 mas comun es el Home Premium por lo que surte un segundo problema.<br />
<br />
Si logra descargar esta maquina virtual, Instale ahi el CodeWarrior y podra utilizarlo cuando desee.<br />
<br />
==== Propuesta personal 1 ====<br />
<br />
Una mas sencilla opcion, y mas eficiente, es seguir los siguientes pasos:<br />
<br />
1.- Crear una carpeta llamada Freescale dentro de '''C:\Program Files(x86)'''<br />
2.- Descargar el siguiente archivo y descomprimirlo en la carpeta creada [https://dl.dropbox.com/u/43803714/codewarrior%20V6.3.rar '''CodeWarrior for Microcontrollers V6''']<br />
3.- Ubicar el archivo '''Mwregsvr.exe''' dentro de la carpeta bin<br />
4.- Seleccionar el archivo y con click derecho entrar a '''propiedades'''<br />
5.- Seleccionar la etiqueta de '''Compatibilidad''' y configurar de la siguiente manera:<br />
[[Archivo:Compatibilidad-Windos7.jpg]]<br />
y presionar aceptar.<br />
6.- En esa misma carpeta, ejecute el archivo '''regservers.bat'''(acepte todos los permisos de Windows)<br />
7.- Ahora, en la misma carpeta, ubique el archivo '''IDE.exe''' y cree un acceso directo al escritorio<br />
8.- Listo!! Ahora pueden utilizar el CodeWarrior V6.3 en Windows 7 de 64-bit directamente de su PC sin utilizar maquinas virtuales<br />
<br />
==== Propuesta personal 2 ====<br />
<br />
En caso de querer trabajar con una maquina virtual, recomiendo descargar una llamada Virtual Box, de Oracle, que es compatible con todos los sistemas operativos y ademas te da la capacidad de instalar cualquier sistema operativo que desees (MacOS, todo tipo de Windows, Linux, etc..) sin importar que sea de 64-bit o 32-bit. <br />
<br />
Luego de poseer esta maquina virtual, Instale ahi el CodeWarrior y podra utilizarlo cuando desee.<br />
<br />
== Proyectos ==<br />
<br />
CodeWarrior, como muchos programas, trabaja mediante la creación de proyectos y para esto se tienen una gran variedad de opciones para la codificacion tales como elegir que lenguaje se utilizara ( C, C++, ensamblador o Mixto), Elegir el microcontrolador a utilizar, entre otra serie de diferentes especificaciones. Para hacer su vida un poco mas facil, aqui tienen un tutorial para la creacion de los projectos.<br />
<br />
=== Lenguajes de programación ===<br />
<br />
Anteriormente, CodeWarrior tambien funcionaba con lenguajes como Pascal,Object Pascal, Objective-C y java, pero en la actualidad cuenta con lenguaje C, C++ y lenguaje ensamblador. Lo bueno de contar con un compilador para lenguaje C, C++ y ensamblador es que se puede codificar dependiendo de que nivel se necesite manejar. Ademas de esto, se pueden crear codigos mixtos de modo que se pueden realizar codigos mas rapidos y mas efectivos.<br />
<br />
==== Lenguaje Ensamblador ====<br />
<br />
Para hacer uso de lenguaje ensamblador en CodeWarrior aqui les dejo un link hacia el instruction set en donde podran encontrar la información especifica sobre cuales instrucciones maneja y cuales son sus funciones, ademas de explicar la sintaxis de programación. [http://cache.freescale.com/files/microcontrollers/doc/ref_manual/HCS08RMV1.pdf Manual y set de Instrucciones] <br />
<br />
==== Combinación de lenguajes ====<br />
<br />
Para hacer uso de una combinacion de lenguaje C y lenguaje ensamblador, debemos crear un proyecto en lenguaje C y luego si hay necesidad de utilizar lenguaje ensamblador usaremos el comando '''_ASM''' para cada instrucción o simplemente colocamos el comando seguido de unos corchetes en donde colocaremos todas las instrucciones que deseemos en este lenguaje.<br />
<br />
<br />
<br />
=== Creacion de un proyecto ===<br />
<br />
Para crear un nuevo proyecto deben abrir el CodeWarrior V6.3 (Haciendo doble click el CodeWarrior IDE) y lo primero que veran sera esta ventana: <br />
<br />
[[Archivo:CrearProyecto1.jpg|275px|Primera Ventana]]<br />
Aqui seleccionaran la primera opción que dice '''Create New Proyect''' en donde ahora aparecera la segunda ventana:<br />
<br />
[[Archivo:CrearProyecto2.jpg|thumb|right|400px|Segunda Ventana]]<br />
<br />
<br />
<br />
Aqui van a seleccionar primero la '''serie''' a la que pertenece su microcontrolador (HC08, HCS08, RS08, ColdFire V1 o Flexis), en nuestro caso sera flexis, esta se expandera y mostrara las diferentes familias de micros que se pueden seleccionar. Seleccionen la '''familia''' a la cual pertenece su micro, en nuestro caso la familia QE, y finalmente seleccionen su '''micro''', en nuestro caso el MC9S08QE128.<br />
Observaran que al seleccionar su micro, arriba a la derecha en el recuadro blanco aparecieron varias opciones. Escogan siempre '''Full Chip Simulation''' como su conección y den click en '''next'''.<br />
<br />
<br />
<br />
[[Archivo:CrearProyecto3.jpg|thumb|left|400px|Tercera Ventana]]<br />
Se abrira esta tercera ventana en la cual seleccionaremos el lenguaje, el nombre del proyecto y la localizacion donde se desea guardar el archivo:<br />
<br />
<br />
<br />
Primero observaremos 4 opciones para el lenguaje '''Absolute Assembly''' para codificar unicamente en lenguaje ensamblador, '''Relocatable Assembly''' para codificar principalmente en lenguaje ensamblador, '''C''' para codificar principalmente en lenguaje C y '''C++''' para codificar principalmente en C++. Con estos ultimos 3 seleccionas el lenguaje principal pero permites la codificacion mixta.<br />
La seleccion de nombre y localizacion del proyecto son a gusto del consumidor. <br />
<br />
<br />
<br />
[[Archivo:CrearProyecto5.jpg|right|Cuarta Ventana]]<br />
Al finalizar den click en '''next''' y aparecera una cuarta ventana para añadir proyectos ya existentes desde tu computadora hacia el CodeWarrior Donde solo deberas buscar los archivos que quieras añadir y luego hacer click en '''add'''. Luego de finalizar (hallan añadido o no algun proyecto) hagan click en '''next'''.<br />
<br />
<br />
<br />
[[Archivo:CrearProyecto4.jpg|thumb|left|Quinta Ventana]]<br />
Aparecera la quinta ventana en donde apareceran 3 opciones '''None''', '''Device Inicialization''' y '''Processor Expert''' que sirven para un inicializado rapido en el main. Para nuestro proyecto no es necesaria ninguna inicialización por lo que se debe seleccionar '''None''' y luego dar click en '''next'''.<br />
<br />
<br />
Por ultimo tendremos una sexta ventana en la que no le aplicaremos ningun cambio y simplemente haremos click en '''Finish''' y de esta manera estara listo nuestro proyecto para ser codificado.<br />
<br />
<br />
<br />
Por si no quedo muy clara la explicacion de como crear el proyecto, aqui dejo un video de youtube en donde explican exactamente lo mismo que aqui solo que en video: [http://www.youtube.com/watch?v=EZG9FF0bX78 Tutorial en youtube]<br />
<br />
==== Depuracion del Proyecto ====<br />
<br />
Para depurar el programa codificado, solo hace falta hacer click en el boton [[Archivo:BotonDebug.jpg]] con la que pueden suceder 2 cosas (Utilizando la conexion en '''Full Chip Simulation'''):<br />
<br />
1.- Aparecera la ventana de error diciendo que lineas del código tienen algun error o warning. Tambien pueden aparecer comentarios que hace el compilador.<br />
<br />
2.- El programa se depurara y se abrira la ventana '''True-time Simulator & Real-time Debugger'''.<br />
<br />
Si nos encontramos en el segundo caso, observaremos los siguientes puntos en la ventana que abrira:<br />
<br />
1.- Icono para correr el programa completo o hasta hallar una parada (breakpoint).<br />
2.- Icono para correr el programa instruccion por instrucción.<br />
3.- Icono para saltar una instrucción.<br />
4.- Icono para salir de una instrucción.<br />
5.- Icono para correr instrucción por instrucción en ensamblador.<br />
6.- Icono para detener la corrida del programa.<br />
7.- Icono para detener y reiniciar el programa.<br />
8.- Indicador de una parada (breakpoint). Este se puede colocar haciendo click derecho en la instrucción en que deseas para y seleccionando<br />
'''Set breakpoint'''.<br />
<br />
<br />
[[Archivo:VentanaSimulacion.jpg]]<br />
<br />
En el caso de estar conectado al microcontrolador, para depurar el programa debemos tener configurada la conexión en '''P&E Multilink/Cyclone Pro''' y al hacerlo observaremos 2 ventanas adicionales, la primera preguntandonos si queremos conectar y descargar nuestro programa hacia el micro (Borrando el programa que este tenia anteriormente), y una segunda ventana en la que nos pedira una ultima confirmación. A partir de ahi, las herramientas para correr el programa son exactamente las mismas que cuando no se tiene el micro conectado.<br />
<br />
==== Carpetas iniciales ====<br />
<br />
Al finalizar la creación del proyecto aparecerán varias carpetas iniciales como se ve en la imagen<br />
[[Archivo:CarpetasIniciales.jpg|thumb|left|250px|Carpetas Iniciales]]<br />
1.- El main.c es el archivo sobre el cual haremos nuestro código. <br />
2.- El derivative.h es un archivo que se encarga de incluir la definición del micro.<br />
3.- El archivo que posee el nombre de nuestro micro (MC9HCS08QE128.h) Contiene la inicialización y definición<br />
de todos los registros, máscaras, tipos, puertos, vectores, entre otros referentes, de nuestro micro. Si se requiere <br />
saber el nombre que se da para algún dato necesitado, aquí se puede encontrar. <br />
4.- El resto de las carpetas y archivos son importantes para nosotros, sin embargo no deben ser modificadas ya<br />
que son las bases para nuestro proyecto.<br />
<br />
==== Añadir Archivos ====<br />
<br />
Para introducir un archivo al programa en necesario crearlo haciendo click arriba a la izquierda en el boton [[Archivo:BotonCrearArchivo.jpg]]. Una vez creado el archivo y guardado, éste se puede añadir a nuestro main al realizar los siguientes pasos:<br />
* Guardar el proyecto .c en caso de ser un programa y .h en caso de ser una declaración. <br />
Nota: Todo archivo .c debe tener un archivo de nombre idéntico .h en donde sea declarado.<br />
* Hacer click arriba en la barra donde dice Proyecto<br />
* Hacer click en la primera opción '''add (nombre del proyecto) to Project'''<br />
* Colocar en el main<br />
#include "nombre.h"<br />
<br />
=Device Initialization=<br />
<br />
[[Archivo:Device.jpg|thumb|right|800px|Carpetas Iniciales]]<br />
<br />
Codewarrior posee más de una sola manera de diseñar un proyecto, así como herramientas que facilitan la completación del mismo. El device initialization es una de estas herramientas.<br />
<br />
==Descripción==<br />
<br />
Existe una serie de características que hacen que el uso del device initialization sea eficiente.<br />
<br />
*Posee una interfaz gráfica con el usuario. Le permite al usuario literalmente "ver" el microcontrolador y en donde van conectados sus pines.<br />
<br />
*Si colocas el mouse en algún parámetro o puerto que vaya a ser modificado con el código de diseño, el programa inmediatamente resaltara los registros que se están usándo en el puerto señalado.<br />
<br />
*Es un método fácil para inicializar los periféricos. Así como están mostrados en el gráfico del microcontrolador el 'device initialization' permite inicializarlos automáticamente, en otras palabras puede generar código para la inicialización de los periféricos, y se puede elegir si se quiere generar código en C o en ASSEMBLER.<br />
<br />
==Inicialización==<br />
<br />
*Crear un proyecto como ya se explicó anteriormente<br />
<br />
*Ir a la barra principal del CODEWARRIOR y presionar 'DEVICE INITIALIZATION', saldrá un pequeño menú donde se seleccionará 'initialize device'.<br />
<br />
* Ahora se puede ver la interfaz gráfica del microcontrolador, seleccionar los valores de los parámetros, que se desean cambiar, puertos, Módulos IRQ, etc. Al seleccionarlos se podrán cambiar los valores predeterminados.<br />
<br />
*Ya elegidos los parámetros, se debe seleccionar 'GENERATE CODE', ésto generara el código de las inicializaciones de los periféricos. Elegir si se desea código en C o ASSEMBLER. El código generado sera guardado en el proyecto en una carpeta llamada "generated code".<br />
<br />
= Links Externos =<br />
* [http://disenodigital.unlugar.com/articulos/METROWERKS%20CODEWARRIOR.pdf Que es CodeWarrior], por Metrowerks<br />
* [http://cache.freescale.com/files/soft_dev_tools/doc/app_note/AN3936.pdf Instalación en Windows 7 64-bit], Propuesta de Freescale<br />
* [http://www.ezebrizzio.com.ar/?p=95 Instalación en Windows 7 64-bit], Propuesta personal 1<br />
<br />
<br />
<br />
[[Categoría:Freescale]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Freescale_Codewarrior_6.3&diff=2428Freescale Codewarrior 6.32012-12-01T01:42:25Z<p>Francjsalanova: </p>
<hr />
<div>[[Archivo:CodeWarrior-image2.jpg|thumb|right|400px|Freescale CodeWarrior]]<br />
<br />
CodeWarrior es una herramienta basada en un entorno IDE (Integrated Development Environment). Desarrollado por Metrowerks, CodeWarrior integra edición de archivos, compilación optimizada, simulación de código, depuración y programación de diferentes dispositivos tales como el MPU, MCU, DSP, entre otros.<br />
<br />
Este programa trae la versatilidad de programar en lenguaje ensamblador, C, C++ e incluso permite combinaciones de código en los tres tipos mencionados.<br />
<br />
Los productos clasicos de CodeWarrior fueron lanzados originalmente para Macintosh (Mac), Microsoft Windows, Linux, Solaris, PlayStation 2, Nintendo GameCube, Nintendo DS, Nintendo Wii, Palm OS, Symbian OS e incluso BeOs. Sin embargo, a partir de CodeWarrior Pro 10 se descontinuo la version para Macintosh.<br />
<br />
== Instalación ==<br />
<br />
La instalacion de este software no es gratuita. Se debe poseer una licencia para poder ser instalado y para esto se debe comprar el software directamente o se debe adquirir algun dispositivo con el cual viene un CD con el programa para su instalacion. CodeWarrior originalmente es creado para computadoras cuyo sistema operativo es de 32-bit. <br />
<br />
=== Windows 7 de 64-bit ===<br />
<br />
En el caso de Windows 7 de 64-bit se encontraran con que el escudo de instalacion (install shield) abortara la instalacion al detectar que el sistema operativo es de 64-bit. Para arreglar esto se tienen las siguientes propuestas.<br />
<br />
==== Propuesta de Freescale ====<br />
<br />
Freescale propone descargar un programa de Microsoft llamado Windows virtual PC para trabajar con el sistema operativo Windows XP que es compatible con casi todos los programas que se desean instalar y que no sean compatibles con Windos 7 de 64-bit.<br />
<br />
Para esta propuesta de Freescale puede que se encuentren con el problema de que es necesario tener Windows 7 Professional, Enterprise o Ultimate para que sea compatible, pero el Windows 7 mas comun es el Home Premium por lo que surte un segundo problema.<br />
<br />
Si logra descargar esta maquina virtual, Instale ahi el CodeWarrior y podra utilizarlo cuando desee.<br />
<br />
==== Propuesta personal 1 ====<br />
<br />
Una mas sencilla opcion, y mas eficiente, es seguir los siguientes pasos:<br />
<br />
1.- Crear una carpeta llamada Freescale dentro de '''C:\Program Files(x86)'''<br />
2.- Descargar el siguiente archivo y descomprimirlo en la carpeta creada [https://dl.dropbox.com/u/43803714/codewarrior%20V6.3.rar '''CodeWarrior for Microcontrollers V6''']<br />
3.- Ubicar el archivo '''Mwregsvr.exe''' dentro de la carpeta bin<br />
4.- Seleccionar el archivo y con click derecho entrar a '''propiedades'''<br />
5.- Seleccionar la etiqueta de '''Compatibilidad''' y configurar de la siguiente manera:<br />
[[Archivo:Compatibilidad-Windos7.jpg]]<br />
y presionar aceptar.<br />
6.- En esa misma carpeta, ejecute el archivo '''regservers.bat'''(acepte todos los permisos de Windows)<br />
7.- Ahora, en la misma carpeta, ubique el archivo '''IDE.exe''' y cree un acceso directo al escritorio<br />
8.- Listo!! Ahora pueden utilizar el CodeWarrior V6.3 en Windows 7 de 64-bit directamente de su PC sin utilizar maquinas virtuales<br />
<br />
==== Propuesta personal 2 ====<br />
<br />
En caso de querer trabajar con una maquina virtual, recomiendo descargar una llamada Virtual Box, de Oracle, que es compatible con todos los sistemas operativos y ademas te da la capacidad de instalar cualquier sistema operativo que desees (MacOS, todo tipo de Windows, Linux, etc..) sin importar que sea de 64-bit o 32-bit. <br />
<br />
Luego de poseer esta maquina virtual, Instale ahi el CodeWarrior y podra utilizarlo cuando desee.<br />
<br />
== Proyectos ==<br />
<br />
CodeWarrior, como muchos programas, trabaja mediante la creación de proyectos y para esto se tienen una gran variedad de opciones para la codificacion tales como elegir que lenguaje se utilizara ( C, C++, ensamblador o Mixto), Elegir el microcontrolador a utilizar, entre otra serie de diferentes especificaciones. Para hacer su vida un poco mas facil, aqui tienen un tutorial para la creacion de los projectos.<br />
<br />
=== Lenguajes de programación ===<br />
<br />
Anteriormente, CodeWarrior tambien funcionaba con lenguajes como Pascal,Object Pascal, Objective-C y java, pero en la actualidad cuenta con lenguaje C, C++ y lenguaje ensamblador. Lo bueno de contar con un compilador para lenguaje C, C++ y ensamblador es que se puede codificar dependiendo de que nivel se necesite manejar. Ademas de esto, se pueden crear codigos mixtos de modo que se pueden realizar codigos mas rapidos y mas efectivos.<br />
<br />
==== Lenguaje Ensamblador ====<br />
<br />
Para hacer uso de lenguaje ensamblador en CodeWarrior aqui les dejo un link hacia el instruction set en donde podran encontrar la información especifica sobre cuales instrucciones maneja y cuales son sus funciones, ademas de explicar la sintaxis de programación. [http://cache.freescale.com/files/microcontrollers/doc/ref_manual/HCS08RMV1.pdf Manual y set de Instrucciones] <br />
<br />
==== Combinación de lenguajes ====<br />
<br />
Para hacer uso de una combinacion de lenguaje C y lenguaje ensamblador, debemos crear un proyecto en lenguaje C y luego si hay necesidad de utilizar lenguaje ensamblador usaremos el comando '''_ASM''' para cada instrucción o simplemente colocamos el comando seguido de unos corchetes en donde colocaremos todas las instrucciones que deseemos en este lenguaje.<br />
<br />
<br />
<br />
=== Creacion de un proyecto ===<br />
<br />
Para crear un nuevo proyecto deben abrir el CodeWarrior V6.3 (Haciendo doble click el CodeWarrior IDE) y lo primero que veran sera esta ventana: <br />
<br />
[[Archivo:CrearProyecto1.jpg|275px|Primera Ventana]]<br />
Aqui seleccionaran la primera opción que dice '''Create New Proyect''' en donde ahora aparecera la segunda ventana:<br />
<br />
[[Archivo:CrearProyecto2.jpg|thumb|right|400px|Segunda Ventana]]<br />
<br />
<br />
<br />
Aqui van a seleccionar primero la '''serie''' a la que pertenece su microcontrolador (HC08, HCS08, RS08, ColdFire V1 o Flexis), en nuestro caso sera flexis, esta se expandera y mostrara las diferentes familias de micros que se pueden seleccionar. Seleccionen la '''familia''' a la cual pertenece su micro, en nuestro caso la familia QE, y finalmente seleccionen su '''micro''', en nuestro caso el MC9S08QE128.<br />
Observaran que al seleccionar su micro, arriba a la derecha en el recuadro blanco aparecieron varias opciones. Escogan siempre '''Full Chip Simulation''' como su conección y den click en '''next'''.<br />
<br />
<br />
<br />
[[Archivo:CrearProyecto3.jpg|thumb|left|400px|Tercera Ventana]]<br />
Se abrira esta tercera ventana en la cual seleccionaremos el lenguaje, el nombre del proyecto y la localizacion donde se desea guardar el archivo:<br />
<br />
<br />
<br />
Primero observaremos 4 opciones para el lenguaje '''Absolute Assembly''' para codificar unicamente en lenguaje ensamblador, '''Relocatable Assembly''' para codificar principalmente en lenguaje ensamblador, '''C''' para codificar principalmente en lenguaje C y '''C++''' para codificar principalmente en C++. Con estos ultimos 3 seleccionas el lenguaje principal pero permites la codificacion mixta.<br />
La seleccion de nombre y localizacion del proyecto son a gusto del consumidor. <br />
<br />
<br />
<br />
[[Archivo:CrearProyecto5.jpg|right|Cuarta Ventana]]<br />
Al finalizar den click en '''next''' y aparecera una cuarta ventana para añadir proyectos ya existentes desde tu computadora hacia el CodeWarrior Donde solo deberas buscar los archivos que quieras añadir y luego hacer click en '''add'''. Luego de finalizar (hallan añadido o no algun proyecto) hagan click en '''next'''.<br />
<br />
<br />
<br />
[[Archivo:CrearProyecto4.jpg|thumb|left|Quinta Ventana]]<br />
Aparecera la quinta ventana en donde apareceran 3 opciones '''None''', '''Device Inicialization''' y '''Processor Expert''' que sirven para un inicializado rapido en el main. Para nuestro proyecto no es necesaria ninguna inicialización por lo que se debe seleccionar '''None''' y luego dar click en '''next'''.<br />
<br />
<br />
Por ultimo tendremos una sexta ventana en la que no le aplicaremos ningun cambio y simplemente haremos click en '''Finish''' y de esta manera estara listo nuestro proyecto para ser codificado.<br />
<br />
<br />
<br />
Por si no quedo muy clara la explicacion de como crear el proyecto, aqui dejo un video de youtube en donde explican exactamente lo mismo que aqui solo que en video: [http://www.youtube.com/watch?v=EZG9FF0bX78 Tutorial en youtube]<br />
<br />
==== Depuracion del Proyecto ====<br />
<br />
Para depurar el programa codificado, solo hace falta hacer click en el boton [[Archivo:BotonDebug.jpg]] con la que pueden suceder 2 cosas (Utilizando la conexion en '''Full Chip Simulation'''):<br />
<br />
1.- Aparecera la ventana de error diciendo que lineas del código tienen algun error o warning. Tambien pueden aparecer comentarios que hace el compilador.<br />
<br />
2.- El programa se depurara y se abrira la ventana '''True-time Simulator & Real-time Debugger'''.<br />
<br />
Si nos encontramos en el segundo caso, observaremos los siguientes puntos en la ventana que abrira:<br />
<br />
1.- Icono para correr el programa completo o hasta hallar una parada (breakpoint).<br />
2.- Icono para correr el programa instruccion por instrucción.<br />
3.- Icono para saltar una instrucción.<br />
4.- Icono para salir de una instrucción.<br />
5.- Icono para correr instruccion por instruccion en ensamblador.<br />
6.- Icono para detener la corrida del programa.<br />
7.- Icono para detener y reiniciar el programa.<br />
8.- Indicador de una parada (breakpoint). Este se puede colocar haciendo click derecho en la instruccion en que deseas para y seleccionando '''Set breakpoint'''.<br />
<br />
<br />
<br />
[[Archivo:VentanaSimulacion.jpg]]<br />
<br />
En el caso de estar conectado al microcontrolador, para depurar el programa debemos tener configurada la conexión en '''P&E Multilink/Cyclone Pro''' y al hacerlo observaremos 2 ventanas adicionales, la primera preguntandonos si queremos conectar y descargar nuestro programa hacia el micro (Borrando el programa que este tenia anteriormente), y una segunda ventana en la que nos pedira una ultima confirmación. A partir de ahi, las herramientas para correr el programa son exactamente las mismas que cuando no se tiene el micro conectado.<br />
<br />
==== Carpetas iniciales ====<br />
<br />
Al finalizar la creación del proyecto aparecerán varias carpetas iniciales como se ve en la imagen<br />
[[Archivo:CarpetasIniciales.jpg|thumb|left|250px|Carpetas Iniciales]]<br />
1.- El main.c es el archivo sobre el cual haremos nuestro código. <br />
2.- El derivative.h es un archivo que se encarga de incluir la definición del micro.<br />
3.- El archivo que posee el nombre de nuestro micro (MC9HCS08QE128.h) Contiene la inicialización y definición<br />
de todos los registros, máscaras, tipos, puertos, vectores, entre otros referentes, de nuestro micro. Si se requiere <br />
saber el nombre que se da para algún dato necesitado, aquí se puede encontrar. <br />
4.- El resto de las carpetas y archivos son importantes para nosotros, sin embargo no deben ser modificadas ya<br />
que son las bases para nuestro proyecto.<br />
<br />
==== Añadir Archivos ====<br />
<br />
Para introducir un archivo al programa en necesario crearlo haciendo click arriba a la izquierda en el boton [[Archivo:BotonCrearArchivo.jpg]]. Una vez creado el archivo y guardado, éste se puede añadir a nuestro main al realizar los siguientes pasos:<br />
* Guardar el proyecto .c en caso de ser un programa y .h en caso de ser una declaración. <br />
Nota: Todo archivo .c debe tener un archivo de nombre idéntico .h en donde sea declarado.<br />
* Hacer click arriba en la barra donde dice Proyecto<br />
* Hacer click en la primera opción '''add (nombre del proyecto) to Project'''<br />
* Colocar en el main<br />
#include "nombre.h"<br />
<br />
=Device Initialization=<br />
<br />
[[Archivo:Device.jpg|thumb|right|800px|Carpetas Iniciales]]<br />
<br />
Codewarrior posee más de una sola manera de diseñar un proyecto, así como herramientas que facilitan la completación del mismo. El device initialization es una de estas herramientas.<br />
<br />
==Descripción==<br />
<br />
Existe una serie de características que hacen que el uso del device initialization sea eficiente.<br />
<br />
*Posee una interfaz gráfica con el usuario. Le permite al usuario literalmente "ver" el microcontrolador y en donde van conectados sus pines.<br />
<br />
*Si colocas el mouse en algún parámetro o puerto que vaya a ser modificado con el código de diseño, el programa inmediatamente resaltara los registros que se están usándo en el puerto señalado.<br />
<br />
*Es un método fácil para inicializar los periféricos. Así como están mostrados en el gráfico del microcontrolador el 'device initialization' permite inicializarlos automáticamente, en otras palabras puede generar código para la inicialización de los periféricos, y se puede elegir si se quiere generar código en C o en ASSEMBLER.<br />
<br />
==Inicialización==<br />
<br />
*Crear un proyecto como ya se explicó anteriormente<br />
<br />
*Ir a la barra principal del CODEWARRIOR y presionar 'DEVICE INITIALIZATION', saldrá un pequeño menú donde se seleccionará 'initialize device'.<br />
<br />
* Ahora se puede ver la interfaz gráfica del microcontrolador, seleccionar los valores de los parámetros, que se desean cambiar, puertos, Módulos IRQ, etc. Al seleccionarlos se podrán cambiar los valores predeterminados.<br />
<br />
*Ya elegidos los parámetros, se debe seleccionar 'GENERATE CODE', ésto generara el código de las inicializaciones de los periféricos. Elegir si se desea código en C o ASSEMBLER. El código generado sera guardado en el proyecto en una carpeta llamada "generated code".<br />
<br />
= Links Externos =<br />
* [http://disenodigital.unlugar.com/articulos/METROWERKS%20CODEWARRIOR.pdf Que es CodeWarrior], por Metrowerks<br />
* [http://cache.freescale.com/files/soft_dev_tools/doc/app_note/AN3936.pdf Instalación en Windows 7 64-bit], Propuesta de Freescale<br />
* [http://www.ezebrizzio.com.ar/?p=95 Instalación en Windows 7 64-bit], Propuesta personal 1<br />
<br />
<br />
<br />
[[Categoría:Freescale]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Freescale_Codewarrior_6.3&diff=2426Freescale Codewarrior 6.32012-12-01T01:39:53Z<p>Francjsalanova: </p>
<hr />
<div>[[Archivo:CodeWarrior-image2.jpg|thumb|right|400px|Freescale CodeWarrior]]<br />
<br />
CodeWarrior es una herramienta basada en un entorno IDE (Integrated Development Environment). Desarrollado por Metrowerks, CodeWarrior integra edición de archivos, compilación optimizada, simulación de código, depuración y programación de diferentes dispositivos tales como el MPU, MCU, DSP, entre otros.<br />
<br />
Este programa trae la versatilidad de programar en lenguaje ensamblador, C, C++ e incluso permite combinaciones de código en los tres tipos mencionados.<br />
<br />
Los productos clasicos de CodeWarrior fueron lanzados originalmente para Macintosh (Mac), Microsoft Windows, Linux, Solaris, PlayStation 2, Nintendo GameCube, Nintendo DS, Nintendo Wii, Palm OS, Symbian OS e incluso BeOs. Sin embargo, a partir de CodeWarrior Pro 10 se descontinuo la version para Macintosh.<br />
<br />
== Instalación ==<br />
<br />
La instalacion de este software no es gratuita. Se debe poseer una licencia para poder ser instalado y para esto se debe comprar el software directamente o se debe adquirir algun dispositivo con el cual viene un CD con el programa para su instalacion. CodeWarrior originalmente es creado para computadoras cuyo sistema operativo es de 32-bit. <br />
<br />
=== Windows 7 de 64-bit ===<br />
<br />
En el caso de Windows 7 de 64-bit se encontraran con que el escudo de instalacion (install shield) abortara la instalacion al detectar que el sistema operativo es de 64-bit. Para arreglar esto se tienen las siguientes propuestas.<br />
<br />
==== Propuesta de Freescale ====<br />
<br />
Freescale propone descargar un programa de Microsoft llamado Windows virtual PC para trabajar con el sistema operativo Windows XP que es compatible con casi todos los programas que se desean instalar y que no sean compatibles con Windos 7 de 64-bit.<br />
<br />
Para esta propuesta de Freescale puede que se encuentren con el problema de que es necesario tener Windows 7 Professional, Enterprise o Ultimate para que sea compatible, pero el Windows 7 mas comun es el Home Premium por lo que surte un segundo problema.<br />
<br />
Si logra descargar esta maquina virtual, Instale ahi el CodeWarrior y podra utilizarlo cuando desee.<br />
<br />
==== Propuesta personal 1 ====<br />
<br />
Una mas sencilla opcion, y mas eficiente, es seguir los siguientes pasos:<br />
<br />
1.- Crear una carpeta llamada Freescale dentro de '''C:\Program Files(x86)'''<br />
2.- Descargar el siguiente archivo y descomprimirlo en la carpeta creada [https://dl.dropbox.com/u/43803714/codewarrior%20V6.3.rar '''CodeWarrior for Microcontrollers V6''']<br />
3.- Ubicar el archivo '''Mwregsvr.exe''' dentro de la carpeta bin<br />
4.- Seleccionar el archivo y con click derecho entrar a '''propiedades'''<br />
5.- Seleccionar la etiqueta de '''Compatibilidad''' y configurar de la siguiente manera:<br />
[[Archivo:Compatibilidad-Windos7.jpg]]<br />
y presionar aceptar.<br />
6.- En esa misma carpeta, ejecute el archivo '''regservers.bat'''(acepte todos los permisos de Windows)<br />
7.- Ahora, en la misma carpeta, ubique el archivo '''IDE.exe''' y cree un acceso directo al escritorio<br />
8.- Listo!! Ahora pueden utilizar el CodeWarrior V6.3 en Windows 7 de 64-bit directamente de su PC sin utilizar maquinas virtuales<br />
<br />
==== Propuesta personal 2 ====<br />
<br />
En caso de querer trabajar con una maquina virtual, recomiendo descargar una llamada Virtual Box, de Oracle, que es compatible con todos los sistemas operativos y ademas te da la capacidad de instalar cualquier sistema operativo que desees (MacOS, todo tipo de Windows, Linux, etc..) sin importar que sea de 64-bit o 32-bit. <br />
<br />
Luego de poseer esta maquina virtual, Instale ahi el CodeWarrior y podra utilizarlo cuando desee.<br />
<br />
== Proyectos ==<br />
<br />
CodeWarrior, como muchos programas, trabaja mediante la creación de proyectos y para esto se tienen una gran variedad de opciones para la codificacion tales como elegir que lenguaje se utilizara ( C, C++, ensamblador o Mixto), Elegir el microcontrolador a utilizar, entre otra serie de diferentes especificaciones. Para hacer su vida un poco mas facil, aqui tienen un tutorial para la creacion de los projectos.<br />
<br />
=== Lenguajes de programación ===<br />
<br />
Anteriormente, CodeWarrior tambien funcionaba con lenguajes como Pascal,Object Pascal, Objective-C y java, pero en la actualidad cuenta con lenguaje C, C++ y lenguaje ensamblador. Lo bueno de contar con un compilador para lenguaje C, C++ y ensamblador es que se puede codificar dependiendo de que nivel se necesite manejar. Ademas de esto, se pueden crear codigos mixtos de modo que se pueden realizar codigos mas rapidos y mas efectivos.<br />
<br />
==== Lenguaje Ensamblador ====<br />
<br />
Para hacer uso de lenguaje ensamblador en CodeWarrior aqui les dejo un link hacia el instruction set en donde podran encontrar la información especifica sobre cuales instrucciones maneja y cuales son sus funciones, ademas de explicar la sintaxis de programación. [http://cache.freescale.com/files/microcontrollers/doc/ref_manual/HCS08RMV1.pdf Manual y set de Instrucciones] <br />
<br />
==== Combinación de lenguajes ====<br />
<br />
Para hacer uso de una combinacion de lenguaje C y lenguaje ensamblador, debemos crear un proyecto en lenguaje C y luego si hay necesidad de utilizar lenguaje ensamblador usaremos el comando '''_ASM''' para cada instrucción o simplemente colocamos el comando seguido de unos corchetes en donde colocaremos todas las instrucciones que deseemos en este lenguaje.<br />
<br />
<br />
<br />
=== Creacion de un proyecto ===<br />
<br />
Para crear un nuevo proyecto deben abrir el CodeWarrior V6.3 (Haciendo doble click el CodeWarrior IDE) y lo primero que veran sera esta ventana: <br />
<br />
[[Archivo:CrearProyecto1.jpg|275px|Primera Ventana]]<br />
Aqui seleccionaran la primera opción que dice '''Create New Proyect''' en donde ahora aparecera la segunda ventana:<br />
<br />
[[Archivo:CrearProyecto2.jpg|thumb|right|400px|Segunda Ventana]]<br />
<br />
<br />
<br />
Aqui van a seleccionar primero la '''serie''' a la que pertenece su microcontrolador (HC08, HCS08, RS08, ColdFire V1 o Flexis), en nuestro caso sera flexis, esta se expandera y mostrara las diferentes familias de micros que se pueden seleccionar. Seleccionen la '''familia''' a la cual pertenece su micro, en nuestro caso la familia QE, y finalmente seleccionen su '''micro''', en nuestro caso el MC9S08QE128.<br />
Observaran que al seleccionar su micro, arriba a la derecha en el recuadro blanco aparecieron varias opciones. Escogan siempre '''Full Chip Simulation''' como su conección y den click en '''next'''.<br />
<br />
<br />
<br />
[[Archivo:CrearProyecto3.jpg|thumb|left|400px|Tercera Ventana]]<br />
Se abrira esta tercera ventana en la cual seleccionaremos el lenguaje, el nombre del proyecto y la localizacion donde se desea guardar el archivo:<br />
<br />
<br />
<br />
Primero observaremos 4 opciones para el lenguaje '''Absolute Assembly''' para codificar unicamente en lenguaje ensamblador, '''Relocatable Assembly''' para codificar principalmente en lenguaje ensamblador, '''C''' para codificar principalmente en lenguaje C y '''C++''' para codificar principalmente en C++. Con estos ultimos 3 seleccionas el lenguaje principal pero permites la codificacion mixta.<br />
La seleccion de nombre y localizacion del proyecto son a gusto del consumidor. <br />
<br />
<br />
<br />
[[Archivo:CrearProyecto5.jpg|right|Cuarta Ventana]]<br />
Al finalizar den click en '''next''' y aparecera una cuarta ventana para añadir proyectos ya existentes desde tu computadora hacia el CodeWarrior Donde solo deberas buscar los archivos que quieras añadir y luego hacer click en '''add'''. Luego de finalizar (hallan añadido o no algun proyecto) hagan click en '''next'''.<br />
<br />
<br />
<br />
[[Archivo:CrearProyecto4.jpg|thumb|left|Quinta Ventana]]<br />
Aparecera la quinta ventana en donde apareceran 3 opciones '''None''', '''Device Inicialization''' y '''Processor Expert''' que sirven para un inicializado rapido en el main. Para nuestro proyecto no es necesaria ninguna inicialización por lo que se debe seleccionar '''None''' y luego dar click en '''next'''.<br />
<br />
<br />
Por ultimo tendremos una sexta ventana en la que no le aplicaremos ningun cambio y simplemente haremos click en '''Finish''' y de esta manera estara listo nuestro proyecto para ser codificado.<br />
<br />
<br />
<br />
Por si no quedo muy clara la explicacion de como crear el proyecto, aqui dejo un video de youtube en donde explican exactamente lo mismo que aqui solo que en video: [http://www.youtube.com/watch?v=EZG9FF0bX78 Tutorial en youtube]<br />
<br />
==== Depuracion del Proyecto ====<br />
<br />
Para depurar el programa codificado, solo hace falta hacer click en el boton [[Archivo:BotonDebug.jpg]] con la que pueden suceder 2 cosas (Utilizando la conexion en '''Full Chip Simulation'''):<br />
<br />
1.- Aparecera la ventana de error diciendo que lineas del código tienen algun error o warning. Tambien pueden aparecer comentarios que hace el compilador.<br />
<br />
2.- El programa se depurara y se abrira la ventana '''True-time Simulator & Real-time Debugger'''.<br />
<br />
Si nos encontramos en el segundo caso, observaremos los siguientes puntos en la ventana que abrira:<br />
<br />
1.- Icono para correr el programa completo o hasta hallar una parada (breakpoint).<br />
2.- Icono para correr el programa instruccion por instrucción.<br />
3.- Icono para saltar una instrucción.<br />
4.- Icono para salir de una instrucción.<br />
5.- Icono para correr instruccion por instruccion en ensamblador.<br />
6.- Icono para detener la corrida del programa.<br />
7.- Icono para detener y reiniciar el programa.<br />
8.- Indicador de una parada (breakpoint). Este se puede colocar haciendo click derecho en la instruccion en que deseas para y seleccionando '''Set breakpoint'''.<br />
<br />
<br />
<br />
<br />
[[Archivo:VentanaSimulacion.jpg]]<br />
<br />
En el caso de estar conectado al microcontrolador, para depurar el programa debemos tener configurada la conexión en '''P&E Multilink/Cyclone Pro''' y al hacerlo observaremos 2 ventanas adicionales, la primera preguntandonos si queremos conectar y descargar nuestro programa hacia el micro (Borrando el programa que este tenia anteriormente), y una segunda ventana en la que nos pedira una ultima confirmación. A partir de ahi, las herramientas para correr el programa son exactamente las mismas que cuando no se tiene el micro conectado.<br />
<br />
==== Carpetas iniciales ====<br />
<br />
Al finalizar la creación del proyecto aparecerán varias carpetas iniciales como se ve en la imagen<br />
[[Archivo:CarpetasIniciales.jpg|thumb|left|250px|Carpetas Iniciales]]<br />
1.- El main.c es el archivo sobre el cual haremos nuestro código. <br />
2.- El derivative.h es un archivo que se encarga de incluir la definición del micro.<br />
3.- El archivo que posee el nombre de nuestro micro (MC9HCS08QE128.h) Contiene la inicialización y definición<br />
de todos los registros, máscaras, tipos, puertos, vectores, entre otros referentes, de nuestro micro. Si se requiere <br />
saber el nombre que se da para algún dato necesitado, aquí se puede encontrar. <br />
4.- El resto de las carpetas y archivos son importantes para nosotros, sin embargo no deben ser modificadas ya<br />
que son las bases para nuestro proyecto.<br />
<br />
==== Añadir Archivos ====<br />
<br />
Para introducir un archivo al programa en necesario crearlo haciendo click arriba a la izquierda en el boton [[Archivo:BotonCrearArchivo.jpg]]. Una vez creado el archivo y guardado, éste se puede añadir a nuestro main al realizar los siguientes pasos:<br />
* Guardar el proyecto .c en caso de ser un programa y .h en caso de ser una declaración. <br />
Nota: Todo archivo .c debe tener un archivo de nombre idéntico .h en donde sea declarado.<br />
* Hacer click arriba en la barra donde dice Proyecto<br />
* Hacer click en la primera opción '''add (nombre del proyecto) to Project'''<br />
* Colocar en el main<br />
#include "nombre.h"<br />
<br />
=Device Initialization=<br />
<br />
[[Archivo:Device.jpg|thumb|right|800px|Carpetas Iniciales]]<br />
<br />
Codewarrior posee más de una sola manera de diseñar un proyecto, así como herramientas que facilitan la completación del mismo. El device initialization es una de estas herramientas.<br />
<br />
==Descripción==<br />
<br />
Existe una serie de características que hacen que el uso del device initialization sea eficiente.<br />
<br />
*Posee una interfaz gráfica con el usuario. Le permite al usuario literalmente "ver" el microcontrolador y en donde van conectados sus pines.<br />
<br />
*Si colocas el mouse en algún parámetro o puerto que vaya a ser modificado con el código de diseño, el programa inmediatamente resaltara los registros que se están usándo en el puerto señalado.<br />
<br />
*Es un método fácil para inicializar los periféricos. Así como están mostrados en el gráfico del microcontrolador el 'device initialization' permite inicializarlos automáticamente, en otras palabras puede generar código para la inicialización de los periféricos, y se puede elegir si se quiere generar código en C o en ASSEMBLER.<br />
<br />
==Inicialización==<br />
<br />
*Crear un proyecto como ya se explicó anteriormente<br />
<br />
*Ir a la barra principal del CODEWARRIOR y presionar 'DEVICE INITIALIZATION', saldrá un pequeño menú donde se seleccionará 'initialize device'.<br />
<br />
* Ahora se puede ver la interfaz gráfica del microcontrolador, seleccionar los valores de los parámetros, que se desean cambiar, puertos, Módulos IRQ, etc. Al seleccionarlos se podrán cambiar los valores predeterminados.<br />
<br />
*Ya elegidos los parámetros, se debe seleccionar 'GENERATE CODE', ésto generara el código de las inicializaciones de los periféricos. Elegir si se desea código en C o ASSEMBLER. El código generado sera guardado en el proyecto en una carpeta llamada "generated code".<br />
<br />
= Links Externos =<br />
* [http://disenodigital.unlugar.com/articulos/METROWERKS%20CODEWARRIOR.pdf Que es CodeWarrior], por Metrowerks<br />
* [http://cache.freescale.com/files/soft_dev_tools/doc/app_note/AN3936.pdf Instalación en Windows 7 64-bit], Propuesta de Freescale<br />
* [http://www.ezebrizzio.com.ar/?p=95 Instalación en Windows 7 64-bit], Propuesta personal 1<br />
<br />
<br />
<br />
[[Categoría:Freescale]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Buzzer_-_DEMOQE128&diff=2424Buzzer - DEMOQE1282012-12-01T01:31:54Z<p>Francjsalanova: </p>
<hr />
<div>[[Categoría: DEMOQE128]]<br />
[[Archivo:Buzzer demo.jpg|200px|thumb|right|Piezo Buzzer DEMOQE128]] <br />
<br />
==''Buzzer''==<br />
<br />
[[Archivo:Buzzer 1.jpg|200px|thumb|left|Piezo Buzzer (MSPS23H)Precio por unidad: US$0.22-0.25]]<br />
Un ''buzzer'' es un transductor electro acústico o dispositivo de señales de audio que produce un tono<br />
intermitente o continuo dependiendo de cómo se programe; existen muchos tipos de ''buzzer'' <br />
desde electromecánicos hasta piezoeléctricos. <br />
<br />
[[Archivo:BUZZER transducer.jpg|200px|thumb|right|Piezo Transducer (MSPT23A)Precio por unidad US $ 0.1-0.5]]<br />
[[Archivo:BUZZER_magnetico.jpg|200px|thumb|letf|SMD Magnetic Buzzer (MSES12D)Precio por unidad: US $ 0.1-0.5]] <br />
Existe una gran variedad de modelos de ''buzzer'', desde magnéticos hasta piezoeléctricos, con distintos precios y especificaciones.<br />
Elegir cual de estos modelos es mejor depende enteramente de el uso que se le quiera dar. Un ''buzzer'' puede servir como alarma, beeper, avisos de fallos o aciertos en ciertos programas o incluso se puede implementar para lograr tonos armónicos o canciones.<br />
Mas adelante explicaremos como se puede hacer un tono con el ''buzzer'' he incluso una secuencia de tonos que formen una canción y como crear silencios entre canciones.<br />
<br />
<br />
[[Archivo:Piezo buzzer 2.jpg|200px|thumb|right| Piezo Buzzer (MSPS43B)Precio por unidad: US $ 0.5-1.0 ]]<br />
<br />
El [[Tarjeta de Desarrollo - DEMOQE128|DEMOQE128]] contiene un piezo ''buzzer''. El corazón de un ''buzzer'' piezoeléctrico es un disco de piezo el cual consiste en una placa cerámica recubierto de una capa metálica. Debe tener incluido un oscilador para ser considerado ''buzzer''.<br />
<br />
==Inicializaciones de ''Buzzer''==<br />
<br />
Antes de empezar a codificar y trabajar con el ''buzzer'' se debe verificar que el DEMOQE128 posea los <br />
settings necesarios para su funcionamiento:<br />
<br />
• Colocar los [[JUMPER SETTINGS|jumpers]] de manera que se permita la salida de la señal al ''buzzer''. El ''buzzer'' <br />
depende de que el jumper J19 este colocado de la siguiente manera:<br />
<br />
[[Archivo:Jumper buzzer.jpg|289px|thumb|center|Jumper del ''Buzzer'' ]] <br />
<br />
• Tener en cuenta con que puerto trabaja el ''Buzzer'' y activarlo como salida. Se debe colocar <br />
el puerto PTBDD como salida ya que el ''buzzer'' funciona por medio de PTBD_PTB5.<br />
<br />
<br />
<pre> PTBDD= 0xFF; </pre><br />
<br />
==Implementación==<br />
<br />
Antes de empezar a utilizar el ''buzzer'' se debe tener en cuenta un par de cosas importantes:<br />
<br />
• El ''buzzer'' es parte del hardware del DEMOQE128, no depende del micro controlador implementado.<br />
• El ''buzzer'' no posee una estructura definida de control <br />
• La implementación del ''buzzer'' depende del código.<br />
<br />
<br />
Como se mencionó anteriormente para implementar el ''buzzer'' no contamos con registros de control ni con secuencias de instrucciones de control, para poder utilizarlo debemos trabajar dentro del código. <br />
Se debe programar el código de manera que emule una señal periódica, de esta manera podemos usar esta señal como salida para el dispositivo , el cual arrojará los tonos programados.<br />
<br />
<br />
'''¿Cómo crear una señal periódica?'''<br />
<br />
Se puede utilizar una señal periódica para implementar los tonos en el ''buzzer'', para efectos prácticos el ''buzzer'' solo recibirá un 1 o un 0 dependiendo de en que tiempo se tome la señal y cuanto tiempo se mantenga en dicha salida. Una señal cuadrática sería un buen ejemplo para la implementación de este método de diseño.<br />
<br />
<br />
[[Archivo:Onda cuadrada.jpg|613px|thumb|center|Onda periodica de salida al ''Buzzer'']] <br />
<br />
<br />
Al momento de crear la señal hay que tomar en cuenta ciertas cosas para el tipo de tono que se quiera producir, entre esas están las siguientes:<br />
<br />
• La cantidad de ciclos de reloj de la onda<br />
• La duración en la que se repetirá la onda cuadrada deseada<br />
• El diseño de los tiempos entre tonos para evitar que se solapen<br />
<br />
==Generación de solo un tono==<br />
<br />
===Por interrupciones RTC===<br />
<br />
<br />
<pre>• Colocar como salida el puerto PTBDD. Esto permite generar una salida en el puerto que esta conectado al ''buzzer''.<br />
<br />
PTBDD = 0xff; <br />
<br />
</pre><br />
<br />
• Habilitar interrupciones [[RTC (Real-timer counter) - MC9S08QE128|RTC (Real Time Counter)]]:<br />
<br />
Las interrupciones RTC se usarán para determinar el periodo de la onda.<br />
<br />
'''En assembler''' <br />
<br />
<pre><br />
<br />
<br />
LDA #$04 ; Valor necesario para habilitar en el registro RTC del SCGC2 (reg 3)<br />
STA SCGC2 ; Habilita BUS clock para RTC , SYSTEM CLOCK GATING CONTROL REGISTER, PROCESO<br />
<br />
LDA #$00<br />
STA RTCMOD ;Se inicializa el módulo Real Time Counter, real time counter módulo<br />
LDA #$1E ;para que active la bandera RTIF cada 1s , interrupciones cada seg<br />
STA RTCSC ; real time estado y registros de control<br />
<br />
</pre><br />
<br />
'''En lenguaje C'''<br />
<pre><br />
<br />
SCGC2=0x04; //Habilita BUS clock para RTC , SYSTEM CLOCK GATING CONTROL REGISTER, PROCESO<br />
RTCMOD=0x00; //Se inicializa el módulo Real Time Counter, real time counter modulo<br />
RTCSC=0x1E; //para que active la bandera RTIF cada 1s , interrupciones cada seg<br />
//real time estado y registros de control <br />
<br />
</pre><br />
• El periodo de la onda es determinado de la siguiente manera: <br />
<br />
El programa entrará en la rutina de interrupción que se diseñó anteriormente por RTC, durante esta rutina se negará la salida PTBD_PTB5, esto determina la mitad del periodo. Si se observa la onda cuadrada se puede notar que con cada cambio de flanco o salida negada la amplitud de la onda cambia de “0” a “1”, cuando la onda haga dos cambios (vuelva al estado que se toma como referencia) se cumple un periodo, por eso cada interrupción por RTC representa medio periodo.<br />
<br />
<br />
• Se continúa negando la salida PTBD_PTB5 por un tiempo indeterminado, esto genera un tono en la salida del ''buzzer'', el cual reconoce los cambios en el periodo de la señal como el tono en cuestión.<br />
<br />
'''Variación de tonos:'''<br />
<br />
• Para cambiar el tono, se debe configurar el RTC de manera que module la duración entre interrupciones (esto cambiará el periodo de la onda). <br />
<br />
• En el caso que se quiera programar mas de una secuencia de tonos, o "canciones" juntas, un dato de interés podría ser que el ''buzzer'' no puede <br />
reconocer frecuencias ( expresadas en periodos) muy altas o muy bajas, lo cual usualmente es útil para hacer "silencios"entre una cancion y otra.<br />
<br />
===Generación de tonos manual (sin RTC)===<br />
<br />
• Los primeros pasos de inicialización son exactamente iguales con o sin RTC<br />
<br />
<br />
• Al momento de implementar las interrupciones, si no se posee el conocimiento para usar el RTC también se puede crear un periodo “manualmente”, se debe tener como parámetro la cantidad de ciclos de reloj que tendrá la onda cuadrada. Luego se debe “sincronizar” el tiempo que tarda cada instrucción del programa con respecto a la cantidad e ciclos de la onda. Para poder completar los ciclos faltantes (la onda usualmente se toma mas ciclos de reloj que las instrucciones de cambio de periodo) se pueden utilizar “nops” iterados dentro de las mismas instrucciones si se trata de assembler o ciclos si se trabaja con C. <br />
<br />
• Se puede utilizar una tabla de frecuencias para cada “nota” que se desea, si se quiere hacer un sonido específico ( esto para cuando se desea generar mas de un tono), el programa leerá estas variaciones y las tomará como un cambio en el periodo, que en si es lo que define que nota tomara como salida el ''buzzer''. <br />
<br />
• Aunque es posible generar una onda de esta manera es mejor utilizar el RTC pues este diseño es muy poco eficiencia y se desperdicia la verdadera capacidad del [[Tarjeta de Desarrollo - DEMOQE128|DEMOQE128]]. <br />
<br />
Un ejemplo de este diseño sería:<br />
<br />
<br />
<pre><br />
;************************************************************************** ; <br />
;*** Rutina de generación de ondas cuadradas, de 30 ciclos de reloj *******;<br />
;*** se llevará a cabo tantas veces como indique PERIODO, ******* ; <br />
;*** Luego negará la salida del ''Buzzer'' y repetirá el conteo de PERIODO ****;<br />
;*** 30 ciclos * 250 ns (Tiempo de cada ciclo) = 7.5uS *****************;<br />
;**************************************************************************; <br />
<br />
MOV 0, COUNTER;<br />
MOV 0, COUNTER_2<br />
<br />
Flanco: NOP ;1 ciclo - Los NOP son para compensar los ciclos usados en cambiar el flanco<br />
LDA COUNTER <br />
INCA<br />
STA COUNTER<br />
BNE COUNTER, #12,Flanco <br />
<br />
Cambio: NOP <br />
LDA COUNTER <br />
INCA<br />
STA COUNTER<br />
BNE COUNTER, #10,Cambio <br />
<br />
AIX #-1 ;2 ciclos<br />
CPHX #$0000 ;3 ciclos - Revisa si el contador llega a cero, compare hx con el valor<br />
BNE Flanco ;3 ciclos - Si aun no se termina el periodo, decrementar contador, NECESITA DE RESULTADO DE LA funcion anterior para actuar<br />
<br />
COM PTBD ;5 ciclos<br />
LDHX periodo ;5 ciclos<br />
BRA Cambio ;3 ciclos - Si ya terminó el periodo, pasar al siguiente flanco<br />
<br />
<br />
;**************************************************************<br />
</pre><br />
<br />
•Para el uso de esta instrucción también se necesita el uso de una tabla de frecuencias que representen una escala de notas o tonos, el programa leerá la "canción"que no sera mas que una combinación de las frecuencias de la tabla y las traducirá a cambios en periodo como se mencionó anteriormente. un modelo de dicha tabla podría ser:<br />
<br />
<pre><br />
;Tabla de Notas musicales ordenadas por octava: do, do#,re,re#,mi,fa,fa#,sol,sol#,la,la#,si <br />
;do, do#,re,re#,mi, fa, fa#,sol,sol#,la,la#,si<br />
SILENCIO: DC.W $FFFF<br />
OCTAVA1: DC.W 509,480,454,428,403,381,359,339,320,302,285,269 ;3<br />
OCTAVA2: DC.W 254,240,226,213,201,190,179,169,160,151,143,135 ;4<br />
OCTAVA3: DC.W 126,119,113,106,100,94,89,84,79,75,71,66 ;5<br />
OCTAVA4: DC.W 63,59,56,53,50,47,44,42,39,37,35,33 ;6 <br />
</pre><br />
•Aun así se recomienda de nuevo no utilizar este método sino uno que implique la variación del periodo por medio de RTC, lo que haría que la cantidad de líneas de código de el programa disminuya significativamente ademas de ser la manera correcta de programar y aprovechar eficientemente las funciones del DEMOQE128.<br />
<br />
==Programa de Prueba==<br />
<br />
A continuación se puede observar un enlace a youtube con un video de la implementación del ''buzzer'', está programado para reproducir dos fragmentos de canciones del juego "ZELDA", primero "''Serenade Of Water''", luego, y con un silencio de segundo y medio, sonará un fragmento de "''Song Of Storms''".<br />
<br />
http://www.youtube.com/watch?v=jyfUEQ8zmCY<br />
<br />
==Referencias==<br />
<br />
•[http://www.soundbuzzer.com Imágenes de los ''buzzers'']<br />
<br />
•[http://cache.freescale.com/files/microcontrollers/doc/user_guide/DEMOQE128UM.pdf?fpsp=1&WT_TYPE=Users%20Guides&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation DEMOQE128UM]<br />
<br />
[[Categoría: DEMOQE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Buzzer_-_DEMOQE128&diff=2423Buzzer - DEMOQE1282012-12-01T01:30:46Z<p>Francjsalanova: </p>
<hr />
<div>[[Categoría: DEMOQE128]]<br />
[[Archivo:Buzzer demo.jpg|200px|thumb|right|Piezo Buzzer DEMOQE128]] <br />
<br />
==''Buzzer''==<br />
<br />
[[Archivo:Buzzer 1.jpg|200px|thumb|left|Piezo Buzzer (MSPS23H)Precio por unidad: US$0.22-0.25]]<br />
Un ''buzzer'' es un transductor electro acústico o dispositivo de señales de audio que produce un tono<br />
intermitente o continuo dependiendo de cómo se programe; existen muchos tipos de ''buzzer'' <br />
desde electromecánicos hasta piezoeléctricos. <br />
<br />
[[Archivo:BUZZER transducer.jpg|200px|thumb|right|Piezo Transducer (MSPT23A)Precio por unidad US $ 0.1-0.5]]<br />
[[Archivo:BUZZER_magnetico.jpg|200px|thumb|letf|SMD Magnetic Buzzer (MSES12D)Precio por unidad: US $ 0.1-0.5]] <br />
Existe una gran variedad de modelos de ''buzzer'', desde magnéticos hasta piezoeléctricos, con distintos precios y especificaciones.<br />
Elegir cual de estos modelos es mejor depende enteramente de el uso que se le quiera dar. Un ''buzzer'' puede servir como alarma, beeper, avisos de fallos o aciertos en ciertos programas o incluso se puede implementar para lograr tonos armónicos o canciones.<br />
Mas adelante explicaremos como se puede hacer un tono con el ''buzzer'' he incluso una secuencia de tonos que formen una canción y como crear silencios entre canciones.<br />
<br />
<br />
[[Archivo:Piezo buzzer 2.jpg|200px|thumb|right| Piezo Buzzer (MSPS43B)Precio por unidad: US $ 0.5-1.0 ]]<br />
<br />
El [[Tarjeta de Desarrollo - DEMOQE128|DEMOQE128]] contiene un piezo ''buzzer''. El corazón de un ''buzzer'' piezoeléctrico es un disco de piezo el cual consiste en una placa cerámica recubierto de una capa metálica. Debe tener incluido un oscilador para ser considerado ''buzzer''.<br />
<br />
==Inicializaciones de ''Buzzer''==<br />
<br />
Antes de empezar a codificar y trabajar con el ''buzzer'' se debe verificar que el DEMOQE128 posea los <br />
settings necesarios para su funcionamiento:<br />
<br />
• Colocar los [[JUMPER SETTINGS|jumpers]] de manera que se permita la salida de la señal al ''buzzer''. El ''buzzer'' <br />
depende de que el jumper J19 este colocado de la siguiente manera:<br />
<br />
[[Archivo:Jumper buzzer.jpg|289px|thumb|center|Jumper del ''Buzzer'' ]] <br />
<br />
• Tener en cuenta con que puerto trabaja el ''Buzzer'' y activarlo como salida. Se debe colocar <br />
el puerto PTBDD como salida ya que el ''buzzer'' funciona por medio de PTBD_PTB5.<br />
<br />
<br />
<pre> PTBDD= 0xFF; </pre><br />
<br />
==Implementación==<br />
<br />
Antes de empezar a utilizar el ''buzzer'' se debe tener en cuenta un par de cosas importantes:<br />
<br />
• El ''buzzer'' es parte del hardware del DEMOQE128, no depende del micro controlador implementado.<br />
• El ''buzzer'' no posee una estructura definida de control <br />
• La implementación del ''buzzer'' depende del código.<br />
<br />
<br />
Como se mencionó anteriormente para implementar el ''buzzer'' no contamos con registros de control ni con secuencias de instrucciones de control, para poder utilizarlo debemos trabajar dentro del código. <br />
Se debe programar el código de manera que emule una señal periódica, de esta manera podemos usar esta señal como salida para el dispositivo , el cual arrojará los tonos programados.<br />
<br />
<br />
'''¿Cómo crear una señal periódica?'''<br />
<br />
Se puede utilizar una señal periódica para implementar los tonos en el ''buzzer'', para efectos prácticos el ''buzzer'' solo recibirá un 1 o un 0 dependiendo de en que tiempo se tome la señal y cuanto tiempo se mantenga en dicha salida. Una señal cuadrática sería un buen ejemplo para la implementación de este método de diseño.<br />
<br />
<br />
[[Archivo:Onda cuadrada.jpg|613px|thumb|center|Onda periodica de salida al ''Buzzer'']] <br />
<br />
<br />
Al momento de crear la señal hay que tomar en cuenta ciertas cosas para el tipo de tono que se quiera producir, entre esas están las siguientes:<br />
<br />
• La cantidad de ciclos de reloj de la onda<br />
• La duración en la que se repetirá la onda cuadrada deseada<br />
• El diseño de los tiempos entre tonos para evitar que se solapen<br />
<br />
==Generación de solo un tono==<br />
<br />
===Por interrupciones RTC===<br />
<br />
<br />
<pre>• Colocar como salida el puerto PTBDD. Esto permite generar una salida en el puerto que esta conectado al ''buzzer''.<br />
<br />
PTBDD = 0xff; <br />
<br />
</pre><br />
<br />
• Habilitar interrupciones [[RTC (Real-timer counter) - MC9S08QE128|RTC (Real Time Counter)]]:<br />
<br />
Las interrupciones RTC se usarán para determinar el periodo de la onda.<br />
<br />
'''En assembler''' <br />
<br />
<syntaxhighlight lang="asm"><pre><br />
<br />
<br />
LDA #$04 ; Valor necesario para habilitar en el registro RTC del SCGC2 (reg 3)<br />
STA SCGC2 ; Habilita BUS clock para RTC , SYSTEM CLOCK GATING CONTROL REGISTER, PROCESO<br />
<br />
LDA #$00<br />
STA RTCMOD ;Se inicializa el módulo Real Time Counter, real time counter módulo<br />
LDA #$1E ;para que active la bandera RTIF cada 1s , interrupciones cada seg<br />
STA RTCSC ; real time estado y registros de control<br />
<br />
</pre></syntaxhighlight><br />
<br />
'''En lenguaje C'''<br />
<pre><syntaxhighlight lang="C"><br />
<br />
SCGC2=0x04; //Habilita BUS clock para RTC , SYSTEM CLOCK GATING CONTROL REGISTER, PROCESO<br />
RTCMOD=0x00; //Se inicializa el módulo Real Time Counter, real time counter modulo<br />
RTCSC=0x1E; //para que active la bandera RTIF cada 1s , interrupciones cada seg<br />
//real time estado y registros de control <br />
<br />
</syntaxhighlight></pre><br />
• El periodo de la onda es determinado de la siguiente manera: <br />
<br />
El programa entrará en la rutina de interrupción que se diseñó anteriormente por RTC, durante esta rutina se negará la salida PTBD_PTB5, esto determina la mitad del periodo. Si se observa la onda cuadrada se puede notar que con cada cambio de flanco o salida negada la amplitud de la onda cambia de “0” a “1”, cuando la onda haga dos cambios (vuelva al estado que se toma como referencia) se cumple un periodo, por eso cada interrupción por RTC representa medio periodo.<br />
<br />
<br />
• Se continúa negando la salida PTBD_PTB5 por un tiempo indeterminado, esto genera un tono en la salida del ''buzzer'', el cual reconoce los cambios en el periodo de la señal como el tono en cuestión.<br />
<br />
'''Variación de tonos:'''<br />
<br />
• Para cambiar el tono, se debe configurar el RTC de manera que module la duración entre interrupciones (esto cambiará el periodo de la onda). <br />
<br />
• En el caso que se quiera programar mas de una secuencia de tonos, o "canciones" juntas, un dato de interés podría ser que el ''buzzer'' no puede <br />
reconocer frecuencias ( expresadas en periodos) muy altas o muy bajas, lo cual usualmente es útil para hacer "silencios"entre una cancion y otra.<br />
<br />
===Generación de tonos manual (sin RTC)===<br />
<br />
• Los primeros pasos de inicialización son exactamente iguales con o sin RTC<br />
<br />
<br />
• Al momento de implementar las interrupciones, si no se posee el conocimiento para usar el RTC también se puede crear un periodo “manualmente”, se debe tener como parámetro la cantidad de ciclos de reloj que tendrá la onda cuadrada. Luego se debe “sincronizar” el tiempo que tarda cada instrucción del programa con respecto a la cantidad e ciclos de la onda. Para poder completar los ciclos faltantes (la onda usualmente se toma mas ciclos de reloj que las instrucciones de cambio de periodo) se pueden utilizar “nops” iterados dentro de las mismas instrucciones si se trata de assembler o ciclos si se trabaja con C. <br />
<br />
• Se puede utilizar una tabla de frecuencias para cada “nota” que se desea, si se quiere hacer un sonido específico ( esto para cuando se desea generar mas de un tono), el programa leerá estas variaciones y las tomará como un cambio en el periodo, que en si es lo que define que nota tomara como salida el ''buzzer''. <br />
<br />
• Aunque es posible generar una onda de esta manera es mejor utilizar el RTC pues este diseño es muy poco eficiencia y se desperdicia la verdadera capacidad del [[Tarjeta de Desarrollo - DEMOQE128|DEMOQE128]]. <br />
<br />
Un ejemplo de este diseño sería:<br />
<br />
<br />
<pre><syntaxhighlight lang="asm"><br />
;************************************************************************** ; <br />
;*** Rutina de generación de ondas cuadradas, de 30 ciclos de reloj *******;<br />
;*** se llevará a cabo tantas veces como indique PERIODO, ******* ; <br />
;*** Luego negará la salida del ''Buzzer'' y repetirá el conteo de PERIODO ****;<br />
;*** 30 ciclos * 250 ns (Tiempo de cada ciclo) = 7.5uS *****************;<br />
;**************************************************************************; <br />
<br />
MOV 0, COUNTER;<br />
MOV 0, COUNTER_2<br />
<br />
Flanco: NOP ;1 ciclo - Los NOP son para compensar los ciclos usados en cambiar el flanco<br />
LDA COUNTER <br />
INCA<br />
STA COUNTER<br />
BNE COUNTER, #12,Flanco <br />
<br />
Cambio: NOP <br />
LDA COUNTER <br />
INCA<br />
STA COUNTER<br />
BNE COUNTER, #10,Cambio <br />
<br />
AIX #-1 ;2 ciclos<br />
CPHX #$0000 ;3 ciclos - Revisa si el contador llega a cero, compare hx con el valor<br />
BNE Flanco ;3 ciclos - Si aun no se termina el periodo, decrementar contador, NECESITA DE RESULTADO DE LA funcion anterior para actuar<br />
<br />
COM PTBD ;5 ciclos<br />
LDHX periodo ;5 ciclos<br />
BRA Cambio ;3 ciclos - Si ya terminó el periodo, pasar al siguiente flanco<br />
<br />
<br />
;**************************************************************<br />
</syntaxhighlight></pre><br />
<br />
•Para el uso de esta instrucción también se necesita el uso de una tabla de frecuencias que representen una escala de notas o tonos, el programa leerá la "canción"que no sera mas que una combinación de las frecuencias de la tabla y las traducirá a cambios en periodo como se mencionó anteriormente. un modelo de dicha tabla podría ser:<br />
<br />
<pre><syntaxhighlight lang="asm"> <br />
;Tabla de Notas musicales ordenadas por octava: do, do#,re,re#,mi,fa,fa#,sol,sol#,la,la#,si <br />
;do, do#,re,re#,mi, fa, fa#,sol,sol#,la,la#,si<br />
SILENCIO: DC.W $FFFF<br />
OCTAVA1: DC.W 509,480,454,428,403,381,359,339,320,302,285,269 ;3<br />
OCTAVA2: DC.W 254,240,226,213,201,190,179,169,160,151,143,135 ;4<br />
OCTAVA3: DC.W 126,119,113,106,100,94,89,84,79,75,71,66 ;5<br />
OCTAVA4: DC.W 63,59,56,53,50,47,44,42,39,37,35,33 ;6 <br />
</syntaxhighlight></pre><br />
•Aun así se recomienda de nuevo no utilizar este método sino uno que implique la variación del periodo por medio de RTC, lo que haría que la cantidad de líneas de código de el programa disminuya significativamente ademas de ser la manera correcta de programar y aprovechar eficientemente las funciones del DEMOQE128.<br />
<br />
==Programa de Prueba==<br />
<br />
A continuación se puede observar un enlace a youtube con un video de la implementación del ''buzzer'', está programado para reproducir dos fragmentos de canciones del juego "ZELDA", primero "''Serenade Of Water''", luego, y con un silencio de segundo y medio, sonará un fragmento de "''Song Of Storms''".<br />
<br />
http://www.youtube.com/watch?v=jyfUEQ8zmCY<br />
<br />
==Referencias==<br />
<br />
•[http://www.soundbuzzer.com Imágenes de los ''buzzers'']<br />
<br />
•[http://cache.freescale.com/files/microcontrollers/doc/user_guide/DEMOQE128UM.pdf?fpsp=1&WT_TYPE=Users%20Guides&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation DEMOQE128UM]<br />
<br />
[[Categoría: DEMOQE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Buzzer_-_DEMOQE128&diff=2422Buzzer - DEMOQE1282012-12-01T01:30:43Z<p>Francjsalanova: </p>
<hr />
<div>[[Categoría: DEMOQE128]]<br />
[[Archivo:Buzzer demo.jpg|200px|thumb|right|Piezo Buzzer DEMOQE128]] <br />
<br />
==''Buzzer''==<br />
<br />
[[Archivo:Buzzer 1.jpg|200px|thumb|left|Piezo Buzzer (MSPS23H)Precio por unidad: US$0.22-0.25]]<br />
Un ''buzzer'' es un transductor electro acústico o dispositivo de señales de audio que produce un tono<br />
intermitente o continuo dependiendo de cómo se programe; existen muchos tipos de ''buzzer'' <br />
desde electromecánicos hasta piezoeléctricos. <br />
<br />
[[Archivo:BUZZER transducer.jpg|200px|thumb|right|Piezo Transducer (MSPT23A)Precio por unidad US $ 0.1-0.5]]<br />
[[Archivo:BUZZER_magnetico.jpg|200px|thumb|letf|SMD Magnetic Buzzer (MSES12D)Precio por unidad: US $ 0.1-0.5]] <br />
Existe una gran variedad de modelos de ''buzzer'', desde magnéticos hasta piezoeléctricos, con distintos precios y especificaciones.<br />
Elegir cual de estos modelos es mejor depende enteramente de el uso que se le quiera dar. Un ''buzzer'' puede servir como alarma, beeper, avisos de fallos o aciertos en ciertos programas o incluso se puede implementar para lograr tonos armónicos o canciones.<br />
Mas adelante explicaremos como se puede hacer un tono con el ''buzzer'' he incluso una secuencia de tonos que formen una canción y como crear silencios entre canciones.<br />
<br />
<br />
[[Archivo:Piezo buzzer 2.jpg|200px|thumb|right| Piezo Buzzer (MSPS43B)Precio por unidad: US $ 0.5-1.0 ]]<br />
<br />
El [[Tarjeta de Desarrollo - DEMOQE128|DEMOQE128]] contiene un piezo ''buzzer''. El corazón de un ''buzzer'' piezoeléctrico es un disco de piezo el cual consiste en una placa cerámica recubierto de una capa metálica. Debe tener incluido un oscilador para ser considerado ''buzzer''.<br />
<br />
==Inicializaciones de ''Buzzer''==<br />
<br />
Antes de empezar a codificar y trabajar con el ''buzzer'' se debe verificar que el DEMOQE128 posea los <br />
settings necesarios para su funcionamiento:<br />
<br />
• Colocar los [[JUMPER SETTINGS|jumpers]] de manera que se permita la salida de la señal al ''buzzer''. El ''buzzer'' <br />
depende de que el jumper J19 este colocado de la siguiente manera:<br />
<br />
[[Archivo:Jumper buzzer.jpg|289px|thumb|center|Jumper del ''Buzzer'' ]] <br />
<br />
• Tener en cuenta con que puerto trabaja el ''Buzzer'' y activarlo como salida. Se debe colocar <br />
el puerto PTBDD como salida ya que el ''buzzer'' funciona por medio de PTBD_PTB5.<br />
<br />
<br />
<pre> PTBDD= 0xFF; </pre><br />
<br />
==Implementación==<br />
<br />
Antes de empezar a utilizar el ''buzzer'' se debe tener en cuenta un par de cosas importantes:<br />
<br />
• El ''buzzer'' es parte del hardware del DEMOQE128, no depende del micro controlador implementado.<br />
• El ''buzzer'' no posee una estructura definida de control <br />
• La implementación del ''buzzer'' depende del código.<br />
<br />
<br />
Como se mencionó anteriormente para implementar el ''buzzer'' no contamos con registros de control ni con secuencias de instrucciones de control, para poder utilizarlo debemos trabajar dentro del código. <br />
Se debe programar el código de manera que emule una señal periódica, de esta manera podemos usar esta señal como salida para el dispositivo , el cual arrojará los tonos programados.<br />
<br />
<br />
'''¿Cómo crear una señal periódica?'''<br />
<br />
Se puede utilizar una señal periódica para implementar los tonos en el ''buzzer'', para efectos prácticos el ''buzzer'' solo recibirá un 1 o un 0 dependiendo de en que tiempo se tome la señal y cuanto tiempo se mantenga en dicha salida. Una señal cuadrática sería un buen ejemplo para la implementación de este método de diseño.<br />
<br />
<br />
[[Archivo:Onda cuadrada.jpg|613px|thumb|center|Onda periodica de salida al ''Buzzer'']] <br />
<br />
<br />
Al momento de crear la señal hay que tomar en cuenta ciertas cosas para el tipo de tono que se quiera producir, entre esas están las siguientes:<br />
<br />
• La cantidad de ciclos de reloj de la onda<br />
• La duración en la que se repetirá la onda cuadrada deseada<br />
• El diseño de los tiempos entre tonos para evitar que se solapen<br />
<br />
==Generación de solo un tono==<br />
<br />
===Por interrupciones RTC===<br />
<br />
<br />
<pre>• Colocar como salida el puerto PTBDD. Esto permite generar una salida en el puerto que esta conectado al ''buzzer''.<br />
<br />
PTBDD= 0xff; <br />
<br />
</pre><br />
<br />
• Habilitar interrupciones [[RTC (Real-timer counter) - MC9S08QE128|RTC (Real Time Counter)]]:<br />
<br />
Las interrupciones RTC se usarán para determinar el periodo de la onda.<br />
<br />
'''En assembler''' <br />
<br />
<syntaxhighlight lang="asm"><pre><br />
<br />
<br />
LDA #$04 ; Valor necesario para habilitar en el registro RTC del SCGC2 (reg 3)<br />
STA SCGC2 ; Habilita BUS clock para RTC , SYSTEM CLOCK GATING CONTROL REGISTER, PROCESO<br />
<br />
LDA #$00<br />
STA RTCMOD ;Se inicializa el módulo Real Time Counter, real time counter módulo<br />
LDA #$1E ;para que active la bandera RTIF cada 1s , interrupciones cada seg<br />
STA RTCSC ; real time estado y registros de control<br />
<br />
</pre></syntaxhighlight><br />
<br />
'''En lenguaje C'''<br />
<pre><syntaxhighlight lang="C"><br />
<br />
SCGC2=0x04; //Habilita BUS clock para RTC , SYSTEM CLOCK GATING CONTROL REGISTER, PROCESO<br />
RTCMOD=0x00; //Se inicializa el módulo Real Time Counter, real time counter modulo<br />
RTCSC=0x1E; //para que active la bandera RTIF cada 1s , interrupciones cada seg<br />
//real time estado y registros de control <br />
<br />
</syntaxhighlight></pre><br />
• El periodo de la onda es determinado de la siguiente manera: <br />
<br />
El programa entrará en la rutina de interrupción que se diseñó anteriormente por RTC, durante esta rutina se negará la salida PTBD_PTB5, esto determina la mitad del periodo. Si se observa la onda cuadrada se puede notar que con cada cambio de flanco o salida negada la amplitud de la onda cambia de “0” a “1”, cuando la onda haga dos cambios (vuelva al estado que se toma como referencia) se cumple un periodo, por eso cada interrupción por RTC representa medio periodo.<br />
<br />
<br />
• Se continúa negando la salida PTBD_PTB5 por un tiempo indeterminado, esto genera un tono en la salida del ''buzzer'', el cual reconoce los cambios en el periodo de la señal como el tono en cuestión.<br />
<br />
'''Variación de tonos:'''<br />
<br />
• Para cambiar el tono, se debe configurar el RTC de manera que module la duración entre interrupciones (esto cambiará el periodo de la onda). <br />
<br />
• En el caso que se quiera programar mas de una secuencia de tonos, o "canciones" juntas, un dato de interés podría ser que el ''buzzer'' no puede <br />
reconocer frecuencias ( expresadas en periodos) muy altas o muy bajas, lo cual usualmente es útil para hacer "silencios"entre una cancion y otra.<br />
<br />
===Generación de tonos manual (sin RTC)===<br />
<br />
• Los primeros pasos de inicialización son exactamente iguales con o sin RTC<br />
<br />
<br />
• Al momento de implementar las interrupciones, si no se posee el conocimiento para usar el RTC también se puede crear un periodo “manualmente”, se debe tener como parámetro la cantidad de ciclos de reloj que tendrá la onda cuadrada. Luego se debe “sincronizar” el tiempo que tarda cada instrucción del programa con respecto a la cantidad e ciclos de la onda. Para poder completar los ciclos faltantes (la onda usualmente se toma mas ciclos de reloj que las instrucciones de cambio de periodo) se pueden utilizar “nops” iterados dentro de las mismas instrucciones si se trata de assembler o ciclos si se trabaja con C. <br />
<br />
• Se puede utilizar una tabla de frecuencias para cada “nota” que se desea, si se quiere hacer un sonido específico ( esto para cuando se desea generar mas de un tono), el programa leerá estas variaciones y las tomará como un cambio en el periodo, que en si es lo que define que nota tomara como salida el ''buzzer''. <br />
<br />
• Aunque es posible generar una onda de esta manera es mejor utilizar el RTC pues este diseño es muy poco eficiencia y se desperdicia la verdadera capacidad del [[Tarjeta de Desarrollo - DEMOQE128|DEMOQE128]]. <br />
<br />
Un ejemplo de este diseño sería:<br />
<br />
<br />
<pre><syntaxhighlight lang="asm"><br />
;************************************************************************** ; <br />
;*** Rutina de generación de ondas cuadradas, de 30 ciclos de reloj *******;<br />
;*** se llevará a cabo tantas veces como indique PERIODO, ******* ; <br />
;*** Luego negará la salida del ''Buzzer'' y repetirá el conteo de PERIODO ****;<br />
;*** 30 ciclos * 250 ns (Tiempo de cada ciclo) = 7.5uS *****************;<br />
;**************************************************************************; <br />
<br />
MOV 0, COUNTER;<br />
MOV 0, COUNTER_2<br />
<br />
Flanco: NOP ;1 ciclo - Los NOP son para compensar los ciclos usados en cambiar el flanco<br />
LDA COUNTER <br />
INCA<br />
STA COUNTER<br />
BNE COUNTER, #12,Flanco <br />
<br />
Cambio: NOP <br />
LDA COUNTER <br />
INCA<br />
STA COUNTER<br />
BNE COUNTER, #10,Cambio <br />
<br />
AIX #-1 ;2 ciclos<br />
CPHX #$0000 ;3 ciclos - Revisa si el contador llega a cero, compare hx con el valor<br />
BNE Flanco ;3 ciclos - Si aun no se termina el periodo, decrementar contador, NECESITA DE RESULTADO DE LA funcion anterior para actuar<br />
<br />
COM PTBD ;5 ciclos<br />
LDHX periodo ;5 ciclos<br />
BRA Cambio ;3 ciclos - Si ya terminó el periodo, pasar al siguiente flanco<br />
<br />
<br />
;**************************************************************<br />
</syntaxhighlight></pre><br />
<br />
•Para el uso de esta instrucción también se necesita el uso de una tabla de frecuencias que representen una escala de notas o tonos, el programa leerá la "canción"que no sera mas que una combinación de las frecuencias de la tabla y las traducirá a cambios en periodo como se mencionó anteriormente. un modelo de dicha tabla podría ser:<br />
<br />
<pre><syntaxhighlight lang="asm"> <br />
;Tabla de Notas musicales ordenadas por octava: do, do#,re,re#,mi,fa,fa#,sol,sol#,la,la#,si <br />
;do, do#,re,re#,mi, fa, fa#,sol,sol#,la,la#,si<br />
SILENCIO: DC.W $FFFF<br />
OCTAVA1: DC.W 509,480,454,428,403,381,359,339,320,302,285,269 ;3<br />
OCTAVA2: DC.W 254,240,226,213,201,190,179,169,160,151,143,135 ;4<br />
OCTAVA3: DC.W 126,119,113,106,100,94,89,84,79,75,71,66 ;5<br />
OCTAVA4: DC.W 63,59,56,53,50,47,44,42,39,37,35,33 ;6 <br />
</syntaxhighlight></pre><br />
•Aun así se recomienda de nuevo no utilizar este método sino uno que implique la variación del periodo por medio de RTC, lo que haría que la cantidad de líneas de código de el programa disminuya significativamente ademas de ser la manera correcta de programar y aprovechar eficientemente las funciones del DEMOQE128.<br />
<br />
==Programa de Prueba==<br />
<br />
A continuación se puede observar un enlace a youtube con un video de la implementación del ''buzzer'', está programado para reproducir dos fragmentos de canciones del juego "ZELDA", primero "''Serenade Of Water''", luego, y con un silencio de segundo y medio, sonará un fragmento de "''Song Of Storms''".<br />
<br />
http://www.youtube.com/watch?v=jyfUEQ8zmCY<br />
<br />
==Referencias==<br />
<br />
•[http://www.soundbuzzer.com Imágenes de los ''buzzers'']<br />
<br />
•[http://cache.freescale.com/files/microcontrollers/doc/user_guide/DEMOQE128UM.pdf?fpsp=1&WT_TYPE=Users%20Guides&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation DEMOQE128UM]<br />
<br />
[[Categoría: DEMOQE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Buzzer_-_DEMOQE128&diff=2421Buzzer - DEMOQE1282012-12-01T01:29:31Z<p>Francjsalanova: </p>
<hr />
<div>[[Categoría: DEMOQE128]]<br />
[[Archivo:Buzzer demo.jpg|200px|thumb|right|Piezo Buzzer DEMOQE128]] <br />
<br />
==''Buzzer''==<br />
<br />
[[Archivo:Buzzer 1.jpg|200px|thumb|left|Piezo Buzzer (MSPS23H)Precio por unidad: US$0.22-0.25]]<br />
Un ''buzzer'' es un transductor electro acústico o dispositivo de señales de audio que produce un tono<br />
intermitente o continuo dependiendo de cómo se programe; existen muchos tipos de ''buzzer'' <br />
desde electromecánicos hasta piezoeléctricos. <br />
<br />
[[Archivo:BUZZER transducer.jpg|200px|thumb|right|Piezo Transducer (MSPT23A)Precio por unidad US $ 0.1-0.5]]<br />
[[Archivo:BUZZER_magnetico.jpg|200px|thumb|letf|SMD Magnetic Buzzer (MSES12D)Precio por unidad: US $ 0.1-0.5]] <br />
Existe una gran variedad de modelos de ''buzzer'', desde magnéticos hasta piezoeléctricos, con distintos precios y especificaciones.<br />
Elegir cual de estos modelos es mejor depende enteramente de el uso que se le quiera dar. Un ''buzzer'' puede servir como alarma, beeper, avisos de fallos o aciertos en ciertos programas o incluso se puede implementar para lograr tonos armónicos o canciones.<br />
Mas adelante explicaremos como se puede hacer un tono con el ''buzzer'' he incluso una secuencia de tonos que formen una canción y como crear silencios entre canciones.<br />
<br />
<br />
[[Archivo:Piezo buzzer 2.jpg|200px|thumb|right| Piezo Buzzer (MSPS43B)Precio por unidad: US $ 0.5-1.0 ]]<br />
<br />
El [[Tarjeta de Desarrollo - DEMOQE128|DEMOQE128]] contiene un piezo ''buzzer''. El corazón de un ''buzzer'' piezoeléctrico es un disco de piezo el cual consiste en una placa cerámica recubierto de una capa metálica. Debe tener incluido un oscilador para ser considerado ''buzzer''.<br />
<br />
==Inicializaciones de ''Buzzer''==<br />
<br />
Antes de empezar a codificar y trabajar con el ''buzzer'' se debe verificar que el DEMOQE128 posea los <br />
settings necesarios para su funcionamiento:<br />
<br />
• Colocar los [[JUMPER SETTINGS|jumpers]] de manera que se permita la salida de la señal al ''buzzer''. El ''buzzer'' <br />
depende de que el jumper J19 este colocado de la siguiente manera:<br />
<br />
[[Archivo:Jumper buzzer.jpg|289px|thumb|center|Jumper del ''Buzzer'' ]] <br />
<br />
• Tener en cuenta con que puerto trabaja el ''Buzzer'' y activarlo como salida. Se debe colocar <br />
el puerto PTBDD como salida ya que el ''buzzer'' funciona por medio de PTBD_PTB5.<br />
<br />
<br />
<pre> PTBDD= 0xFF; </pre><br />
<br />
==Implementación==<br />
<br />
Antes de empezar a utilizar el ''buzzer'' se debe tener en cuenta un par de cosas importantes:<br />
<br />
• El ''buzzer'' es parte del hardware del DEMOQE128, no depende del micro controlador implementado.<br />
• El ''buzzer'' no posee una estructura definida de control <br />
• La implementación del ''buzzer'' depende del código.<br />
<br />
<br />
Como se mencionó anteriormente para implementar el ''buzzer'' no contamos con registros de control ni con secuencias de instrucciones de control, para poder utilizarlo debemos trabajar dentro del código. <br />
Se debe programar el código de manera que emule una señal periódica, de esta manera podemos usar esta señal como salida para el dispositivo , el cual arrojará los tonos programados.<br />
<br />
<br />
'''¿Cómo crear una señal periódica?'''<br />
<br />
Se puede utilizar una señal periódica para implementar los tonos en el ''buzzer'', para efectos prácticos el ''buzzer'' solo recibirá un 1 o un 0 dependiendo de en que tiempo se tome la señal y cuanto tiempo se mantenga en dicha salida. Una señal cuadrática sería un buen ejemplo para la implementación de este método de diseño.<br />
<br />
<br />
[[Archivo:Onda cuadrada.jpg|613px|thumb|center|Onda periodica de salida al ''Buzzer'']] <br />
<br />
<br />
Al momento de crear la señal hay que tomar en cuenta ciertas cosas para el tipo de tono que se quiera producir, entre esas están las siguientes:<br />
<br />
• La cantidad de ciclos de reloj de la onda<br />
• La duración en la que se repetirá la onda cuadrada deseada<br />
• El diseño de los tiempos entre tonos para evitar que se solapen<br />
<br />
==Generación de solo un tono==<br />
<br />
===Por interrupciones RTC===<br />
<br />
<br />
<pre>• Colocar como salida el puerto PTBDD. Esto permite generar una salida en el puerto que esta conectado al ''buzzer''.<br />
<syntaxhighlight lang="C"><br />
PTBDD= 0xff; <br />
<br />
</syntaxhighlight></pre><br />
<br />
• Habilitar interrupciones [[RTC (Real-timer counter) - MC9S08QE128|RTC (Real Time Counter)]]:<br />
<br />
Las interrupciones RTC se usarán para determinar el periodo de la onda.<br />
<br />
'''En assembler''' <br />
<br />
<syntaxhighlight lang="asm"><pre><br />
<br />
<br />
LDA #$04 ; Valor necesario para habilitar en el registro RTC del SCGC2 (reg 3)<br />
STA SCGC2 ; Habilita BUS clock para RTC , SYSTEM CLOCK GATING CONTROL REGISTER, PROCESO<br />
<br />
LDA #$00<br />
STA RTCMOD ;Se inicializa el módulo Real Time Counter, real time counter módulo<br />
LDA #$1E ;para que active la bandera RTIF cada 1s , interrupciones cada seg<br />
STA RTCSC ; real time estado y registros de control<br />
<br />
</pre></syntaxhighlight><br />
<br />
'''En lenguaje C'''<br />
<pre><syntaxhighlight lang="C"><br />
<br />
SCGC2=0x04; //Habilita BUS clock para RTC , SYSTEM CLOCK GATING CONTROL REGISTER, PROCESO<br />
RTCMOD=0x00; //Se inicializa el módulo Real Time Counter, real time counter modulo<br />
RTCSC=0x1E; //para que active la bandera RTIF cada 1s , interrupciones cada seg<br />
//real time estado y registros de control <br />
<br />
</syntaxhighlight></pre><br />
• El periodo de la onda es determinado de la siguiente manera: <br />
<br />
El programa entrará en la rutina de interrupción que se diseñó anteriormente por RTC, durante esta rutina se negará la salida PTBD_PTB5, esto determina la mitad del periodo. Si se observa la onda cuadrada se puede notar que con cada cambio de flanco o salida negada la amplitud de la onda cambia de “0” a “1”, cuando la onda haga dos cambios (vuelva al estado que se toma como referencia) se cumple un periodo, por eso cada interrupción por RTC representa medio periodo.<br />
<br />
<br />
• Se continúa negando la salida PTBD_PTB5 por un tiempo indeterminado, esto genera un tono en la salida del ''buzzer'', el cual reconoce los cambios en el periodo de la señal como el tono en cuestión.<br />
<br />
'''Variación de tonos:'''<br />
<br />
• Para cambiar el tono, se debe configurar el RTC de manera que module la duración entre interrupciones (esto cambiará el periodo de la onda). <br />
<br />
• En el caso que se quiera programar mas de una secuencia de tonos, o "canciones" juntas, un dato de interés podría ser que el ''buzzer'' no puede <br />
reconocer frecuencias ( expresadas en periodos) muy altas o muy bajas, lo cual usualmente es útil para hacer "silencios"entre una cancion y otra.<br />
<br />
===Generación de tonos manual (sin RTC)===<br />
<br />
• Los primeros pasos de inicialización son exactamente iguales con o sin RTC<br />
<br />
<br />
• Al momento de implementar las interrupciones, si no se posee el conocimiento para usar el RTC también se puede crear un periodo “manualmente”, se debe tener como parámetro la cantidad de ciclos de reloj que tendrá la onda cuadrada. Luego se debe “sincronizar” el tiempo que tarda cada instrucción del programa con respecto a la cantidad e ciclos de la onda. Para poder completar los ciclos faltantes (la onda usualmente se toma mas ciclos de reloj que las instrucciones de cambio de periodo) se pueden utilizar “nops” iterados dentro de las mismas instrucciones si se trata de assembler o ciclos si se trabaja con C. <br />
<br />
• Se puede utilizar una tabla de frecuencias para cada “nota” que se desea, si se quiere hacer un sonido específico ( esto para cuando se desea generar mas de un tono), el programa leerá estas variaciones y las tomará como un cambio en el periodo, que en si es lo que define que nota tomara como salida el ''buzzer''. <br />
<br />
• Aunque es posible generar una onda de esta manera es mejor utilizar el RTC pues este diseño es muy poco eficiencia y se desperdicia la verdadera capacidad del [[Tarjeta de Desarrollo - DEMOQE128|DEMOQE128]]. <br />
<br />
Un ejemplo de este diseño sería:<br />
<br />
<br />
<pre><syntaxhighlight lang="asm"><br />
;************************************************************************** ; <br />
;*** Rutina de generación de ondas cuadradas, de 30 ciclos de reloj *******;<br />
;*** se llevará a cabo tantas veces como indique PERIODO, ******* ; <br />
;*** Luego negará la salida del ''Buzzer'' y repetirá el conteo de PERIODO ****;<br />
;*** 30 ciclos * 250 ns (Tiempo de cada ciclo) = 7.5uS *****************;<br />
;**************************************************************************; <br />
<br />
MOV 0, COUNTER;<br />
MOV 0, COUNTER_2<br />
<br />
Flanco: NOP ;1 ciclo - Los NOP son para compensar los ciclos usados en cambiar el flanco<br />
LDA COUNTER <br />
INCA<br />
STA COUNTER<br />
BNE COUNTER, #12,Flanco <br />
<br />
Cambio: NOP <br />
LDA COUNTER <br />
INCA<br />
STA COUNTER<br />
BNE COUNTER, #10,Cambio <br />
<br />
AIX #-1 ;2 ciclos<br />
CPHX #$0000 ;3 ciclos - Revisa si el contador llega a cero, compare hx con el valor<br />
BNE Flanco ;3 ciclos - Si aun no se termina el periodo, decrementar contador, NECESITA DE RESULTADO DE LA funcion anterior para actuar<br />
<br />
COM PTBD ;5 ciclos<br />
LDHX periodo ;5 ciclos<br />
BRA Cambio ;3 ciclos - Si ya terminó el periodo, pasar al siguiente flanco<br />
<br />
<br />
;**************************************************************<br />
</syntaxhighlight></pre><br />
<br />
•Para el uso de esta instrucción también se necesita el uso de una tabla de frecuencias que representen una escala de notas o tonos, el programa leerá la "canción"que no sera mas que una combinación de las frecuencias de la tabla y las traducirá a cambios en periodo como se mencionó anteriormente. un modelo de dicha tabla podría ser:<br />
<br />
<pre><syntaxhighlight lang="asm"> <br />
;Tabla de Notas musicales ordenadas por octava: do, do#,re,re#,mi,fa,fa#,sol,sol#,la,la#,si <br />
;do, do#,re,re#,mi, fa, fa#,sol,sol#,la,la#,si<br />
SILENCIO: DC.W $FFFF<br />
OCTAVA1: DC.W 509,480,454,428,403,381,359,339,320,302,285,269 ;3<br />
OCTAVA2: DC.W 254,240,226,213,201,190,179,169,160,151,143,135 ;4<br />
OCTAVA3: DC.W 126,119,113,106,100,94,89,84,79,75,71,66 ;5<br />
OCTAVA4: DC.W 63,59,56,53,50,47,44,42,39,37,35,33 ;6 <br />
</syntaxhighlight></pre><br />
•Aun así se recomienda de nuevo no utilizar este método sino uno que implique la variación del periodo por medio de RTC, lo que haría que la cantidad de líneas de código de el programa disminuya significativamente ademas de ser la manera correcta de programar y aprovechar eficientemente las funciones del DEMOQE128.<br />
<br />
==Programa de Prueba==<br />
<br />
A continuación se puede observar un enlace a youtube con un video de la implementación del ''buzzer'', está programado para reproducir dos fragmentos de canciones del juego "ZELDA", primero "''Serenade Of Water''", luego, y con un silencio de segundo y medio, sonará un fragmento de "''Song Of Storms''".<br />
<br />
http://www.youtube.com/watch?v=jyfUEQ8zmCY<br />
<br />
==Referencias==<br />
<br />
•[http://www.soundbuzzer.com Imágenes de los ''buzzers'']<br />
<br />
•[http://cache.freescale.com/files/microcontrollers/doc/user_guide/DEMOQE128UM.pdf?fpsp=1&WT_TYPE=Users%20Guides&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation DEMOQE128UM]<br />
<br />
[[Categoría: DEMOQE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Buzzer_-_DEMOQE128&diff=2420Buzzer - DEMOQE1282012-12-01T01:28:15Z<p>Francjsalanova: </p>
<hr />
<div>[[Categoría: DEMOQE128]]<br />
[[Archivo:Buzzer demo.jpg|200px|thumb|right|Piezo Buzzer DEMOQE128]] <br />
<br />
==''Buzzer''==<br />
<br />
[[Archivo:Buzzer 1.jpg|200px|thumb|left|Piezo Buzzer (MSPS23H)Precio por unidad: US$0.22-0.25]]<br />
Un ''buzzer'' es un transductor electro acústico o dispositivo de señales de audio que produce un tono<br />
intermitente o continuo dependiendo de cómo se programe; existen muchos tipos de ''buzzer'' <br />
desde electromecánicos hasta piezoeléctricos. <br />
<br />
[[Archivo:BUZZER transducer.jpg|200px|thumb|right|Piezo Transducer (MSPT23A)Precio por unidad US $ 0.1-0.5]]<br />
[[Archivo:BUZZER_magnetico.jpg|200px|thumb|letf|SMD Magnetic Buzzer (MSES12D)Precio por unidad: US $ 0.1-0.5]] <br />
Existe una gran variedad de modelos de ''buzzer'', desde magnéticos hasta piezoeléctricos, con distintos precios y especificaciones.<br />
Elegir cual de estos modelos es mejor depende enteramente de el uso que se le quiera dar. Un ''buzzer'' puede servir como alarma, beeper, avisos de fallos o aciertos en ciertos programas o incluso se puede implementar para lograr tonos armónicos o canciones.<br />
Mas adelante explicaremos como se puede hacer un tono con el ''buzzer'' he incluso una secuencia de tonos que formen una canción y como crear silencios entre canciones.<br />
<br />
<br />
[[Archivo:Piezo buzzer 2.jpg|200px|thumb|right| Piezo Buzzer (MSPS43B)Precio por unidad: US $ 0.5-1.0 ]]<br />
<br />
El [[Tarjeta de Desarrollo - DEMOQE128|DEMOQE128]] contiene un piezo ''buzzer''. El corazón de un ''buzzer'' piezoeléctrico es un disco de piezo el cual consiste en una placa cerámica recubierto de una capa metálica. Debe tener incluido un oscilador para ser considerado ''buzzer''.<br />
<br />
==Inicializaciones de ''Buzzer''==<br />
<br />
Antes de empezar a codificar y trabajar con el ''buzzer'' se debe verificar que el DEMOQE128 posea los <br />
settings necesarios para su funcionamiento:<br />
<br />
• Colocar los [[JUMPER SETTINGS|jumpers]] de manera que se permita la salida de la señal al ''buzzer''. El ''buzzer'' <br />
depende de que el jumper J19 este colocado de la siguiente manera:<br />
<br />
[[Archivo:Jumper buzzer.jpg|289px|thumb|center|Jumper del ''Buzzer'' ]] <br />
<br />
• Tener en cuenta con que puerto trabaja el ''Buzzer'' y activarlo como salida. Se debe colocar <br />
el puerto PTBDD como salida ya que el ''buzzer'' funciona por medio de PTBD_PTB5.<br />
<br />
<br />
<pre> PTBDD= 0xFF; </pre><br />
<br />
==Implementación==<br />
<br />
Antes de empezar a utilizar el ''buzzer'' se debe tener en cuenta un par de cosas importantes:<br />
<br />
• El ''buzzer'' es parte del hardware del DEMOQE128, no depende del micro controlador implementado.<br />
• El ''buzzer'' no posee una estructura definida de control <br />
• La implementación del ''buzzer'' depende del código.<br />
<br />
<br />
Como se mencionó anteriormente para implementar el ''buzzer'' no contamos con registros de control ni con secuencias de instrucciones de control, para poder utilizarlo debemos trabajar dentro del código. <br />
Se debe programar el código de manera que emule una señal periódica, de esta manera podemos usar esta señal como salida para el dispositivo , el cual arrojará los tonos programados.<br />
<br />
<br />
'''¿Cómo crear una señal periódica?'''<br />
<br />
Se puede utilizar una señal periódica para implementar los tonos en el ''buzzer'', para efectos prácticos el ''buzzer'' solo recibirá un 1 o un 0 dependiendo de en que tiempo se tome la señal y cuanto tiempo se mantenga en dicha salida. Una señal cuadrática sería un buen ejemplo para la implementación de este método de diseño.<br />
<br />
<br />
[[Archivo:Onda cuadrada.jpg|613px|thumb|center|Onda periodica de salida al ''Buzzer'']] <br />
<br />
<br />
Al momento de crear la señal hay que tomar en cuenta ciertas cosas para el tipo de tono que se quiera producir, entre esas están las siguientes:<br />
<br />
• La cantidad de ciclos de reloj de la onda<br />
• La duración en la que se repetirá la onda cuadrada deseada<br />
• El diseño de los tiempos entre tonos para evitar que se solapen<br />
<br />
==Generación de solo un tono==<br />
<br />
===Por interrupciones RTC===<br />
<br />
<br />
<pre>• Colocar como salida el puerto PTBDD. Esto permite generar una salida en el puerto que esta conectado al ''buzzer''.<br />
<syntaxhighlight lang="C"><br />
PTBDD= 0xff; <br />
<br />
</syntaxhighlight></pre><br />
<br />
• Habilitar interrupciones [[RTC (Real-timer counter) - MC9S08QE128|RTC (Real Time Counter)]]:<br />
<br />
Las interrupciones RTC se usarán para determinar el periodo de la onda.<br />
<br />
'''En assembler''' <br />
<br />
<pre><syntaxhighlight lang="asm"><br />
<br />
<br />
LDA #$04 ; Valor necesario para habilitar en el registro RTC del SCGC2 (reg 3)<br />
STA SCGC2 ; Habilita BUS clock para RTC , SYSTEM CLOCK GATING CONTROL REGISTER, PROCESO<br />
<br />
LDA #$00<br />
STA RTCMOD ;Se inicializa el módulo Real Time Counter, real time counter módulo<br />
LDA #$1E ;para que active la bandera RTIF cada 1s , interrupciones cada seg<br />
STA RTCSC ; real time estado y registros de control<br />
<br />
</syntaxhighlight></pre><br />
<br />
'''En lenguaje C'''<br />
<pre><syntaxhighlight lang="C"><br />
<br />
SCGC2=0x04; //Habilita BUS clock para RTC , SYSTEM CLOCK GATING CONTROL REGISTER, PROCESO<br />
RTCMOD=0x00; //Se inicializa el módulo Real Time Counter, real time counter modulo<br />
RTCSC=0x1E; //para que active la bandera RTIF cada 1s , interrupciones cada seg<br />
//real time estado y registros de control <br />
<br />
</syntaxhighlight></pre><br />
• El periodo de la onda es determinado de la siguiente manera: <br />
<br />
El programa entrará en la rutina de interrupción que se diseñó anteriormente por RTC, durante esta rutina se negará la salida PTBD_PTB5, esto determina la mitad del periodo. Si se observa la onda cuadrada se puede notar que con cada cambio de flanco o salida negada la amplitud de la onda cambia de “0” a “1”, cuando la onda haga dos cambios (vuelva al estado que se toma como referencia) se cumple un periodo, por eso cada interrupción por RTC representa medio periodo.<br />
<br />
<br />
• Se continúa negando la salida PTBD_PTB5 por un tiempo indeterminado, esto genera un tono en la salida del ''buzzer'', el cual reconoce los cambios en el periodo de la señal como el tono en cuestión.<br />
<br />
'''Variación de tonos:'''<br />
<br />
• Para cambiar el tono, se debe configurar el RTC de manera que module la duración entre interrupciones (esto cambiará el periodo de la onda). <br />
<br />
• En el caso que se quiera programar mas de una secuencia de tonos, o "canciones" juntas, un dato de interés podría ser que el ''buzzer'' no puede <br />
reconocer frecuencias ( expresadas en periodos) muy altas o muy bajas, lo cual usualmente es útil para hacer "silencios"entre una cancion y otra.<br />
<br />
===Generación de tonos manual (sin RTC)===<br />
<br />
• Los primeros pasos de inicialización son exactamente iguales con o sin RTC<br />
<br />
<br />
• Al momento de implementar las interrupciones, si no se posee el conocimiento para usar el RTC también se puede crear un periodo “manualmente”, se debe tener como parámetro la cantidad de ciclos de reloj que tendrá la onda cuadrada. Luego se debe “sincronizar” el tiempo que tarda cada instrucción del programa con respecto a la cantidad e ciclos de la onda. Para poder completar los ciclos faltantes (la onda usualmente se toma mas ciclos de reloj que las instrucciones de cambio de periodo) se pueden utilizar “nops” iterados dentro de las mismas instrucciones si se trata de assembler o ciclos si se trabaja con C. <br />
<br />
• Se puede utilizar una tabla de frecuencias para cada “nota” que se desea, si se quiere hacer un sonido específico ( esto para cuando se desea generar mas de un tono), el programa leerá estas variaciones y las tomará como un cambio en el periodo, que en si es lo que define que nota tomara como salida el ''buzzer''. <br />
<br />
• Aunque es posible generar una onda de esta manera es mejor utilizar el RTC pues este diseño es muy poco eficiencia y se desperdicia la verdadera capacidad del [[Tarjeta de Desarrollo - DEMOQE128|DEMOQE128]]. <br />
<br />
Un ejemplo de este diseño sería:<br />
<br />
<br />
<pre><syntaxhighlight lang="asm"><br />
;************************************************************************** ; <br />
;*** Rutina de generación de ondas cuadradas, de 30 ciclos de reloj *******;<br />
;*** se llevará a cabo tantas veces como indique PERIODO, ******* ; <br />
;*** Luego negará la salida del ''Buzzer'' y repetirá el conteo de PERIODO ****;<br />
;*** 30 ciclos * 250 ns (Tiempo de cada ciclo) = 7.5uS *****************;<br />
;**************************************************************************; <br />
<br />
MOV 0, COUNTER;<br />
MOV 0, COUNTER_2<br />
<br />
Flanco: NOP ;1 ciclo - Los NOP son para compensar los ciclos usados en cambiar el flanco<br />
LDA COUNTER <br />
INCA<br />
STA COUNTER<br />
BNE COUNTER, #12,Flanco <br />
<br />
Cambio: NOP <br />
LDA COUNTER <br />
INCA<br />
STA COUNTER<br />
BNE COUNTER, #10,Cambio <br />
<br />
AIX #-1 ;2 ciclos<br />
CPHX #$0000 ;3 ciclos - Revisa si el contador llega a cero, compare hx con el valor<br />
BNE Flanco ;3 ciclos - Si aun no se termina el periodo, decrementar contador, NECESITA DE RESULTADO DE LA funcion anterior para actuar<br />
<br />
COM PTBD ;5 ciclos<br />
LDHX periodo ;5 ciclos<br />
BRA Cambio ;3 ciclos - Si ya terminó el periodo, pasar al siguiente flanco<br />
<br />
<br />
;**************************************************************<br />
</syntaxhighlight></pre><br />
<br />
•Para el uso de esta instrucción también se necesita el uso de una tabla de frecuencias que representen una escala de notas o tonos, el programa leerá la "canción"que no sera mas que una combinación de las frecuencias de la tabla y las traducirá a cambios en periodo como se mencionó anteriormente. un modelo de dicha tabla podría ser:<br />
<br />
<pre><syntaxhighlight lang="asm"> <br />
;Tabla de Notas musicales ordenadas por octava: do, do#,re,re#,mi,fa,fa#,sol,sol#,la,la#,si <br />
;do, do#,re,re#,mi, fa, fa#,sol,sol#,la,la#,si<br />
SILENCIO: DC.W $FFFF<br />
OCTAVA1: DC.W 509,480,454,428,403,381,359,339,320,302,285,269 ;3<br />
OCTAVA2: DC.W 254,240,226,213,201,190,179,169,160,151,143,135 ;4<br />
OCTAVA3: DC.W 126,119,113,106,100,94,89,84,79,75,71,66 ;5<br />
OCTAVA4: DC.W 63,59,56,53,50,47,44,42,39,37,35,33 ;6 <br />
</syntaxhighlight></pre><br />
•Aun así se recomienda de nuevo no utilizar este método sino uno que implique la variación del periodo por medio de RTC, lo que haría que la cantidad de líneas de código de el programa disminuya significativamente ademas de ser la manera correcta de programar y aprovechar eficientemente las funciones del DEMOQE128.<br />
<br />
==Programa de Prueba==<br />
<br />
A continuación se puede observar un enlace a youtube con un video de la implementación del ''buzzer'', está programado para reproducir dos fragmentos de canciones del juego "ZELDA", primero "''Serenade Of Water''", luego, y con un silencio de segundo y medio, sonará un fragmento de "''Song Of Storms''".<br />
<br />
http://www.youtube.com/watch?v=jyfUEQ8zmCY<br />
<br />
==Referencias==<br />
<br />
•[http://www.soundbuzzer.com Imágenes de los ''buzzers'']<br />
<br />
•[http://cache.freescale.com/files/microcontrollers/doc/user_guide/DEMOQE128UM.pdf?fpsp=1&WT_TYPE=Users%20Guides&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation DEMOQE128UM]<br />
<br />
[[Categoría: DEMOQE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Sistemas_Operativos_de_Multiprogramaci%C3%B3n&diff=2414Sistemas Operativos de Multiprogramación2012-12-01T01:21:09Z<p>Francjsalanova: </p>
<hr />
<div>También llamado sistemas operativos multitarea o multiproceso, se distingue por la habilidad de soportar dos o más procesos activos simultáneamente. El término multiprogramación denota un sistema operativo que, además de soportar procesos concurrentes múltiples, permite que residan simultáneamente en la memoria primaria las instrucciones y los datos procedentes de dos o más procesos distintos.<br />
<br />
El concepto de multiprogramación no se debe confundir con operación de multiproceso. Si bien el primer término implica el último, no sucede en viceversa. La operación multiproceso es la gestión de la totalidad de los recursos del sistema de la computadora mediante la implementación de cauce segmentado.<br />
<br />
La multiprogramación modificó el esquema de implementación de sistemas operativos por lotes al permitir alcanzar una mayor interacción entre los usuarios y programas en ejecución, un mayor rendimiento total del sistema y la creación de sistemas dinámicos que facilitan la implementación y estandarización de nuevos programas y conexiones con sistemas externos.<br />
<br />
<br />
== Tipos de sistemas operativos de multiprogramación ==<br />
=== Sistemas de tiempo compartido ===<br />
<br />
El tiempo compartido es bastante popular en sistemas multiprogramados y multiusuarios. Estos sistemas de multiacceso dedican la mayor parte del tiempo de ejecución de un programa único de una gran aplicación. Son elementos dedicados que poseen un buen tiempo de respuesta del terminal y tratan con frecuencia de proporcionar un reparto equitativo del los recursos comunes para dar la ilusión a cada usuario de poseer la máquina para el mismo. Por ejemplo, cuando se carga el sistema, se hace esperar más a los usuarios con más requerimientos de proceso pedido.<br />
<br />
El algoritmo empleado en el despacho de las actividades es único de la filosofía de estos sistemas. El mismo consiste en la ejecución de los programas con prioridad rotatoria que se incrementa con las esperas y cae después de que se dispensó el servicio. El sistema operativo interrumpe un programa y lo pone al final de la cola de programas en espera, cuando es más largo que la fracción de tiempo definida por el sistema, para prevenir a los programas de la monopolización del procesador.<br />
<br />
El gestor de memoria del sistema proporciona el aislamiento y protección de los programas en ejecución. Sin embargo, se puede emplear un espacio de memoria compartido controlado por el sistema operativo.<br />
<br />
Los componentes de entrada salida se rigen por un gestor I/O que debe permitir la cooperación con múltiples usuarios y dispositivos. Debido a la lenta respuesta de los terminales humanos y la reacción o respuesta humana, el procesamiento de las interrupciones del terminal no necesitan ser críticas para el tiempo.<br />
<br />
El gestor de archivos, por otro lado, debe proporcionar protección y control de acceso, dado a la posibilidad de concurrencia y de conflictos al acceder a los archivos.<br />
<br />
<br />
=== Sistemas de tiempo real ===<br />
<br />
Se usan en entornos donde se deben aceptar y procesar en tiempo breve y sin tiempos muertos un gran número de sucesos, en su mayoría externos al sistema de computadora. Son asuntos secundarios la conveniencia del usuario y la utilización de recursos.<br />
<br />
Estos sistemas se caracterizan principalmente por encargarse de procesos que se activan al ocurrir el suceso relacionado, señalado frecuentemente por una interrupción. Se consigue el multiproceso planificando los procesos independientes unos de otros. Se asigna a cada proceso un cierto nivel de prioridad que corresponde a la importancia relativa de los sucesos que sirve. El procesador está normalmente asignado al proceso con más alta prioridad entre los que están listos para ejecutarse. Esta forma de planificación se llama planificación basada en la prioridad preferente.<br />
<br />
A diferencia de los sistemas de tiempo compartido, el gestor de memoria está diseñado para tener un menor tiempo de respuesta debido a que los programas generalmente residen permanentemente en la memoria ya que usualmente son sistemas estáticos no diseñados para permitir la implementación de programas externos.<br />
<br />
El tiempo crítico del gestor de dispositivo es una de las características principales de los sistemas de tiempo real. Además de las formas sofisticadas proporcionadas de gestión de interrupciones y almacenamiento intermedio, estos sistemas proporcionan frecuentemente llamadas del sistema que permiten a los procesos de usuario conectarse directamente a vectores de interrupción y sucesos de servicio. De esta forma, los programas pueden ceder espacio en procesador a otras ejecuciones con el levantamiento de una interrupción.<br />
<br />
Generalmente estos sistemas de operación no poseen ningún tipo de almacenamiento secundario, solamente en aquellos sistemas de grandes magnitudes en los cuales si es requerido se necesita la implementación de un gestor de archivos que como en otros tipos de sistemas operativos debe manejar protección y control de acceso.<br />
<br />
<br />
=== Sistemas operativos combinados ===<br />
Lamentablemente el uso de sistemas operativos de tiempo son demasiado específicos y por lo tanto, a pesar de su gran utilidad en sistemas estáticos de gran escala, no satisfacen la necesidades de los usuarios en computadoras personales y emergentes dispositivos portátiles. Por dicha razón surge la necesidad de implementar sistemas operativos combinados que emplean las ventajas de los sistemas operativos de multiprogramación conjuntamente con los sistemas operativos por lotes.<br />
<br />
Los sistemas combinados se caracterizan por poseer bloques o lotes que se ejecutan con una menor prioridad que el resto de las aplicaciones. Así se logra el uso completo del procesador al eliminar los tiempos muertos o de espera.<br />
<br />
<br />
== Diseño e implementación de los sistemas operativos ==<br />
=== Requerimientos funcionales ===<br />
* Los procesos se crean en respuesta a los requerimientos explícitos o implícitos de los usuarios.<br />
<br />
* Los procesos emiten peticiones de los servicios y recursos del sistema.<br />
<br />
* El sistema operativo proporciona funciones de supervisión y control para la gestión de los procesos, tales como la creación y la retirada.<br />
<br />
* La gestión de la memoria consiste principalmente en la asignación de la memoria física a los requerimientos de los procesos.<br />
<br />
* Llamadas a sistema por parte de los usuarios.<br />
<br />
* Integridad de los archivos ante malfuncionamiento del equipo y caídas del sistema.<br />
<br />
* Implementación de archivos comunes y documentos compartidos entre las distintas tareas.<br />
<br />
<br />
=== Implementación ===<br />
El desarrollo de sistemas operativos de gran complejidad, como cualquier proyecto de programación de grandes extensiones, generalmente termina en el fracaso y el desastre. La implementación de subconjuntos del sistema, por otro lado, permite la elaboración de estratos de jerarquía que permiten obtener una mayor abstracción de programación, confiabilidad en las etapas inferiores, así como también la habilidad de modificar secciones por separado o la inclusión de nuevos elementos o customización del ambiente de usuario o interface.<br />
<br />
Podemos así subdividir un sistema en diversos estratos que generalmente son implementados:<br />
<br />
* Núcleo: con frecuencia llamado Kernel, realiza operaciones proporcionadas directamente sobre el hardware, gestionando los procesos en funcionamiento mediante estructuras de datos que representan el estado del sistema. Es aquí donde se encuentra el planificador el cual se encarga de determinar que proceso se debe ejecutar al finar la tarea actual. Este scheduler se encarga primoramente de cambiar el contexto de ejecución, lo que incluye guardar el estado en proceso y restaurar el de llegada. Por otro lado, este nivel se encarga de gestionar la interrupciones y proporcionar las facilidades para la conexión de las rutinas de servicio a las interrupciones de hardware. También se puede proporcionar en este nivel los mecanismos básicos para la sincronización entre procesos y comunicación como semáforos o mensajes.<br />
<br />
* I/O básica: conformado por las instrucciones de bajo nivel que permiten la implementación de los bloques de datos de la memoria secundaria. Proporciona una abstracción de almacenamiento como una matriz lineal de bloques de datos.<br />
<br />
* Gestión de memoria: en este nivel se asigna memoria principal a los procesos a ejecutar y se librea cuando no se necesite más. Es aquí donde se de lleva a cabo la implementación de la memoria virtual, que da al programador la ilusión de poseer un basto recurso de memoria de almacenamiento. Estos módulos manejan las interrupciones de hardware que señalan los intentos direccionar los datos que no se encuentran en la memoria principal; en tal caso los bloques de datos no encontrados son traídos desde el almacenamiento secundario usando las facilidades del nivel anterior de I/O básica.<br />
<br />
* Sistema de archivos y dispositivos: proporciona las facilidades para el almacenamiento durante largo tiempo y la manipulación de archivo. Posee un nivel más sofisticado en la asignación de espacio y acceso a los datos en almacenamiento secundario que el nivel de I/O básico. En este nivel, los archivos no se modifican mediante el direccionamiento de los bloques de datos ya que la lectura y escritura de datos se hace por medio de direcciones relativas al archivo a modificar. Así también, en este nivel se puentean y gestionan los dispositivos externos y periféricos mediante una vista uniforme proporcionada por una interfaz estándar que también se extiende a una facilidad de comunicación entre programas, llamada encauzamiento (pippe), que es esencialmente un canal de comunicación virtual de un sentido.<br />
<br />
* Intérprete del lenguaje de órdenes: este nivel proporciona la interfaz entre los usuarios interactivos y el sistema operativo. Los módulos de este nivel, emplean las facilidades proporcionadas por niveles bajos para aceptar líneas de órdenes desde los terminal. Entonces se reconocen estas líneas de entrada para separar las órdenes de los parámetros e identificar el tipo de servicio requerido.<br />
<br />
<br />
== Implementación de sistemas operativos en el microprocesador MC9S08QE128 ==<br />
Si bien este microprocesador puede parecer bajo el entorno actual un tanto lento, no se debe olvidar que años atrás con microprocesadores de mucha menor capacidad de procesamiento ya existían sistemas operativos en computadoras, redes de comunicación, almacenamiento de datos bancarios, cohetes espaciales, etc. Si treinta años atrás la tecnología era suficiente para el desarrollo de estos sistemas, con mayor razón es posible en la actualidad. Problemáticas de implementación radican en el mal uso y mala elección de estrategias de programación del sistema operativo.<br />
<br />
El micro disponible en el DEMOQE128 parece no haber sido diseñado con el objetivo de la implementación de sistemas operativos ya que por ejemplo no posee múltiples Stack Pointers (SP) para realizar el direccionamiento de las tareas en memoria principal y contiene numerosas aplicaciones y elementos innecesarios para tal fin. Sin embargo posee elementos suficientes para el desarrollo de un sistema operativo sencillo que puede ser empelado en la elaboración de proyectos de pequeña escala.<br />
<br />
A continuación se expondrán algunos de los elementos principales que podría tener un sistema operativo elaborado para este microprocesador.<br />
<br />
=== TaskControlBlock ===<br />
Un task control block, es una estructura utilizada para manejar y administrar las tareas que se quieren ejecutar en un sistema operativo. Esta estructura debe poseer todos los atributos y campos necesarios para asegurar que el sistema operativo pueda cargar la tarea adecuada y ejecutarla. El TCB (task control block), debe contener el identificador y la pila de la tarea correspondiente y dependiendo de la implementación, si es una lista doblemente enlazada en la que se encuentran los TCB de las tareas a ejecutar, el apuntador a la tarea siguiente y la tarea previa para que el despachador tenga la información necesaria para poder cargar la siguiente tarea a ejecutarse. <br />
<br />
<br />
Un ejemplo en lenguaje C de un TCB se muestra a continuación:<br />
<br />
<pre>typedef struct _TCB {<br />
<br />
char *StackPtr; //Apuntador al stack <br />
<br />
struct _TCB *Next; //Apuntador al siguiente TCB (tarea siguiete)<br />
<br />
struct _TCB *Prev; //Apuntador al TCB anterior (tarea anterior)<br />
<br />
char Stack[STACK_DEPTH]; //Tamaño del stack de la tarea<br />
<br />
int Task; //Identificador de la tarea<br />
<br />
char estado; //Estado de la tarea (corriendo, bloqueado, en espera, etc.)<br />
<br />
} TCB;</pre> <br />
<br />
<br />
=== Tick === <br />
El tick o time switch es la interrupción del proceso en ejecución para la sustitución por otro en un sistema en el que dichas actividades comparten por separado, períodos de ejecución en el procesador. Este período de ejecución se recomienda que sea menor al tiempo de reacción del ser humano (0.12 segundos). Generalmente se emplea un timer de 10 nanosegundos que interrumpe el proceso de ejecución. Puede ser empleado para ello el Real Time Counter o RTC.<br />
<br />
<br />
=== Implementación de timers ===<br />
Si bien la interrupción por serial, keyboard o software están permitidas en el desarrollo de sistemas operativos, normalmente se estandarizan las interrupciones de los contadores para demandar menor hardware así como también para crear un mayor grado de abstracción en niveles superiores de programación.<br />
<br />
En sistemas operativos basados en UNIX así como también en Windows, generalmente se emplea un número muy limitado de contadores. Estos elementos son globales en todas las aplicaciones que se ejecutan, ya que estos son gestionados por el Kernel. Usualmente se usan 2 contadores: uno de 10 nanosegundos y otro de 1 milisegundo. El primero además de ser empleado según la necesidad de los usuarios se utiliza como tick del sistema.<br />
<br />
Implementando una lista con contadores con un ID correspondiente a dicho time counter, se pueden implementar los 10 nanosegundos y 1 milisegundo para interrumpir una tarea luego de un tiempo subdividido por la combinación de dichos contadores globales.<br />
<br />
Por otro lado, no debemos olvidar la implementación de contadores de menor prioridad para llevar la hora en el sistema operativo.<br />
<br />
<br />
=== Tareas ===<br />
Las tareas son un conjunto de funciones o actividades que compartirán el uso de procesador en tiempos distintos de ejecución. Estas generalmente se definen como funciones de ejecución separada.<br />
<br />
En sistemas temporales, se emplea un tick que llama a una función despachadora para cambiar de tarea y permitir así la sensación de multiprocesamiento (multitasking).<br />
<br />
La estructura que se debe emplear en un micro como el MC9S08QE128 debe diseñarse tomando en cuenta la función del sistema. Si se desea implementar un ambiente que permita la introducción dinámica de nuevos programas por periféricos de entrada salida o de la memoria secundaria, es usualmente recomendable la implementación de una lista enlazada o doble enlazada entre las distintas tareas que se encuentran es espera de ejecución.<br />
<br />
De elegir un sistema medianamente estático, con espacios de memoria definidos para cada una de las tareas, se puede utilizar el uso de un arreglo de elementos.<br />
<br />
Sin importar la estructura elegida, la misma usualmente posee el valor address al lugar de memoria donde comienza a listarse la tarea, un ID que permite reconocer y buscar los programas en lista de ejecución, apuntadores de enlace (en caso de implementar lista enlazadas), bit de bloqueo y un valor de sleep.<br />
<br />
Entre las funciones relacionadas a los procesos de ejecución se encuentra el de crear una nueva tarea, eliminarla, colocarla en modo sleep y el de bloquear la misma.<br />
<br />
Tenemos como ejemplo la función de crear una nueva tarea:<br />
<br />
<br />
<pre>void create_task(func_ptr PC, char *stack, int stack_size, char task_id) {<br />
<br />
int *SP;<br />
<br />
SP = (int *) (stack + stack_size - 2);<br />
<br />
*SP-- = (int) PC;<br />
<br />
*SP-- = 0;<br />
<br />
*SP = 0;<br />
<br />
tasks[task_id].SP = SP;<br />
<br />
}</pre><br />
<br />
<br />
=== Despachador === <br />
Del inglés dispatch, es de las primeras funciones que se deben crear para realizar un sistema operativo que causa más problemas y dificultades de entendimiento. Es llamada al entrar en la interrupción tick y permite cambiar la tarea de ejecución en intervalos de tiempo.<br />
<br />
<br />
<pre><nowiki>#</nowiki>pragma INLINE<br />
<br />
void dispatch(char nexto) {<br />
<br />
void *tmp;<br />
<br />
asm tsx;<br />
<br />
asm aix #0x06;<br />
<br />
asm sthx tmp;<br />
<br />
tasks[running].SP = tmp;<br />
<br />
running = nexto; <br />
<br />
tmp = tasks[nexto].SP;<br />
<br />
asm ldhx tmp;<br />
<br />
asm sthx;<br />
<br />
}</pre><br />
<br />
<br />
De la función lo primero que se hace notar es el uso de #pragma INLINE. Esto es usado cuando la función dispatch es usada dentro de una interrupción (en este caso la de tick) y se desea ser transparente impidiendo la perdida del stack pointer al cual se retornará del interrupt.<br />
<br />
Dispatch no hace más que cambiar la tarea a ejecutar. Primero que todo, se debe entender el funcionamiento de los interrupts. El siguiente esquema obtenido del manual muestra los registros que son colocados en el stack automáticamente al entrar en la interrupción del tick.<br />
<br />
<br />
[[Archivo:Stack_on_interruption.jpeg]]<br />
<br />
<br />
Como se muestra en el esquema, se puede observar que la interrupción deja en el stack la parte alta y baja del SP, el valor de X, el acumulador A y el código de la condición de registro. La función expuesta almacena el valor del SP en X lo que deja al sistema apuntando 5 + 1 (al hacer tsx) posiciones en relación al lugar original en el que se encontraba antes de la acción de la interrupción. Posteriormente se almacena el valor de HX en una variable temporal, y se guarda el sitio de la memoria en el cual el programa se encontraba corriendo antes de la interrupción (tasks[running].SP = tmp;).<br />
<br />
Finalmente se cambia la tarea que se encuentra en ejecución por la nueva tarea (nexto) así como también se usa el temporal nuevamente para cargar la posición SP particular correspondiente al sitio donde la nueva tarea comenzará o se quedó ejecutando anteriormente y se guarda el dato en el registro SP.<br />
<br />
De tal manera, se almacenaron los datos de ejecución al momento de parar la tarea y se cambia a la nueva actividad.<br />
<br />
<br />
=== Planificador === <br />
Conocido como scheduler, es el módulo que se encarga de llevar a cabo la elección del próximo programa a ejecutar al entrar a la interrupción tick. El siguiente ejemplo es de un sistema en el que la estructura de listado de las tareas es un arreglo. en el mismo, existe un número limitado de tareas definido por la variable MAX_TASK.<br />
<br />
<pre>void scheduler(void) {<br />
<br />
char next;<br />
<br />
next = running + 1;<br />
<br />
do {<br />
<br />
if ( next >= MAX_TASKS ) next = 0;<br />
<br />
if ( tasks[next].SP != 0 ) break;<br />
<br />
next++;<br />
<br />
} while (next != running);<br />
<br />
dispatch(next);<br />
<br />
asm pulh;<br />
<br />
asm rti;<br />
<br />
}</pre><br />
<br />
Como se puede observar, la función no hace más que asignar el siguiente valor numérico en la lista y comprueba si no sobrepasa el valor máximo de tareas, en cuyo caso resetea el contador a cero. También se verifica si la tarea correspondiente a ese valor numérico realmente existe. Para definir dichas tareas se puede emplear el siguiente método que permite la implementación en funciones no por un número sino por un tag o nombre asignado por el programador.<br />
<br />
<pre><nowiki>#</nowiki>define ONE_TASK (0)<br />
<br />
<nowiki>#</nowiki>define TWO_TASK (SERIAL_TASK + 1)<br />
<br />
<nowiki>#</nowiki>define THREE_TASK (SERIAL_TASK + 2)<br />
<br />
<nowiki>#</nowiki>define FOUR_TASK (SERIAL_TASK + 3)</pre><br />
<br />
La implementación en listas enlazadas no difiere mucho, simplemente se se asigna como siguiente tarea a ejecutar la siguiente a la actual.<br />
<br />
Si bien el uso secuencial en este módulo de distribución de tiempo es fácil de implementar, no satisface completamente las necesidades del sistema operativo como tal. Es importante la inclusión funciones y elementos que permitan bloquear o colocar en sleep las tareas para así no desaprovechar los recursos en tareas que no deben ser procesadas. Es aún más importante la inclusión de prioridades o listas de prioridades en el planificador.<br />
<br />
En la elaboración del sistema operativo se debe colocar un sistema de prioridades en la ejecución de las tareas ya que se logra una mayor eficiencia en el uso de los recursos así como también una mejor respuesta ante las necesidades de los usuarios.<br />
<br />
<br />
=== Vector de Interrupción ===<br />
La siguiente función de interrupción llama al planificador que tras determinar la nueva a ejecutar llama al despachador que se encargará de hacer el cambio en memoria por dicha nueva tarea. Es importante eliminar las interrupaciones mientras nos encontramos en el vector de interrupción.<br />
<br />
<pre>void interrupt VectorNumber_Vtpm1ovf TMR1_ISR(void) {<br />
<br />
TPM1SC_TOF = 0;<br />
<br />
scheduler();<br />
<br />
}</pre><br />
<br />
<br />
<br />
Un ejemplo de una rutina que carga la siguiente tarea a ejecutarse en el sistema operativo para el DEMOQE128 utilizando como generador<br />
de ticks el modulo del RTC<br />
<br />
<pre>void interrupt VectorNumber_Vrtc EJEMPLO_RUTINA_CAMBIO_CONTEXO_RTC (void){<br />
<br />
<br />
RTCSC = RTCSC | 0x80; //Borra la solicitud de interrupción para poder recibir la siguiente interrupción del RTC<br />
<br />
__asm sei; // Inhabilita las interrupciones<br />
<br />
__asm tsx; // Guarda el stack pointer de la tarea actual en el registro X<br />
__asm pshx; // Pone en el stack el byte menos significativo del stack pointer<br />
__asm pshh; // Pone en el stack el byte mas significativo del stack pointer<br />
__asm ldhx CurrentTask; // Guardo en H:X la direccion de CurrentTask<br />
__asm pula; // Saco el primer valor de mi stack (H) y lo guardo en el acumulador<br />
__asm sta , x; // Guardo H en donde apunta el registro H:X (CurrentTask->StackPtr)<br />
__asm pula; // Saco el primer valor de mi stack (X) y lo guardo en el acumulador<br />
__asm sta 1, x; // Guardo X donde apunta (H:X + 1) (CurrentTask->StackPtr + 1)<br />
<br />
__asm ldhx CurrentTask; // Cargo en H:X la direccion del CurrentTask<br />
__asm aix #2; // Sumo 2, por el registro H:X que se guardo, para que la direccion del nuevo task sea la adecuada//<br />
__asm ldhx , x // Cargo H:X con lo que apunta CurrentTask<br />
__asm sthx CurrentTask; // Guardo la direccion de la siguiente tarea en CurrentTask<br />
<br />
<br />
__asm ldhx ,x // Carga lo que apunta H:X que es el StackPtr actual<br />
__asm txs; // Guarda H:X en SP<br />
__asm pulh; // Des-apila el primer elemento de la pila<br />
<br />
__asm cli; // Habilita las interrupciones<br />
__asm rti; // Retorna de la interrupción<br />
}</pre><br />
<br />
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Sistemas_Operativos_de_Multiprogramaci%C3%B3n&diff=2413Sistemas Operativos de Multiprogramación2012-12-01T01:20:26Z<p>Francjsalanova: </p>
<hr />
<div>También llamado sistemas operativos multitarea o multiproceso, se distingue por la habilidad de soportar dos o más procesos activos simultáneamente. El término multiprogramación denota un sistema operativo que, además de soportar procesos concurrentes múltiples, permite que residan simultáneamente en la memoria primaria las instrucciones y los datos procedentes de dos o más procesos distintos.<br />
<br />
El concepto de multiprogramación no se debe confundir con operación de multiproceso. Si bien el primer término implica el último, no sucede en viceversa. La operación multiproceso es la gestión de la totalidad de los recursos del sistema de la computadora mediante la implementación de cauce segmentado.<br />
<br />
La multiprogramación modificó el esquema de implementación de sistemas operativos por lotes al permitir alcanzar una mayor interacción entre los usuarios y programas en ejecución, un mayor rendimiento total del sistema y la creación de sistemas dinámicos que facilitan la implementación y estandarización de nuevos programas y conexiones con sistemas externos.<br />
<br />
<br />
== Tipos de sistemas operativos de multiprogramación ==<br />
=== Sistemas de tiempo compartido ===<br />
<br />
El tiempo compartido es bastante popular en sistemas multiprogramados y multiusuarios. Estos sistemas de multiacceso dedican la mayor parte del tiempo de ejecución de un programa único de una gran aplicación. Son elementos dedicados que poseen un buen tiempo de respuesta del terminal y tratan con frecuencia de proporcionar un reparto equitativo del los recursos comunes para dar la ilusión a cada usuario de poseer la máquina para el mismo. Por ejemplo, cuando se carga el sistema, se hace esperar más a los usuarios con más requerimientos de proceso pedido.<br />
<br />
El algoritmo empleado en el despacho de las actividades es único de la filosofía de estos sistemas. El mismo consiste en la ejecución de los programas con prioridad rotatoria que se incrementa con las esperas y cae después de que se dispensó el servicio. El sistema operativo interrumpe un programa y lo pone al final de la cola de programas en espera, cuando es más largo que la fracción de tiempo definida por el sistema, para prevenir a los programas de la monopolización del procesador.<br />
<br />
El gestor de memoria del sistema proporciona el aislamiento y protección de los programas en ejecución. Sin embargo, se puede emplear un espacio de memoria compartido controlado por el sistema operativo.<br />
<br />
Los componentes de entrada salida se rigen por un gestor I/O que debe permitir la cooperación con múltiples usuarios y dispositivos. Debido a la lenta respuesta de los terminales humanos y la reacción o respuesta humana, el procesamiento de las interrupciones del terminal no necesitan ser críticas para el tiempo.<br />
<br />
El gestor de archivos, por otro lado, debe proporcionar protección y control de acceso, dado a la posibilidad de concurrencia y de conflictos al acceder a los archivos.<br />
<br />
<br />
=== Sistemas de tiempo real ===<br />
<br />
Se usan en entornos donde se deben aceptar y procesar en tiempo breve y sin tiempos muertos un gran número de sucesos, en su mayoría externos al sistema de computadora. Son asuntos secundarios la conveniencia del usuario y la utilización de recursos.<br />
<br />
Estos sistemas se caracterizan principalmente por encargarse de procesos que se activan al ocurrir el suceso relacionado, señalado frecuentemente por una interrupción. Se consigue el multiproceso planificando los procesos independientes unos de otros. Se asigna a cada proceso un cierto nivel de prioridad que corresponde a la importancia relativa de los sucesos que sirve. El procesador está normalmente asignado al proceso con más alta prioridad entre los que están listos para ejecutarse. Esta forma de planificación se llama planificación basada en la prioridad preferente.<br />
<br />
A diferencia de los sistemas de tiempo compartido, el gestor de memoria está diseñado para tener un menor tiempo de respuesta debido a que los programas generalmente residen permanentemente en la memoria ya que usualmente son sistemas estáticos no diseñados para permitir la implementación de programas externos.<br />
<br />
El tiempo crítico del gestor de dispositivo es una de las características principales de los sistemas de tiempo real. Además de las formas sofisticadas proporcionadas de gestión de interrupciones y almacenamiento intermedio, estos sistemas proporcionan frecuentemente llamadas del sistema que permiten a los procesos de usuario conectarse directamente a vectores de interrupción y sucesos de servicio. De esta forma, los programas pueden ceder espacio en procesador a otras ejecuciones con el levantamiento de una interrupción.<br />
<br />
Generalmente estos sistemas de operación no poseen ningún tipo de almacenamiento secundario, solamente en aquellos sistemas de grandes magnitudes en los cuales si es requerido se necesita la implementación de un gestor de archivos que como en otros tipos de sistemas operativos debe manejar protección y control de acceso.<br />
<br />
<br />
=== Sistemas operativos combinados ===<br />
Lamentablemente el uso de sistemas operativos de tiempo son demasiado específicos y por lo tanto, a pesar de su gran utilidad en sistemas estáticos de gran escala, no satisfacen la necesidades de los usuarios en computadoras personales y emergentes dispositivos portátiles. Por dicha razón surge la necesidad de implementar sistemas operativos combinados que emplean las ventajas de los sistemas operativos de multiprogramación conjuntamente con los sistemas operativos por lotes.<br />
<br />
Los sistemas combinados se caracterizan por poseer bloques o lotes que se ejecutan con una menor prioridad que el resto de las aplicaciones. Así se logra el uso completo del procesador al eliminar los tiempos muertos o de espera.<br />
<br />
<br />
== Diseño e implementación de los sistemas operativos ==<br />
=== Requerimientos funcionales ===<br />
* Los procesos se crean en respuesta a los requerimientos explícitos o implícitos de los usuarios.<br />
<br />
* Los procesos emiten peticiones de los servicios y recursos del sistema.<br />
<br />
* El sistema operativo proporciona funciones de supervisión y control para la gestión de los procesos, tales como la creación y la retirada.<br />
<br />
* La gestión de la memoria consiste principalmente en la asignación de la memoria física a los requerimientos de los procesos.<br />
<br />
* Llamadas a sistema por parte de los usuarios.<br />
<br />
* Integridad de los archivos ante malfuncionamiento del equipo y caídas del sistema.<br />
<br />
* Implementación de archivos comunes y documentos compartidos entre las distintas tareas.<br />
<br />
<br />
=== Implementación ===<br />
El desarrollo de sistemas operativos de gran complejidad, como cualquier proyecto de programación de grandes extensiones, generalmente termina en el fracaso y el desastre. La implementación de subconjuntos del sistema, por otro lado, permite la elaboración de estratos de jerarquía que permiten obtener una mayor abstracción de programación, confiabilidad en las etapas inferiores, así como también la habilidad de modificar secciones por separado o la inclusión de nuevos elementos o customización del ambiente de usuario o interface.<br />
<br />
Podemos así subdividir un sistema en diversos estratos que generalmente son implementados:<br />
<br />
* Núcleo: con frecuencia llamado Kernel, realiza operaciones proporcionadas directamente sobre el hardware, gestionando los procesos en funcionamiento mediante estructuras de datos que representan el estado del sistema. Es aquí donde se encuentra el planificador el cual se encarga de determinar que proceso se debe ejecutar al finar la tarea actual. Este scheduler se encarga primoramente de cambiar el contexto de ejecución, lo que incluye guardar el estado en proceso y restaurar el de llegada. Por otro lado, este nivel se encarga de gestionar la interrupciones y proporcionar las facilidades para la conexión de las rutinas de servicio a las interrupciones de hardware. También se puede proporcionar en este nivel los mecanismos básicos para la sincronización entre procesos y comunicación como semáforos o mensajes.<br />
<br />
* I/O básica: conformado por las instrucciones de bajo nivel que permiten la implementación de los bloques de datos de la memoria secundaria. Proporciona una abstracción de almacenamiento como una matriz lineal de bloques de datos.<br />
<br />
* Gestión de memoria: en este nivel se asigna memoria principal a los procesos a ejecutar y se librea cuando no se necesite más. Es aquí donde se de lleva a cabo la implementación de la memoria virtual, que da al programador la ilusión de poseer un basto recurso de memoria de almacenamiento. Estos módulos manejan las interrupciones de hardware que señalan los intentos direccionar los datos que no se encuentran en la memoria principal; en tal caso los bloques de datos no encontrados son traídos desde el almacenamiento secundario usando las facilidades del nivel anterior de I/O básica.<br />
<br />
* Sistema de archivos y dispositivos: proporciona las facilidades para el almacenamiento durante largo tiempo y la manipulación de archivo. Posee un nivel más sofisticado en la asignación de espacio y acceso a los datos en almacenamiento secundario que el nivel de I/O básico. En este nivel, los archivos no se modifican mediante el direccionamiento de los bloques de datos ya que la lectura y escritura de datos se hace por medio de direcciones relativas al archivo a modificar. Así también, en este nivel se puentean y gestionan los dispositivos externos y periféricos mediante una vista uniforme proporcionada por una interfaz estándar que también se extiende a una facilidad de comunicación entre programas, llamada encauzamiento (pippe), que es esencialmente un canal de comunicación virtual de un sentido.<br />
<br />
* Intérprete del lenguaje de órdenes: este nivel proporciona la interfaz entre los usuarios interactivos y el sistema operativo. Los módulos de este nivel, emplean las facilidades proporcionadas por niveles bajos para aceptar líneas de órdenes desde los terminal. Entonces se reconocen estas líneas de entrada para separar las órdenes de los parámetros e identificar el tipo de servicio requerido.<br />
<br />
<br />
== Implementación de sistemas operativos en el microprocesador MC9S08QE128 ==<br />
Si bien este microprocesador puede parecer bajo el entorno actual un tanto lento, no se debe olvidar que años atrás con microprocesadores de mucha menor capacidad de procesamiento ya existían sistemas operativos en computadoras, redes de comunicación, almacenamiento de datos bancarios, cohetes espaciales, etc. Si treinta años atrás la tecnología era suficiente para el desarrollo de estos sistemas, con mayor razón es posible en la actualidad. Problemáticas de implementación radican en el mal uso y mala elección de estrategias de programación del sistema operativo.<br />
<br />
El micro disponible en el DEMOQE128 parece no haber sido diseñado con el objetivo de la implementación de sistemas operativos ya que por ejemplo no posee múltiples Stack Pointers (SP) para realizar el direccionamiento de las tareas en memoria principal y contiene numerosas aplicaciones y elementos innecesarios para tal fin. Sin embargo posee elementos suficientes para el desarrollo de un sistema operativo sencillo que puede ser empelado en la elaboración de proyectos de pequeña escala.<br />
<br />
A continuación se expondrán algunos de los elementos principales que podría tener un sistema operativo elaborado para este microprocesador.<br />
<br />
=== TaskControlBlock ===<br />
Un task control block, es una estructura utilizada para manejar y administrar las tareas que se quieren ejecutar en un sistema operativo. Esta estructura debe poseer todos los atributos y campos necesarios para asegurar que el sistema operativo pueda cargar la tarea adecuada y ejecutarla. El TCB (task control block), debe contener el identificador y la pila de la tarea correspondiente y dependiendo de la implementación, si es una lista doblemente enlazada en la que se encuentran los TCB de las tareas a ejecutar, el apuntador a la tarea siguiente y la tarea previa para que el despachador tenga la información necesaria para poder cargar la siguiente tarea a ejecutarse. <br />
<br />
<br />
Un ejemplo en lenguaje C de un TCB se muestra a continuación:<br />
<br />
<pre>typedef struct _TCB {<br />
<br />
char *StackPtr; //Apuntador al stack <br />
<br />
struct _TCB *Next; //Apuntador al siguiente TCB (tarea siguiete)<br />
<br />
struct _TCB *Prev; //Apuntador al TCB anterior (tarea anterior)<br />
<br />
char Stack[STACK_DEPTH]; //Tamaño del stack de la tarea<br />
<br />
int Task; //Identificador de la tarea<br />
<br />
char estado; //Estado de la tarea (corriendo, bloqueado, en espera, etc.)<br />
<br />
} TCB;</pre> <br />
<br />
<br />
=== Tick === <br />
El tick o time switch es la interrupción del proceso en ejecución para la sustitución por otro en un sistema en el que dichas actividades comparten por separado, períodos de ejecución en el procesador. Este período de ejecución se recomienda que sea menor al tiempo de reacción del ser humano (0.12 segundos). Generalmente se emplea un timer de 10 nanosegundos que interrumpe el proceso de ejecución. Puede ser empleado para ello el Real Time Counter o RTC.<br />
<br />
<br />
=== Implementación de timers ===<br />
Si bien la interrupción por serial, keyboard o software están permitidas en el desarrollo de sistemas operativos, normalmente se estandarizan las interrupciones de los contadores para demandar menor hardware así como también para crear un mayor grado de abstracción en niveles superiores de programación.<br />
<br />
En sistemas operativos basados en UNIX así como también en Windows, generalmente se emplea un número muy limitado de contadores. Estos elementos son globales en todas las aplicaciones que se ejecutan, ya que estos son gestionados por el Kernel. Usualmente se usan 2 contadores: uno de 10 nanosegundos y otro de 1 milisegundo. El primero además de ser empleado según la necesidad de los usuarios se utiliza como tick del sistema.<br />
<br />
Implementando una lista con contadores con un ID correspondiente a dicho time counter, se pueden implementar los 10 nanosegundos y 1 milisegundo para interrumpir una tarea luego de un tiempo subdividido por la combinación de dichos contadores globales.<br />
<br />
Por otro lado, no debemos olvidar la implementación de contadores de menor prioridad para llevar la hora en el sistema operativo.<br />
<br />
<br />
=== Tareas ===<br />
Las tareas son un conjunto de funciones o actividades que compartirán el uso de procesador en tiempos distintos de ejecución. Estas generalmente se definen como funciones de ejecución separada.<br />
<br />
En sistemas temporales, se emplea un tick que llama a una función despachadora para cambiar de tarea y permitir así la sensación de multiprocesamiento (multitasking).<br />
<br />
La estructura que se debe emplear en un micro como el MC9S08QE128 debe diseñarse tomando en cuenta la función del sistema. Si se desea implementar un ambiente que permita la introducción dinámica de nuevos programas por periféricos de entrada salida o de la memoria secundaria, es usualmente recomendable la implementación de una lista enlazada o doble enlazada entre las distintas tareas que se encuentran es espera de ejecución.<br />
<br />
De elegir un sistema medianamente estático, con espacios de memoria definidos para cada una de las tareas, se puede utilizar el uso de un arreglo de elementos.<br />
<br />
Sin importar la estructura elegida, la misma usualmente posee el valor address al lugar de memoria donde comienza a listarse la tarea, un ID que permite reconocer y buscar los programas en lista de ejecución, apuntadores de enlace (en caso de implementar lista enlazadas), bit de bloqueo y un valor de sleep.<br />
<br />
Entre las funciones relacionadas a los procesos de ejecución se encuentra el de crear una nueva tarea, eliminarla, colocarla en modo sleep y el de bloquear la misma.<br />
<br />
Tenemos como ejemplo la función de crear una nueva tarea:<br />
<br />
<br />
void create_task(func_ptr PC, char *stack, int stack_size, char task_id) {<br />
<br />
int *SP;<br />
<br />
SP = (int *) (stack + stack_size - 2);<br />
<br />
*SP-- = (int) PC;<br />
<br />
*SP-- = 0;<br />
<br />
*SP = 0;<br />
<br />
tasks[task_id].SP = SP;<br />
<br />
}<br />
<br />
<br />
=== Despachador === <br />
Del inglés dispatch, es de las primeras funciones que se deben crear para realizar un sistema operativo que causa más problemas y dificultades de entendimiento. Es llamada al entrar en la interrupción tick y permite cambiar la tarea de ejecución en intervalos de tiempo.<br />
<br />
<br />
<pre><nowiki>#</nowiki>pragma INLINE<br />
<br />
void dispatch(char nexto) {<br />
<br />
void *tmp;<br />
<br />
asm tsx;<br />
<br />
asm aix #0x06;<br />
<br />
asm sthx tmp;<br />
<br />
tasks[running].SP = tmp;<br />
<br />
running = nexto; <br />
<br />
tmp = tasks[nexto].SP;<br />
<br />
asm ldhx tmp;<br />
<br />
asm sthx;<br />
<br />
}</pre><br />
<br />
<br />
De la función lo primero que se hace notar es el uso de #pragma INLINE. Esto es usado cuando la función dispatch es usada dentro de una interrupción (en este caso la de tick) y se desea ser transparente impidiendo la perdida del stack pointer al cual se retornará del interrupt.<br />
<br />
Dispatch no hace más que cambiar la tarea a ejecutar. Primero que todo, se debe entender el funcionamiento de los interrupts. El siguiente esquema obtenido del manual muestra los registros que son colocados en el stack automáticamente al entrar en la interrupción del tick.<br />
<br />
<br />
[[Archivo:Stack_on_interruption.jpeg]]<br />
<br />
<br />
Como se muestra en el esquema, se puede observar que la interrupción deja en el stack la parte alta y baja del SP, el valor de X, el acumulador A y el código de la condición de registro. La función expuesta almacena el valor del SP en X lo que deja al sistema apuntando 5 + 1 (al hacer tsx) posiciones en relación al lugar original en el que se encontraba antes de la acción de la interrupción. Posteriormente se almacena el valor de HX en una variable temporal, y se guarda el sitio de la memoria en el cual el programa se encontraba corriendo antes de la interrupción (tasks[running].SP = tmp;).<br />
<br />
Finalmente se cambia la tarea que se encuentra en ejecución por la nueva tarea (nexto) así como también se usa el temporal nuevamente para cargar la posición SP particular correspondiente al sitio donde la nueva tarea comenzará o se quedó ejecutando anteriormente y se guarda el dato en el registro SP.<br />
<br />
De tal manera, se almacenaron los datos de ejecución al momento de parar la tarea y se cambia a la nueva actividad.<br />
<br />
<br />
=== Planificador === <br />
Conocido como scheduler, es el módulo que se encarga de llevar a cabo la elección del próximo programa a ejecutar al entrar a la interrupción tick. El siguiente ejemplo es de un sistema en el que la estructura de listado de las tareas es un arreglo. en el mismo, existe un número limitado de tareas definido por la variable MAX_TASK.<br />
<br />
<pre>void scheduler(void) {<br />
<br />
char next;<br />
<br />
next = running + 1;<br />
<br />
do {<br />
<br />
if ( next >= MAX_TASKS ) next = 0;<br />
<br />
if ( tasks[next].SP != 0 ) break;<br />
<br />
next++;<br />
<br />
} while (next != running);<br />
<br />
dispatch(next);<br />
<br />
asm pulh;<br />
<br />
asm rti;<br />
<br />
}</pre><br />
<br />
Como se puede observar, la función no hace más que asignar el siguiente valor numérico en la lista y comprueba si no sobrepasa el valor máximo de tareas, en cuyo caso resetea el contador a cero. También se verifica si la tarea correspondiente a ese valor numérico realmente existe. Para definir dichas tareas se puede emplear el siguiente método que permite la implementación en funciones no por un número sino por un tag o nombre asignado por el programador.<br />
<br />
<pre><nowiki>#</nowiki>define ONE_TASK (0)<br />
<br />
<nowiki>#</nowiki>define TWO_TASK (SERIAL_TASK + 1)<br />
<br />
<nowiki>#</nowiki>define THREE_TASK (SERIAL_TASK + 2)<br />
<br />
<nowiki>#</nowiki>define FOUR_TASK (SERIAL_TASK + 3)</pre><br />
<br />
La implementación en listas enlazadas no difiere mucho, simplemente se se asigna como siguiente tarea a ejecutar la siguiente a la actual.<br />
<br />
Si bien el uso secuencial en este módulo de distribución de tiempo es fácil de implementar, no satisface completamente las necesidades del sistema operativo como tal. Es importante la inclusión funciones y elementos que permitan bloquear o colocar en sleep las tareas para así no desaprovechar los recursos en tareas que no deben ser procesadas. Es aún más importante la inclusión de prioridades o listas de prioridades en el planificador.<br />
<br />
En la elaboración del sistema operativo se debe colocar un sistema de prioridades en la ejecución de las tareas ya que se logra una mayor eficiencia en el uso de los recursos así como también una mejor respuesta ante las necesidades de los usuarios.<br />
<br />
<br />
=== Vector de Interrupción ===<br />
La siguiente función de interrupción llama al planificador que tras determinar la nueva a ejecutar llama al despachador que se encargará de hacer el cambio en memoria por dicha nueva tarea. Es importante eliminar las interrupaciones mientras nos encontramos en el vector de interrupción.<br />
<br />
<pre>void interrupt VectorNumber_Vtpm1ovf TMR1_ISR(void) {<br />
<br />
TPM1SC_TOF = 0;<br />
<br />
scheduler();<br />
<br />
}</pre><br />
<br />
<br />
<br />
Un ejemplo de una rutina que carga la siguiente tarea a ejecutarse en el sistema operativo para el DEMOQE128 utilizando como generador<br />
de ticks el modulo del RTC<br />
<br />
<pre>void interrupt VectorNumber_Vrtc EJEMPLO_RUTINA_CAMBIO_CONTEXO_RTC (void){<br />
<br />
<br />
RTCSC = RTCSC | 0x80; //Borra la solicitud de interrupción para poder recibir la siguiente interrupción del RTC<br />
<br />
__asm sei; // Inhabilita las interrupciones<br />
<br />
__asm tsx; // Guarda el stack pointer de la tarea actual en el registro X<br />
__asm pshx; // Pone en el stack el byte menos significativo del stack pointer<br />
__asm pshh; // Pone en el stack el byte mas significativo del stack pointer<br />
__asm ldhx CurrentTask; // Guardo en H:X la direccion de CurrentTask<br />
__asm pula; // Saco el primer valor de mi stack (H) y lo guardo en el acumulador<br />
__asm sta , x; // Guardo H en donde apunta el registro H:X (CurrentTask->StackPtr)<br />
__asm pula; // Saco el primer valor de mi stack (X) y lo guardo en el acumulador<br />
__asm sta 1, x; // Guardo X donde apunta (H:X + 1) (CurrentTask->StackPtr + 1)<br />
<br />
__asm ldhx CurrentTask; // Cargo en H:X la direccion del CurrentTask<br />
__asm aix #2; // Sumo 2, por el registro H:X que se guardo, para que la direccion del nuevo task sea la adecuada//<br />
__asm ldhx , x // Cargo H:X con lo que apunta CurrentTask<br />
__asm sthx CurrentTask; // Guardo la direccion de la siguiente tarea en CurrentTask<br />
<br />
<br />
__asm ldhx ,x // Carga lo que apunta H:X que es el StackPtr actual<br />
__asm txs; // Guarda H:X en SP<br />
__asm pulh; // Des-apila el primer elemento de la pila<br />
<br />
__asm cli; // Habilita las interrupciones<br />
__asm rti; // Retorna de la interrupción<br />
}</pre><br />
<br />
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Sistemas_Operativos_de_Multiprogramaci%C3%B3n&diff=2411Sistemas Operativos de Multiprogramación2012-12-01T01:18:50Z<p>Francjsalanova: </p>
<hr />
<div>También llamado sistemas operativos multitarea o multiproceso, se distingue por la habilidad de soportar dos o más procesos activos simultáneamente. El término multiprogramación denota un sistema operativo que, además de soportar procesos concurrentes múltiples, permite que residan simultáneamente en la memoria primaria las instrucciones y los datos procedentes de dos o más procesos distintos.<br />
<br />
El concepto de multiprogramación no se debe confundir con operación de multiproceso. Si bien el primer término implica el último, no sucede en viceversa. La operación multiproceso es la gestión de la totalidad de los recursos del sistema de la computadora mediante la implementación de cauce segmentado.<br />
<br />
La multiprogramación modificó el esquema de implementación de sistemas operativos por lotes al permitir alcanzar una mayor interacción entre los usuarios y programas en ejecución, un mayor rendimiento total del sistema y la creación de sistemas dinámicos que facilitan la implementación y estandarización de nuevos programas y conexiones con sistemas externos.<br />
<br />
<br />
== Tipos de sistemas operativos de multiprogramación ==<br />
=== Sistemas de tiempo compartido ===<br />
<br />
El tiempo compartido es bastante popular en sistemas multiprogramados y multiusuarios. Estos sistemas de multiacceso dedican la mayor parte del tiempo de ejecución de un programa único de una gran aplicación. Son elementos dedicados que poseen un buen tiempo de respuesta del terminal y tratan con frecuencia de proporcionar un reparto equitativo del los recursos comunes para dar la ilusión a cada usuario de poseer la máquina para el mismo. Por ejemplo, cuando se carga el sistema, se hace esperar más a los usuarios con más requerimientos de proceso pedido.<br />
<br />
El algoritmo empleado en el despacho de las actividades es único de la filosofía de estos sistemas. El mismo consiste en la ejecución de los programas con prioridad rotatoria que se incrementa con las esperas y cae después de que se dispensó el servicio. El sistema operativo interrumpe un programa y lo pone al final de la cola de programas en espera, cuando es más largo que la fracción de tiempo definida por el sistema, para prevenir a los programas de la monopolización del procesador.<br />
<br />
El gestor de memoria del sistema proporciona el aislamiento y protección de los programas en ejecución. Sin embargo, se puede emplear un espacio de memoria compartido controlado por el sistema operativo.<br />
<br />
Los componentes de entrada salida se rigen por un gestor I/O que debe permitir la cooperación con múltiples usuarios y dispositivos. Debido a la lenta respuesta de los terminales humanos y la reacción o respuesta humana, el procesamiento de las interrupciones del terminal no necesitan ser críticas para el tiempo.<br />
<br />
El gestor de archivos, por otro lado, debe proporcionar protección y control de acceso, dado a la posibilidad de concurrencia y de conflictos al acceder a los archivos.<br />
<br />
<br />
=== Sistemas de tiempo real ===<br />
<br />
Se usan en entornos donde se deben aceptar y procesar en tiempo breve y sin tiempos muertos un gran número de sucesos, en su mayoría externos al sistema de computadora. Son asuntos secundarios la conveniencia del usuario y la utilización de recursos.<br />
<br />
Estos sistemas se caracterizan principalmente por encargarse de procesos que se activan al ocurrir el suceso relacionado, señalado frecuentemente por una interrupción. Se consigue el multiproceso planificando los procesos independientes unos de otros. Se asigna a cada proceso un cierto nivel de prioridad que corresponde a la importancia relativa de los sucesos que sirve. El procesador está normalmente asignado al proceso con más alta prioridad entre los que están listos para ejecutarse. Esta forma de planificación se llama planificación basada en la prioridad preferente.<br />
<br />
A diferencia de los sistemas de tiempo compartido, el gestor de memoria está diseñado para tener un menor tiempo de respuesta debido a que los programas generalmente residen permanentemente en la memoria ya que usualmente son sistemas estáticos no diseñados para permitir la implementación de programas externos.<br />
<br />
El tiempo crítico del gestor de dispositivo es una de las características principales de los sistemas de tiempo real. Además de las formas sofisticadas proporcionadas de gestión de interrupciones y almacenamiento intermedio, estos sistemas proporcionan frecuentemente llamadas del sistema que permiten a los procesos de usuario conectarse directamente a vectores de interrupción y sucesos de servicio. De esta forma, los programas pueden ceder espacio en procesador a otras ejecuciones con el levantamiento de una interrupción.<br />
<br />
Generalmente estos sistemas de operación no poseen ningún tipo de almacenamiento secundario, solamente en aquellos sistemas de grandes magnitudes en los cuales si es requerido se necesita la implementación de un gestor de archivos que como en otros tipos de sistemas operativos debe manejar protección y control de acceso.<br />
<br />
<br />
=== Sistemas operativos combinados ===<br />
Lamentablemente el uso de sistemas operativos de tiempo son demasiado específicos y por lo tanto, a pesar de su gran utilidad en sistemas estáticos de gran escala, no satisfacen la necesidades de los usuarios en computadoras personales y emergentes dispositivos portátiles. Por dicha razón surge la necesidad de implementar sistemas operativos combinados que emplean las ventajas de los sistemas operativos de multiprogramación conjuntamente con los sistemas operativos por lotes.<br />
<br />
Los sistemas combinados se caracterizan por poseer bloques o lotes que se ejecutan con una menor prioridad que el resto de las aplicaciones. Así se logra el uso completo del procesador al eliminar los tiempos muertos o de espera.<br />
<br />
<br />
== Diseño e implementación de los sistemas operativos ==<br />
=== Requerimientos funcionales ===<br />
* Los procesos se crean en respuesta a los requerimientos explícitos o implícitos de los usuarios.<br />
<br />
* Los procesos emiten peticiones de los servicios y recursos del sistema.<br />
<br />
* El sistema operativo proporciona funciones de supervisión y control para la gestión de los procesos, tales como la creación y la retirada.<br />
<br />
* La gestión de la memoria consiste principalmente en la asignación de la memoria física a los requerimientos de los procesos.<br />
<br />
* Llamadas a sistema por parte de los usuarios.<br />
<br />
* Integridad de los archivos ante malfuncionamiento del equipo y caídas del sistema.<br />
<br />
* Implementación de archivos comunes y documentos compartidos entre las distintas tareas.<br />
<br />
<br />
=== Implementación ===<br />
El desarrollo de sistemas operativos de gran complejidad, como cualquier proyecto de programación de grandes extensiones, generalmente termina en el fracaso y el desastre. La implementación de subconjuntos del sistema, por otro lado, permite la elaboración de estratos de jerarquía que permiten obtener una mayor abstracción de programación, confiabilidad en las etapas inferiores, así como también la habilidad de modificar secciones por separado o la inclusión de nuevos elementos o customización del ambiente de usuario o interface.<br />
<br />
Podemos así subdividir un sistema en diversos estratos que generalmente son implementados:<br />
<br />
* Núcleo: con frecuencia llamado Kernel, realiza operaciones proporcionadas directamente sobre el hardware, gestionando los procesos en funcionamiento mediante estructuras de datos que representan el estado del sistema. Es aquí donde se encuentra el planificador el cual se encarga de determinar que proceso se debe ejecutar al finar la tarea actual. Este scheduler se encarga primoramente de cambiar el contexto de ejecución, lo que incluye guardar el estado en proceso y restaurar el de llegada. Por otro lado, este nivel se encarga de gestionar la interrupciones y proporcionar las facilidades para la conexión de las rutinas de servicio a las interrupciones de hardware. También se puede proporcionar en este nivel los mecanismos básicos para la sincronización entre procesos y comunicación como semáforos o mensajes.<br />
<br />
* I/O básica: conformado por las instrucciones de bajo nivel que permiten la implementación de los bloques de datos de la memoria secundaria. Proporciona una abstracción de almacenamiento como una matriz lineal de bloques de datos.<br />
<br />
* Gestión de memoria: en este nivel se asigna memoria principal a los procesos a ejecutar y se librea cuando no se necesite más. Es aquí donde se de lleva a cabo la implementación de la memoria virtual, que da al programador la ilusión de poseer un basto recurso de memoria de almacenamiento. Estos módulos manejan las interrupciones de hardware que señalan los intentos direccionar los datos que no se encuentran en la memoria principal; en tal caso los bloques de datos no encontrados son traídos desde el almacenamiento secundario usando las facilidades del nivel anterior de I/O básica.<br />
<br />
* Sistema de archivos y dispositivos: proporciona las facilidades para el almacenamiento durante largo tiempo y la manipulación de archivo. Posee un nivel más sofisticado en la asignación de espacio y acceso a los datos en almacenamiento secundario que el nivel de I/O básico. En este nivel, los archivos no se modifican mediante el direccionamiento de los bloques de datos ya que la lectura y escritura de datos se hace por medio de direcciones relativas al archivo a modificar. Así también, en este nivel se puentean y gestionan los dispositivos externos y periféricos mediante una vista uniforme proporcionada por una interfaz estándar que también se extiende a una facilidad de comunicación entre programas, llamada encauzamiento (pippe), que es esencialmente un canal de comunicación virtual de un sentido.<br />
<br />
* Intérprete del lenguaje de órdenes: este nivel proporciona la interfaz entre los usuarios interactivos y el sistema operativo. Los módulos de este nivel, emplean las facilidades proporcionadas por niveles bajos para aceptar líneas de órdenes desde los terminal. Entonces se reconocen estas líneas de entrada para separar las órdenes de los parámetros e identificar el tipo de servicio requerido.<br />
<br />
<br />
== Implementación de sistemas operativos en el microprocesador MC9S08QE128 ==<br />
Si bien este microprocesador puede parecer bajo el entorno actual un tanto lento, no se debe olvidar que años atrás con microprocesadores de mucha menor capacidad de procesamiento ya existían sistemas operativos en computadoras, redes de comunicación, almacenamiento de datos bancarios, cohetes espaciales, etc. Si treinta años atrás la tecnología era suficiente para el desarrollo de estos sistemas, con mayor razón es posible en la actualidad. Problemáticas de implementación radican en el mal uso y mala elección de estrategias de programación del sistema operativo.<br />
<br />
El micro disponible en el DEMOQE128 parece no haber sido diseñado con el objetivo de la implementación de sistemas operativos ya que por ejemplo no posee múltiples Stack Pointers (SP) para realizar el direccionamiento de las tareas en memoria principal y contiene numerosas aplicaciones y elementos innecesarios para tal fin. Sin embargo posee elementos suficientes para el desarrollo de un sistema operativo sencillo que puede ser empelado en la elaboración de proyectos de pequeña escala.<br />
<br />
A continuación se expondrán algunos de los elementos principales que podría tener un sistema operativo elaborado para este microprocesador.<br />
<br />
=== TaskControlBlock ===<br />
Un task control block, es una estructura utilizada para manejar y administrar las tareas que se quieren ejecutar en un sistema operativo. Esta estructura debe poseer todos los atributos y campos necesarios para asegurar que el sistema operativo pueda cargar la tarea adecuada y ejecutarla. El TCB (task control block), debe contener el identificador y la pila de la tarea correspondiente y dependiendo de la implementación, si es una lista doblemente enlazada en la que se encuentran los TCB de las tareas a ejecutar, el apuntador a la tarea siguiente y la tarea previa para que el despachador tenga la información necesaria para poder cargar la siguiente tarea a ejecutarse. <br />
<br />
<br />
<br />
Un ejemplo en lenguaje C de un TCB se muestra a continuación:<br />
<br />
<br />
<br />
<pre>typedef struct _TCB {<br />
<br />
char *StackPtr; //Apuntador al stack <br />
<br />
struct _TCB *Next; //Apuntador al siguiente TCB (tarea siguiete)<br />
<br />
struct _TCB *Prev; //Apuntador al TCB anterior (tarea anterior)<br />
<br />
char Stack[STACK_DEPTH]; //Tamaño del stack de la tarea<br />
<br />
int Task; //Identificador de la tarea<br />
<br />
char estado; //Estado de la tarea (corriendo, bloqueado, en espera, etc.)<br />
<br />
} TCB;</pre> <br />
<br />
<br />
<br />
<br />
<br />
<br />
=== Tick === <br />
El tick o time switch es la interrupción del proceso en ejecución para la sustitución por otro en un sistema en el que dichas actividades comparten por separado, períodos de ejecución en el procesador. Este período de ejecución se recomienda que sea menor al tiempo de reacción del ser humano (0.12 segundos). Generalmente se emplea un timer de 10 nanosegundos que interrumpe el proceso de ejecución. Puede ser empleado para ello el Real Time Counter o RTC.<br />
<br />
<br />
=== Implementación de timers ===<br />
Si bien la interrupción por serial, keyboard o software están permitidas en el desarrollo de sistemas operativos, normalmente se estandarizan las interrupciones de los contadores para demandar menor hardware así como también para crear un mayor grado de abstracción en niveles superiores de programación.<br />
<br />
En sistemas operativos basados en UNIX así como también en Windows, generalmente se emplea un número muy limitado de contadores. Estos elementos son globales en todas las aplicaciones que se ejecutan, ya que estos son gestionados por el Kernel. Usualmente se usan 2 contadores: uno de 10 nanosegundos y otro de 1 milisegundo. El primero además de ser empleado según la necesidad de los usuarios se utiliza como tick del sistema.<br />
<br />
Implementando una lista con contadores con un ID correspondiente a dicho time counter, se pueden implementar los 10 nanosegundos y 1 milisegundo para interrumpir una tarea luego de un tiempo subdividido por la combinación de dichos contadores globales.<br />
<br />
Por otro lado, no debemos olvidar la implementación de contadores de menor prioridad para llevar la hora en el sistema operativo.<br />
<br />
<br />
=== Tareas ===<br />
Las tareas son un conjunto de funciones o actividades que compartirán el uso de procesador en tiempos distintos de ejecución. Estas generalmente se definen como funciones de ejecución separada.<br />
<br />
En sistemas temporales, se emplea un tick que llama a una función despachadora para cambiar de tarea y permitir así la sensación de multiprocesamiento (multitasking).<br />
<br />
La estructura que se debe emplear en un micro como el MC9S08QE128 debe diseñarse tomando en cuenta la función del sistema. Si se desea implementar un ambiente que permita la introducción dinámica de nuevos programas por periféricos de entrada salida o de la memoria secundaria, es usualmente recomendable la implementación de una lista enlazada o doble enlazada entre las distintas tareas que se encuentran es espera de ejecución.<br />
<br />
De elegir un sistema medianamente estático, con espacios de memoria definidos para cada una de las tareas, se puede utilizar el uso de un arreglo de elementos.<br />
<br />
Sin importar la estructura elegida, la misma usualmente posee el valor address al lugar de memoria donde comienza a listarse la tarea, un ID que permite reconocer y buscar los programas en lista de ejecución, apuntadores de enlace (en caso de implementar lista enlazadas), bit de bloqueo y un valor de sleep.<br />
<br />
Entre las funciones relacionadas a los procesos de ejecución se encuentra el de crear una nueva tarea, eliminarla, colocarla en modo sleep y el de bloquear la misma.<br />
<br />
Tenemos como ejemplo la función de crear una nueva tarea:<br />
<br />
<br />
void create_task(func_ptr PC, char *stack, int stack_size, char task_id) {<br />
<br />
int *SP;<br />
<br />
SP = (int *) (stack + stack_size - 2);<br />
<br />
*SP-- = (int) PC;<br />
<br />
*SP-- = 0;<br />
<br />
*SP = 0;<br />
<br />
tasks[task_id].SP = SP;<br />
<br />
}<br />
<br />
<br />
=== Despachador === <br />
Del inglés dispatch, es de las primeras funciones que se deben crear para realizar un sistema operativo que causa más problemas y dificultades de entendimiento. Es llamada al entrar en la interrupción tick y permite cambiar la tarea de ejecución en intervalos de tiempo.<br />
<br />
<br />
<nowiki>#</nowiki>pragma INLINE<br />
<br />
void dispatch(char nexto) {<br />
<br />
void *tmp;<br />
<br />
asm tsx;<br />
<br />
asm aix #0x06;<br />
<br />
asm sthx tmp;<br />
<br />
tasks[running].SP = tmp;<br />
<br />
running = nexto; <br />
<br />
tmp = tasks[nexto].SP;<br />
<br />
asm ldhx tmp;<br />
<br />
asm sthx;<br />
<br />
}<br />
<br />
<br />
De la función lo primero que se hace notar es el uso de #pragma INLINE. Esto es usado cuando la función dispatch es usada dentro de una interrupción (en este caso la de tick) y se desea ser transparente impidiendo la perdida del stack pointer al cual se retornará del interrupt.<br />
<br />
Dispatch no hace más que cambiar la tarea a ejecutar. Primero que todo, se debe entender el funcionamiento de los interrupts. El siguiente esquema obtenido del manual muestra los registros que son colocados en el stack automáticamente al entrar en la interrupción del tick.<br />
<br />
<br />
[[Archivo:Stack_on_interruption.jpeg]]<br />
<br />
<br />
Como se muestra en el esquema, se puede observar que la interrupción deja en el stack la parte alta y baja del SP, el valor de X, el acumulador A y el código de la condición de registro. La función expuesta almacena el valor del SP en X lo que deja al sistema apuntando 5 + 1 (al hacer tsx) posiciones en relación al lugar original en el que se encontraba antes de la acción de la interrupción. Posteriormente se almacena el valor de HX en una variable temporal, y se guarda el sitio de la memoria en el cual el programa se encontraba corriendo antes de la interrupción (tasks[running].SP = tmp;).<br />
<br />
Finalmente se cambia la tarea que se encuentra en ejecución por la nueva tarea (nexto) así como también se usa el temporal nuevamente para cargar la posición SP particular correspondiente al sitio donde la nueva tarea comenzará o se quedó ejecutando anteriormente y se guarda el dato en el registro SP.<br />
<br />
De tal manera, se almacenaron los datos de ejecución al momento de parar la tarea y se cambia a la nueva actividad.<br />
<br />
<br />
=== Planificador === <br />
Conocido como scheduler, es el módulo que se encarga de llevar a cabo la elección del próximo programa a ejecutar al entrar a la interrupción tick. El siguiente ejemplo es de un sistema en el que la estructura de listado de las tareas es un arreglo. en el mismo, existe un número limitado de tareas definido por la variable MAX_TASK.<br />
<br />
void scheduler(void) {<br />
<br />
char next;<br />
<br />
next = running + 1;<br />
<br />
do {<br />
<br />
if ( next >= MAX_TASKS ) next = 0;<br />
<br />
if ( tasks[next].SP != 0 ) break;<br />
<br />
next++;<br />
<br />
} while (next != running);<br />
<br />
dispatch(next);<br />
<br />
asm pulh;<br />
<br />
asm rti;<br />
<br />
}<br />
<br />
Como se puede observar, la función no hace más que asignar el siguiente valor numérico en la lista y comprueba si no sobrepasa el valor máximo de tareas, en cuyo caso resetea el contador a cero. También se verifica si la tarea correspondiente a ese valor numérico realmente existe. Para definir dichas tareas se puede emplear el siguiente método que permite la implementación en funciones no por un número sino por un tag o nombre asignado por el programador.<br />
<br />
<nowiki>#</nowiki>define ONE_TASK (0)<br />
<br />
<nowiki>#</nowiki>define TWO_TASK (SERIAL_TASK + 1)<br />
<br />
<nowiki>#</nowiki>define THREE_TASK (SERIAL_TASK + 2)<br />
<br />
<nowiki>#</nowiki>define FOUR_TASK (SERIAL_TASK + 3)<br />
<br />
La implementación en listas enlazadas no difiere mucho, simplemente se se asigna como siguiente tarea a ejecutar la siguiente a la actual.<br />
<br />
Si bien el uso secuencial en este módulo de distribución de tiempo es fácil de implementar, no satisface completamente las necesidades del sistema operativo como tal. Es importante la inclusión funciones y elementos que permitan bloquear o colocar en sleep las tareas para así no desaprovechar los recursos en tareas que no deben ser procesadas. Es aún más importante la inclusión de prioridades o listas de prioridades en el planificador.<br />
<br />
En la elaboración del sistema operativo se debe colocar un sistema de prioridades en la ejecución de las tareas ya que se logra una mayor eficiencia en el uso de los recursos así como también una mejor respuesta ante las necesidades de los usuarios.<br />
<br />
<br />
=== Vector de Interrupción ===<br />
La siguiente función de interrupción llama al planificador que tras determinar la nueva a ejecutar llama al despachador que se encargará de hacer el cambio en memoria por dicha nueva tarea. Es importante eliminar las interrupaciones mientras nos encontramos en el vector de interrupción.<br />
<br />
void interrupt VectorNumber_Vtpm1ovf TMR1_ISR(void) {<br />
<br />
TPM1SC_TOF = 0;<br />
<br />
scheduler();<br />
<br />
}<br />
<br />
<br />
<br />
Un ejemplo de una rutina que carga la siguiente tarea a ejecutarse en el sistema operativo para el DEMOQE128 utilizando como generador<br />
de ticks el modulo del RTC<br />
<br />
void interrupt VectorNumber_Vrtc EJEMPLO_RUTINA_CAMBIO_CONTEXO_RTC (void){<br />
<br />
<br />
RTCSC = RTCSC | 0x80; //Borra la solicitud de interrupción para poder recibir la siguiente interrupción del RTC<br />
<br />
__asm sei; // Inhabilita las interrupciones<br />
<br />
__asm tsx; // Guarda el stack pointer de la tarea actual en el registro X<br />
__asm pshx; // Pone en el stack el byte menos significativo del stack pointer<br />
__asm pshh; // Pone en el stack el byte mas significativo del stack pointer<br />
__asm ldhx CurrentTask; // Guardo en H:X la direccion de CurrentTask<br />
__asm pula; // Saco el primer valor de mi stack (H) y lo guardo en el acumulador<br />
__asm sta , x; // Guardo H en donde apunta el registro H:X (CurrentTask->StackPtr)<br />
__asm pula; // Saco el primer valor de mi stack (X) y lo guardo en el acumulador<br />
__asm sta 1, x; // Guardo X donde apunta (H:X + 1) (CurrentTask->StackPtr + 1)<br />
<br />
__asm ldhx CurrentTask; // Cargo en H:X la direccion del CurrentTask<br />
__asm aix #2; // Sumo 2, por el registro H:X que se guardo, para que la direccion del nuevo task sea la adecuada//<br />
__asm ldhx , x // Cargo H:X con lo que apunta CurrentTask<br />
__asm sthx CurrentTask; // Guardo la direccion de la siguiente tarea en CurrentTask<br />
<br />
<br />
__asm ldhx ,x // Carga lo que apunta H:X que es el StackPtr actual<br />
__asm txs; // Guarda H:X en SP<br />
__asm pulh; // Des-apila el primer elemento de la pila<br />
<br />
__asm cli; // Habilita las interrupciones<br />
__asm rti; // Retorna de la interrupción<br />
}<br />
<br />
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Sistemas_Operativos_de_Multiprogramaci%C3%B3n&diff=2410Sistemas Operativos de Multiprogramación2012-12-01T01:17:24Z<p>Francjsalanova: </p>
<hr />
<div>También llamado sistemas operativos multitarea o multiproceso, se distingue por la habilidad de soportar dos o más procesos activos simultáneamente. El término multiprogramación denota un sistema operativo que, además de soportar procesos concurrentes múltiples, permite que residan simultáneamente en la memoria primaria las instrucciones y los datos procedentes de dos o más procesos distintos.<br />
<br />
El concepto de multiprogramación no se debe confundir con operación de multiproceso. Si bien el primer término implica el último, no sucede en viceversa. La operación multiproceso es la gestión de la totalidad de los recursos del sistema de la computadora mediante la implementación de cauce segmentado.<br />
<br />
La multiprogramación modificó el esquema de implementación de sistemas operativos por lotes al permitir alcanzar una mayor interacción entre los usuarios y programas en ejecución, un mayor rendimiento total del sistema y la creación de sistemas dinámicos que facilitan la implementación y estandarización de nuevos programas y conexiones con sistemas externos.<br />
<br />
<br />
== Tipos de sistemas operativos de multiprogramación ==<br />
=== Sistemas de tiempo compartido ===<br />
<br />
El tiempo compartido es bastante popular en sistemas multiprogramados y multiusuarios. Estos sistemas de multiacceso dedican la mayor parte del tiempo de ejecución de un programa único de una gran aplicación. Son elementos dedicados que poseen un buen tiempo de respuesta del terminal y tratan con frecuencia de proporcionar un reparto equitativo del los recursos comunes para dar la ilusión a cada usuario de poseer la máquina para el mismo. Por ejemplo, cuando se carga el sistema, se hace esperar más a los usuarios con más requerimientos de proceso pedido.<br />
<br />
El algoritmo empleado en el despacho de las actividades es único de la filosofía de estos sistemas. El mismo consiste en la ejecución de los programas con prioridad rotatoria que se incrementa con las esperas y cae después de que se dispensó el servicio. El sistema operativo interrumpe un programa y lo pone al final de la cola de programas en espera, cuando es más largo que la fracción de tiempo definida por el sistema, para prevenir a los programas de la monopolización del procesador.<br />
<br />
El gestor de memoria del sistema proporciona el aislamiento y protección de los programas en ejecución. Sin embargo, se puede emplear un espacio de memoria compartido controlado por el sistema operativo.<br />
<br />
Los componentes de entrada salida se rigen por un gestor I/O que debe permitir la cooperación con múltiples usuarios y dispositivos. Debido a la lenta respuesta de los terminales humanos y la reacción o respuesta humana, el procesamiento de las interrupciones del terminal no necesitan ser críticas para el tiempo.<br />
<br />
El gestor de archivos, por otro lado, debe proporcionar protección y control de acceso, dado a la posibilidad de concurrencia y de conflictos al acceder a los archivos.<br />
<br />
<br />
=== Sistemas de tiempo real ===<br />
<br />
Se usan en entornos donde se deben aceptar y procesar en tiempo breve y sin tiempos muertos un gran número de sucesos, en su mayoría externos al sistema de computadora. Son asuntos secundarios la conveniencia del usuario y la utilización de recursos.<br />
<br />
Estos sistemas se caracterizan principalmente por encargarse de procesos que se activan al ocurrir el suceso relacionado, señalado frecuentemente por una interrupción. Se consigue el multiproceso planificando los procesos independientes unos de otros. Se asigna a cada proceso un cierto nivel de prioridad que corresponde a la importancia relativa de los sucesos que sirve. El procesador está normalmente asignado al proceso con más alta prioridad entre los que están listos para ejecutarse. Esta forma de planificación se llama planificación basada en la prioridad preferente.<br />
<br />
A diferencia de los sistemas de tiempo compartido, el gestor de memoria está diseñado para tener un menor tiempo de respuesta debido a que los programas generalmente residen permanentemente en la memoria ya que usualmente son sistemas estáticos no diseñados para permitir la implementación de programas externos.<br />
<br />
El tiempo crítico del gestor de dispositivo es una de las características principales de los sistemas de tiempo real. Además de las formas sofisticadas proporcionadas de gestión de interrupciones y almacenamiento intermedio, estos sistemas proporcionan frecuentemente llamadas del sistema que permiten a los procesos de usuario conectarse directamente a vectores de interrupción y sucesos de servicio. De esta forma, los programas pueden ceder espacio en procesador a otras ejecuciones con el levantamiento de una interrupción.<br />
<br />
Generalmente estos sistemas de operación no poseen ningún tipo de almacenamiento secundario, solamente en aquellos sistemas de grandes magnitudes en los cuales si es requerido se necesita la implementación de un gestor de archivos que como en otros tipos de sistemas operativos debe manejar protección y control de acceso.<br />
<br />
<br />
=== Sistemas operativos combinados ===<br />
Lamentablemente el uso de sistemas operativos de tiempo son demasiado específicos y por lo tanto, a pesar de su gran utilidad en sistemas estáticos de gran escala, no satisfacen la necesidades de los usuarios en computadoras personales y emergentes dispositivos portátiles. Por dicha razón surge la necesidad de implementar sistemas operativos combinados que emplean las ventajas de los sistemas operativos de multiprogramación conjuntamente con los sistemas operativos por lotes.<br />
<br />
Los sistemas combinados se caracterizan por poseer bloques o lotes que se ejecutan con una menor prioridad que el resto de las aplicaciones. Así se logra el uso completo del procesador al eliminar los tiempos muertos o de espera.<br />
<br />
<br />
== Diseño e implementación de los sistemas operativos ==<br />
=== Requerimientos funcionales ===<br />
* Los procesos se crean en respuesta a los requerimientos explícitos o implícitos de los usuarios.<br />
<br />
* Los procesos emiten peticiones de los servicios y recursos del sistema.<br />
<br />
* El sistema operativo proporciona funciones de supervisión y control para la gestión de los procesos, tales como la creación y la retirada.<br />
<br />
* La gestión de la memoria consiste principalmente en la asignación de la memoria física a los requerimientos de los procesos.<br />
<br />
* Llamadas a sistema por parte de los usuarios.<br />
<br />
* Integridad de los archivos ante malfuncionamiento del equipo y caídas del sistema.<br />
<br />
* Implementación de archivos comunes y documentos compartidos entre las distintas tareas.<br />
<br />
<br />
=== Implementación ===<br />
El desarrollo de sistemas operativos de gran complejidad, como cualquier proyecto de programación de grandes extensiones, generalmente termina en el fracaso y el desastre. La implementación de subconjuntos del sistema, por otro lado, permite la elaboración de estratos de jerarquía que permiten obtener una mayor abstracción de programación, confiabilidad en las etapas inferiores, así como también la habilidad de modificar secciones por separado o la inclusión de nuevos elementos o customización del ambiente de usuario o interface.<br />
<br />
Podemos así subdividir un sistema en diversos estratos que generalmente son implementados:<br />
<br />
* Núcleo: con frecuencia llamado Kernel, realiza operaciones proporcionadas directamente sobre el hardware, gestionando los procesos en funcionamiento mediante estructuras de datos que representan el estado del sistema. Es aquí donde se encuentra el planificador el cual se encarga de determinar que proceso se debe ejecutar al finar la tarea actual. Este scheduler se encarga primoramente de cambiar el contexto de ejecución, lo que incluye guardar el estado en proceso y restaurar el de llegada. Por otro lado, este nivel se encarga de gestionar la interrupciones y proporcionar las facilidades para la conexión de las rutinas de servicio a las interrupciones de hardware. También se puede proporcionar en este nivel los mecanismos básicos para la sincronización entre procesos y comunicación como semáforos o mensajes.<br />
<br />
* I/O básica: conformado por las instrucciones de bajo nivel que permiten la implementación de los bloques de datos de la memoria secundaria. Proporciona una abstracción de almacenamiento como una matriz lineal de bloques de datos.<br />
<br />
* Gestión de memoria: en este nivel se asigna memoria principal a los procesos a ejecutar y se librea cuando no se necesite más. Es aquí donde se de lleva a cabo la implementación de la memoria virtual, que da al programador la ilusión de poseer un basto recurso de memoria de almacenamiento. Estos módulos manejan las interrupciones de hardware que señalan los intentos direccionar los datos que no se encuentran en la memoria principal; en tal caso los bloques de datos no encontrados son traídos desde el almacenamiento secundario usando las facilidades del nivel anterior de I/O básica.<br />
<br />
* Sistema de archivos y dispositivos: proporciona las facilidades para el almacenamiento durante largo tiempo y la manipulación de archivo. Posee un nivel más sofisticado en la asignación de espacio y acceso a los datos en almacenamiento secundario que el nivel de I/O básico. En este nivel, los archivos no se modifican mediante el direccionamiento de los bloques de datos ya que la lectura y escritura de datos se hace por medio de direcciones relativas al archivo a modificar. Así también, en este nivel se puentean y gestionan los dispositivos externos y periféricos mediante una vista uniforme proporcionada por una interfaz estándar que también se extiende a una facilidad de comunicación entre programas, llamada encauzamiento (pippe), que es esencialmente un canal de comunicación virtual de un sentido.<br />
<br />
* Intérprete del lenguaje de órdenes: este nivel proporciona la interfaz entre los usuarios interactivos y el sistema operativo. Los módulos de este nivel, emplean las facilidades proporcionadas por niveles bajos para aceptar líneas de órdenes desde los terminal. Entonces se reconocen estas líneas de entrada para separar las órdenes de los parámetros e identificar el tipo de servicio requerido.<br />
<br />
<br />
== Implementación de sistemas operativos en el microprocesador MC9S08QE128 ==<br />
Si bien este microprocesador puede parecer bajo el entorno actual un tanto lento, no se debe olvidar que años atrás con microprocesadores de mucha menor capacidad de procesamiento ya existían sistemas operativos en computadoras, redes de comunicación, almacenamiento de datos bancarios, cohetes espaciales, etc. Si treinta años atrás la tecnología era suficiente para el desarrollo de estos sistemas, con mayor razón es posible en la actualidad. Problemáticas de implementación radican en el mal uso y mala elección de estrategias de programación del sistema operativo.<br />
<br />
El micro disponible en el DEMOQE128 parece no haber sido diseñado con el objetivo de la implementación de sistemas operativos ya que por ejemplo no posee múltiples Stack Pointers (SP) para realizar el direccionamiento de las tareas en memoria principal y contiene numerosas aplicaciones y elementos innecesarios para tal fin. Sin embargo posee elementos suficientes para el desarrollo de un sistema operativo sencillo que puede ser empelado en la elaboración de proyectos de pequeña escala.<br />
<br />
A continuación se expondrán algunos de los elementos principales que podría tener un sistema operativo elaborado para este microprocesador.<br />
<br />
=== TaskControlBlock ===<br />
Un task control block, es una estructura utilizada para manejar y administrar las tareas que se quieren ejecutar en un sistema operativo. Esta estructura debe poseer todos los atributos y campos necesarios para asegurar que el sistema operativo pueda cargar la tarea adecuada y ejecutarla. El TCB (task control block), debe contener el identificador y la pila de la tarea correspondiente y dependiendo de la implementación, si es una lista doblemente enlazada en la que se encuentran los TCB de las tareas a ejecutar, el apuntador a la tarea siguiente y la tarea previa para que el despachador tenga la información necesaria para poder cargar la siguiente tarea a ejecutarse. <br />
<br />
<br />
<br />
Un ejemplo en lenguaje C de un TCB se muestra a continuación:<br />
<br />
<br />
<br />
typedef struct _TCB {<br />
<br />
char *StackPtr; //Apuntador al stack <br />
<br />
struct _TCB *Next; //Apuntador al siguiente TCB (tarea siguiete)<br />
<br />
struct _TCB *Prev; //Apuntador al TCB anterior (tarea anterior)<br />
<br />
char Stack[STACK_DEPTH]; //Tamaño del stack de la tarea<br />
<br />
int Task; //Identificador de la tarea<br />
<br />
char estado; //Estado de la tarea (corriendo, bloqueado, en espera, etc.)<br />
<br />
} TCB; <br />
<br />
<br />
<br />
<br />
<br />
=== Tick === <br />
El tick o time switch es la interrupción del proceso en ejecución para la sustitución por otro en un sistema en el que dichas actividades comparten por separado, períodos de ejecución en el procesador. Este período de ejecución se recomienda que sea menor al tiempo de reacción del ser humano (0.12 segundos). Generalmente se emplea un timer de 10 nanosegundos que interrumpe el proceso de ejecución. Puede ser empleado para ello el Real Time Counter o RTC.<br />
<br />
<br />
=== Implementación de timers ===<br />
Si bien la interrupción por serial, keyboard o software están permitidas en el desarrollo de sistemas operativos, normalmente se estandarizan las interrupciones de los contadores para demandar menor hardware así como también para crear un mayor grado de abstracción en niveles superiores de programación.<br />
<br />
En sistemas operativos basados en UNIX así como también en Windows, generalmente se emplea un número muy limitado de contadores. Estos elementos son globales en todas las aplicaciones que se ejecutan, ya que estos son gestionados por el Kernel. Usualmente se usan 2 contadores: uno de 10 nanosegundos y otro de 1 milisegundo. El primero además de ser empleado según la necesidad de los usuarios se utiliza como tick del sistema.<br />
<br />
Implementando una lista con contadores con un ID correspondiente a dicho time counter, se pueden implementar los 10 nanosegundos y 1 milisegundo para interrumpir una tarea luego de un tiempo subdividido por la combinación de dichos contadores globales.<br />
<br />
Por otro lado, no debemos olvidar la implementación de contadores de menor prioridad para llevar la hora en el sistema operativo.<br />
<br />
<br />
=== Tareas ===<br />
Las tareas son un conjunto de funciones o actividades que compartirán el uso de procesador en tiempos distintos de ejecución. Estas generalmente se definen como funciones de ejecución separada.<br />
<br />
En sistemas temporales, se emplea un tick que llama a una función despachadora para cambiar de tarea y permitir así la sensación de multiprocesamiento (multitasking).<br />
<br />
La estructura que se debe emplear en un micro como el MC9S08QE128 debe diseñarse tomando en cuenta la función del sistema. Si se desea implementar un ambiente que permita la introducción dinámica de nuevos programas por periféricos de entrada salida o de la memoria secundaria, es usualmente recomendable la implementación de una lista enlazada o doble enlazada entre las distintas tareas que se encuentran es espera de ejecución.<br />
<br />
De elegir un sistema medianamente estático, con espacios de memoria definidos para cada una de las tareas, se puede utilizar el uso de un arreglo de elementos.<br />
<br />
Sin importar la estructura elegida, la misma usualmente posee el valor address al lugar de memoria donde comienza a listarse la tarea, un ID que permite reconocer y buscar los programas en lista de ejecución, apuntadores de enlace (en caso de implementar lista enlazadas), bit de bloqueo y un valor de sleep.<br />
<br />
Entre las funciones relacionadas a los procesos de ejecución se encuentra el de crear una nueva tarea, eliminarla, colocarla en modo sleep y el de bloquear la misma.<br />
<br />
Tenemos como ejemplo la función de crear una nueva tarea:<br />
<br />
<br />
void create_task(func_ptr PC, char *stack, int stack_size, char task_id) {<br />
<br />
int *SP;<br />
<br />
SP = (int *) (stack + stack_size - 2);<br />
<br />
*SP-- = (int) PC;<br />
<br />
*SP-- = 0;<br />
<br />
*SP = 0;<br />
<br />
tasks[task_id].SP = SP;<br />
<br />
}<br />
<br />
<br />
=== Despachador === <br />
Del inglés dispatch, es de las primeras funciones que se deben crear para realizar un sistema operativo que causa más problemas y dificultades de entendimiento. Es llamada al entrar en la interrupción tick y permite cambiar la tarea de ejecución en intervalos de tiempo.<br />
<br />
<br />
<nowiki>#</nowiki>pragma INLINE<br />
<br />
void dispatch(char nexto) {<br />
<br />
void *tmp;<br />
<br />
asm tsx;<br />
<br />
asm aix #0x06;<br />
<br />
asm sthx tmp;<br />
<br />
tasks[running].SP = tmp;<br />
<br />
running = nexto; <br />
<br />
tmp = tasks[nexto].SP;<br />
<br />
asm ldhx tmp;<br />
<br />
asm sthx;<br />
<br />
}<br />
<br />
<br />
De la función lo primero que se hace notar es el uso de #pragma INLINE. Esto es usado cuando la función dispatch es usada dentro de una interrupción (en este caso la de tick) y se desea ser transparente impidiendo la perdida del stack pointer al cual se retornará del interrupt.<br />
<br />
Dispatch no hace más que cambiar la tarea a ejecutar. Primero que todo, se debe entender el funcionamiento de los interrupts. El siguiente esquema obtenido del manual muestra los registros que son colocados en el stack automáticamente al entrar en la interrupción del tick.<br />
<br />
<br />
[[Archivo:Stack_on_interruption.jpeg]]<br />
<br />
<br />
Como se muestra en el esquema, se puede observar que la interrupción deja en el stack la parte alta y baja del SP, el valor de X, el acumulador A y el código de la condición de registro. La función expuesta almacena el valor del SP en X lo que deja al sistema apuntando 5 + 1 (al hacer tsx) posiciones en relación al lugar original en el que se encontraba antes de la acción de la interrupción. Posteriormente se almacena el valor de HX en una variable temporal, y se guarda el sitio de la memoria en el cual el programa se encontraba corriendo antes de la interrupción (tasks[running].SP = tmp;).<br />
<br />
Finalmente se cambia la tarea que se encuentra en ejecución por la nueva tarea (nexto) así como también se usa el temporal nuevamente para cargar la posición SP particular correspondiente al sitio donde la nueva tarea comenzará o se quedó ejecutando anteriormente y se guarda el dato en el registro SP.<br />
<br />
De tal manera, se almacenaron los datos de ejecución al momento de parar la tarea y se cambia a la nueva actividad.<br />
<br />
<br />
=== Planificador === <br />
Conocido como scheduler, es el módulo que se encarga de llevar a cabo la elección del próximo programa a ejecutar al entrar a la interrupción tick. El siguiente ejemplo es de un sistema en el que la estructura de listado de las tareas es un arreglo. en el mismo, existe un número limitado de tareas definido por la variable MAX_TASK.<br />
<br />
void scheduler(void) {<br />
<br />
char next;<br />
<br />
next = running + 1;<br />
<br />
do {<br />
<br />
if ( next >= MAX_TASKS ) next = 0;<br />
<br />
if ( tasks[next].SP != 0 ) break;<br />
<br />
next++;<br />
<br />
} while (next != running);<br />
<br />
dispatch(next);<br />
<br />
asm pulh;<br />
<br />
asm rti;<br />
<br />
}<br />
<br />
Como se puede observar, la función no hace más que asignar el siguiente valor numérico en la lista y comprueba si no sobrepasa el valor máximo de tareas, en cuyo caso resetea el contador a cero. También se verifica si la tarea correspondiente a ese valor numérico realmente existe. Para definir dichas tareas se puede emplear el siguiente método que permite la implementación en funciones no por un número sino por un tag o nombre asignado por el programador.<br />
<br />
<nowiki>#</nowiki>define ONE_TASK (0)<br />
<br />
<nowiki>#</nowiki>define TWO_TASK (SERIAL_TASK + 1)<br />
<br />
<nowiki>#</nowiki>define THREE_TASK (SERIAL_TASK + 2)<br />
<br />
<nowiki>#</nowiki>define FOUR_TASK (SERIAL_TASK + 3)<br />
<br />
La implementación en listas enlazadas no difiere mucho, simplemente se se asigna como siguiente tarea a ejecutar la siguiente a la actual.<br />
<br />
Si bien el uso secuencial en este módulo de distribución de tiempo es fácil de implementar, no satisface completamente las necesidades del sistema operativo como tal. Es importante la inclusión funciones y elementos que permitan bloquear o colocar en sleep las tareas para así no desaprovechar los recursos en tareas que no deben ser procesadas. Es aún más importante la inclusión de prioridades o listas de prioridades en el planificador.<br />
<br />
En la elaboración del sistema operativo se debe colocar un sistema de prioridades en la ejecución de las tareas ya que se logra una mayor eficiencia en el uso de los recursos así como también una mejor respuesta ante las necesidades de los usuarios.<br />
<br />
<br />
=== Vector de Interrupción ===<br />
La siguiente función de interrupción llama al planificador que tras determinar la nueva a ejecutar llama al despachador que se encargará de hacer el cambio en memoria por dicha nueva tarea. Es importante eliminar las interrupaciones mientras nos encontramos en el vector de interrupción.<br />
<br />
void interrupt VectorNumber_Vtpm1ovf TMR1_ISR(void) {<br />
<br />
TPM1SC_TOF = 0;<br />
<br />
scheduler();<br />
<br />
}<br />
<br />
<br />
<br />
Un ejemplo de una rutina que carga la siguiente tarea a ejecutarse en el sistema operativo para el DEMOQE128 utilizando como generador<br />
de ticks el modulo del RTC<br />
<br />
void interrupt VectorNumber_Vrtc EJEMPLO_RUTINA_CAMBIO_CONTEXO_RTC (void){<br />
<br />
<br />
RTCSC = RTCSC | 0x80; //Borra la solicitud de interrupción para poder recibir la siguiente interrupción del RTC<br />
<br />
__asm sei; // Inhabilita las interrupciones<br />
<br />
__asm tsx; // Guarda el stack pointer de la tarea actual en el registro X<br />
__asm pshx; // Pone en el stack el byte menos significativo del stack pointer<br />
__asm pshh; // Pone en el stack el byte mas significativo del stack pointer<br />
__asm ldhx CurrentTask; // Guardo en H:X la direccion de CurrentTask<br />
__asm pula; // Saco el primer valor de mi stack (H) y lo guardo en el acumulador<br />
__asm sta , x; // Guardo H en donde apunta el registro H:X (CurrentTask->StackPtr)<br />
__asm pula; // Saco el primer valor de mi stack (X) y lo guardo en el acumulador<br />
__asm sta 1, x; // Guardo X donde apunta (H:X + 1) (CurrentTask->StackPtr + 1)<br />
<br />
__asm ldhx CurrentTask; // Cargo en H:X la direccion del CurrentTask<br />
__asm aix #2; // Sumo 2, por el registro H:X que se guardo, para que la direccion del nuevo task sea la adecuada//<br />
__asm ldhx , x // Cargo H:X con lo que apunta CurrentTask<br />
__asm sthx CurrentTask; // Guardo la direccion de la siguiente tarea en CurrentTask<br />
<br />
<br />
__asm ldhx ,x // Carga lo que apunta H:X que es el StackPtr actual<br />
__asm txs; // Guarda H:X en SP<br />
__asm pulh; // Des-apila el primer elemento de la pila<br />
<br />
__asm cli; // Habilita las interrupciones<br />
__asm rti; // Retorna de la interrupción<br />
}<br />
<br />
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Sistemas_Operativos_de_Multiprogramaci%C3%B3n&diff=2409Sistemas Operativos de Multiprogramación2012-12-01T01:16:03Z<p>Francjsalanova: </p>
<hr />
<div>También llamado sistemas operativos multitarea o multiproceso, se distingue por la habilidad de soportar dos o más procesos activos simultáneamente. El término multiprogramación denota un sistema operativo que, además de soportar procesos concurrentes múltiples, permite que residan simultáneamente en la memoria primaria las instrucciones y los datos procedentes de dos o más procesos distintos.<br />
<br />
El concepto de multiprogramación no se debe confundir con operación de multiproceso. Si bien el primer término implica el último, no sucede en viceversa. La operación multiproceso es la gestión de la totalidad de los recursos del sistema de la computadora mediante la implementación de cauce segmentado.<br />
<br />
La multiprogramación modificó el esquema de implementación de sistemas operativos por lotes al permitir alcanzar una mayor interacción entre los usuarios y programas en ejecución, un mayor rendimiento total del sistema y la creación de sistemas dinámicos que facilitan la implementación y estandarización de nuevos programas y conexiones con sistemas externos.<br />
<br />
<br />
== Tipos de sistemas operativos de multiprogramación ==<br />
=== Sistemas de tiempo compartido ===<br />
<br />
El tiempo compartido es bastante popular en sistemas multiprogramados y multiusuarios. Estos sistemas de multiacceso dedican la mayor parte del tiempo de ejecución de un programa único de una gran aplicación. Son elementos dedicados que poseen un buen tiempo de respuesta del terminal y tratan con frecuencia de proporcionar un reparto equitativo del los recursos comunes para dar la ilusión a cada usuario de poseer la máquina para el mismo. Por ejemplo, cuando se carga el sistema, se hace esperar más a los usuarios con más requerimientos de proceso pedido.<br />
<br />
El algoritmo empleado en el despacho de las actividades es único de la filosofía de estos sistemas. El mismo consiste en la ejecución de los programas con prioridad rotatoria que se incrementa con las esperas y cae después de que se dispensó el servicio. El sistema operativo interrumpe un programa y lo pone al final de la cola de programas en espera, cuando es más largo que la fracción de tiempo definida por el sistema, para prevenir a los programas de la monopolización del procesador.<br />
<br />
El gestor de memoria del sistema proporciona el aislamiento y protección de los programas en ejecución. Sin embargo, se puede emplear un espacio de memoria compartido controlado por el sistema operativo.<br />
<br />
Los componentes de entrada salida se rigen por un gestor I/O que debe permitir la cooperación con múltiples usuarios y dispositivos. Debido a la lenta respuesta de los terminales humanos y la reacción o respuesta humana, el procesamiento de las interrupciones del terminal no necesitan ser críticas para el tiempo.<br />
<br />
El gestor de archivos, por otro lado, debe proporcionar protección y control de acceso, dado a la posibilidad de concurrencia y de conflictos al acceder a los archivos.<br />
<br />
<br />
=== Sistemas de tiempo real ===<br />
<br />
Se usan en entornos donde se deben aceptar y procesar en tiempo breve y sin tiempos muertos un gran número de sucesos, en su mayoría externos al sistema de computadora. Son asuntos secundarios la conveniencia del usuario y la utilización de recursos.<br />
<br />
Estos sistemas se caracterizan principalmente por encargarse de procesos que se activan al ocurrir el suceso relacionado, señalado frecuentemente por una interrupción. Se consigue el multiproceso planificando los procesos independientes unos de otros. Se asigna a cada proceso un cierto nivel de prioridad que corresponde a la importancia relativa de los sucesos que sirve. El procesador está normalmente asignado al proceso con más alta prioridad entre los que están listos para ejecutarse. Esta forma de planificación se llama planificación basada en la prioridad preferente.<br />
<br />
A diferencia de los sistemas de tiempo compartido, el gestor de memoria está diseñado para tener un menor tiempo de respuesta debido a que los programas generalmente residen permanentemente en la memoria ya que usualmente son sistemas estáticos no diseñados para permitir la implementación de programas externos.<br />
<br />
El tiempo crítico del gestor de dispositivo es una de las características principales de los sistemas de tiempo real. Además de las formas sofisticadas proporcionadas de gestión de interrupciones y almacenamiento intermedio, estos sistemas proporcionan frecuentemente llamadas del sistema que permiten a los procesos de usuario conectarse directamente a vectores de interrupción y sucesos de servicio. De esta forma, los programas pueden ceder espacio en procesador a otras ejecuciones con el levantamiento de una interrupción.<br />
<br />
Generalmente estos sistemas de operación no poseen ningún tipo de almacenamiento secundario, solamente en aquellos sistemas de grandes magnitudes en los cuales si es requerido se necesita la implementación de un gestor de archivos que como en otros tipos de sistemas operativos debe manejar protección y control de acceso.<br />
<br />
<br />
=== Sistemas operativos combinados ===<br />
Lamentablemente el uso de sistemas operativos de tiempo son demasiado específicos y por lo tanto, a pesar de su gran utilidad en sistemas estáticos de gran escala, no satisfacen la necesidades de los usuarios en computadoras personales y emergentes dispositivos portátiles. Por dicha razón surge la necesidad de implementar sistemas operativos combinados que emplean las ventajas de los sistemas operativos de multiprogramación conjuntamente con los sistemas operativos por lotes.<br />
<br />
Los sistemas combinados se caracterizan por poseer bloques o lotes que se ejecutan con una menor prioridad que el resto de las aplicaciones. Así se logra el uso completo del procesador al eliminar los tiempos muertos o de espera.<br />
<br />
<br />
== Diseño e implementación de los sistemas operativos ==<br />
=== Requerimientos funcionales ===<br />
* Los procesos se crean en respuesta a los requerimientos explícitos o implícitos de los usuarios.<br />
<br />
* Los procesos emiten peticiones de los servicios y recursos del sistema.<br />
<br />
* El sistema operativo proporciona funciones de supervisión y control para la gestión de los procesos, tales como la creación y la retirada.<br />
<br />
* La gestión de la memoria consiste principalmente en la asignación de la memoria física a los requerimientos de los procesos.<br />
<br />
* Llamadas a sistema por parte de los usuarios.<br />
<br />
* Integridad de los archivos ante malfuncionamiento del equipo y caídas del sistema.<br />
<br />
* Implementación de archivos comunes y documentos compartidos entre las distintas tareas.<br />
<br />
<br />
=== Implementación ===<br />
El desarrollo de sistemas operativos de gran complejidad, como cualquier proyecto de programación de grandes extensiones, generalmente termina en el fracaso y el desastre. La implementación de subconjuntos del sistema, por otro lado, permite la elaboración de estratos de jerarquía que permiten obtener una mayor abstracción de programación, confiabilidad en las etapas inferiores, así como también la habilidad de modificar secciones por separado o la inclusión de nuevos elementos o customización del ambiente de usuario o interface.<br />
<br />
Podemos así subdividir un sistema en diversos estratos que generalmente son implementados:<br />
<br />
* Núcleo: con frecuencia llamado Kernel, realiza operaciones proporcionadas directamente sobre el hardware, gestionando los procesos en funcionamiento mediante estructuras de datos que representan el estado del sistema. Es aquí donde se encuentra el planificador el cual se encarga de determinar que proceso se debe ejecutar al finar la tarea actual. Este scheduler se encarga primoramente de cambiar el contexto de ejecución, lo que incluye guardar el estado en proceso y restaurar el de llegada. Por otro lado, este nivel se encarga de gestionar la interrupciones y proporcionar las facilidades para la conexión de las rutinas de servicio a las interrupciones de hardware. También se puede proporcionar en este nivel los mecanismos básicos para la sincronización entre procesos y comunicación como semáforos o mensajes.<br />
<br />
* I/O básica: conformado por las instrucciones de bajo nivel que permiten la implementación de los bloques de datos de la memoria secundaria. Proporciona una abstracción de almacenamiento como una matriz lineal de bloques de datos.<br />
<br />
* Gestión de memoria: en este nivel se asigna memoria principal a los procesos a ejecutar y se librea cuando no se necesite más. Es aquí donde se de lleva a cabo la implementación de la memoria virtual, que da al programador la ilusión de poseer un basto recurso de memoria de almacenamiento. Estos módulos manejan las interrupciones de hardware que señalan los intentos direccionar los datos que no se encuentran en la memoria principal; en tal caso los bloques de datos no encontrados son traídos desde el almacenamiento secundario usando las facilidades del nivel anterior de I/O básica.<br />
<br />
* Sistema de archivos y dispositivos: proporciona las facilidades para el almacenamiento durante largo tiempo y la manipulación de archivo. Posee un nivel más sofisticado en la asignación de espacio y acceso a los datos en almacenamiento secundario que el nivel de I/O básico. En este nivel, los archivos no se modifican mediante el direccionamiento de los bloques de datos ya que la lectura y escritura de datos se hace por medio de direcciones relativas al archivo a modificar. Así también, en este nivel se puentean y gestionan los dispositivos externos y periféricos mediante una vista uniforme proporcionada por una interfaz estándar que también se extiende a una facilidad de comunicación entre programas, llamada encauzamiento (pippe), que es esencialmente un canal de comunicación virtual de un sentido.<br />
<br />
* Intérprete del lenguaje de órdenes: este nivel proporciona la interfaz entre los usuarios interactivos y el sistema operativo. Los módulos de este nivel, emplean las facilidades proporcionadas por niveles bajos para aceptar líneas de órdenes desde los terminal. Entonces se reconocen estas líneas de entrada para separar las órdenes de los parámetros e identificar el tipo de servicio requerido.<br />
<br />
<br />
== Implementación de sistemas operativos en el microprocesador MC9S08QE128 ==<br />
Si bien este microprocesador puede parecer bajo el entorno actual un tanto lento, no se debe olvidar que años atrás con microprocesadores de mucha menor capacidad de procesamiento ya existían sistemas operativos en computadoras, redes de comunicación, almacenamiento de datos bancarios, cohetes espaciales, etc. Si treinta años atrás la tecnología era suficiente para el desarrollo de estos sistemas, con mayor razón es posible en la actualidad. Problemáticas de implementación radican en el mal uso y mala elección de estrategias de programación del sistema operativo.<br />
<br />
El micro disponible en el DEMOQE128 parece no haber sido diseñado con el objetivo de la implementación de sistemas operativos ya que por ejemplo no posee múltiples Stack Pointers (SP) para realizar el direccionamiento de las tareas en memoria principal y contiene numerosas aplicaciones y elementos innecesarios para tal fin. Sin embargo posee elementos suficientes para el desarrollo de un sistema operativo sencillo que puede ser empelado en la elaboración de proyectos de pequeña escala.<br />
<br />
A continuación se expondrán algunos de los elementos principales que podría tener un sistema operativo elaborado para este microprocesador.<br />
<br />
=== TaskControlBlock ===<br />
Un task control block, es una estructura utilizada para manejar y administrar las tareas que se quieren ejecutar en un sistema operativo. Esta estructura debe poseer todos los atributos y campos necesarios para asegurar que el sistema operativo pueda cargar la tarea adecuada y ejecutarla. El TCB (task control block), debe contener el identificador y la pila de la tarea correspondiente y dependiendo de la implementación, si es una lista doblemente enlazada en la que se encuentran los TCB de las tareas a ejecutar, el apuntador a la tarea siguiente y la tarea previa para que el despachador tenga la información necesaria para poder cargar la siguiente tarea a ejecutarse. <br />
<br />
<br />
<br />
Un ejemplo en lenguaje C de un TCB se muestra a continuación:<br />
<br />
<br />
<br />
typedef struct _TCB {<br />
<br />
<br />
<br />
char *StackPtr; //Apuntador al stack <br />
<br />
struct _TCB *Next; //Apuntador al siguiente TCB (tarea siguiete)<br />
<br />
struct _TCB *Prev; //Apuntador al TCB anterior (tarea anterior)<br />
<br />
char Stack[STACK_DEPTH]; //Tamaño del stack de la tarea<br />
<br />
int Task; //Identificador de la tarea<br />
<br />
char estado; //Estado de la tarea (corriendo, bloqueado, en espera, etc.)<br />
<br />
} TCB; <br />
<br />
<br />
<br />
<br />
<br />
=== Tick === <br />
El tick o time switch es la interrupción del proceso en ejecución para la sustitución por otro en un sistema en el que dichas actividades comparten por separado, períodos de ejecución en el procesador. Este período de ejecución se recomienda que sea menor al tiempo de reacción del ser humano (0.12 segundos). Generalmente se emplea un timer de 10 nanosegundos que interrumpe el proceso de ejecución. Puede ser empleado para ello el Real Time Counter o RTC.<br />
<br />
<br />
=== Implementación de timers ===<br />
Si bien la interrupción por serial, keyboard o software están permitidas en el desarrollo de sistemas operativos, normalmente se estandarizan las interrupciones de los contadores para demandar menor hardware así como también para crear un mayor grado de abstracción en niveles superiores de programación.<br />
<br />
En sistemas operativos basados en UNIX así como también en Windows, generalmente se emplea un número muy limitado de contadores. Estos elementos son globales en todas las aplicaciones que se ejecutan, ya que estos son gestionados por el Kernel. Usualmente se usan 2 contadores: uno de 10 nanosegundos y otro de 1 milisegundo. El primero además de ser empleado según la necesidad de los usuarios se utiliza como tick del sistema.<br />
<br />
Implementando una lista con contadores con un ID correspondiente a dicho time counter, se pueden implementar los 10 nanosegundos y 1 milisegundo para interrumpir una tarea luego de un tiempo subdividido por la combinación de dichos contadores globales.<br />
<br />
Por otro lado, no debemos olvidar la implementación de contadores de menor prioridad para llevar la hora en el sistema operativo.<br />
<br />
<br />
=== Tareas ===<br />
Las tareas son un conjunto de funciones o actividades que compartirán el uso de procesador en tiempos distintos de ejecución. Estas generalmente se definen como funciones de ejecución separada.<br />
<br />
En sistemas temporales, se emplea un tick que llama a una función despachadora para cambiar de tarea y permitir así la sensación de multiprocesamiento (multitasking).<br />
<br />
La estructura que se debe emplear en un micro como el MC9S08QE128 debe diseñarse tomando en cuenta la función del sistema. Si se desea implementar un ambiente que permita la introducción dinámica de nuevos programas por periféricos de entrada salida o de la memoria secundaria, es usualmente recomendable la implementación de una lista enlazada o doble enlazada entre las distintas tareas que se encuentran es espera de ejecución.<br />
<br />
De elegir un sistema medianamente estático, con espacios de memoria definidos para cada una de las tareas, se puede utilizar el uso de un arreglo de elementos.<br />
<br />
Sin importar la estructura elegida, la misma usualmente posee el valor address al lugar de memoria donde comienza a listarse la tarea, un ID que permite reconocer y buscar los programas en lista de ejecución, apuntadores de enlace (en caso de implementar lista enlazadas), bit de bloqueo y un valor de sleep.<br />
<br />
Entre las funciones relacionadas a los procesos de ejecución se encuentra el de crear una nueva tarea, eliminarla, colocarla en modo sleep y el de bloquear la misma.<br />
<br />
Tenemos como ejemplo la función de crear una nueva tarea:<br />
<br />
<br />
void create_task(func_ptr PC, char *stack, int stack_size, char task_id) {<br />
<br />
int *SP;<br />
<br />
SP = (int *) (stack + stack_size - 2);<br />
<br />
*SP-- = (int) PC;<br />
<br />
*SP-- = 0;<br />
<br />
*SP = 0;<br />
<br />
tasks[task_id].SP = SP;<br />
<br />
}<br />
<br />
<br />
=== Despachador === <br />
Del inglés dispatch, es de las primeras funciones que se deben crear para realizar un sistema operativo que causa más problemas y dificultades de entendimiento. Es llamada al entrar en la interrupción tick y permite cambiar la tarea de ejecución en intervalos de tiempo.<br />
<br />
<br />
<nowiki>#</nowiki>pragma INLINE<br />
<br />
void dispatch(char nexto) {<br />
<br />
void *tmp;<br />
<br />
asm tsx;<br />
<br />
asm aix #0x06;<br />
<br />
asm sthx tmp;<br />
<br />
tasks[running].SP = tmp;<br />
<br />
running = nexto; <br />
<br />
tmp = tasks[nexto].SP;<br />
<br />
asm ldhx tmp;<br />
<br />
asm sthx;<br />
<br />
}<br />
<br />
<br />
De la función lo primero que se hace notar es el uso de #pragma INLINE. Esto es usado cuando la función dispatch es usada dentro de una interrupción (en este caso la de tick) y se desea ser transparente impidiendo la perdida del stack pointer al cual se retornará del interrupt.<br />
<br />
Dispatch no hace más que cambiar la tarea a ejecutar. Primero que todo, se debe entender el funcionamiento de los interrupts. El siguiente esquema obtenido del manual muestra los registros que son colocados en el stack automáticamente al entrar en la interrupción del tick.<br />
<br />
<br />
[[Archivo:Stack_on_interruption.jpeg]]<br />
<br />
<br />
Como se muestra en el esquema, se puede observar que la interrupción deja en el stack la parte alta y baja del SP, el valor de X, el acumulador A y el código de la condición de registro. La función expuesta almacena el valor del SP en X lo que deja al sistema apuntando 5 + 1 (al hacer tsx) posiciones en relación al lugar original en el que se encontraba antes de la acción de la interrupción. Posteriormente se almacena el valor de HX en una variable temporal, y se guarda el sitio de la memoria en el cual el programa se encontraba corriendo antes de la interrupción (tasks[running].SP = tmp;).<br />
<br />
Finalmente se cambia la tarea que se encuentra en ejecución por la nueva tarea (nexto) así como también se usa el temporal nuevamente para cargar la posición SP particular correspondiente al sitio donde la nueva tarea comenzará o se quedó ejecutando anteriormente y se guarda el dato en el registro SP.<br />
<br />
De tal manera, se almacenaron los datos de ejecución al momento de parar la tarea y se cambia a la nueva actividad.<br />
<br />
<br />
=== Planificador === <br />
Conocido como scheduler, es el módulo que se encarga de llevar a cabo la elección del próximo programa a ejecutar al entrar a la interrupción tick. El siguiente ejemplo es de un sistema en el que la estructura de listado de las tareas es un arreglo. en el mismo, existe un número limitado de tareas definido por la variable MAX_TASK.<br />
<br />
void scheduler(void) {<br />
<br />
char next;<br />
<br />
next = running + 1;<br />
<br />
do {<br />
<br />
if ( next >= MAX_TASKS ) next = 0;<br />
<br />
if ( tasks[next].SP != 0 ) break;<br />
<br />
next++;<br />
<br />
} while (next != running);<br />
<br />
dispatch(next);<br />
<br />
asm pulh;<br />
<br />
asm rti;<br />
<br />
}<br />
<br />
Como se puede observar, la función no hace más que asignar el siguiente valor numérico en la lista y comprueba si no sobrepasa el valor máximo de tareas, en cuyo caso resetea el contador a cero. También se verifica si la tarea correspondiente a ese valor numérico realmente existe. Para definir dichas tareas se puede emplear el siguiente método que permite la implementación en funciones no por un número sino por un tag o nombre asignado por el programador.<br />
<br />
<nowiki>#</nowiki>define ONE_TASK (0)<br />
<br />
<nowiki>#</nowiki>define TWO_TASK (SERIAL_TASK + 1)<br />
<br />
<nowiki>#</nowiki>define THREE_TASK (SERIAL_TASK + 2)<br />
<br />
<nowiki>#</nowiki>define FOUR_TASK (SERIAL_TASK + 3)<br />
<br />
La implementación en listas enlazadas no difiere mucho, simplemente se se asigna como siguiente tarea a ejecutar la siguiente a la actual.<br />
<br />
Si bien el uso secuencial en este módulo de distribución de tiempo es fácil de implementar, no satisface completamente las necesidades del sistema operativo como tal. Es importante la inclusión funciones y elementos que permitan bloquear o colocar en sleep las tareas para así no desaprovechar los recursos en tareas que no deben ser procesadas. Es aún más importante la inclusión de prioridades o listas de prioridades en el planificador.<br />
<br />
En la elaboración del sistema operativo se debe colocar un sistema de prioridades en la ejecución de las tareas ya que se logra una mayor eficiencia en el uso de los recursos así como también una mejor respuesta ante las necesidades de los usuarios.<br />
<br />
<br />
=== Vector de Interrupción ===<br />
La siguiente función de interrupción llama al planificador que tras determinar la nueva a ejecutar llama al despachador que se encargará de hacer el cambio en memoria por dicha nueva tarea. Es importante eliminar las interrupaciones mientras nos encontramos en el vector de interrupción.<br />
<br />
void interrupt VectorNumber_Vtpm1ovf TMR1_ISR(void) {<br />
<br />
TPM1SC_TOF = 0;<br />
<br />
scheduler();<br />
<br />
}<br />
<br />
<br />
<br />
Un ejemplo de una rutina que carga la siguiente tarea a ejecutarse en el sistema operativo para el DEMOQE128 utilizando como generador<br />
de ticks el modulo del RTC<br />
<br />
void interrupt VectorNumber_Vrtc EJEMPLO_RUTINA_CAMBIO_CONTEXO_RTC (void){<br />
<br />
<br />
RTCSC = RTCSC | 0x80; //Borra la solicitud de interrupción para poder recibir la siguiente interrupción del RTC<br />
<br />
__asm sei; // Inhabilita las interrupciones<br />
<br />
__asm tsx; // Guarda el stack pointer de la tarea actual en el registro X<br />
__asm pshx; // Pone en el stack el byte menos significativo del stack pointer<br />
__asm pshh; // Pone en el stack el byte mas significativo del stack pointer<br />
__asm ldhx CurrentTask; // Guardo en H:X la direccion de CurrentTask<br />
__asm pula; // Saco el primer valor de mi stack (H) y lo guardo en el acumulador<br />
__asm sta , x; // Guardo H en donde apunta el registro H:X (CurrentTask->StackPtr)<br />
__asm pula; // Saco el primer valor de mi stack (X) y lo guardo en el acumulador<br />
__asm sta 1, x; // Guardo X donde apunta (H:X + 1) (CurrentTask->StackPtr + 1)<br />
<br />
__asm ldhx CurrentTask; // Cargo en H:X la direccion del CurrentTask<br />
__asm aix #2; // Sumo 2, por el registro H:X que se guardo, para que la direccion del nuevo task sea la adecuada//<br />
__asm ldhx , x // Cargo H:X con lo que apunta CurrentTask<br />
__asm sthx CurrentTask; // Guardo la direccion de la siguiente tarea en CurrentTask<br />
<br />
<br />
__asm ldhx ,x // Carga lo que apunta H:X que es el StackPtr actual<br />
__asm txs; // Guarda H:X en SP<br />
__asm pulh; // Des-apila el primer elemento de la pila<br />
<br />
__asm cli; // Habilita las interrupciones<br />
__asm rti; // Retorna de la interrupción<br />
}<br />
<br />
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Sistemas_Operativos_de_Multiprogramaci%C3%B3n&diff=2407Sistemas Operativos de Multiprogramación2012-12-01T01:03:34Z<p>Francjsalanova: </p>
<hr />
<div>También llamado sistemas operativos multitarea o multiproceso, se distingue por la habilidad de soportar dos o más procesos activos simultáneamente. El término multiprogramación denota un sistema operativo que, además de soportar procesos concurrentes múltiples, permite que residan simultáneamente en la memoria primaria las instrucciones y los datos procedentes de dos o más procesos distintos.<br />
<br />
El concepto de multiprogramación no se debe confundir con operación de multiproceso. Si bien el primer término implica el último, no sucede en viceversa. La operación multiproceso es la gestión de la totalidad de los recursos del sistema de la computadora mediante la implementación de cauce segmentado.<br />
<br />
La multiprogramación modificó el esquema de implementación de sistemas operativos por lotes al permitir alcanzar una mayor interacción entre los usuarios y programas en ejecución, un mayor rendimiento total del sistema y la creación de sistemas dinámicos que facilitan la implementación y estandarización de nuevos programas y conexiones con sistemas externos.<br />
<br />
<br />
== Tipos de sistemas operativos de multiprogramación ==<br />
=== Sistemas de tiempo compartido ===<br />
<br />
El tiempo compartido es bastante popular en sistemas multiprogramados y multiusuarios. Estos sistemas de multiacceso dedican la mayor parte del tiempo de ejecución de un programa único de una gran aplicación. Son elementos dedicados que poseen un buen tiempo de respuesta del terminal y tratan con frecuencia de proporcionar un reparto equitativo del los recursos comunes para dar la ilusión a cada usuario de poseer la máquina para el mismo. Por ejemplo, cuando se carga el sistema, se hace esperar más a los usuarios con más requerimientos de proceso pedido.<br />
<br />
El algoritmo empleado en el despacho de las actividades es único de la filosofía de estos sistemas. El mismo consiste en la ejecución de los programas con prioridad rotatoria que se incrementa con las esperas y cae después de que se dispensó el servicio. El sistema operativo interrumpe un programa y lo pone al final de la cola de programas en espera, cuando es más largo que la fracción de tiempo definida por el sistema, para prevenir a los programas de la monopolización del procesador.<br />
<br />
El gestor de memoria del sistema proporciona el aislamiento y protección de los programas en ejecución. Sin embargo, se puede emplear un espacio de memoria compartido controlado por el sistema operativo.<br />
<br />
Los componentes de entrada salida se rigen por un gestor I/O que debe permitir la cooperación con múltiples usuarios y dispositivos. Debido a la lenta respuesta de los terminales humanos y la reacción o respuesta humana, el procesamiento de las interrupciones del terminal no necesitan ser críticas para el tiempo.<br />
<br />
El gestor de archivos, por otro lado, debe proporcionar protección y control de acceso, dado a la posibilidad de concurrencia y de conflictos al acceder a los archivos.<br />
<br />
<br />
=== Sistemas de tiempo real ===<br />
<br />
Se usan en entornos donde se deben aceptar y procesar en tiempo breve y sin tiempos muertos un gran número de sucesos, en su mayoría externos al sistema de computadora. Son asuntos secundarios la conveniencia del usuario y la utilización de recursos.<br />
<br />
Estos sistemas se caracterizan principalmente por encargarse de procesos que se activan al ocurrir el suceso relacionado, señalado frecuentemente por una interrupción. Se consigue el multiproceso planificando los procesos independientes unos de otros. Se asigna a cada proceso un cierto nivel de prioridad que corresponde a la importancia relativa de los sucesos que sirve. El procesador está normalmente asignado al proceso con más alta prioridad entre los que están listos para ejecutarse. Esta forma de planificación se llama planificación basada en la prioridad preferente.<br />
<br />
A diferencia de los sistemas de tiempo compartido, el gestor de memoria está diseñado para tener un menor tiempo de respuesta debido a que los programas generalmente residen permanentemente en la memoria ya que usualmente son sistemas estáticos no diseñados para permitir la implementación de programas externos.<br />
<br />
El tiempo crítico del gestor de dispositivo es una de las características principales de los sistemas de tiempo real. Además de las formas sofisticadas proporcionadas de gestión de interrupciones y almacenamiento intermedio, estos sistemas proporcionan frecuentemente llamadas del sistema que permiten a los procesos de usuario conectarse directamente a vectores de interrupción y sucesos de servicio. De esta forma, los programas pueden ceder espacio en procesador a otras ejecuciones con el levantamiento de una interrupción.<br />
<br />
Generalmente estos sistemas de operación no poseen ningún tipo de almacenamiento secundario, solamente en aquellos sistemas de grandes magnitudes en los cuales si es requerido se necesita la implementación de un gestor de archivos que como en otros tipos de sistemas operativos debe manejar protección y control de acceso.<br />
<br />
<br />
=== Sistemas operativos combinados ===<br />
Lamentablemente el uso de sistemas operativos de tiempo son demasiado específicos y por lo tanto, a pesar de su gran utilidad en sistemas estáticos de gran escala, no satisfacen la necesidades de los usuarios en computadoras personales y emergentes dispositivos portátiles. Por dicha razón surge la necesidad de implementar sistemas operativos combinados que emplean las ventajas de los sistemas operativos de multiprogramación conjuntamente con los sistemas operativos por lotes.<br />
<br />
Los sistemas combinados se caracterizan por poseer bloques o lotes que se ejecutan con una menor prioridad que el resto de las aplicaciones. Así se logra el uso completo del procesador al eliminar los tiempos muertos o de espera.<br />
<br />
<br />
== Diseño e implementación de los sistemas operativos ==<br />
=== Requerimientos funcionales ===<br />
* Los procesos se crean en respuesta a los requerimientos explícitos o implícitos de los usuarios.<br />
<br />
* Los procesos emiten peticiones de los servicios y recursos del sistema.<br />
<br />
* El sistema operativo proporciona funciones de supervisión y control para la gestión de los procesos, tales como la creación y la retirada.<br />
<br />
* La gestión de la memoria consiste principalmente en la asignación de la memoria física a los requerimientos de los procesos.<br />
<br />
* Llamadas a sistema por parte de los usuarios.<br />
<br />
* Integridad de los archivos ante malfuncionamiento del equipo y caídas del sistema.<br />
<br />
* Implementación de archivos comunes y documentos compartidos entre las distintas tareas.<br />
<br />
<br />
=== Implementación ===<br />
El desarrollo de sistemas operativos de gran complejidad, como cualquier proyecto de programación de grandes extensiones, generalmente termina en el fracaso y el desastre. La implementación de subconjuntos del sistema, por otro lado, permite la elaboración de estratos de jerarquía que permiten obtener una mayor abstracción de programación, confiabilidad en las etapas inferiores, así como también la habilidad de modificar secciones por separado o la inclusión de nuevos elementos o customización del ambiente de usuario o interface.<br />
<br />
Podemos así subdividir un sistema en diversos estratos que generalmente son implementados:<br />
<br />
* Núcleo: con frecuencia llamado Kernel, realiza operaciones proporcionadas directamente sobre el hardware, gestionando los procesos en funcionamiento mediante estructuras de datos que representan el estado del sistema. Es aquí donde se encuentra el planificador el cual se encarga de determinar que proceso se debe ejecutar al finar la tarea actual. Este scheduler se encarga primoramente de cambiar el contexto de ejecución, lo que incluye guardar el estado en proceso y restaurar el de llegada. Por otro lado, este nivel se encarga de gestionar la interrupciones y proporcionar las facilidades para la conexión de las rutinas de servicio a las interrupciones de hardware. También se puede proporcionar en este nivel los mecanismos básicos para la sincronización entre procesos y comunicación como semáforos o mensajes.<br />
<br />
* I/O básica: conformado por las instrucciones de bajo nivel que permiten la implementación de los bloques de datos de la memoria secundaria. Proporciona una abstracción de almacenamiento como una matriz lineal de bloques de datos.<br />
<br />
* Gestión de memoria: en este nivel se asigna memoria principal a los procesos a ejecutar y se librea cuando no se necesite más. Es aquí donde se de lleva a cabo la implementación de la memoria virtual, que da al programador la ilusión de poseer un basto recurso de memoria de almacenamiento. Estos módulos manejan las interrupciones de hardware que señalan los intentos direccionar los datos que no se encuentran en la memoria principal; en tal caso los bloques de datos no encontrados son traídos desde el almacenamiento secundario usando las facilidades del nivel anterior de I/O básica.<br />
<br />
* Sistema de archivos y dispositivos: proporciona las facilidades para el almacenamiento durante largo tiempo y la manipulación de archivo. Posee un nivel más sofisticado en la asignación de espacio y acceso a los datos en almacenamiento secundario que el nivel de I/O básico. En este nivel, los archivos no se modifican mediante el direccionamiento de los bloques de datos ya que la lectura y escritura de datos se hace por medio de direcciones relativas al archivo a modificar. Así también, en este nivel se puentean y gestionan los dispositivos externos y periféricos mediante una vista uniforme proporcionada por una interfaz estándar que también se extiende a una facilidad de comunicación entre programas, llamada encauzamiento (pippe), que es esencialmente un canal de comunicación virtual de un sentido.<br />
<br />
* Intérprete del lenguaje de órdenes: este nivel proporciona la interfaz entre los usuarios interactivos y el sistema operativo. Los módulos de este nivel, emplean las facilidades proporcionadas por niveles bajos para aceptar líneas de órdenes desde los terminal. Entonces se reconocen estas líneas de entrada para separar las órdenes de los parámetros e identificar el tipo de servicio requerido.<br />
<br />
<br />
== Implementación de sistemas operativos en el microprocesador MC9S08QE128 ==<br />
Si bien este microprocesador puede parecer bajo el entorno actual un tanto lento, no se debe olvidar que años atrás con microprocesadores de mucha menor capacidad de procesamiento ya existían sistemas operativos en computadoras, redes de comunicación, almacenamiento de datos bancarios, cohetes espaciales, etc. Si treinta años atrás la tecnología era suficiente para el desarrollo de estos sistemas, con mayor razón es posible en la actualidad. Problemáticas de implementación radican en el mal uso y mala elección de estrategias de programación del sistema operativo.<br />
<br />
El micro disponible en el DEMOQE128 parece no haber sido diseñado con el objetivo de la implementación de sistemas operativos ya que por ejemplo no posee múltiples Stack Pointers (SP) para realizar el direccionamiento de las tareas en memoria principal y contiene numerosas aplicaciones y elementos innecesarios para tal fin. Sin embargo posee elementos suficientes para el desarrollo de un sistema operativo sencillo que puede ser empelado en la elaboración de proyectos de pequeña escala.<br />
<br />
A continuación se expondrán algunos de los elementos principales que podría tener un sistema operativo elaborado para este microprocesador.<br />
<br />
<br />
=== Tick ===<br />
El tick o time switch es la interrupción del proceso en ejecución para la sustitución por otro en un sistema en el que dichas actividades comparten por separado, períodos de ejecución en el procesador. Este período de ejecución se recomienda que sea menor al tiempo de reacción del ser humano (0.12 segundos). Generalmente se emplea un timer de 10 nanosegundos que interrumpe el proceso de ejecución. Puede ser empleado para ello el Real Time Counter o RTC.<br />
<br />
<br />
=== Implementación de timers ===<br />
Si bien la interrupción por serial, keyboard o software están permitidas en el desarrollo de sistemas operativos, normalmente se estandarizan las interrupciones de los contadores para demandar menor hardware así como también para crear un mayor grado de abstracción en niveles superiores de programación.<br />
<br />
En sistemas operativos basados en UNIX así como también en Windows, generalmente se emplea un número muy limitado de contadores. Estos elementos son globales en todas las aplicaciones que se ejecutan, ya que estos son gestionados por el Kernel. Usualmente se usan 2 contadores: uno de 10 nanosegundos y otro de 1 milisegundo. El primero además de ser empleado según la necesidad de los usuarios se utiliza como tick del sistema.<br />
<br />
Implementando una lista con contadores con un ID correspondiente a dicho time counter, se pueden implementar los 10 nanosegundos y 1 milisegundo para interrumpir una tarea luego de un tiempo subdividido por la combinación de dichos contadores globales.<br />
<br />
Por otro lado, no debemos olvidar la implementación de contadores de menor prioridad para llevar la hora en el sistema operativo.<br />
<br />
<br />
=== Tareas ===<br />
Las tareas son un conjunto de funciones o actividades que compartirán el uso de procesador en tiempos distintos de ejecución. Estas generalmente se definen como funciones de ejecución separada.<br />
<br />
En sistemas temporales, se emplea un tick que llama a una función despachadora para cambiar de tarea y permitir así la sensación de multiprocesamiento (multitasking).<br />
<br />
La estructura que se debe emplear en un micro como el MC9S08QE128 debe diseñarse tomando en cuenta la función del sistema. Si se desea implementar un ambiente que permita la introducción dinámica de nuevos programas por periféricos de entrada salida o de la memoria secundaria, es usualmente recomendable la implementación de una lista enlazada o doble enlazada entre las distintas tareas que se encuentran es espera de ejecución.<br />
<br />
De elegir un sistema medianamente estático, con espacios de memoria definidos para cada una de las tareas, se puede utilizar el uso de un arreglo de elementos.<br />
<br />
Sin importar la estructura elegida, la misma usualmente posee el valor address al lugar de memoria donde comienza a listarse la tarea, un ID que permite reconocer y buscar los programas en lista de ejecución, apuntadores de enlace (en caso de implementar lista enlazadas), bit de bloqueo y un valor de sleep.<br />
<br />
Entre las funciones relacionadas a los procesos de ejecución se encuentra el de crear una nueva tarea, eliminarla, colocarla en modo sleep y el de bloquear la misma.<br />
<br />
Tenemos como ejemplo la función de crear una nueva tarea:<br />
<br />
<br />
void create_task(func_ptr PC, char *stack, int stack_size, char task_id) {<br />
<br />
int *SP;<br />
<br />
SP = (int *) (stack + stack_size - 2);<br />
<br />
*SP-- = (int) PC;<br />
<br />
*SP-- = 0;<br />
<br />
*SP = 0;<br />
<br />
tasks[task_id].SP = SP;<br />
<br />
}<br />
<br />
<br />
=== Despachador === <br />
Del inglés dispatch, es de las primeras funciones que se deben crear para realizar un sistema operativo que causa más problemas y dificultades de entendimiento. Es llamada al entrar en la interrupción tick y permite cambiar la tarea de ejecución en intervalos de tiempo.<br />
<br />
<br />
<nowiki>#</nowiki>pragma INLINE<br />
<br />
void dispatch(char nexto) {<br />
<br />
void *tmp;<br />
<br />
asm tsx;<br />
<br />
asm aix #0x06;<br />
<br />
asm sthx tmp;<br />
<br />
tasks[running].SP = tmp;<br />
<br />
running = nexto; <br />
<br />
tmp = tasks[nexto].SP;<br />
<br />
asm ldhx tmp;<br />
<br />
asm sthx;<br />
<br />
}<br />
<br />
<br />
De la función lo primero que se hace notar es el uso de #pragma INLINE. Esto es usado cuando la función dispatch es usada dentro de una interrupción (en este caso la de tick) y se desea ser transparente impidiendo la perdida del stack pointer al cual se retornará del interrupt.<br />
<br />
Dispatch no hace más que cambiar la tarea a ejecutar. Primero que todo, se debe entender el funcionamiento de los interrupts. El siguiente esquema obtenido del manual muestra los registros que son colocados en el stack automáticamente al entrar en la interrupción del tick.<br />
<br />
<br />
[[Archivo:Stack_on_interruption.jpeg]]<br />
<br />
<br />
Como se muestra en el esquema, se puede observar que la interrupción deja en el stack la parte alta y baja del SP, el valor de X, el acumulador A y el código de la condición de registro. La función expuesta almacena el valor del SP en X lo que deja al sistema apuntando 5 + 1 (al hacer tsx) posiciones en relación al lugar original en el que se encontraba antes de la acción de la interrupción. Posteriormente se almacena el valor de HX en una variable temporal, y se guarda el sitio de la memoria en el cual el programa se encontraba corriendo antes de la interrupción (tasks[running].SP = tmp;).<br />
<br />
Finalmente se cambia la tarea que se encuentra en ejecución por la nueva tarea (nexto) así como también se usa el temporal nuevamente para cargar la posición SP particular correspondiente al sitio donde la nueva tarea comenzará o se quedó ejecutando anteriormente y se guarda el dato en el registro SP.<br />
<br />
De tal manera, se almacenaron los datos de ejecución al momento de parar la tarea y se cambia a la nueva actividad.<br />
<br />
<br />
=== Planificador === <br />
Conocido como scheduler, es el módulo que se encarga de llevar a cabo la elección del próximo programa a ejecutar al entrar a la interrupción tick. El siguiente ejemplo es de un sistema en el que la estructura de listado de las tareas es un arreglo. en el mismo, existe un número limitado de tareas definido por la variable MAX_TASK.<br />
<br />
void scheduler(void) {<br />
<br />
char next;<br />
<br />
next = running + 1;<br />
<br />
do {<br />
<br />
if ( next >= MAX_TASKS ) next = 0;<br />
<br />
if ( tasks[next].SP != 0 ) break;<br />
<br />
next++;<br />
<br />
} while (next != running);<br />
<br />
dispatch(next);<br />
<br />
asm pulh;<br />
<br />
asm rti;<br />
<br />
}<br />
<br />
Como se puede observar, la función no hace más que asignar el siguiente valor numérico en la lista y comprueba si no sobrepasa el valor máximo de tareas, en cuyo caso resetea el contador a cero. También se verifica si la tarea correspondiente a ese valor numérico realmente existe. Para definir dichas tareas se puede emplear el siguiente método que permite la implementación en funciones no por un número sino por un tag o nombre asignado por el programador.<br />
<br />
<nowiki>#</nowiki>define ONE_TASK (0)<br />
<br />
<nowiki>#</nowiki>define TWO_TASK (SERIAL_TASK + 1)<br />
<br />
<nowiki>#</nowiki>define THREE_TASK (SERIAL_TASK + 2)<br />
<br />
<nowiki>#</nowiki>define FOUR_TASK (SERIAL_TASK + 3)<br />
<br />
La implementación en listas enlazadas no difiere mucho, simplemente se se asigna como siguiente tarea a ejecutar la siguiente a la actual.<br />
<br />
Si bien el uso secuencial en este módulo de distribución de tiempo es fácil de implementar, no satisface completamente las necesidades del sistema operativo como tal. Es importante la inclusión funciones y elementos que permitan bloquear o colocar en sleep las tareas para así no desaprovechar los recursos en tareas que no deben ser procesadas. Es aún más importante la inclusión de prioridades o listas de prioridades en el planificador.<br />
<br />
En la elaboración del sistema operativo se debe colocar un sistema de prioridades en la ejecución de las tareas ya que se logra una mayor eficiencia en el uso de los recursos así como también una mejor respuesta ante las necesidades de los usuarios.<br />
<br />
<br />
=== Vector de Interrupción ===<br />
La siguiente función de interrupción llama al planificador que tras determinar la nueva a ejecutar llama al despachador que se encargará de hacer el cambio en memoria por dicha nueva tarea. Es importante eliminar las interrupaciones mientras nos encontramos en el vector de interrupción.<br />
<br />
void interrupt VectorNumber_Vtpm1ovf TMR1_ISR(void) {<br />
<br />
TPM1SC_TOF = 0;<br />
<br />
scheduler();<br />
<br />
}<br />
<br />
<br />
<br />
Un ejemplo de una rutina que carga la siguiente tarea a ejecutarse en el sistema operativo para el DEMOQE128 utilizando como generador<br />
de ticks el modulo del RTC<br />
<br />
void interrupt VectorNumber_Vrtc EJEMPLO_RUTINA_CAMBIO_CONTEXO_RTC (void){<br />
<br />
<br />
RTCSC = RTCSC | 0x80; //Borra la solicitud de interrupción para poder recibir la siguiente interrupción del RTC<br />
<br />
__asm sei; // Inhabilita las interrupciones<br />
<br />
__asm tsx; // Guarda el stack pointer de la tarea actual en el registro X<br />
__asm pshx; // Pone en el stack el byte menos significativo del stack pointer<br />
__asm pshh; // Pone en el stack el byte mas significativo del stack pointer<br />
__asm ldhx CurrentTask; // Guardo en H:X la direccion de CurrentTask<br />
__asm pula; // Saco el primer valor de mi stack (H) y lo guardo en el acumulador<br />
__asm sta , x; // Guardo H en donde apunta el registro H:X (CurrentTask->StackPtr)<br />
__asm pula; // Saco el primer valor de mi stack (X) y lo guardo en el acumulador<br />
__asm sta 1, x; // Guardo X donde apunta (H:X + 1) (CurrentTask->StackPtr + 1)<br />
<br />
__asm ldhx CurrentTask; // Cargo en H:X la direccion del CurrentTask<br />
__asm aix #2; // Sumo 2, por el registro H:X que se guardo, para que la direccion del nuevo task sea la adecuada//<br />
__asm ldhx , x // Cargo H:X con lo que apunta CurrentTask<br />
__asm sthx CurrentTask; // Guardo la direccion de la siguiente tarea en CurrentTask<br />
<br />
<br />
__asm ldhx ,x // Carga lo que apunta H:X que es el StackPtr actual<br />
__asm txs; // Guarda H:X en SP<br />
__asm pulh; // Des-apila el primer elemento de la pila<br />
<br />
__asm cli; // Habilita las interrupciones<br />
__asm rti; // Retorna de la interrupción<br />
}<br />
<br />
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Sistemas_Operativos_de_Multiprogramaci%C3%B3n&diff=2405Sistemas Operativos de Multiprogramación2012-12-01T01:00:24Z<p>Francjsalanova: </p>
<hr />
<div>También llamado sistemas operativos multitarea o multiproceso, se distingue por la habilidad de soportar dos o más procesos activos simultáneamente. El término multiprogramación denota un sistema operativo que, además de soportar procesos concurrentes múltiples, permite que residan simultáneamente en la memoria primaria las instrucciones y los datos procedentes de dos o más procesos distintos.<br />
<br />
El concepto de multiprogramación no se debe confundir con operación de multiproceso. Si bien el primer término implica el último, no sucede en viceversa. La operación multiproceso es la gestión de la totalidad de los recursos del sistema de la computadora mediante la implementación de cauce segmentado.<br />
<br />
La multiprogramación modificó el esquema de implementación de sistemas operativos por lotes al permitir alcanzar una mayor interacción entre los usuarios y programas en ejecución, un mayor rendimiento total del sistema y la creación de sistemas dinámicos que facilitan la implementación y estandarización de nuevos programas y conexiones con sistemas externos.<br />
<br />
<br />
== Tipos de sistemas operativos de multiprogramación ==<br />
=== Sistemas de tiempo compartido ===<br />
<br />
El tiempo compartido es bastante popular en sistemas multiprogramados y multiusuarios. Estos sistemas de multiacceso dedican la mayor parte del tiempo de ejecución de un programa único de una gran aplicación. Son elementos dedicados que poseen un buen tiempo de respuesta del terminal y tratan con frecuencia de proporcionar un reparto equitativo del los recursos comunes para dar la ilusión a cada usuario de poseer la máquina para el mismo. Por ejemplo, cuando se carga el sistema, se hace esperar más a los usuarios con más requerimientos de proceso pedido.<br />
<br />
El algoritmo empleado en el despacho de las actividades es único de la filosofía de estos sistemas. El mismo consiste en la ejecución de los programas con prioridad rotatoria que se incrementa con las esperas y cae después de que se dispensó el servicio. El sistema operativo interrumpe un programa y lo pone al final de la cola de programas en espera, cuando es más largo que la fracción de tiempo definida por el sistema, para prevenir a los programas de la monopolización del procesador.<br />
<br />
El gestor de memoria del sistema proporciona el aislamiento y protección de los programas en ejecución. Sin embargo, se puede emplear un espacio de memoria compartido controlado por el sistema operativo.<br />
<br />
Los componentes de entrada salida se rigen por un gestor I/O que debe permitir la cooperación con múltiples usuarios y dispositivos. Debido a la lenta respuesta de los terminales humanos y la reacción o respuesta humana, el procesamiento de las interrupciones del terminal no necesitan ser críticas para el tiempo.<br />
<br />
El gestor de archivos, por otro lado, debe proporcionar protección y control de acceso, dado a la posibilidad de concurrencia y de conflictos al acceder a los archivos.<br />
<br />
<br />
=== Sistemas de tiempo real ===<br />
<br />
Se usan en entornos donde se deben aceptar y procesar en tiempo breve y sin tiempos muertos un gran número de sucesos, en su mayoría externos al sistema de computadora. Son asuntos secundarios la conveniencia del usuario y la utilización de recursos.<br />
<br />
Estos sistemas se caracterizan principalmente por encargarse de procesos que se activan al ocurrir el suceso relacionado, señalado frecuentemente por una interrupción. Se consigue el multiproceso planificando los procesos independientes unos de otros. Se asigna a cada proceso un cierto nivel de prioridad que corresponde a la importancia relativa de los sucesos que sirve. El procesador está normalmente asignado al proceso con más alta prioridad entre los que están listos para ejecutarse. Esta forma de planificación se llama planificación basada en la prioridad preferente.<br />
<br />
A diferencia de los sistemas de tiempo compartido, el gestor de memoria está diseñado para tener un menor tiempo de respuesta debido a que los programas generalmente residen permanentemente en la memoria ya que usualmente son sistemas estáticos no diseñados para permitir la implementación de programas externos.<br />
<br />
El tiempo crítico del gestor de dispositivo es una de las características principales de los sistemas de tiempo real. Además de las formas sofisticadas proporcionadas de gestión de interrupciones y almacenamiento intermedio, estos sistemas proporcionan frecuentemente llamadas del sistema que permiten a los procesos de usuario conectarse directamente a vectores de interrupción y sucesos de servicio. De esta forma, los programas pueden ceder espacio en procesador a otras ejecuciones con el levantamiento de una interrupción.<br />
<br />
Generalmente estos sistemas de operación no poseen ningún tipo de almacenamiento secundario, solamente en aquellos sistemas de grandes magnitudes en los cuales si es requerido se necesita la implementación de un gestor de archivos que como en otros tipos de sistemas operativos debe manejar protección y control de acceso.<br />
<br />
<br />
=== Sistemas operativos combinados ===<br />
Lamentablemente el uso de sistemas operativos de tiempo son demasiado específicos y por lo tanto, a pesar de su gran utilidad en sistemas estáticos de gran escala, no satisfacen la necesidades de los usuarios en computadoras personales y emergentes dispositivos portátiles. Por dicha razón surge la necesidad de implementar sistemas operativos combinados que emplean las ventajas de los sistemas operativos de multiprogramación conjuntamente con los sistemas operativos por lotes.<br />
<br />
Los sistemas combinados se caracterizan por poseer bloques o lotes que se ejecutan con una menor prioridad que el resto de las aplicaciones. Así se logra el uso completo del procesador al eliminar los tiempos muertos o de espera.<br />
<br />
<br />
== Diseño e implementación de los sistemas operativos ==<br />
=== Requerimientos funcionales ===<br />
* Los procesos se crean en respuesta a los requerimientos explícitos o implícitos de los usuarios.<br />
<br />
* Los procesos emiten peticiones de los servicios y recursos del sistema.<br />
<br />
* El sistema operativo proporciona funciones de supervisión y control para la gestión de los procesos, tales como la creación y la retirada.<br />
<br />
* La gestión de la memoria consiste principalmente en la asignación de la memoria física a los requerimientos de los procesos.<br />
<br />
* Llamadas a sistema por parte de los usuarios.<br />
<br />
* Integridad de los archivos ante malfuncionamiento del equipo y caídas del sistema.<br />
<br />
* Implementación de archivos comunes y documentos compartidos entre las distintas tareas.<br />
<br />
<br />
=== Implementación ===<br />
El desarrollo de sistemas operativos de gran complejidad, como cualquier proyecto de programación de grandes extensiones, generalmente termina en el fracaso y el desastre. La implementación de subconjuntos del sistema, por otro lado, permite la elaboración de estratos de jerarquía que permiten obtener una mayor abstracción de programación, confiabilidad en las etapas inferiores, así como también la habilidad de modificar secciones por separado o la inclusión de nuevos elementos o customización del ambiente de usuario o interface.<br />
<br />
Podemos así subdividir un sistema en diversos estratos que generalmente son implementados:<br />
<br />
* Núcleo: con frecuencia llamado Kernel, realiza operaciones proporcionadas directamente sobre el hardware, gestionando los procesos en funcionamiento mediante estructuras de datos que representan el estado del sistema. Es aquí donde se encuentra el planificador el cual se encarga de determinar que proceso se debe ejecutar al finar la tarea actual. Este scheduler se encarga primoramente de cambiar el contexto de ejecución, lo que incluye guardar el estado en proceso y restaurar el de llegada. Por otro lado, este nivel se encarga de gestionar la interrupciones y proporcionar las facilidades para la conexión de las rutinas de servicio a las interrupciones de hardware. También se puede proporcionar en este nivel los mecanismos básicos para la sincronización entre procesos y comunicación como semáforos o mensajes.<br />
<br />
* I/O básica: conformado por las instrucciones de bajo nivel que permiten la implementación de los bloques de datos de la memoria secundaria. Proporciona una abstracción de almacenamiento como una matriz lineal de bloques de datos.<br />
<br />
* Gestión de memoria: en este nivel se asigna memoria principal a los procesos a ejecutar y se librea cuando no se necesite más. Es aquí donde se de lleva a cabo la implementación de la memoria virtual, que da al programador la ilusión de poseer un basto recurso de memoria de almacenamiento. Estos módulos manejan las interrupciones de hardware que señalan los intentos direccionar los datos que no se encuentran en la memoria principal; en tal caso los bloques de datos no encontrados son traídos desde el almacenamiento secundario usando las facilidades del nivel anterior de I/O básica.<br />
<br />
* Sistema de archivos y dispositivos: proporciona las facilidades para el almacenamiento durante largo tiempo y la manipulación de archivo. Posee un nivel más sofisticado en la asignación de espacio y acceso a los datos en almacenamiento secundario que el nivel de I/O básico. En este nivel, los archivos no se modifican mediante el direccionamiento de los bloques de datos ya que la lectura y escritura de datos se hace por medio de direcciones relativas al archivo a modificar. Así también, en este nivel se puentean y gestionan los dispositivos externos y periféricos mediante una vista uniforme proporcionada por una interfaz estándar que también se extiende a una facilidad de comunicación entre programas, llamada encauzamiento (pippe), que es esencialmente un canal de comunicación virtual de un sentido.<br />
<br />
* Intérprete del lenguaje de órdenes: este nivel proporciona la interfaz entre los usuarios interactivos y el sistema operativo. Los módulos de este nivel, emplean las facilidades proporcionadas por niveles bajos para aceptar líneas de órdenes desde los terminal. Entonces se reconocen estas líneas de entrada para separar las órdenes de los parámetros e identificar el tipo de servicio requerido.<br />
<br />
<br />
== Implementación de sistemas operativos en el microprocesador MC9S08QE128 ==<br />
Si bien este microprocesador puede parecer bajo el entorno actual un tanto lento, no se debe olvidar que años atrás con microprocesadores de mucha menor capacidad de procesamiento ya existían sistemas operativos en computadoras, redes de comunicación, almacenamiento de datos bancarios, cohetes espaciales, etc. Si treinta años atrás la tecnología era suficiente para el desarrollo de estos sistemas, con mayor razón es posible en la actualidad. Problemáticas de implementación radican en el mal uso y mala elección de estrategias de programación del sistema operativo.<br />
<br />
El micro disponible en el DEMOQE128 parece no haber sido diseñado con el objetivo de la implementación de sistemas operativos ya que por ejemplo no posee múltiples Stack Pointers (SP) para realizar el direccionamiento de las tareas en memoria principal y contiene numerosas aplicaciones y elementos innecesarios para tal fin. Sin embargo posee elementos suficientes para el desarrollo de un sistema operativo sencillo que puede ser empelado en la elaboración de proyectos de pequeña escala.<br />
<br />
A continuación se expondrán algunos de los elementos principales que podría tener un sistema operativo elaborado para este microprocesador.<br />
<br />
<br />
=== Tick ===<br />
El tick o time switch es la interrupción del proceso en ejecución para la sustitución por otro en un sistema en el que dichas actividades comparten por separado, períodos de ejecución en el procesador. Este período de ejecución se recomienda que sea menor al tiempo de reacción del ser humano (0.12 segundos). Generalmente se emplea un timer de 10 nanosegundos que interrumpe el proceso de ejecución. Puede ser empleado para ello el Real Time Counter o RTC.<br />
<br />
<br />
=== Implementación de timers ===<br />
Si bien la interrupción por serial, keyboard o software están permitidas en el desarrollo de sistemas operativos, normalmente se estandarizan las interrupciones de los contadores para demandar menor hardware así como también para crear un mayor grado de abstracción en niveles superiores de programación.<br />
<br />
En sistemas operativos basados en UNIX así como también en Windows, generalmente se emplea un número muy limitado de contadores. Estos elementos son globales en todas las aplicaciones que se ejecutan, ya que estos son gestionados por el Kernel. Usualmente se usan 2 contadores: uno de 10 nanosegundos y otro de 1 milisegundo. El primero además de ser empleado según la necesidad de los usuarios se utiliza como tick del sistema.<br />
<br />
Implementando una lista con contadores con un ID correspondiente a dicho time counter, se pueden implementar los 10 nanosegundos y 1 milisegundo para interrumpir una tarea luego de un tiempo subdividido por la combinación de dichos contadores globales.<br />
<br />
Por otro lado, no debemos olvidar la implementación de contadores de menor prioridad para llevar la hora en el sistema operativo.<br />
<br />
<br />
=== Tareas ===<br />
Las tareas son un conjunto de funciones o actividades que compartirán el uso de procesador en tiempos distintos de ejecución. Estas generalmente se definen como funciones de ejecución separada.<br />
<br />
En sistemas temporales, se emplea un tick que llama a una función despachadora para cambiar de tarea y permitir así la sensación de multiprocesamiento (multitasking).<br />
<br />
La estructura que se debe emplear en un micro como el MC9S08QE128 debe diseñarse tomando en cuenta la función del sistema. Si se desea implementar un ambiente que permita la introducción dinámica de nuevos programas por periféricos de entrada salida o de la memoria secundaria, es usualmente recomendable la implementación de una lista enlazada o doble enlazada entre las distintas tareas que se encuentran es espera de ejecución.<br />
<br />
De elegir un sistema medianamente estático, con espacios de memoria definidos para cada una de las tareas, se puede utilizar el uso de un arreglo de elementos.<br />
<br />
Sin importar la estructura elegida, la misma usualmente posee el valor address al lugar de memoria donde comienza a listarse la tarea, un ID que permite reconocer y buscar los programas en lista de ejecución, apuntadores de enlace (en caso de implementar lista enlazadas), bit de bloqueo y un valor de sleep.<br />
<br />
Entre las funciones relacionadas a los procesos de ejecución se encuentra el de crear una nueva tarea, eliminarla, colocarla en modo sleep y el de bloquear la misma.<br />
<br />
Tenemos como ejemplo la función de crear una nueva tarea:<br />
<br />
<br />
void create_task(func_ptr PC, char *stack, int stack_size, char task_id) {<br />
<br />
int *SP;<br />
<br />
SP = (int *) (stack + stack_size - 2);<br />
<br />
*SP-- = (int) PC;<br />
<br />
*SP-- = 0;<br />
<br />
*SP = 0;<br />
<br />
tasks[task_id].SP = SP;<br />
<br />
}<br />
<br />
<br />
=== Despachador === <br />
Del inglés dispatch, es de las primeras funciones que se deben crear para realizar un sistema operativo que causa más problemas y dificultades de entendimiento. Es llamada al entrar en la interrupción tick y permite cambiar la tarea de ejecución en intervalos de tiempo.<br />
<br />
<br />
<nowiki>#</nowiki>pragma INLINE<br />
<br />
void dispatch(char nexto) {<br />
<br />
void *tmp;<br />
<br />
asm tsx;<br />
<br />
asm aix #0x06;<br />
<br />
asm sthx tmp;<br />
<br />
tasks[running].SP = tmp;<br />
<br />
running = nexto; <br />
<br />
tmp = tasks[nexto].SP;<br />
<br />
asm ldhx tmp;<br />
<br />
asm sthx;<br />
<br />
}<br />
<br />
<br />
De la función lo primero que se hace notar es el uso de #pragma INLINE. Esto es usado cuando la función dispatch es usada dentro de una interrupción (en este caso la de tick) y se desea ser transparente impidiendo la perdida del stack pointer al cual se retornará del interrupt.<br />
<br />
Dispatch no hace más que cambiar la tarea a ejecutar. Primero que todo, se debe entender el funcionamiento de los interrupts. El siguiente esquema obtenido del manual muestra los registros que son colocados en el stack automáticamente al entrar en la interrupción del tick.<br />
<br />
<br />
[[Archivo:Stack_on_interruption.jpeg]]<br />
<br />
<br />
Como se muestra en el esquema, se puede observar que la interrupción deja en el stack la parte alta y baja del SP, el valor de X, el acumulador A y el código de la condición de registro. La función expuesta almacena el valor del SP en X lo que deja al sistema apuntando 5 + 1 (al hacer tsx) posiciones en relación al lugar original en el que se encontraba antes de la acción de la interrupción. Posteriormente se almacena el valor de HX en una variable temporal, y se guarda el sitio de la memoria en el cual el programa se encontraba corriendo antes de la interrupción (tasks[running].SP = tmp;).<br />
<br />
Finalmente se cambia la tarea que se encuentra en ejecución por la nueva tarea (nexto) así como también se usa el temporal nuevamente para cargar la posición SP particular correspondiente al sitio donde la nueva tarea comenzará o se quedó ejecutando anteriormente y se guarda el dato en el registro SP.<br />
<br />
De tal manera, se almacenaron los datos de ejecución al momento de parar la tarea y se cambia a la nueva actividad.<br />
<br />
<br />
=== Planificador === <br />
Conocido como scheduler, es el módulo que se encarga de llevar a cabo la elección del próximo programa a ejecutar al entrar a la interrupción tick. El siguiente ejemplo es de un sistema en el que la estructura de listado de las tareas es un arreglo. en el mismo, existe un número limitado de tareas definido por la variable MAX_TASK.<br />
<br />
void scheduler(void) {<br />
<br />
char next;<br />
<br />
next = running + 1;<br />
<br />
do {<br />
<br />
if ( next >= MAX_TASKS ) next = 0;<br />
<br />
if ( tasks[next].SP != 0 ) break;<br />
<br />
next++;<br />
<br />
} while (next != running);<br />
<br />
dispatch(next);<br />
<br />
asm pulh;<br />
<br />
asm rti;<br />
<br />
}<br />
<br />
Como se puede observar, la función no hace más que asignar el siguiente valor numérico en la lista y comprueba si no sobrepasa el valor máximo de tareas, en cuyo caso resetea el contador a cero. También se verifica si la tarea correspondiente a ese valor numérico realmente existe. Para definir dichas tareas se puede emplear el siguiente método que permite la implementación en funciones no por un número sino por un tag o nombre asignado por el programador.<br />
<br />
<nowiki>#</nowiki>define ONE_TASK (0)<br />
<br />
<nowiki>#</nowiki>define TWO_TASK (SERIAL_TASK + 1)<br />
<br />
<nowiki>#</nowiki>define THREE_TASK (SERIAL_TASK + 2)<br />
<br />
<nowiki>#</nowiki>define FOUR_TASK (SERIAL_TASK + 3)<br />
<br />
La implementación en listas enlazadas no difiere mucho, simplemente se se asigna como siguiente tarea a ejecutar la siguiente a la actual.<br />
<br />
Si bien el uso secuencial en este módulo de distribución de tiempo es fácil de implementar, no satisface completamente las necesidades del sistema operativo como tal. Es importante la inclusión funciones y elementos que permitan bloquear o colocar en sleep las tareas para así no desaprovechar los recursos en tareas que no deben ser procesadas. Es aún más importante la inclusión de prioridades o listas de prioridades en el planificador.<br />
<br />
En la elaboración del sistema operativo se debe colocar un sistema de prioridades en la ejecución de las tareas ya que se logra una mayor eficiencia en el uso de los recursos así como también una mejor respuesta ante las necesidades de los usuarios.<br />
<br />
<br />
=== Vector de Interrupción ===<br />
La siguiente función de interrupción llama al planificador que tras determinar la nueva a ejecutar llama al despachador que se encargará de hacer el cambio en memoria por dicha nueva tarea. Es importante eliminar las interrupaciones mientras nos encontramos en el vector de interrupción.<br />
<br />
void interrupt VectorNumber_Vtpm1ovf TMR1_ISR(void) {<br />
<br />
TPM1SC_TOF = 0;<br />
<br />
scheduler();<br />
<br />
}<br />
<br />
<br />
<br />
Un ejemplo de una rutina que carga la siguiente tarea a ejecutarse en el sistema operativo para el DEMOQE128 utilizando como generador<br />
de ticks el modulo del RTC<br />
<br />
void interrupt VectorNumber_Vrtc EJEMPLO_RUTINA_CAMBIO_CONTEXO_RTC (void){<br />
<br />
<br />
RTCSC = RTCSC | 0x80; //Borra la solicitud de interrupción para poder recibir la siguiente interrupción del RTC<br />
<br />
__asm sei; // Inhabilita las interrupciones<br />
<br />
__asm tsx; // Guarda el stack pointer de la tarea actual en el registro X<br />
__asm pshx; // Pone en el stack el byte menos significativo del stack pointer<br />
__asm pshh; // Pone en el stack el byte mas significativo del stack pointer<br />
__asm ldhx CurrentTask; // Guardo en H:X la direccion de CurrentTask<br />
__asm pula; // Saco el primer valor de mi stack (H) y lo guardo en el acumulador<br />
__asm sta , x; // Guardo H en donde apunta el registro H:X (CurrentTask->StackPtr)<br />
__asm pula; // Saco el primer valor de mi stack (X) y lo guardo en el acumulador<br />
__asm sta 1, x; // Guardo X donde apunta (H:X + 1) (CurrentTask->StackPtr + 1)<br />
<br />
__asm ldhx CurrentTask; // Cargo en H:X la direccion del CurrentTask<br />
__asm aix #2; /* Sumo 2, por el registro H:X que se guardo <br />
para que la direccion del nuevo task sea la adecuada*/<br />
__asm ldhx , x // Cargo H:X con lo que apunta CurrentTask<br />
__asm sthx CurrentTask; // Guardo la direccion de la siguiente tarea en CurrentTask<br />
<br />
<br />
__asm ldhx ,x // Carga lo que apunta H:X que es el StackPtr actual<br />
__asm txs; // Guarda H:X en SP<br />
__asm pulh; // Des-apila el primer elemento de la pila<br />
<br />
__asm cli; // Habilita las interrupciones<br />
__asm rti; // Retorna de la interrupción<br />
}<br />
<br />
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=PWM_(Modulaci%C3%B3n_de_Ancho_de_Pulso)&diff=2401PWM (Modulación de Ancho de Pulso)2012-12-01T00:45:07Z<p>Francjsalanova: </p>
<hr />
<div>[[Categoría: EC3883 - Laboratorio de Proyectos 3]]<br />
[[Categoría: MC9S08QE128]]<br />
<br />
==Introducción==<br />
<br />
<br />
<br />
<br />
===Configuración===<br />
<br />
El comparador analógico (ACMP) puede ser configurado para conectarse el a un canal TPM de entrada, colocando el bit SOPT2 [ACICx] en uno. Haciendo esto, el pin del canal 0 del TPM no está disponible de forma externa, es decir no puede ser modificado. La salida del ACMP 1 puede conectarse a TPM1CH0 y la salida del ACMP2 puede conectarse a TPM2CH0.<br />
[[Archivo:Untitled.jpg|700px|center|thumb|'''Configuración del módulo SOPT2 para conectar el ACMP a los canales del TPM''']]<br />
<br />
<br />
<br />
Al momento de programar, el código para la configuración anterior sería de esta forma:<br />
<br />
'''SOPT2=0x05'''<br />
<br />
<br />
Donde el valor hexadecimal 0x05 representa los 8 bits del registro SOPT2 que, como se observa en el cuadro anterior, son 00000101.<br />
<br />
<br />
===Compuerta de clocks===<br />
<br />
Los clocks de los módulos TPM1, TPM2 y TPM3 pueden activarse o desactivarse usando el módulo SCGC1 [TPMx]. Cuando los bits están en 1, los puertos se habilitan dejando usar los clocks de cada módulo, y en cero se inhabilitan. Luego de un reset estos bits se colocan en 1.<br />
[[Archivo:Untitled2.jpg|700px|center|thumb|'''Habilitación de los clocks del TPM1 TPM2 y TPM3''']]<br />
<br />
Similar al caso anterior, el código para la configuración anteriormente descrita es:<br />
<br />
'''SCGC1=0xE0'''<br />
<br />
Nuevamente el valor hexadecimal 0xE0 representa los 8 bits del registro SCGC1, los cuales eran 11100000<br />
<br />
<br />
Ademas del reloj interno el modulo permite seleccionar entre dehabilitar el temporizador, un reloj de oscilador de cristal o un reloj externo para ser el reloj que controla el pre-escalador y subsecuentemente el contador TPM de 16-bits.<br />
<br />
<br />
<br />
<br />
===Vector de interrupciones===<br />
<br />
A continuación se presentan los vectores de interrupciones para este módulo:<br />
<br />
[[Archivo:Untitled3.jpg|700px|center|thumb|'''Vectores de interrupción del TPM''']]<br />
<br />
<br />
===Características===<br />
<br />
El módulo PWM posee las siguientes características:<br />
<br />
*Cada canal se puede configurarse para ser capturador de entrada, comparador de salidas, o alineación de flancos PWM. Estos tipos de configuración se discutirán en la sección de modos de operación.<br />
<br />
*Escoger la polaridad en las salidas del PWM (positiva o negativa)<br />
<br />
*El módulo puede ser configurado como buffer o como alineación central de la modulación del ancho de pulso (CPMW por sus siglas en inglés).<br />
<br />
*El timer puede ser modificado para usarse con una escala predeterminada del bus clock, un clock fijo o un clock externo:<br />
<br />
#La preescala se define dividiendo el clock del bus entre 1, 2, 4, 8, 16, 32, 64 o 128. El bus clock al que opera el microcontrolador es de 1MHz.<br />
#El clock fijo es sincronizado con el bus clock mediante un circuito sincronizador.<br />
#Para el clock externo, el pin puede compartirse con un pin de un canal o de cualquier otra entrada, por lo tanto hay que tener cuidado al configurar este pin.<br />
<br />
*Un interruptor por canal y un contador para las interrupciones.<br />
<br />
<br />
<br />
<br />
===Modos de operación===<br />
<br />
Los canales pueden ser configurados independientemente como capturadores de entrada, comparador de salidas, o alineación de los flancos de PWM. Un bit de control puede modificarse para que todos los canales del módulo sean configurados como alineación de la modulación del ancho de pulso, si este es el caso se inhabilitan las otras opciones de configuración.<br />
Cuando el microcontrolador esta en BDM background o BDM foreground, el TPM suspende las operaciones y las reanuda apenas el microcontrolador regresa a estado normal. Cuando esta en stop, todos los clocks del microcontrolador se paran, incluyendo el oscilador principal, por lo tanto el modulo TPM es inhabilitado momentáneamente. En el modo de espera (wait mode), el TPM opera de forma normal ya que no genera una referencia a tiempo real ni el interrupt necesario para despertar el micro de este estado. Los modos de operación son los siguientes:<br />
<br />
*'''Modo de captura de entrada:''' Cuando un evento preseleccionado de flanco ocurre en el pin asociado al canal que se esta usando, el valor actual del contador del timer de 16 bits es guardado en el registro de valor del canal y una bandera de interrupción se coloca en uno. Un flanco de subida, flanco de bajada, cualquier flanco o ningún flanco (canal inhabilitado) puede ser seleccionado como el flanco activo que dispara la captura de entrada.<br />
<br />
*'''Modo de comparación de salida:''' Cuando el valor en el registro del contador es igual al valor del registro del canal, una bandera de un bit de interrupción se coloca en uno, y una acción de salida seleccionada es forzada en el pin del microcontrolador. La salida que se ve en el pin puede ser forzada a cero, a uno, intercambiar/conmutar las salidas o simplemente ignorarlo.<br />
<br />
*'''Modo de alineación de flancos de PWM:''' El valor del registro de 16 bits +1 define el período de la señal de salida del PWM. El valor del registro del canal define el duty cicle (tiempo en que la señal permanece en un estado activo) de la señal de salida del PWM. También se puede definir la polaridad de la señal de salida. Las interrupciones ocurren apenas termine el período de la señal, es decir en el punto de transición del duty cicle (cuando la señal pasa de activa a inactiva) <br />
<br />
*'''Modo de alineacion central del PWM:''' El doble del valor del registro del modulo de 16 bits define el period de las salidas PWM, y los registros de valores de los canals definen la mitad de la duracion del duty cycle. El contador del timer cuenta hasta que llega al valor del registro del modulo y luego cuenta desde este valor hasta cero. Mientras el contador esta contando hacia abajo, y el valor del contador es el mismo que el del modulo, la salida PWM se activa. En el caso contrario, es decir cuando esta contando hacia arriba y los valores coinciden, la salida PWM se desactiva. <br />
<br />
<br />
===Diagrama de bloques===<br />
<br />
El módulo TPM usa un pin de entrada/salida por canal (TPMxCHn), donde n representa el numero del canal. Hay que tener cuidado a usar estos pines ya que los pines de entrada/salida del TPM están asociados a los puertos de entrada/salida generales del microcontrolador. El componente central es el contador de 16 bits, el cual provee el tiempo de referencia para los modos de operación. Los registros del modulo del contador (TPMxMODH:TPMxMODL) registra el valor del modulo. Este dato se puede leer cuando sea, mas si se modifica este dato en la parte baja (TPMxMODL) o en la parte alta (TPMxMODH), se resetea el contador.<br />
<br />
[[Archivo:Untitled4.jpg|700px|center|thumb|'''Diagrama de bloques del TPM''']]<br />
<br />
<br />
==Registros del TPM==<br />
<br />
<br />
===Registros de status y control del TPM (TPMxSC)===<br />
<br />
El registro TPMxSC contiene la bandera de overflow y los bits de control para determinar la habilitación de las interrupciones, el modo de operación que se va a usar, el tipo de clock y la escala en caso de ser necesaria.<br />
[[Archivo:Untitled5.jpg|700px|center|thumb|'''Bits del registro TPMxSC''']]<br />
<br />
*'''TOF (Bit 7):''' Este bit se conoce como la bandera de overflow del timer. Este bit se coloca en uno cuando el contador del TPM se resetea (0x0000) luego de haber alcanzado el valor guardado en el registro de modulo del contador. Para borrar este bit (ponerlo en cero), es necesario leer el registro TPMxSC cuando la bandera este en uno y escribir en este bit un cero. Si llegase a ocurrir otro overflow antes de colocar el bit 7 en cero, la secuencia se resetea por lo tanto la bandera quedaría en uno para que una interrupción del tipo TOF no se pierda debido a una anterior.<br />
<br />
*'''TOIE (Bit 6):''' Tambien llamado habilitador de interrupciones de overflow del timer. Si este bit esta en uno se habilita la interrupción debido a overflows. Es decir que aunque el bit de la bandera de overflow este en uno, si este bit esta en cero nunca van a ocurrir interrupciones del tipo TOF.<br />
<br />
*'''CPWMS (Bit 5):''' Si este bit esta en uno, se activa el modo de operación de alineación central de PWM para todos los canales, desactivando las demás opciones. Además configura el TPM para que el contador opere tanto hacia arriba como hacia abajo (up/down counting) en vez de solo hacia arriba. Un reset coloca este bit en cero habilitando los demás modos de operación.<br />
<br />
*'''CLKS[B:A] (Bit 4:3):''' Estos dos bits se usan para definir que tipo de clock se va a utilizar. El clock fijo solo sirve cuando el clock del sistema esta basado en un sistema PLL (divisor del clock). En caso de no ser así el clock va a ser el mismo que el bus clock, 1MHz para este caso. La sincronización de un clock externo se genera mediante el modulo del bus clock del TPM, mientras que para el caso de un clock fijo es a través de un circuito sincronizador.<br />
[[Archivo:Untitled6.jpg|700px|center|thumb|'''Tipos de clock (Bit 4:3)''']]<br />
<br />
*'''PS[2:0] (Bit 2:0):''' Estos 3 bits se usan para modificar el clock del TPM escogiendo uno de los factores de división que se observan en la siguiente tabla.<br />
[[Archivo:Untitled7.jpg|700px|center|thumb|'''Factor de escalamiento (Bits 2:0)''']]<br />
<br />
<br />
<br />
<br />
===Registro de contadores del TPM (TPMxCNTH:TPMxCNTL)===<br />
<br />
<br />
Los registros TPMxCNTH y TPMxCNTL contienen el bit más significativo y menos significativo respectivamente del valor en el contador del TPM. Leer cualquiera de los valores en estos registros coloca los datos de ambos en un buffer hasta que se finalice esta operación. Estos registros se resetean apenas se resetee el microcontrolador o se escriba en el registro TPMxSC. Como ambos son registros de solo lectura, apenas se intente escribir en alguno de ellos se reseteara el contador.<br />
<br />
[[Archivo:Untitled8.jpg|700px|center|thumb|'''8 bits mas significativos del contador (TPMxCNTH)''']][[Archivo:Untitled8.jpg|700px|center|thumb|'''8 bits menos significativos del contador (TPMxCNTL)''']]<br />
<br />
<br />
===Registros del modulo del contador del TPM (TPMxMODH:TPMxMODL)===<br />
<br />
El registro de módulo del TPM contiene el valor para el contador del TPM. Cuando este contador alcance el valor asignado en este registro se reinicia y coloca en uno la bandera de overflow para saber que termino un ciclo. Al escribir en los registros TPMxMODH o TPMxMODL, que representan los 16 bits del módulo, evita que ocurran interrupciones por overflow hasta que se termine de escribir, además de que guarda el valor de los registros en un buffer, y se actualizará dependiendo de los valores en CLKSB:CLKSA entonces:<br />
*CLKSB y CLKSA son cero los registros se van a actualizar apenas se termine de escribir el segundo byte.<br />
*CLKSB y CLKSA son diferentes de cero los registros se van a actualizar cuando se terminen de escribir en ambos.<br />
Resetear coloca los 16 bits del módulo en cero.<br />
<br />
[[Archivo:Untitled10.jpg|700px|center|thumb|'''8 bits mas significativos del registro de modulo (TPMxMODH)''']]<br />
[[Archivo:Untitled11.jpg|700px|center|thumb|'''8 bits menos significativos del registro de modulo (TPMxMODL)''']]<br />
<br />
<br />
===Registros de status y control de los canales del TPM (TPMxCnSC)===<br />
<br />
Este registro contiene el bit para la bandera de interrupciones y los bits de control para configurar el modo de operacion del canal. <br />
<br />
[[Archivo:Untitled12.jpg|700px|center|thumb|'''Registro de control y status del los canales''']]<br />
<br />
*'''CHnF (Bit 7):''' Cuando el canal esta en el modo de captura de entrada, este bit se pondra en uno cuando ocurra el flanco que se definió como flanco activo. Cuando el canal esta en comparación de salida, en alineación de flancos o alineación central de PWM, el bit CHnF se coloca en uno cuando el valor en el registro del contador es igual al valor en el registro del canal, siempre y cuando el duty cycle no sea ni cero ni cien porciento. La interrupción ocurrirá siempre y cuando este bit este en uno y que las interrupciones estén habilitadas, es decir que el bit CHnIE sea uno. Resetear coloca el bit CHnF en cero.<br />
*'''CHnIE (Bit 6):''' Este bit habilita las interrupciones del canal especifico cuando esta en uno. Resetear modifica este bit y lo fuerza a cero.<br />
*'''MSnB (Bit 5):''' Se conoce también como selección de modo A para los canales. Cuando CPWMS esta en cero y el bit MSnB esta en uno, configura el canal TPM especifico para alineación de flancos PWM.<br />
*'''MSnA (Bit 4):''' Conocido tambien como modo de selección A para los canals. Cuando CPWMS y MSnB son cero, MSnA va a configurar el canal para capturador de entrada o comparador de salida.<br />
<br />
[[Archivo:Untitled13.jpg|700px|center|thumb|'''Selección del modo de operacion de los canales''']]<br />
<br />
<br />
<br />
<br />
===Registros del valor de los canales del TPM (TPMxCnVH:TPMxCnVL)===<br />
<br />
Mientras el canal este en el modo de captura de entrada o en el modo de comparación de salidas, leer o escribir alguno de estos dos registros (TPMxCnVH o TPMxCnVL) respectivamente, pondrá los datos de ambos en un buffer hasta que se termine de ejecutar esta acción. Cuando esta en el modo de comparación de salidas, escribir en cualquiera de estos registros. En el caso de escritura ocurrirá y dependiendo de los valores en CLKSB y CLKSA ocurrirá lo siguiente:<br />
*CLKSB y CLKSA son iguales a cero los registros se actualizarán cuando el segundo byte sea escrito.<br />
*CLKSB y CLKSA son distintos de cero y esta en modo de comparación, los registros se actualizarán cuando el segundo byte se halla escrito y en el próximo cambio del contador.<br />
*CLKSB y CLKSA son distintos de cero y este en el modo EPWM o CPWM, entonces los registros serán actualizados luego de que ambos bytes se escriban, y que el contador del TPM cambie.<br />
<br />
[[Archivo:Untitled16.jpg|700px|center|thumb|'''Registro del valor del canal (8 bits mas significativos)''']]<br />
[[Archivo:Untitled17.jpg|700px|center|thumb|'''Registro del valor del canal (8 bits menos significativos)''']]<br />
<br />
<br />
<br />
<br />
==Reset==<br />
<br />
El módulo TPM se resetea cuando ocurre cualquier reset del microcontrolador. Al resetear el microcontrolador el registro TPMxSC inhabilita los clocks del TPM y la bandera de overflow (TOIE). Además los bits CPWMS, MSnB, MSnA, ELSnB y ELSnA son todos forzados a cero, lo que configura todos los canales al modo de operación de captura de entrada.<br />
<br />
<br />
==Interrupciones==<br />
<br />
El módulo tiene una interrupción opcional para el contador principal y un interruptor extra para cada canal. Lo que realizará la interrupción de los canales va a depender del modo de operación en el que este el canal. Si el canal esta configurado para recibir una entrada, la bandera de interrupción se coloca en uno cada vez que la entrada deseada es reconocida. Si el canal esta configurado para comparar la salida o para los modos de PWM, la bandera de interrupciones se coloca en uno cada vez que el valor del contador es igual al dato guardado en registro de valores.<br />
<br />
Para cada interrupción del TPM, una bandera de un bit se coloca en uno para reconocer las condiciones de interrupción como overflow, interrupción por captura de entradas o interrupción por comparación de salidas. Para poner este bit en cero hay que leer el registro que posee la bandera y escribir en ella un cero lógico. Si una nueva interrupción es detectada mientras se realizan estas operaciones, la secuencia se resetea y la bandera de interrupción permanece en uno después del paso de escritura para evitar que la interrupción nueva no se ejecute gracias a la anterior.<br />
<br />
<br />
<br />
<br />
===Interrupciones del tipo TOF (interrupción por bandera de overflow)===<br />
<br />
La operación que va a ocurrir por una interrupción del tipo TOF varía dependiendo del modo de operación en que se encuentre el canal TPM, sin embargo las variaciones son minimas.<br />
Para las interrupciones del tipo TOF normales ocurren apenas el contador cambia de 0xFFFF a 0x0000. Cuando el TPM no esta configurado para alineación central de PWM, la bandera se coloca en uno cuando el contador cambia del valor que esta en el registro de modulo a 0x0000.<br />
<br />
<br />
<br />
<br />
===Interrupciones de alineacion central de PWM===<br />
<br />
Cuando CPWMS se coloca en uno, la bandera TOF se activa cada vez que el contador cambia de dirección, es decir que va de contar hacia arriba a contar hacia abajo. Para este caso en particular la bandera de este bit corresponde al final de cada período.<br />
<br />
<br />
<br />
<br />
===Interrupción del tipo de captura de entrada===<br />
<br />
Cuando un canal esta configurado en este modo y los bits de control ELSnB y ELSnA están en alguna de las 4 opciones (flanco de subida, flanco de bajada, cualquier flanco, o canal desabilitado), cada vez que el flanco seleccionado sea reconocido, la bandera de interrupciones se fuerza en uno. <br />
<br />
<br />
<br />
<br />
===Interrupción del tipo de comparación de salida===<br />
<br />
Cuando un canal esta configurado en este modo de operación, la bandera de interrupciones se activa cada vez que el valor del contador es igual al valor que se encuentra guardado en el registro del canal.<br />
<br />
<br />
<br />
<br />
===Interrupcion por finalización de Duty Cycle===<br />
<br />
Para los canales que esten configurados para cualquier operación del tipo PWM existen dos posibilidades. Cuando el canal esta configurado para alineación de flancos, la bandera de interrupciones se coloca en uno cuando el valor del contador es igual al valor guardado en el registro del canal, esto marca la finalización del duty cycle. Cuando el canal esta configurado para alineación central, el contador va a ser igual al valor del registro del canal dos veces por cada periodo (uno cuando el clock esta contando hacia arriba y otro cuando el clock esta contando hacia abajo). Para este caso la bandera se coloca en uno al principio y al final del periodo del duty cycle.<br />
<br />
<br />
==Referencias==<br />
<br />
*[http://www.freescale.com/files/microcontrollers/doc/ref_manual/MC9S08QE128RM.pdf''MC9S08QE128RM Reference Manual'']</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=PWM_(Modulaci%C3%B3n_de_Ancho_de_Pulso)&diff=2399PWM (Modulación de Ancho de Pulso)2012-12-01T00:33:32Z<p>Francjsalanova: </p>
<hr />
<div>[[Categoría: EC3883 - Laboratorio de Proyectos 3]]<br />
[[Categoría: MC9S08QE128]]<br />
<br />
==Introducción==<br />
<br />
<br />
<br />
<br />
===Configuración===<br />
<br />
El comparador analógico (ACMP) puede ser configurado para conectarse el a un canal TPM de entrada, colocando el bit SOPT2 [ACICx] en uno. Haciendo esto, el pin del canal 0 del TPM no está disponible de forma externa, es decir no puede ser modificado. La salida del ACMP 1 puede conectarse a TPM1CH0 y la salida del ACMP2 puede conectarse a TPM2CH0.<br />
[[Archivo:Untitled.jpg|700px|center|thumb|'''Configuración del módulo SOPT2 para conectar el ACMP a los canales del TPM''']]<br />
<br />
<br />
<br />
Al momento de programar, el código para la configuración anterior sería de esta forma:<br />
<br />
'''SOPT2=0x05'''<br />
<br />
<br />
Donde el valor hexadecimal 0x05 representa los 8 bits del registro SOPT2 que, como se observa en el cuadro anterior, son 00000101.<br />
<br />
<br />
===Compuerta de clocks===<br />
<br />
Los clocks de los módulos TPM1, TPM2 y TPM3 pueden activarse o desactivarse usando el módulo SCGC1 [TPMx]. Cuando los bits están en 1, los puertos se habilitan dejando usar los clocks de cada módulo, y en cero se inhabilitan. Luego de un reset estos bits se colocan en 1.<br />
[[Archivo:Untitled2.jpg|700px|center|thumb|'''Habilitación de los clocks del TPM1 TPM2 y TPM3''']]<br />
<br />
Similar al caso anterior, el código para la configuración anteriormente descrita es:<br />
<br />
'''SCGC1=0xE0'''<br />
<br />
Nuevamente el valor hexadecimal 0xE0 representa los 8 bits del registro SCGC1, los cuales eran 11100000<br />
<br />
<br />
===Vector de interrupciones===<br />
<br />
A continuación se presentan los vectores de interrupciones para este módulo:<br />
<br />
[[Archivo:Untitled3.jpg|700px|center|thumb|'''Vectores de interrupción del TPM''']]<br />
<br />
<br />
===Características===<br />
<br />
El módulo PWM posee las siguientes características:<br />
<br />
*Cada canal se puede configurarse para ser capturador de entrada, comparador de salidas, o alineación de flancos PWM. Estos tipos de configuración se discutirán en la sección de modos de operación.<br />
<br />
*Escoger la polaridad en las salidas del PWM (positiva o negativa)<br />
<br />
*El módulo puede ser configurado como buffer o como alineación central de la modulación del ancho de pulso (CPMW por sus siglas en inglés).<br />
<br />
*El timer puede ser modificado para usarse con una escala predeterminada del bus clock, un clock fijo o un clock externo:<br />
<br />
#La preescala se define dividiendo el clock del bus entre 1, 2, 4, 8, 16, 32, 64 o 128. El bus clock al que opera el microcontrolador es de 1MHz.<br />
#El clock fijo es sincronizado con el bus clock mediante un circuito sincronizador.<br />
#Para el clock externo, el pin puede compartirse con un pin de un canal o de cualquier otra entrada, por lo tanto hay que tener cuidado al configurar este pin.<br />
<br />
*Un interruptor por canal y un contador para las interrupciones.<br />
<br />
<br />
<br />
<br />
===Modos de operación===<br />
<br />
Los canales pueden ser configurados independientemente como capturadores de entrada, comparador de salidas, o alineación de los flancos de PWM. Un bit de control puede modificarse para que todos los canales del módulo sean configurados como alineación de la modulación del ancho de pulso, si este es el caso se inhabilitan las otras opciones de configuración.<br />
Cuando el microcontrolador esta en BDM background o BDM foreground, el TPM suspende las operaciones y las reanuda apenas el microcontrolador regresa a estado normal. Cuando esta en stop, todos los clocks del microcontrolador se paran, incluyendo el oscilador principal, por lo tanto el modulo TPM es inhabilitado momentáneamente. En el modo de espera (wait mode), el TPM opera de forma normal ya que no genera una referencia a tiempo real ni el interrupt necesario para despertar el micro de este estado. Los modos de operación son los siguientes:<br />
<br />
*'''Modo de captura de entrada:''' Cuando un evento preseleccionado de flanco ocurre en el pin asociado al canal que se esta usando, el valor actual del contador del timer de 16 bits es guardado en el registro de valor del canal y una bandera de interrupción se coloca en uno. Un flanco de subida, flanco de bajada, cualquier flanco o ningún flanco (canal inhabilitado) puede ser seleccionado como el flanco activo que dispara la captura de entrada.<br />
<br />
*'''Modo de comparación de salida:''' Cuando el valor en el registro del contador es igual al valor del registro del canal, una bandera de un bit de interrupción se coloca en uno, y una acción de salida seleccionada es forzada en el pin del microcontrolador. La salida que se ve en el pin puede ser forzada a cero, a uno, intercambiar/conmutar las salidas o simplemente ignorarlo.<br />
<br />
*'''Modo de alineación de flancos de PWM:''' El valor del registro de 16 bits +1 define el período de la señal de salida del PWM. El valor del registro del canal define el duty cicle (tiempo en que la señal permanece en un estado activo) de la señal de salida del PWM. También se puede definir la polaridad de la señal de salida. Las interrupciones ocurren apenas termine el período de la señal, es decir en el punto de transición del duty cicle (cuando la señal pasa de activa a inactiva) <br />
<br />
*'''Modo de alineacion central del PWM:''' El doble del valor del registro del modulo de 16 bits define el period de las salidas PWM, y los registros de valores de los canals definen la mitad de la duracion del duty cycle. El contador del timer cuenta hasta que llega al valor del registro del modulo y luego cuenta desde este valor hasta cero. Mientras el contador esta contando hacia abajo, y el valor del contador es el mismo que el del modulo, la salida PWM se activa. En el caso contrario, es decir cuando esta contando hacia arriba y los valores coinciden, la salida PWM se desactiva. <br />
<br />
<br />
===Diagrama de bloques===<br />
<br />
El módulo TPM usa un pin de entrada/salida por canal (TPMxCHn), donde n representa el numero del canal. Hay que tener cuidado a usar estos pines ya que los pines de entrada/salida del TPM están asociados a los puertos de entrada/salida generales del microcontrolador. El componente central es el contador de 16 bits, el cual provee el tiempo de referencia para los modos de operación. Los registros del modulo del contador (TPMxMODH:TPMxMODL) registra el valor del modulo. Este dato se puede leer cuando sea, mas si se modifica este dato en la parte baja (TPMxMODL) o en la parte alta (TPMxMODH), se resetea el contador.<br />
<br />
[[Archivo:Untitled4.jpg|700px|center|thumb|'''Diagrama de bloques del TPM''']]<br />
<br />
<br />
==Registros del TPM==<br />
<br />
<br />
<br />
<br />
<br />
===Registros de status y control del TPM (TPMxSC)===<br />
<br />
El registro TPMxSC contiene la bandera de overflow y los bits de control para determinar la habilitación de las interrupciones, el modo de operación que se va a usar, el tipo de clock y la escala en caso de ser necesaria.<br />
[[Archivo:Untitled5.jpg|700px|center|thumb|'''Bits del registro TPMxSC''']]<br />
<br />
*'''TOF (Bit 7):''' Este bit se conoce como la bandera de overflow del timer. Este bit se coloca en uno cuando el contador del TPM se resetea (0x0000) luego de haber alcanzado el valor guardado en el registro de modulo del contador. Para borrar este bit (ponerlo en cero), es necesario leer el registro TPMxSC cuando la bandera este en uno y escribir en este bit un cero. Si llegase a ocurrir otro overflow antes de colocar el bit 7 en cero, la secuencia se resetea por lo tanto la bandera quedaría en uno para que una interrupción del tipo TOF no se pierda debido a una anterior.<br />
<br />
*'''TOIE (Bit 6):''' Tambien llamado habilitador de interrupciones de overflow del timer. Si este bit esta en uno se habilita la interrupción debido a overflows. Es decir que aunque el bit de la bandera de overflow este en uno, si este bit esta en cero nunca van a ocurrir interrupciones del tipo TOF.<br />
<br />
*'''CPWMS (Bit 5):''' Si este bit esta en uno, se activa el modo de operación de alineación central de PWM para todos los canales, desactivando las demás opciones. Además configura el TPM para que el contador opere tanto hacia arriba como hacia abajo (up/down counting) en vez de solo hacia arriba. Un reset coloca este bit en cero habilitando los demás modos de operación.<br />
<br />
*'''CLKS[B:A] (Bit 4:3):''' Estos dos bits se usan para definir que tipo de clock se va a utilizar. El clock fijo solo sirve cuando el clock del sistema esta basado en un sistema PLL (divisor del clock). En caso de no ser así el clock va a ser el mismo que el bus clock, 1MHz para este caso. La sincronización de un clock externo se genera mediante el modulo del bus clock del TPM, mientras que para el caso de un clock fijo es a través de un circuito sincronizador.<br />
[[Archivo:Untitled6.jpg|700px|center|thumb|'''Tipos de clock (Bit 4:3)''']]<br />
<br />
*'''PS[2:0] (Bit 2:0):''' Estos 3 bits se usan para modificar el clock del TPM escogiendo uno de los factores de división que se observan en la siguiente tabla.<br />
[[Archivo:Untitled7.jpg|700px|center|thumb|'''Factor de escalamiento (Bits 2:0)''']]<br />
<br />
<br />
<br />
<br />
===Registro de contadores del TPM (TPMxCNTH:TPMxCNTL)===<br />
<br />
<br />
Los registros TPMxCNTH y TPMxCNTL contienen el bit más significativo y menos significativo respectivamente del valor en el contador del TPM. Leer cualquiera de los valores en estos registros coloca los datos de ambos en un buffer hasta que se finalice esta operación. Estos registros se resetean apenas se resetee el microcontrolador o se escriba en el registro TPMxSC. Como ambos son registros de solo lectura, apenas se intente escribir en alguno de ellos se reseteara el contador.<br />
<br />
[[Archivo:Untitled8.jpg|700px|center|thumb|'''8 bits mas significativos del contador (TPMxCNTH)''']][[Archivo:Untitled8.jpg|700px|center|thumb|'''8 bits menos significativos del contador (TPMxCNTL)''']]<br />
<br />
<br />
===Registros del modulo del contador del TPM (TPMxMODH:TPMxMODL)===<br />
<br />
El registro de módulo del TPM contiene el valor para el contador del TPM. Cuando este contador alcance el valor asignado en este registro se reinicia y coloca en uno la bandera de overflow para saber que termino un ciclo. Al escribir en los registros TPMxMODH o TPMxMODL, que representan los 16 bits del módulo, evita que ocurran interrupciones por overflow hasta que se termine de escribir, además de que guarda el valor de los registros en un buffer, y se actualizará dependiendo de los valores en CLKSB:CLKSA entonces:<br />
*CLKSB y CLKSA son cero los registros se van a actualizar apenas se termine de escribir el segundo byte.<br />
*CLKSB y CLKSA son diferentes de cero los registros se van a actualizar cuando se terminen de escribir en ambos.<br />
Resetear coloca los 16 bits del módulo en cero.<br />
<br />
[[Archivo:Untitled10.jpg|700px|center|thumb|'''8 bits mas significativos del registro de modulo (TPMxMODH)''']]<br />
[[Archivo:Untitled11.jpg|700px|center|thumb|'''8 bits menos significativos del registro de modulo (TPMxMODL)''']]<br />
<br />
<br />
===Registros de status y control de los canales del TPM (TPMxCnSC)===<br />
<br />
Este registro contiene el bit para la bandera de interrupciones y los bits de control para configurar el modo de operacion del canal. <br />
<br />
[[Archivo:Untitled12.jpg|700px|center|thumb|'''Registro de control y status del los canales''']]<br />
<br />
*'''CHnF (Bit 7):''' Cuando el canal esta en el modo de captura de entrada, este bit se pondra en uno cuando ocurra el flanco que se definió como flanco activo. Cuando el canal esta en comparación de salida, en alineación de flancos o alineación central de PWM, el bit CHnF se coloca en uno cuando el valor en el registro del contador es igual al valor en el registro del canal, siempre y cuando el duty cycle no sea ni cero ni cien porciento. La interrupción ocurrirá siempre y cuando este bit este en uno y que las interrupciones estén habilitadas, es decir que el bit CHnIE sea uno. Resetear coloca el bit CHnF en cero.<br />
*'''CHnIE (Bit 6):''' Este bit habilita las interrupciones del canal especifico cuando esta en uno. Resetear modifica este bit y lo fuerza a cero.<br />
*'''MSnB (Bit 5):''' Se conoce también como selección de modo A para los canales. Cuando CPWMS esta en cero y el bit MSnB esta en uno, configura el canal TPM especifico para alineación de flancos PWM.<br />
*'''MSnA (Bit 4):''' Conocido tambien como modo de selección A para los canals. Cuando CPWMS y MSnB son cero, MSnA va a configurar el canal para capturador de entrada o comparador de salida.<br />
<br />
[[Archivo:Untitled13.jpg|700px|center|thumb|'''Selección del modo de operacion de los canales''']]<br />
<br />
<br />
<br />
<br />
===Registros del valor de los canales del TPM (TPMxCnVH:TPMxCnVL)===<br />
<br />
Mientras el canal este en el modo de captura de entrada o en el modo de comparación de salidas, leer o escribir alguno de estos dos registros (TPMxCnVH o TPMxCnVL) respectivamente, pondrá los datos de ambos en un buffer hasta que se termine de ejecutar esta acción. Cuando esta en el modo de comparación de salidas, escribir en cualquiera de estos registros. En el caso de escritura ocurrirá y dependiendo de los valores en CLKSB y CLKSA ocurrirá lo siguiente:<br />
*CLKSB y CLKSA son iguales a cero los registros se actualizarán cuando el segundo byte sea escrito.<br />
*CLKSB y CLKSA son distintos de cero y esta en modo de comparación, los registros se actualizarán cuando el segundo byte se halla escrito y en el próximo cambio del contador.<br />
*CLKSB y CLKSA son distintos de cero y este en el modo EPWM o CPWM, entonces los registros serán actualizados luego de que ambos bytes se escriban, y que el contador del TPM cambie.<br />
<br />
[[Archivo:Untitled16.jpg|700px|center|thumb|'''Registro del valor del canal (8 bits mas significativos)''']]<br />
[[Archivo:Untitled17.jpg|700px|center|thumb|'''Registro del valor del canal (8 bits menos significativos)''']]<br />
<br />
<br />
<br />
<br />
==Reset==<br />
<br />
El módulo TPM se resetea cuando ocurre cualquier reset del microcontrolador. Al resetear el microcontrolador el registro TPMxSC inhabilita los clocks del TPM y la bandera de overflow (TOIE). Además los bits CPWMS, MSnB, MSnA, ELSnB y ELSnA son todos forzados a cero, lo que configura todos los canales al modo de operación de captura de entrada.<br />
<br />
<br />
==Interrupciones==<br />
<br />
El módulo tiene una interrupción opcional para el contador principal y un interruptor extra para cada canal. Lo que realizará la interrupción de los canales va a depender del modo de operación en el que este el canal. Si el canal esta configurado para recibir una entrada, la bandera de interrupción se coloca en uno cada vez que la entrada deseada es reconocida. Si el canal esta configurado para comparar la salida o para los modos de PWM, la bandera de interrupciones se coloca en uno cada vez que el valor del contador es igual al dato guardado en registro de valores.<br />
<br />
Para cada interrupción del TPM, una bandera de un bit se coloca en uno para reconocer las condiciones de interrupción como overflow, interrupción por captura de entradas o interrupción por comparación de salidas. Para poner este bit en cero hay que leer el registro que posee la bandera y escribir en ella un cero lógico. Si una nueva interrupción es detectada mientras se realizan estas operaciones, la secuencia se resetea y la bandera de interrupción permanece en uno después del paso de escritura para evitar que la interrupción nueva no se ejecute gracias a la anterior.<br />
<br />
<br />
<br />
<br />
===Interrupciones del tipo TOF (interrupción por bandera de overflow)===<br />
<br />
La operación que va a ocurrir por una interrupción del tipo TOF varía dependiendo del modo de operación en que se encuentre el canal TPM, sin embargo las variaciones son minimas.<br />
Para las interrupciones del tipo TOF normales ocurren apenas el contador cambia de 0xFFFF a 0x0000. Cuando el TPM no esta configurado para alineación central de PWM, la bandera se coloca en uno cuando el contador cambia del valor que esta en el registro de modulo a 0x0000.<br />
<br />
<br />
<br />
<br />
===Interrupciones de alineacion central de PWM===<br />
<br />
Cuando CPWMS se coloca en uno, la bandera TOF se activa cada vez que el contador cambia de dirección, es decir que va de contar hacia arriba a contar hacia abajo. Para este caso en particular la bandera de este bit corresponde al final de cada período.<br />
<br />
<br />
<br />
<br />
===Interrupción del tipo de captura de entrada===<br />
<br />
Cuando un canal esta configurado en este modo y los bits de control ELSnB y ELSnA están en alguna de las 4 opciones (flanco de subida, flanco de bajada, cualquier flanco, o canal desabilitado), cada vez que el flanco seleccionado sea reconocido, la bandera de interrupciones se fuerza en uno. <br />
<br />
<br />
<br />
<br />
===Interrupción del tipo de comparación de salida===<br />
<br />
Cuando un canal esta configurado en este modo de operación, la bandera de interrupciones se activa cada vez que el valor del contador es igual al valor que se encuentra guardado en el registro del canal.<br />
<br />
<br />
<br />
<br />
===Interrupcion por finalización de Duty Cycle===<br />
<br />
Para los canales que esten configurados para cualquier operación del tipo PWM existen dos posibilidades. Cuando el canal esta configurado para alineación de flancos, la bandera de interrupciones se coloca en uno cuando el valor del contador es igual al valor guardado en el registro del canal, esto marca la finalización del duty cycle. Cuando el canal esta configurado para alineación central, el contador va a ser igual al valor del registro del canal dos veces por cada periodo (uno cuando el clock esta contando hacia arriba y otro cuando el clock esta contando hacia abajo). Para este caso la bandera se coloca en uno al principio y al final del periodo del duty cycle.<br />
<br />
<br />
==Referencias==<br />
<br />
*[http://www.freescale.com/files/microcontrollers/doc/ref_manual/MC9S08QE128RM.pdf''MC9S08QE128RM Reference Manual'']</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=PWM_(Modulaci%C3%B3n_de_Ancho_de_Pulso)&diff=2398PWM (Modulación de Ancho de Pulso)2012-12-01T00:32:16Z<p>Francjsalanova: </p>
<hr />
<div>[[Categoría: EC3883 - Laboratorio de Proyectos 3]]<br />
[[Categoría: MC9S08QE128]]<br />
<br />
==Introducción==<br />
<br />
<br />
<br />
<br />
===Configuración===<br />
<br />
El comparador analógico (ACMP) puede ser configurado para conectarse el a un canal TPM de entrada, colocando el bit SOPT2 [ACICx] en uno. Haciendo esto, el pin del canal 0 del TPM no está disponible de forma externa, es decir no puede ser modificado. La salida del ACMP 1 puede conectarse a TPM1CH0 y la salida del ACMP2 puede conectarse a TPM2CH0.<br />
[[Archivo:Untitled.jpg|700px|center|thumb|'''Configuración del módulo SOPT2 para conectar el ACMP a los canales del TPM''']]<br />
<br />
<br />
<br />
Al momento de programar, el código para la configuración anterior sería de esta forma:<br />
<br />
'''SOPT2=0x05'''<br />
<br />
<br />
Donde el valor hexadecimal 0x05 representa los 8 bits del registro SOPT2 que, como se observa en el cuadro anterior, son 00000101.<br />
<br />
<br />
===Compuerta de clocks===<br />
<br />
Los clocks de los módulos TPM1, TPM2 y TPM3 pueden activarse o desactivarse usando el módulo SCGC1 [TPMx]. Cuando los bits están en 1, los puertos se habilitan dejando usar los clocks de cada módulo, y en cero se inhabilitan. Luego de un reset estos bits se colocan en 1.<br />
[[Archivo:Untitled2.jpg|700px|center|thumb|'''Habilitación de los clocks del TPM1 TPM2 y TPM3''']]<br />
<br />
Similar al caso anterior, el código para la configuración anteriormente descrita es:<br />
<br />
'''SCGC1=0xE0'''<br />
<br />
Nuevamente el valor hexadecimal 0xE0 representa los 8 bits del registro SCGC1, los cuales eran 11100000<br />
<br />
<br />
===Vector de interrupciones===<br />
<br />
A continuación se presentan los vectores de interrupciones para este módulo:<br />
<br />
[[Archivo:Untitled3.jpg|700px|center|thumb|'''Vectores de interrupción del TPM''']]<br />
<br />
<br />
===Características===<br />
<br />
El módulo PWM posee las siguientes características:<br />
<br />
*Cada canal se puede configurarse para ser capturador de entrada, comparador de salidas, o alineación de flancos PWM. Estos tipos de configuración se discutirán en la sección de modos de operación.<br />
<br />
*Escoger la polaridad en las salidas del PWM (positiva o negativa)<br />
<br />
*El módulo puede ser configurado como buffer o como alineación central de la modulación del ancho de pulso (CPMW por sus siglas en inglés).<br />
<br />
*El timer puede ser modificado para usarse con una escala predeterminada del bus clock, un clock fijo o un clock externo:<br />
<br />
#La preescala se define dividiendo el clock del bus entre 1, 2, 4, 8, 16, 32, 64 o 128. El bus clock al que opera el microcontrolador es de 1MHz.<br />
#El clock fijo es sincronizado con el bus clock mediante un circuito sincronizador.<br />
#Para el clock externo, el pin puede compartirse con un pin de un canal o de cualquier otra entrada, por lo tanto hay que tener cuidado al configurar este pin.<br />
<br />
*Un interruptor por canal y un contador para las interrupciones.<br />
<br />
<br />
<br />
<br />
===Modos de operación===<br />
<br />
Los canales pueden ser configurados independientemente como capturadores de entrada, comparador de salidas, o alineación de los flancos de PWM. Un bit de control puede modificarse para que todos los canales del módulo sean configurados como alineación de la modulación del ancho de pulso, si este es el caso se inhabilitan las otras opciones de configuración.<br />
Cuando el microcontrolador esta en BDM background o BDM foreground, el TPM suspende las operaciones y las reanuda apenas el microcontrolador regresa a estado normal. Cuando esta en stop, todos los clocks del microcontrolador se paran, incluyendo el oscilador principal, por lo tanto el modulo TPM es inhabilitado momentáneamente. En el modo de espera (wait mode), el TPM opera de forma normal ya que no genera una referencia a tiempo real ni el interrupt necesario para despertar el micro de este estado. Los modos de operación son los siguientes:<br />
<br />
*'''Modo de captura de entrada:''' Cuando un evento preseleccionado de flanco ocurre en el pin asociado al canal que se esta usando, el valor actual del contador del timer de 16 bits es guardado en el registro de valor del canal y una bandera de interrupción se coloca en uno. Un flanco de subida, flanco de bajada, cualquier flanco o ningún flanco (canal inhabilitado) puede ser seleccionado como el flanco activo que dispara la captura de entrada.<br />
<br />
*'''Modo de comparación de salida:''' Cuando el valor en el registro del contador es igual al valor del registro del canal, una bandera de un bit de interrupción se coloca en uno, y una acción de salida seleccionada es forzada en el pin del microcontrolador. La salida que se ve en el pin puede ser forzada a cero, a uno, intercambiar/conmutar las salidas o simplemente ignorarlo.<br />
<br />
*'''Modo de alineación de flancos de PWM:''' El valor del registro de 16 bits +1 define el período de la señal de salida del PWM. El valor del registro del canal define el duty cicle (tiempo en que la señal permanece en un estado activo) de la señal de salida del PWM. También se puede definir la polaridad de la señal de salida. Las interrupciones ocurren apenas termine el período de la señal, es decir en el punto de transición del duty cicle (cuando la señal pasa de activa a inactiva) <br />
<br />
*'''Modo de alineacion central del PWM:''' El doble del valor del registro del modulo de 16 bits define el period de las salidas PWM, y los registros de valores de los canals definen la mitad de la duracion del duty cycle. El contador del timer cuenta hasta que llega al valor del registro del modulo y luego cuenta desde este valor hasta cero. Mientras el contador esta contando hacia abajo, y el valor del contador es el mismo que el del modulo, la salida PWM se activa. En el caso contrario, es decir cuando esta contando hacia arriba y los valores coinciden, la salida PWM se desactiva. <br />
<br />
===Diagrama de bloques===<br />
<br />
El módulo TPM usa un pin de entrada/salida por canal (TPMxCHn), donde n representa el numero del canal. Hay que tener cuidado a usar estos pines ya que los pines de entrada/salida del TPM están asociados a los puertos de entrada/salida generales del microcontrolador. El componente central es el contador de 16 bits, el cual provee el tiempo de referencia para los modos de operación. Los registros del modulo del contador (TPMxMODH:TPMxMODL) registra el valor del modulo. Este dato se puede leer cuando sea, mas si se modifica este dato en la parte baja (TPMxMODL) o en la parte alta (TPMxMODH), se resetea el contador.<br />
<br />
[[Archivo:Untitled4.jpg|700px|center|thumb|'''Diagrama de bloques del TPM''']]<br />
<br />
==Registros del TPM==<br />
===Registros de status y control del TPM (TPMxSC)===<br />
<br />
El registro TPMxSC contiene la bandera de overflow y los bits de control para determinar la habilitación de las interrupciones, el modo de operación que se va a usar, el tipo de clock y la escala en caso de ser necesaria.<br />
[[Archivo:Untitled5.jpg|700px|center|thumb|'''Bits del registro TPMxSC''']]<br />
<br />
*'''TOF (Bit 7):''' Este bit se conoce como la bandera de overflow del timer. Este bit se coloca en uno cuando el contador del TPM se resetea (0x0000) luego de haber alcanzado el valor guardado en el registro de modulo del contador. Para borrar este bit (ponerlo en cero), es necesario leer el registro TPMxSC cuando la bandera este en uno y escribir en este bit un cero. Si llegase a ocurrir otro overflow antes de colocar el bit 7 en cero, la secuencia se resetea por lo tanto la bandera quedaría en uno para que una interrupción del tipo TOF no se pierda debido a una anterior.<br />
<br />
*'''TOIE (Bit 6):''' Tambien llamado habilitador de interrupciones de overflow del timer. Si este bit esta en uno se habilita la interrupción debido a overflows. Es decir que aunque el bit de la bandera de overflow este en uno, si este bit esta en cero nunca van a ocurrir interrupciones del tipo TOF.<br />
<br />
*'''CPWMS (Bit 5):''' Si este bit esta en uno, se activa el modo de operación de alineación central de PWM para todos los canales, desactivando las demás opciones. Además configura el TPM para que el contador opere tanto hacia arriba como hacia abajo (up/down counting) en vez de solo hacia arriba. Un reset coloca este bit en cero habilitando los demás modos de operación.<br />
<br />
*'''CLKS[B:A] (Bit 4:3):''' Estos dos bits se usan para definir que tipo de clock se va a utilizar. El clock fijo solo sirve cuando el clock del sistema esta basado en un sistema PLL (divisor del clock). En caso de no ser así el clock va a ser el mismo que el bus clock, 1MHz para este caso. La sincronización de un clock externo se genera mediante el modulo del bus clock del TPM, mientras que para el caso de un clock fijo es a través de un circuito sincronizador.<br />
[[Archivo:Untitled6.jpg|700px|center|thumb|'''Tipos de clock (Bit 4:3)''']]<br />
<br />
*'''PS[2:0] (Bit 2:0):''' Estos 3 bits se usan para modificar el clock del TPM escogiendo uno de los factores de división que se observan en la siguiente tabla.<br />
[[Archivo:Untitled7.jpg|700px|center|thumb|'''Factor de escalamiento (Bits 2:0)''']]<br />
<br />
===Registro de contadores del TPM (TPMxCNTH:TPMxCNTL)===<br />
<br />
Los registros TPMxCNTH y TPMxCNTL contienen el bit más significativo y menos significativo respectivamente del valor en el contador del TPM. Leer cualquiera de los valores en estos registros coloca los datos de ambos en un buffer hasta que se finalice esta operación. Estos registros se resetean apenas se resetee el microcontrolador o se escriba en el registro TPMxSC. Como ambos son registros de solo lectura, apenas se intente escribir en alguno de ellos se reseteara el contador.<br />
<br />
[[Archivo:Untitled8.jpg|700px|center|thumb|'''8 bits mas significativos del contador (TPMxCNTH)''']][[Archivo:Untitled8.jpg|700px|center|thumb|'''8 bits menos significativos del contador (TPMxCNTL)''']]<br />
<br />
===Registros del modulo del contador del TPM (TPMxMODH:TPMxMODL)===<br />
<br />
El registro de módulo del TPM contiene el valor para el contador del TPM. Cuando este contador alcance el valor asignado en este registro se reinicia y coloca en uno la bandera de overflow para saber que termino un ciclo. Al escribir en los registros TPMxMODH o TPMxMODL, que representan los 16 bits del módulo, evita que ocurran interrupciones por overflow hasta que se termine de escribir, además de que guarda el valor de los registros en un buffer, y se actualizará dependiendo de los valores en CLKSB:CLKSA entonces:<br />
*CLKSB y CLKSA son cero los registros se van a actualizar apenas se termine de escribir el segundo byte.<br />
*CLKSB y CLKSA son diferentes de cero los registros se van a actualizar cuando se terminen de escribir en ambos.<br />
Resetear coloca los 16 bits del módulo en cero.<br />
<br />
[[Archivo:Untitled10.jpg|700px|center|thumb|'''8 bits mas significativos del registro de modulo (TPMxMODH)''']]<br />
[[Archivo:Untitled11.jpg|700px|center|thumb|'''8 bits menos significativos del registro de modulo (TPMxMODL)''']]<br />
<br />
===Registros de status y control de los canales del TPM (TPMxCnSC)===<br />
<br />
Este registro contiene el bit para la bandera de interrupciones y los bits de control para configurar el modo de operacion del canal. <br />
<br />
[[Archivo:Untitled12.jpg|700px|center|thumb|'''Registro de control y status del los canales''']]<br />
<br />
*'''CHnF (Bit 7):''' Cuando el canal esta en el modo de captura de entrada, este bit se pondra en uno cuando ocurra el flanco que se definió como flanco activo. Cuando el canal esta en comparación de salida, en alineación de flancos o alineación central de PWM, el bit CHnF se coloca en uno cuando el valor en el registro del contador es igual al valor en el registro del canal, siempre y cuando el duty cycle no sea ni cero ni cien porciento. La interrupción ocurrirá siempre y cuando este bit este en uno y que las interrupciones estén habilitadas, es decir que el bit CHnIE sea uno. Resetear coloca el bit CHnF en cero.<br />
*'''CHnIE (Bit 6):''' Este bit habilita las interrupciones del canal especifico cuando esta en uno. Resetear modifica este bit y lo fuerza a cero.<br />
*'''MSnB (Bit 5):''' Se conoce también como selección de modo A para los canales. Cuando CPWMS esta en cero y el bit MSnB esta en uno, configura el canal TPM especifico para alineación de flancos PWM.<br />
*'''MSnA (Bit 4):''' Conocido tambien como modo de selección A para los canals. Cuando CPWMS y MSnB son cero, MSnA va a configurar el canal para capturador de entrada o comparador de salida.<br />
<br />
[[Archivo:Untitled13.jpg|700px|center|thumb|'''Selección del modo de operacion de los canales''']]<br />
<br />
===Registros del valor de los canales del TPM (TPMxCnVH:TPMxCnVL)===<br />
<br />
Mientras el canal este en el modo de captura de entrada o en el modo de comparación de salidas, leer o escribir alguno de estos dos registros (TPMxCnVH o TPMxCnVL) respectivamente, pondrá los datos de ambos en un buffer hasta que se termine de ejecutar esta acción. Cuando esta en el modo de comparación de salidas, escribir en cualquiera de estos registros. En el caso de escritura ocurrirá y dependiendo de los valores en CLKSB y CLKSA ocurrirá lo siguiente:<br />
*CLKSB y CLKSA son iguales a cero los registros se actualizarán cuando el segundo byte sea escrito.<br />
*CLKSB y CLKSA son distintos de cero y esta en modo de comparación, los registros se actualizarán cuando el segundo byte se halla escrito y en el próximo cambio del contador.<br />
*CLKSB y CLKSA son distintos de cero y este en el modo EPWM o CPWM, entonces los registros serán actualizados luego de que ambos bytes se escriban, y que el contador del TPM cambie.<br />
<br />
[[Archivo:Untitled16.jpg|700px|center|thumb|'''Registro del valor del canal (8 bits mas significativos)''']]<br />
[[Archivo:Untitled17.jpg|700px|center|thumb|'''Registro del valor del canal (8 bits menos significativos)''']]<br />
<br />
==Reset==<br />
<br />
El módulo TPM se resetea cuando ocurre cualquier reset del microcontrolador. Al resetear el microcontrolador el registro TPMxSC inhabilita los clocks del TPM y la bandera de overflow (TOIE). Además los bits CPWMS, MSnB, MSnA, ELSnB y ELSnA son todos forzados a cero, lo que configura todos los canales al modo de operación de captura de entrada.<br />
<br />
==Interrupciones==<br />
<br />
El módulo tiene una interrupción opcional para el contador principal y un interruptor extra para cada canal. Lo que realizará la interrupción de los canales va a depender del modo de operación en el que este el canal. Si el canal esta configurado para recibir una entrada, la bandera de interrupción se coloca en uno cada vez que la entrada deseada es reconocida. Si el canal esta configurado para comparar la salida o para los modos de PWM, la bandera de interrupciones se coloca en uno cada vez que el valor del contador es igual al dato guardado en registro de valores.<br />
<br />
Para cada interrupción del TPM, una bandera de un bit se coloca en uno para reconocer las condiciones de interrupción como overflow, interrupción por captura de entradas o interrupción por comparación de salidas. Para poner este bit en cero hay que leer el registro que posee la bandera y escribir en ella un cero lógico. Si una nueva interrupción es detectada mientras se realizan estas operaciones, la secuencia se resetea y la bandera de interrupción permanece en uno después del paso de escritura para evitar que la interrupción nueva no se ejecute gracias a la anterior.<br />
<br />
===Interrupciones del tipo TOF (interrupción por bandera de overflow)===<br />
<br />
La operación que va a ocurrir por una interrupción del tipo TOF varía dependiendo del modo de operación en que se encuentre el canal TPM, sin embargo las variaciones son minimas.<br />
Para las interrupciones del tipo TOF normales ocurren apenas el contador cambia de 0xFFFF a 0x0000. Cuando el TPM no esta configurado para alineación central de PWM, la bandera se coloca en uno cuando el contador cambia del valor que esta en el registro de modulo a 0x0000.<br />
<br />
===Interrupciones de alineacion central de PWM===<br />
<br />
Cuando CPWMS se coloca en uno, la bandera TOF se activa cada vez que el contador cambia de dirección, es decir que va de contar hacia arriba a contar hacia abajo. Para este caso en particular la bandera de este bit corresponde al final de cada período.<br />
<br />
===Interrupción del tipo de captura de entrada===<br />
<br />
Cuando un canal esta configurado en este modo y los bits de control ELSnB y ELSnA están en alguna de las 4 opciones (flanco de subida, flanco de bajada, cualquier flanco, o canal desabilitado), cada vez que el flanco seleccionado sea reconocido, la bandera de interrupciones se fuerza en uno. <br />
<br />
===Interrupción del tipo de comparación de salida===<br />
<br />
Cuando un canal esta configurado en este modo de operación, la bandera de interrupciones se activa cada vez que el valor del contador es igual al valor que se encuentra guardado en el registro del canal.<br />
<br />
===Interrupcion por finalización de Duty Cycle===<br />
<br />
Para los canales que esten configurados para cualquier operación del tipo PWM existen dos posibilidades. Cuando el canal esta configurado para alineación de flancos, la bandera de interrupciones se coloca en uno cuando el valor del contador es igual al valor guardado en el registro del canal, esto marca la finalización del duty cycle. Cuando el canal esta configurado para alineación central, el contador va a ser igual al valor del registro del canal dos veces por cada periodo (uno cuando el clock esta contando hacia arriba y otro cuando el clock esta contando hacia abajo). Para este caso la bandera se coloca en uno al principio y al final del periodo del duty cycle.<br />
<br />
==Referencias==<br />
<br />
*[http://www.freescale.com/files/microcontrollers/doc/ref_manual/MC9S08QE128RM.pdf''MC9S08QE128RM Reference Manual'']</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=2393I²C (Inter-Integrated Circuit) - MC9S08QE1282012-12-01T00:15:14Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
<br />
==Introducción==<br />
<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 módulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automático de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el número de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El módulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El módulo IIC esta inactivo en el modo stop3 para reducir el consumo de energía. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
==Diagrama de Bloques==<br />
<br />
<br />
[[Archivo:D_bloque.png]]<br />
<br />
<br />
[[Archivo:Resaltando_los_m_de_iic.png]]<br />
<br />
==Inicialización del módulo en modo esclavo==<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionamiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el módulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicialización del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 para:<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinará si la comunicación es de recepción como maestro o transmisión como maestro).<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del módulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descripción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: <br />
<br />
00 mul = 01<br />
<br />
01 mul = 02<br />
<br />
10 mul = 04<br />
<br />
11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL).<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA. <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL.<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value. <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupción de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Selección del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro. Cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmisión — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la transferencia de un byte de data. este bit es únicamente válido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepción o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la dirección de llamada coincide con la dirección de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recibida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitrariedad — Este bit se activa por hardware cuando el procedimiento de arbitración se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la dirección de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupción IIC — El bit IICIF se activa cuando una interrupción esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiera de los siguientes eventos puede activar el bit IICIF:<br />
• Se completó la transferencia de un byte.<br />
• Coincidencia de la dirección de esclavo con la dirección de llamada.<br />
• Pérdida de arbitrariedad.<br />
<br />
0 No hay interrupción pendiente.<br />
<br />
1 Hay una interrupción pendiente.<br />
<br />
'''RXAK''' Recepción de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido después de la transmisión de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. En modo de transmisión maestro, leer este registro inicia la transferencia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits. <br />
<br />
1 Esquema de sireccion de 10-bits.<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
'''IIC Protocol'''<br />
<br />
El bus del IIC utiliza na linea de datos serial (SDA) y una linea de reloj serial (SCL) para transferencia de datos. Todos los dispositivos deben tener salidas tipo open-drain o open collector. Un AND lógico se aplica en ambas líneas con resistencias de pull-up externas. El valor de estas resistencias depende del sistema.<br />
<br />
Generalmente, una comunicación standard esta compuesta de cuatro partes:<br />
• Señal de START.<br />
• Transmisión de la dirección de esclavo.<br />
• Transferencia de datos.<br />
• Señal de STOP. <br />
La señal de STOP no se debe confundir con la instrucción de CPU STOP.<br />
<br />
<br />
[[Archivo:IIC_Bus.png]]<br />
<br />
==Señal de START==<br />
<br />
Cuando el bus esta libre, ningún dispositivo maestro esta controlando el bus (SCL y SDA estan el 1 lógico), un dispositivo maestro debe iniciar la comunicación enviando una señal de START. Como se muestra en la figura 12-9.<br />
Una señal de START se define como el cambio de 1 a cero lógico de la linea SDA mientras SCL esta en 1 lógico. esta señal denota el inicio de una nueva transferencia de datos (cada transmisión de datos debe contener varios bytes de data) y sacar a los esclavos fuera de su estado de espera.<br />
<br />
==Transmisión de la dirección de esclavo==<br />
<br />
<br />
El primer byte de data transmitido inmediatamente después de la señal de START es la dirección de esclavo transmitida por el maestro. Esta es una dirección de llamada de siete bits seguida por el bit R/W. El bit R/W le dice al esclavo la dirección deseada de la transferencia de datos.<br />
<br />
1 = Transferencia tipo lectura, el esclavo transmite data a el maestro.<br />
<br />
0 = Transferencia tipo escritura, el maestro transmite data al esclavo.<br />
<br />
<br />
Sólo el esclavo con una dirección de llamada que coincida con la dirección transmitida por el maestro responderá enviando de vuelta un bit de acknowledge. Esto se logra poniendo en cero lógico la línea SDA en el noveno clock (ver Figura 12-9).<br />
Ningún esclavo en el sistema debe tener la misma dirección de llamada. Si el módulo IIC es el maestro, no debe transmitir una dirección de llamada de esclavo igual a la suya. El IIC no puede ser maestro y esclavo al mismo tiempo.<br />
Si una pérdida de arbitrariedad ocurre durante el ciclo de direccionamiento, el IIC cambiará a modo esclavo.<br />
<br />
<br />
==Transferencia de Datos==<br />
<br />
<br />
Antes de que se logre el direccionamiento correcto del esclavo, la transferencia de datos puede proceder byte por byte en la dirección especificada por el bit R/W enviado por el maestro que realizó la llamada.<br />
todas las transferencias de datos que le sigan a un ciclo de direccionamiento se interpretan como transferencia de datos, incluso si contienen información de sub-direcciones para el dispositivo esclavo.Cada byte de datos tiene 8 bits.<br />
<br />
<br />
Los datos solo pueden cambiar mientras SCL esta en cero lógico y deben ser sostenidos en un estado estable mientras SCL esta en uno lógico como muestra la Figura 12-9.<br />
<br />
<br />
<br />
==Resets==<br />
<br />
<br />
EL módulo IIC se inhabilita después de cada reset. EL IIC no puede causar un reset del MCU.<br />
<br />
<br />
==Interrupciones==<br />
<br />
<br />
El IIC genera una sola interrupción.<br />
<br />
Las interrupciones se producen con cualquiera de los eventos de la tabla 12-11 y cuando el bit IICIEesta activado. La bandera IICIF debe ser borrada por software escribiendo un 1 en el, en la rutina de interrupción. <br />
<br />
<br />
===Interrupción de transferencia de byte===<br />
<br />
<br />
La bandera TCF se activa en el borde de bajada al noveno clock para indicar que se ha completado una transferencia.<br />
<br />
<br />
===Interrupción de detección de dirección===<br />
<br />
Cuando la dirección de llamada coincide con la dirección de esclavo programada en el registro de direccióno cuando el bit GCAEN es activado y una llamada general es recibida, el bit IAAS se activa. El CPU es interrumpido cuando llega una interrupción. El CPU debe verificar el bit SRW y escribirlo de acuerdo al modo de Tx correcto.<br />
<br />
<br />
===Interrupción de pérdida de arbitrariedad===<br />
<br />
<br />
La arbitrariedad se pierde en cualquiera de estas circunstancias:<br />
<br />
• Cuando se baja la línea SDA cuando el maestro la mantiene en alto durante un ciclo de dirección o de transmisión.<br />
• Cuando se baja la línea SDA cuando el maestro la mantiene en alto durante el envío del bit de acknowledge en un ciclo de datos.<br />
• Al tratar de llevarse a cabo un ciclo de START cuando el bus esta ocupado.<br />
• Una ciclo de START repetido es solicitado en modo esclavo.<br />
• Una condición de STOP es detectada cuando el maestro no la solicitó.<br />
Este bit debe ser borrado por software escribiendo un 1 lógico en el.<br />
<br />
==Referencias ==<br />
*[http://www.freescale.com/files/microcontrollers/doc/ref_manual/MC9S08QE128RM.pdf''MC9S08QE128RM Reference Manual'']<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Archivo:Resaltando_los_m_de_iic.png&diff=2392Archivo:Resaltando los m de iic.png2012-12-01T00:14:59Z<p>Francjsalanova: </p>
<hr />
<div></div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=2391I²C (Inter-Integrated Circuit) - MC9S08QE1282012-12-01T00:12:18Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
<br />
==Introducción==<br />
<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 módulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automático de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el número de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El módulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El módulo IIC esta inactivo en el modo stop3 para reducir el consumo de energía. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
==Diagrama de Bloques==<br />
<br />
<br />
[[Archivo:D_bloque.png]]<br />
<br />
<br />
<br />
<br />
==Inicialización del módulo en modo esclavo==<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionamiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el módulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicialización del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 para:<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinará si la comunicación es de recepción como maestro o transmisión como maestro).<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del módulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descripción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: <br />
<br />
00 mul = 01<br />
<br />
01 mul = 02<br />
<br />
10 mul = 04<br />
<br />
11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL).<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA. <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL.<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value. <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupción de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Selección del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro. Cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmisión — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la transferencia de un byte de data. este bit es únicamente válido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepción o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la dirección de llamada coincide con la dirección de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recibida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitrariedad — Este bit se activa por hardware cuando el procedimiento de arbitración se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la dirección de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupción IIC — El bit IICIF se activa cuando una interrupción esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiera de los siguientes eventos puede activar el bit IICIF:<br />
• Se completó la transferencia de un byte.<br />
• Coincidencia de la dirección de esclavo con la dirección de llamada.<br />
• Pérdida de arbitrariedad.<br />
<br />
0 No hay interrupción pendiente.<br />
<br />
1 Hay una interrupción pendiente.<br />
<br />
'''RXAK''' Recepción de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido después de la transmisión de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. En modo de transmisión maestro, leer este registro inicia la transferencia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits. <br />
<br />
1 Esquema de sireccion de 10-bits.<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
'''IIC Protocol'''<br />
<br />
El bus del IIC utiliza na linea de datos serial (SDA) y una linea de reloj serial (SCL) para transferencia de datos. Todos los dispositivos deben tener salidas tipo open-drain o open collector. Un AND lógico se aplica en ambas líneas con resistencias de pull-up externas. El valor de estas resistencias depende del sistema.<br />
<br />
Generalmente, una comunicación standard esta compuesta de cuatro partes:<br />
• Señal de START.<br />
• Transmisión de la dirección de esclavo.<br />
• Transferencia de datos.<br />
• Señal de STOP. <br />
La señal de STOP no se debe confundir con la instrucción de CPU STOP.<br />
<br />
<br />
[[Archivo:IIC_Bus.png]]<br />
<br />
==Señal de START==<br />
<br />
Cuando el bus esta libre, ningún dispositivo maestro esta controlando el bus (SCL y SDA estan el 1 lógico), un dispositivo maestro debe iniciar la comunicación enviando una señal de START. Como se muestra en la figura 12-9.<br />
Una señal de START se define como el cambio de 1 a cero lógico de la linea SDA mientras SCL esta en 1 lógico. esta señal denota el inicio de una nueva transferencia de datos (cada transmisión de datos debe contener varios bytes de data) y sacar a los esclavos fuera de su estado de espera.<br />
<br />
==Transmisión de la dirección de esclavo==<br />
<br />
<br />
El primer byte de data transmitido inmediatamente después de la señal de START es la dirección de esclavo transmitida por el maestro. Esta es una dirección de llamada de siete bits seguida por el bit R/W. El bit R/W le dice al esclavo la dirección deseada de la transferencia de datos.<br />
<br />
1 = Transferencia tipo lectura, el esclavo transmite data a el maestro.<br />
<br />
0 = Transferencia tipo escritura, el maestro transmite data al esclavo.<br />
<br />
<br />
Sólo el esclavo con una dirección de llamada que coincida con la dirección transmitida por el maestro responderá enviando de vuelta un bit de acknowledge. Esto se logra poniendo en cero lógico la línea SDA en el noveno clock (ver Figura 12-9).<br />
Ningún esclavo en el sistema debe tener la misma dirección de llamada. Si el módulo IIC es el maestro, no debe transmitir una dirección de llamada de esclavo igual a la suya. El IIC no puede ser maestro y esclavo al mismo tiempo.<br />
Si una pérdida de arbitrariedad ocurre durante el ciclo de direccionamiento, el IIC cambiará a modo esclavo.<br />
<br />
<br />
==Transferencia de Datos==<br />
<br />
<br />
Antes de que se logre el direccionamiento correcto del esclavo, la transferencia de datos puede proceder byte por byte en la dirección especificada por el bit R/W enviado por el maestro que realizó la llamada.<br />
todas las transferencias de datos que le sigan a un ciclo de direccionamiento se interpretan como transferencia de datos, incluso si contienen información de sub-direcciones para el dispositivo esclavo.Cada byte de datos tiene 8 bits.<br />
<br />
<br />
Los datos solo pueden cambiar mientras SCL esta en cero lógico y deben ser sostenidos en un estado estable mientras SCL esta en uno lógico como muestra la Figura 12-9.<br />
<br />
<br />
<br />
==Resets==<br />
<br />
<br />
EL módulo IIC se inhabilita después de cada reset. EL IIC no puede causar un reset del MCU.<br />
<br />
<br />
==Interrupciones==<br />
<br />
<br />
El IIC genera una sola interrupción.<br />
<br />
Las interrupciones se producen con cualquiera de los eventos de la tabla 12-11 y cuando el bit IICIEesta activado. La bandera IICIF debe ser borrada por software escribiendo un 1 en el, en la rutina de interrupción. <br />
<br />
<br />
===Interrupción de transferencia de byte===<br />
<br />
<br />
La bandera TCF se activa en el borde de bajada al noveno clock para indicar que se ha completado una transferencia.<br />
<br />
<br />
===Interrupción de detección de dirección===<br />
<br />
Cuando la dirección de llamada coincide con la dirección de esclavo programada en el registro de direccióno cuando el bit GCAEN es activado y una llamada general es recibida, el bit IAAS se activa. El CPU es interrumpido cuando llega una interrupción. El CPU debe verificar el bit SRW y escribirlo de acuerdo al modo de Tx correcto.<br />
<br />
<br />
===Interrupción de pérdida de arbitrariedad===<br />
<br />
<br />
La arbitrariedad se pierde en cualquiera de estas circunstancias:<br />
<br />
• Cuando se baja la línea SDA cuando el maestro la mantiene en alto durante un ciclo de dirección o de transmisión.<br />
• Cuando se baja la línea SDA cuando el maestro la mantiene en alto durante el envío del bit de acknowledge en un ciclo de datos.<br />
• Al tratar de llevarse a cabo un ciclo de START cuando el bus esta ocupado.<br />
• Una ciclo de START repetido es solicitado en modo esclavo.<br />
• Una condición de STOP es detectada cuando el maestro no la solicitó.<br />
Este bit debe ser borrado por software escribiendo un 1 lógico en el.<br />
<br />
==Referencias ==<br />
*[http://www.freescale.com/files/microcontrollers/doc/ref_manual/MC9S08QE128RM.pdf''MC9S08QE128RM Reference Manual'']<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=2390I²C (Inter-Integrated Circuit) - MC9S08QE1282012-12-01T00:11:43Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
<br />
==Introducción==<br />
<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 módulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automático de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el número de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El módulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El módulo IIC esta inactivo en el modo stop3 para reducir el consumo de energía. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
==Diagrama de Bloques==<br />
<br />
<br />
[[Archivo:D_bloque.png]]<br />
<br />
<br />
<br />
<br />
===Inicialización del módulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionamiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el módulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicialización del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 para:<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinará si la comunicación es de recepción como maestro o transmisión como maestro).<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del módulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descripción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: <br />
<br />
00 mul = 01<br />
<br />
01 mul = 02<br />
<br />
10 mul = 04<br />
<br />
11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL).<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA. <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL.<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value. <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupción de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Selección del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro. Cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmisión — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la transferencia de un byte de data. este bit es únicamente válido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepción o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la dirección de llamada coincide con la dirección de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recibida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitrariedad — Este bit se activa por hardware cuando el procedimiento de arbitración se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la dirección de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupción IIC — El bit IICIF se activa cuando una interrupción esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiera de los siguientes eventos puede activar el bit IICIF:<br />
• Se completó la transferencia de un byte.<br />
• Coincidencia de la dirección de esclavo con la dirección de llamada.<br />
• Pérdida de arbitrariedad.<br />
<br />
0 No hay interrupción pendiente.<br />
<br />
1 Hay una interrupción pendiente.<br />
<br />
'''RXAK''' Recepción de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido después de la transmisión de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. En modo de transmisión maestro, leer este registro inicia la transferencia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits. <br />
<br />
1 Esquema de sireccion de 10-bits.<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
'''IIC Protocol'''<br />
<br />
El bus del IIC utiliza na linea de datos serial (SDA) y una linea de reloj serial (SCL) para transferencia de datos. Todos los dispositivos deben tener salidas tipo open-drain o open collector. Un AND lógico se aplica en ambas líneas con resistencias de pull-up externas. El valor de estas resistencias depende del sistema.<br />
<br />
Generalmente, una comunicación standard esta compuesta de cuatro partes:<br />
• Señal de START.<br />
• Transmisión de la dirección de esclavo.<br />
• Transferencia de datos.<br />
• Señal de STOP. <br />
La señal de STOP no se debe confundir con la instrucción de CPU STOP.<br />
<br />
<br />
[[Archivo:IIC_Bus.png]]<br />
<br />
==Señal de START==<br />
<br />
Cuando el bus esta libre, ningún dispositivo maestro esta controlando el bus (SCL y SDA estan el 1 lógico), un dispositivo maestro debe iniciar la comunicación enviando una señal de START. Como se muestra en la figura 12-9.<br />
Una señal de START se define como el cambio de 1 a cero lógico de la linea SDA mientras SCL esta en 1 lógico. esta señal denota el inicio de una nueva transferencia de datos (cada transmisión de datos debe contener varios bytes de data) y sacar a los esclavos fuera de su estado de espera.<br />
<br />
==Transmisión de la dirección de esclavo==<br />
<br />
<br />
El primer byte de data transmitido inmediatamente después de la señal de START es la dirección de esclavo transmitida por el maestro. Esta es una dirección de llamada de siete bits seguida por el bit R/W. El bit R/W le dice al esclavo la dirección deseada de la transferencia de datos.<br />
<br />
1 = Transferencia tipo lectura, el esclavo transmite data a el maestro.<br />
<br />
0 = Transferencia tipo escritura, el maestro transmite data al esclavo.<br />
<br />
<br />
Sólo el esclavo con una dirección de llamada que coincida con la dirección transmitida por el maestro responderá enviando de vuelta un bit de acknowledge. Esto se logra poniendo en cero lógico la línea SDA en el noveno clock (ver Figura 12-9).<br />
Ningún esclavo en el sistema debe tener la misma dirección de llamada. Si el módulo IIC es el maestro, no debe transmitir una dirección de llamada de esclavo igual a la suya. El IIC no puede ser maestro y esclavo al mismo tiempo.<br />
Si una pérdida de arbitrariedad ocurre durante el ciclo de direccionamiento, el IIC cambiará a modo esclavo.<br />
<br />
<br />
==Transferencia de Datos==<br />
<br />
<br />
Antes de que se logre el direccionamiento correcto del esclavo, la transferencia de datos puede proceder byte por byte en la dirección especificada por el bit R/W enviado por el maestro que realizó la llamada.<br />
todas las transferencias de datos que le sigan a un ciclo de direccionamiento se interpretan como transferencia de datos, incluso si contienen información de sub-direcciones para el dispositivo esclavo.Cada byte de datos tiene 8 bits.<br />
<br />
<br />
Los datos solo pueden cambiar mientras SCL esta en cero lógico y deben ser sostenidos en un estado estable mientras SCL esta en uno lógico como muestra la Figura 12-9.<br />
<br />
<br />
<br />
==Resets==<br />
<br />
<br />
EL módulo IIC se inhabilita después de cada reset. EL IIC no puede causar un reset del MCU.<br />
<br />
<br />
==Interrupciones==<br />
<br />
<br />
El IIC genera una sola interrupción.<br />
<br />
Las interrupciones se producen con cualquiera de los eventos de la tabla 12-11 y cuando el bit IICIEesta activado. La bandera IICIF debe ser borrada por software escribiendo un 1 en el, en la rutina de interrupción. <br />
<br />
<br />
===Interrupción de transferencia de byte===<br />
<br />
<br />
La bandera TCF se activa en el borde de bajada al noveno clock para indicar que se ha completado una transferencia.<br />
<br />
<br />
===Interrupción de detección de dirección===<br />
<br />
Cuando la dirección de llamada coincide con la dirección de esclavo programada en el registro de direccióno cuando el bit GCAEN es activado y una llamada general es recibida, el bit IAAS se activa. El CPU es interrumpido cuando llega una interrupción. El CPU debe verificar el bit SRW y escribirlo de acuerdo al modo de Tx correcto.<br />
<br />
<br />
===Interrupción de pérdida de arbitrariedad===<br />
<br />
<br />
La arbitrariedad se pierde en cualquiera de estas circunstancias:<br />
<br />
• Cuando se baja la línea SDA cuando el maestro la mantiene en alto durante un ciclo de dirección o de transmisión.<br />
• Cuando se baja la línea SDA cuando el maestro la mantiene en alto durante el envío del bit de acknowledge en un ciclo de datos.<br />
• Al tratar de llevarse a cabo un ciclo de START cuando el bus esta ocupado.<br />
• Una ciclo de START repetido es solicitado en modo esclavo.<br />
• Una condición de STOP es detectada cuando el maestro no la solicitó.<br />
Este bit debe ser borrado por software escribiendo un 1 lógico en el.<br />
<br />
==Referencias ==<br />
*[http://www.freescale.com/files/microcontrollers/doc/ref_manual/MC9S08QE128RM.pdf''MC9S08QE128RM Reference Manual'']<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Archivo:D_bloque.png&diff=2389Archivo:D bloque.png2012-12-01T00:10:08Z<p>Francjsalanova: </p>
<hr />
<div></div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=2384I²C (Inter-Integrated Circuit) - MC9S08QE1282012-12-01T00:03:39Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
<br />
==Introducción==<br />
<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 módulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automático de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el número de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El módulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El módulo IIC esta inactivo en el modo stop3 para reducir el consumo de energía. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del módulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionamiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el módulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicialización del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 para:<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinará si la comunicación es de recepción como maestro o transmisión como maestro).<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del módulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descripción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: <br />
<br />
00 mul = 01<br />
<br />
01 mul = 02<br />
<br />
10 mul = 04<br />
<br />
11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL).<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA. <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL.<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value. <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupción de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Selección del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro. Cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmisión — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la transferencia de un byte de data. este bit es únicamente válido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepción o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la dirección de llamada coincide con la dirección de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recibida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitrariedad — Este bit se activa por hardware cuando el procedimiento de arbitración se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la dirección de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupción IIC — El bit IICIF se activa cuando una interrupción esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiera de los siguientes eventos puede activar el bit IICIF:<br />
• Se completó la transferencia de un byte.<br />
• Coincidencia de la dirección de esclavo con la dirección de llamada.<br />
• Pérdida de arbitrariedad.<br />
<br />
0 No hay interrupción pendiente.<br />
<br />
1 Hay una interrupción pendiente.<br />
<br />
'''RXAK''' Recepción de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido después de la transmisión de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. En modo de transmisión maestro, leer este registro inicia la transferencia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits. <br />
<br />
1 Esquema de sireccion de 10-bits.<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
'''IIC Protocol'''<br />
<br />
El bus del IIC utiliza na linea de datos serial (SDA) y una linea de reloj serial (SCL) para transferencia de datos. Todos los dispositivos deben tener salidas tipo open-drain o open collector. Un AND lógico se aplica en ambas líneas con resistencias de pull-up externas. El valor de estas resistencias depende del sistema.<br />
<br />
Generalmente, una comunicación standard esta compuesta de cuatro partes:<br />
• Señal de START.<br />
• Transmisión de la dirección de esclavo.<br />
• Transferencia de datos.<br />
• Señal de STOP. <br />
La señal de STOP no se debe confundir con la instrucción de CPU STOP.<br />
<br />
<br />
[[Archivo:IIC_Bus.png]]<br />
<br />
==Señal de START==<br />
<br />
Cuando el bus esta libre, ningún dispositivo maestro esta controlando el bus (SCL y SDA estan el 1 lógico), un dispositivo maestro debe iniciar la comunicación enviando una señal de START. Como se muestra en la figura 12-9.<br />
Una señal de START se define como el cambio de 1 a cero lógico de la linea SDA mientras SCL esta en 1 lógico. esta señal denota el inicio de una nueva transferencia de datos (cada transmisión de datos debe contener varios bytes de data) y sacar a los esclavos fuera de su estado de espera.<br />
<br />
==Transmisión de la dirección de esclavo==<br />
<br />
<br />
El primer byte de data transmitido inmediatamente después de la señal de START es la dirección de esclavo transmitida por el maestro. Esta es una dirección de llamada de siete bits seguida por el bit R/W. El bit R/W le dice al esclavo la dirección deseada de la transferencia de datos.<br />
<br />
1 = Transferencia tipo lectura, el esclavo transmite data a el maestro.<br />
<br />
0 = Transferencia tipo escritura, el maestro transmite data al esclavo.<br />
<br />
<br />
Sólo el esclavo con una dirección de llamada que coincida con la dirección transmitida por el maestro responderá enviando de vuelta un bit de acknowledge. Esto se logra poniendo en cero lógico la línea SDA en el noveno clock (ver Figura 12-9).<br />
Ningún esclavo en el sistema debe tener la misma dirección de llamada. Si el módulo IIC es el maestro, no debe transmitir una dirección de llamada de esclavo igual a la suya. El IIC no puede ser maestro y esclavo al mismo tiempo.<br />
Si una pérdida de arbitrariedad ocurre durante el ciclo de direccionamiento, el IIC cambiará a modo esclavo.<br />
<br />
<br />
==Transferencia de Datos==<br />
<br />
<br />
Antes de que se logre el direccionamiento correcto del esclavo, la transferencia de datos puede proceder byte por byte en la dirección especificada por el bit R/W enviado por el maestro que realizó la llamada.<br />
todas las transferencias de datos que le sigan a un ciclo de direccionamiento se interpretan como transferencia de datos, incluso si contienen información de sub-direcciones para el dispositivo esclavo.Cada byte de datos tiene 8 bits.<br />
<br />
<br />
Los datos solo pueden cambiar mientras SCL esta en cero lógico y deben ser sostenidos en un estado estable mientras SCL esta en uno lógico como muestra la Figura 12-9.<br />
<br />
<br />
<br />
==Resets==<br />
<br />
<br />
EL módulo IIC se inhabilita después de cada reset. EL IIC no puede causar un reset del MCU.<br />
<br />
<br />
==Interrupciones==<br />
<br />
<br />
El IIC genera una sola interrupción.<br />
<br />
Las interrupciones se producen con cualquiera de los eventos de la tabla 12-11 y cuando el bit IICIEesta activado. La bandera IICIF debe ser borrada por software escribiendo un 1 en el, en la rutina de interrupción. <br />
<br />
<br />
===Interrupción de transferencia de byte===<br />
<br />
<br />
La bandera TCF se activa en el borde de bajada al noveno clock para indicar que se ha completado una transferencia.<br />
<br />
<br />
===Interrupción de detección de dirección===<br />
<br />
Cuando la dirección de llamada coincide con la dirección de esclavo programada en el registro de direccióno cuando el bit GCAEN es activado y una llamada general es recibida, el bit IAAS se activa. El CPU es interrumpido cuando llega una interrupción. El CPU debe verificar el bit SRW y escribirlo de acuerdo al modo de Tx correcto.<br />
<br />
<br />
===Interrupción de pérdida de arbitrariedad===<br />
<br />
<br />
La arbitrariedad se pierde en cualquiera de estas circunstancias:<br />
<br />
• Cuando se baja la línea SDA cuando el maestro la mantiene en alto durante un ciclo de dirección o de transmisión.<br />
• Cuando se baja la línea SDA cuando el maestro la mantiene en alto durante el envío del bit de acknowledge en un ciclo de datos.<br />
• Al tratar de llevarse a cabo un ciclo de START cuando el bus esta ocupado.<br />
• Una ciclo de START repetido es solicitado en modo esclavo.<br />
• Una condición de STOP es detectada cuando el maestro no la solicitó.<br />
Este bit debe ser borrado por software escribiendo un 1 lógico en el.<br />
<br />
==Referencias ==<br />
*[http://www.freescale.com/files/microcontrollers/doc/ref_manual/MC9S08QE128RM.pdf''MC9S08QE128RM Reference Manual'']<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Pthreads_visual_studio_2012&diff=1908Pthreads visual studio 20122012-11-19T22:00:26Z<p>Francjsalanova: </p>
<hr />
<div>En el siguiente artículo, se pretende ayudar al usuario a crear y configurar un proyecto en Visual Studio 2012, con el fin de trabajar con los hilos '''''POSIX''''' usando el lenguaje de programación '''''C++'''''. <br />
<br />
Para mayor información sobre estos últimos, consulte la sección de referencias ubicada al final del artículo. <br />
<br />
==Visual Studio 2012==<br />
<br />
{| style="border-bottom:3px solid black; border-left:3px solid black; border-top:3px solid black; border-right:3px solid black" border="1" cellpadding="0" cellspacing="1" align="center" <br />
|+'''Datos de programa'''<br />
|-<br />
! style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" colspan="3" align="center"| Microsoft Visual Studio 2012<br />
|-<br />
|style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" colspan="3"|'''Desarrollador'''<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" |Página oficial de<br />
|style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|[http://www.microsoft.com/visualstudio/esn/team-foundation-service Microsoft Visual Studio]<br />
|-<br />
|style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" colspan="3"|'''Información General'''<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Fecha de Lanzamiento:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|15 Agosto 2012<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Género:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|IDE<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|OS:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Windows 32 o 64-bits<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Licencia estudiantil:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|[http://e5.onthehub.com/WebStore/ProductsByMajorVersionList.aspx?ws=762c9a71-a39b-e011-969d-0030487d8897&vsro=8 Alianza USB-Microsoft]<br />
|-<br />
|}<br />
<br />
==Posix Threads==<br />
<br />
Los PThreads, o Posix Threads, es un estandar de POSIX para el control de hilos en un programa, o extensión. Mas específicamente, el estandar POSIX.1c (Extensiones de hilos), define un API para la creación y la manipulación de los ''hilos''.<br />
<br />
Existen alrededor de 100 procedimientos de este estandar, los cuales pueden ser categorizados en 4 grupos principales:<br />
*''Manejadores de Hilos''<br />
*''Variables con condiciones''<br />
*''Sincronización''<br />
*''Mutex''<br />
<br />
Lamentablemente, para los usuarios de Windows, no hay una compatibilidad directa con este tipo de estándares, a diferencia de Linux, MAC OS X,FreeBSD, OpenBSD, Solaris, entre otros. Para ello, se han creado librerías y paquetes independientes para brindarle a Windows y DR-DOR, la compatibilidad necesaria.<br />
<br />
'''Nota:''' En la sección ''Configurar Visual Studio 2012 con pthreads (Posix Threads)'' se encuentra un comprimido con un paquete específico con el cual se podrá trabajar usando Visual Studio. Mas adelante, se explica con detenimiento como configurar dichos archivos.<br />
<br />
==C++==<br />
<br />
'''C++''' ''(C mas mas)'' es un lenguaje de programación, se puede considerar un lenguaje híbrido, que surgió como extensión del lenguaje de programación ''C'' a mediados de los 80. Dicho lenguaje, aporta mecanismos de programación orientada a objetos, como ''classes'' y definiciones de nuevos ''tipos de datos'' no incluidos en C, como wchar_t, permitiendo trabajar con caracteres UNICODE.<br />
<br />
{|align="center" style="border-bottom:3px solid black; border-left:3px solid black; border-top:3px solid black; border-right:3px solid black" cellspacing="10" <br />
|+'''Tipos aritméticos en C++'''<br />
|-<br />
!style="border-bottom: solid grey" |Tipo<br />
!style="border-bottom: solid grey" |Significado<br />
!style="border-bottom: solid grey" |Tamaño mínimo<br />
|-<br />
|bool<br />
|''boolean''(lógico)<br />
| --<br />
|-<br />
|char<br />
|carácter<br />
|8bits<br />
|-<br />
|wchar_t<br />
|carácter ancho<br />
|16bits<br />
|-<br />
|short<br />
|enter-corto<br />
|16bits<br />
|-<br />
|int<br />
|entero<br />
|16bits<br />
|-<br />
|long<br />
|largo-entero<br />
|32bits<br />
|-<br />
|float<br />
|real precisión simple<br />
|~7 dígitos significativos<br />
|-<br />
|double<br />
|real precisión doble<br />
|~15 dígitos significativos<br />
|-<br />
|long double<br />
|real precisión doble extendido<br />
|~15 dígitos significativos<br />
|-<br />
|}<br />
<br />
<br />
Hay que tener en cuenta, para los casos en los que se trabaje E/S (Entradas y Salidas) con el lenguaje de programación C++, se debe incluir la directiva o biblioteca estándar ''<iostream>'' que llegaría a ser el equivalente al ''stdio'' en C.<br />
<br />
<br />
#include <iostream><br />
<br />
<br />
Nótese, que no es necesario colocar ''.h'' en este formato, gracias a los nuevos tipos de archivos cabezera de ANSI implementados en dicho lenguaje.<br />
<br />
Dentro de esta directiva, se encuentran 2 tipos de representaciones tanto para la entrada como para la salida, istream y ostream respectivamente, en los cuales se definen los símbolos de transmisión y recepción de datos:<br />
{|align="center" border="1" style="border-bottom: solid black, border-top: solid black, border-left: solid black,border-right: solid black"<br />
|+<br />
|-<br />
|std:: cin <br />
|Canal de entrada estándar<br />
|-<br />
|std:: cout <br />
|Canal de salida estándar<br />
|-<br />
|std:: cerr <br />
|Canal de salida de error<br />
|-<br />
|std:: endl <br />
|Símbolo para avance de línea<br />
|-<br />
|}<br />
<br />
La entrada se realiza de manera estándar, a través de un canal como el teclado. La salida, tanto de dato como errores, se realiza de manera estándar, generalmente por pantalla. Estos canales tanto de entrada como de salida, son los que generalmente se usan, aunque pueden ser redirigidos los datos a otro canal capaz de transmitir o recibir datos, ya sea por sistema operativo o funciones de sistema.<br />
<br />
Para poder dirigir un dato por el canal de salida, se ha de usar el operador ''<<'', mientras que para entrada, ''>>''. Incluso, se puede llegar a encadenar múltiples salidas o entradas, por ejemplo, el trozo de código: <br />
''std:: cout << "Nací el día" << v_dia << "del mes" << v_mes << "del año" << v_agno << std::endl;'' (Siendo v_dia, v_mes y v_agno, las<br />
respectivas variables)<br />
<br />
Dicho formato también aplica para introducir múltiples entradas.<br />
<br />
'''Código ejemplo:'''<br />
<br />
#include <iostream><br />
<br />
int main()<br />
{<br />
int n1, n2;<br />
std::cout<< "Introducir dos números:" << std:: endl; // Indicando de salida el string o línea de caracteres ''Introducir dos números''<br />
std::cin >>n1 >>n2; // Tomando del canal de entrada los datos en el orden indicado.<br />
std:: cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << std::endl; // Muestra por el canal de salida, <br />
// el string de mostrar la suma.<br />
return 0;<br />
}<br />
<br />
Hay que cuidar el tipo de directivas que se estén incluyendo en nuestro programa, y la manera en que se estén introduciendo, ya que esto puede ayudar al programador a reducir líneas de código o incluso hacer el código mas cómodo a la hora de revisar procedimientos. Por ejemplo, si se incluye la libreria <iostream> sin la extensión ''.h'' es '''necesario''' escribir los espacios de nombres ''std::'' como en el ejemplo anterior. De introducir la directiva <iostream'''.h'''> no es necesario colocar los espacios de nombres ''std::''. Ahora bien, existen también mas combinaciones para lograr la mayor comodidad para el programador, como por ejemplo, agregar <iostream> seguido de la directiva ''using'', la cual permite disponer las definiciones de iostream en el programa.<br />
<br />
#include <iostream><br />
using namespace std;<br />
<br />
int main()<br />
{<br />
int n1, n2;<br />
cout<< "Introducir dos números:" << endl; // Indicando de salida el string o línea de caracteres ''Introducir dos números''<br />
cin >>n1 >>n2; // Tomando del canal de entrada los datos en el orden indicado.<br />
cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << endl; // Muestra por el canal de salida, el string de mostrar la suma.<br />
return 0;<br />
}<br />
<br />
<br />
Para efectos prácticos de este artículo, se configurará a continuación el ''Visual Studio 2012'' para trabajar con C++ y sus respectivas extensiones, debido a su fácil uso y relación con el lenguaje de programación C.<br />
<br />
<br />
==Configurar Visual Studio 2012 con pthreads (Posix Threads)==<br />
En primera instancia, se debe tener Visual Studio 2012 instaldo en la computadora a trabajar. Lo siguiente es descargar estos [https://www.dropbox.com/s/pl2qghdiu8nswtz/Archivos%20pthreads.rar '''Archivos para PThreads - Windows'''], los cuales incluyen las “librerías” e “includes” necesarios.<br />
<br />
===Creando Proyecto App Win32===<br />
Lo siguiente que se va a hacer, será crear un proyecto nuevo en Visual Studio, con la configuración Visual C++. Esto se puede realizar, dando click en “New Project” en el Start Page (Nuevo Proyecto en su defecto), como también buscando en la pestaña “FILE” o “ARCHIVO” -> “new” (nuevo) -> “Project” (proyecto). Para un acceso más rápido también puede presionar la combinación ''crtl+shift+n''.<br />
<br />
<br />
{|<br />
| [[File:1.2_new_proyect.png|thumb|100px|left|Creando proyecto 1]]<br />
| [[File:1.1_new_proyect.png|thumb|100px|right|Creando proyecto 2]]<br />
|}<br />
<br />
<br />
Lo siguiente que se quiere hacer, es configurar el proyecto nuevo como una Aplicación de Consola Win32. Para ello, en la ventana que emergió anteriormente, ubicamos del lado izquierdo, Templates -> Visual C++ -> Win32 Console Application (Aplicación de consola Win32). Le asignamos nombre y ubicación al proyecto ('''¡¡¡Tomar nota!!!'''), y presionamos la tecla aceptar. <br />
<br />
'''Nota:''' De estar trabajando en una computadora ubicada en el Laboratorio C, crear el proyecto en la carpeta Temp con un nombre especifico, para que de esa manera no sea eliminada por el personal.<br />
<br />
{|<br />
| [[File:2.1_Select_win32_console_app.png|100px|thumb|upright|left|Seleccionar win32 App Console 1]]<br />
| [[File:2.2_Select_win32_console_app.png|100px|thumb|upright|right|Seleccionar win32 App Console 2]]<br />
|}<br />
<br />
{|<br />
| [[File:2.3_Select_win32_console_app.png|100px|thumb|upright|Seleccionar win32 App Console 3]]<br />
|}<br />
<br />
En caso de no encontrar de manera manual el tipo de proyecto, uno siempre se puede apoyar en el buscador, ubicado en la esquina superior izquierda de dicha ventana.<br />
<br />
{|<br />
| [[File:2.4_Select_win32_console_app.png|100px|thumb|upright|Buscador]]<br />
|}<br />
<br />
Continuando con la configuración del proyecto, nos topamos con el asistente de aplicaciones Win32. En dicha ventana presionamos Siguiente, llevando a la configuración de aplicaciones, donde se escogerán las siguientes opciones:<br />
*'''''Tipo de aplicación:'''''<br />
**''Aplicación de consola''<br />
*'''''Opciones adicionales:'''''<br />
**''Proyecto vacío''.<br />
<br />
'''Nota:''' Dependiendo de los usos y fines de nuestro proyecto, estas opciones pueden variar, e incluso llevar a mas configuraciones. Para el caso actual, esas opciones no son de interés.<br />
<br />
{|<br />
| [[File:3_config_new_proyect.png|thumb|100px|left|Configurando proyecto 1]]<br />
| [[File:4_config_new_proyect.png|thumb|100px|right|Configurando proyecto 2]]<br />
|}<br />
<br />
===Archivo de Código Fuente===<br />
Ya con el proyecto creado, procedemos a agregar el archivo fuente de nuestro proyecto. Para ello, nos ubicamos en la carpeta Sources (Archivos de código fuente, o, Fuentes), que por defecto se encuentra en la parte derecha de nuestra pantalla. Damos click derecho, y abrimos el camino “Add -> New Item” (Agregar -> Nuevo elemento) ''Ctrl + Shift + A''.<br />
<br />
{|<br />
| [[File:5_Adding_lib's.png|thumb|100px|left|Agregando códigos fuentes 1]]<br />
| [[File:5.1_Adding_lib's.png|thumb|100px|right|Agregando códigos fuentes 2]]<br />
|}<br />
<br />
En la nueva ventana, seleccionamos el tipo de archivo “C++ File (.cpp)” (Archivo C++ (.cpp)) y lo nombramos “main.cpp” en la parte de debajo de la presente pantalla. Damos click, en agregar.<br />
<br />
{|<br />
| [[File:5.2_Adding_lib's.png|thumb|100px|right|Agregando códigos fuentes 3]]<br />
|}<br />
<br />
En esta nueva vista de la pantalla principal del Visual Studio es donde se incluirá el código del usuario<br />
<br />
=== Agregando Librerias de PThreads ===<br />
Interesa en este punto de la configuración tener listos los archivos de librerías e includes, descargados al inicio del artículo. Para ello, se copiará la carpeta pthread (ubicada dentro de x86) en una carpeta, preferiblemente, junto a la carpeta del proyecto en cuestión. Lo siguiente será vincular dichos archivos al proyecto. <br />
Ubicamos el nombre de nuestro proyecto, en el Explorador de Soluciones, justo debajo de Solución ‘nombredelproyecto’. Damos click derecho, y ubicamos “Properties” (Propiedades) o también, podemos acceder con la combinación ''Alt + Enter'', teniendo seleccionado el panel de Explorador de Soluciones.<br />
<br />
{|<br />
| [[File:6_Adding_pthreads_lib's.png|thumb|100px|left|Agregando PThreads lib's 1]]<br />
|}<br />
<br />
Una vez, dentro de la ventana de propiedades, ubicamos en el panel izquierdo “VC++ Directories” (Directorios VC++), y ahí los 3 directorios “Executable Directories”, “Include Directories” y “Library Directories” (Directorio de Archivos Ejecutables, Inclusión y bibliotecas respectivamente) donde vamos a seleccionar la ubicación de los archivos descargados. Seleccionamos uno de ellos, y damos click a la flecha lateral que aparece en la dirección de los archivos actualmente seleccionados y presionamos editar. De ahí, nos aparece una nueva ventana. Presionamos el botón de la carpeta, seguido de los “…”. <br />
<br />
{|<br />
| [[File:6.1_Adding_pthreads_lib's.png|thumb|100px|left|Agregando PThreads lib's 1]]<br />
| [[File:6.2_Adding_pthreads_lib's.png|thumb|100px|left|Agregando PThreads lib's 2]]<br />
|}<br />
<br />
Ubicamos las distintas carpetas en cada uno de los 3 casos:<br />
<br />
'''''Archivos ejecutables:'''''<br />
''pthread -> lib''<br />
<br />
'''''Archivos de inclusión:'''''<br />
''pthread -> include''<br />
<br />
'''''Archivos de bibliotecas:'''''<br />
''pthread -> lib''<br />
<br />
Quedando de la siguiente manera:<br />
<br />
{|<br />
| [[File:6.3_Adding_pthreads_lib's.png|thumb|100px|left|Agregando PThreads lib's 3]]<br />
|}<br />
<br />
Por último, vamos a la sección “Linker -> Input” (Vinculador -> Entrada) en el panel izquierdo. Ubicamos “Additional Dependencies” (Dependencias adicionales), y para efectos prácticos de este artículo, SÓLO agregamos antes de kernel32.lib lo siguiente:<br />
<br />
*''pthreadVC2.lib;''<br />
<br />
'''Nota:''' Recordar poner el “;” <<Punto y coma>> después de cada dependencia agregada, además del tipo de archivo que se está agregando. De tener cualquier dependencia adicional, necesaria para el programa o aplicación en cuestión ha de agregarse en esta sección.<br />
<br />
{|<br />
| [[File:6.4_Adding_pthreads_lib's.png|thumb|100px|left|Agregando PThreads lib's 4]]<br />
| [[File:6.5_Adding_pthreads_lib's.png|thumb|100px|left|Agregando PThreads lib's 5]]<br />
|}<br />
<br />
Una vez terminado, presionamos "Aplicar" luego "Aceptar", regresando a la pantalla principal de Visual Studio.<br />
<br />
Ahora es necesario agregar el archivo pthreadVC2.dll en la carpeta debug de nuestro proyecto, en caso de presentar error, colocar este archivo también en la carpeta de system32 (Para este ultimo paso necesitaras permiso de administrador). <br />
<br />
Ya con estos pasos, Visual Studio queda configurado para trabajar con lo básico de Hilos Posix, quedando pendiente probar los códigos. Dentro del comprimido descargado al principio del artículo se encuentra en un bloc de notas, un código de prueba, sacado de la página<br />
[http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html Linux Tutorial PThreads]<br />
<br />
<br />
'''Código:'''<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <pthread.h><br />
<br />
void *imprimir_mensaje( void *ptr );<br />
<br />
int main()<br />
{<br />
pthread_t hilo1, hilo2;<br />
char *mensaje1 = "Soy el Hilo 1";<br />
char *mensaje2 = "Soy el Hilo 2";<br />
int ret1, ret2;<br />
<br />
/* Crear dos hilos independientes cada uno va a ejecutar la funcion*/<br />
ret1 = pthread_create( &hilo1, NULL, imprimir_mensaje, (void*) mensaje1);<br />
ret2 = pthread_create( &hilo2, NULL, imprimir_mensaje, (void*) mensaje2);<br />
/* Esperar a que los hilos terminen antes que continue el main. Unless we */<br />
/* Si no esperamos se corre el riesgo de ejecutar un exit() el cual */<br />
/* finalizaria el proceso y todos los hilos antes de que terminen. */<br />
pthread_join( hilo1, NULL);<br />
pthread_join( hilo2, NULL);<br />
printf("Hilo 1 Valor de retorno: %d\n",ret1);<br />
printf("Hilo 2 Valor de retorno: %d\n",ret2);<br />
exit(0);<br />
}<br />
<br />
void *imprimir_mensaje( void *ptr )<br />
{<br />
char *mensaje;<br />
mensaje = (char *) ptr;<br />
printf("%s \n", mensaje);<br />
return 0;<br />
} <br />
<br />
<br />
<br />
===Shortcuts de interés===<br />
*'''''Crear nuevo proyecto:''' (Ventana activa: Principal)''<br />
**''Ctrl + Shift + N''<br />
*'''''Añadir nuevo elemento:''' (Ventana activa: Explorador de soluciones)''<br />
**''Ctrl + Shift + A''<br />
*'''''Propiedades de proyecto:''' (Ventana activa: Explorador de soluciones)''<br />
**''Alt + Enter''<br />
*'''''Contruir proyecto:''' (Ventana activa: principal)''<br />
**''Ctrl + Shift + B''<br />
*'''''Correr con debug:''' (Ventana activa: principal)''<br />
**''F5''<br />
*'''''Correr SIN debug:''' (Ventana activa: principal)''<br />
**''Ctrl + F5''<br />
*'''''Step over'''''<br />
**''F10''<br />
*'''''Step into'''''<br />
**''F11''<br />
*'''''Step out'''''<br />
**''Shift + F10''<br />
<br />
<br />
==Referencias==<br />
*[http://books.google.com/books?id=_xvnuFzo7q0C&printsec=frontcover&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false '''Programming with POSIX threads.''' ''David R. Butenhof'']<br />
*[https://www.dropbox.com/s/5o2yzfxtqmig7y7/TutorialVisualStudio2010conPosixThreads.pdf '''Tutorial de configuración de Visual Studio 2010 con Posix Threads.''' ''Raúl Acuña'']<br />
*Joyanes Aguilar, L; Zahonero Martínez, I. ''Programación en C, C++, Java y UML''. McGrawHill (2010)<br />
*[http://www.cplusplus.com/ '''Información de C++: cplusplus.com''']<br />
<br />
Aún falta. Es para ir viendo como va quedando<br />
blah.<br />
<br />
<br />
Gustavo Rivera - 09-10717<br />
<br />
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Pthreads_visual_studio_2012&diff=1907Pthreads visual studio 20122012-11-19T21:59:10Z<p>Francjsalanova: </p>
<hr />
<div>En el siguiente artículo, se pretende ayudar al usuario a crear y configurar un proyecto en Visual Studio 2012, con el fin de trabajar con los hilos '''''POSIX''''' usando el lenguaje de programación '''''C++'''''. <br />
<br />
Para mayor información sobre estos últimos, consulte la sección de referencias ubicada al final del artículo. <br />
<br />
==Visual Studio 2012==<br />
<br />
{| style="border-bottom:3px solid black; border-left:3px solid black; border-top:3px solid black; border-right:3px solid black" border="1" cellpadding="0" cellspacing="1" align="center" <br />
|+'''Datos de programa'''<br />
|-<br />
! style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" colspan="3" align="center"| Microsoft Visual Studio 2012<br />
|-<br />
|style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" colspan="3"|'''Desarrollador'''<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" |Página oficial de<br />
|style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|[http://www.microsoft.com/visualstudio/esn/team-foundation-service Microsoft Visual Studio]<br />
|-<br />
|style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" colspan="3"|'''Información General'''<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Fecha de Lanzamiento:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|15 Agosto 2012<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Género:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|IDE<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|OS:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Windows 32 o 64-bits<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Licencia estudiantil:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|[http://e5.onthehub.com/WebStore/ProductsByMajorVersionList.aspx?ws=762c9a71-a39b-e011-969d-0030487d8897&vsro=8 Alianza USB-Microsoft]<br />
|-<br />
|}<br />
<br />
==Posix Threads==<br />
<br />
Los PThreads, o Posix Threads, es un estandar de POSIX para el control de hilos en un programa, o extensión. Mas específicamente, el estandar POSIX.1c (Extensiones de hilos), define un API para la creación y la manipulación de los ''hilos''.<br />
<br />
Existen alrededor de 100 procedimientos de este estandar, los cuales pueden ser categorizados en 4 grupos principales:<br />
*''Manejadores de Hilos''<br />
*''Variables con condiciones''<br />
*''Sincronización''<br />
*''Mutex''<br />
<br />
Lamentablemente, para los usuarios de Windows, no hay una compatibilidad directa con este tipo de estándares, a diferencia de Linux, MAC OS X,FreeBSD, OpenBSD, Solaris, entre otros. Para ello, se han creado librerías y paquetes independientes para brindarle a Windows y DR-DOR, la compatibilidad necesaria.<br />
<br />
'''Nota:''' En la sección ''Configurar Visual Studio 2012 con pthreads (Posix Threads)'' se encuentra un comprimido con un paquete específico con el cual se podrá trabajar usando Visual Studio. Mas adelante, se explica con detenimiento como configurar dichos archivos.<br />
<br />
==C++==<br />
<br />
'''C++''' ''(C mas mas)'' es un lenguaje de programación, se puede considerar un lenguaje híbrido, que surgió como extensión del lenguaje de programación ''C'' a mediados de los 80. Dicho lenguaje, aporta mecanismos de programación orientada a objetos, como ''classes'' y definiciones de nuevos ''tipos de datos'' no incluidos en C, como wchar_t, permitiendo trabajar con caracteres UNICODE.<br />
<br />
{|align="center" style="border-bottom:3px solid black; border-left:3px solid black; border-top:3px solid black; border-right:3px solid black" cellspacing="10" <br />
|+'''Tipos aritméticos en C++'''<br />
|-<br />
!style="border-bottom: solid grey" |Tipo<br />
!style="border-bottom: solid grey" |Significado<br />
!style="border-bottom: solid grey" |Tamaño mínimo<br />
|-<br />
|bool<br />
|''boolean''(lógico)<br />
| --<br />
|-<br />
|char<br />
|carácter<br />
|8bits<br />
|-<br />
|wchar_t<br />
|carácter ancho<br />
|16bits<br />
|-<br />
|short<br />
|enter-corto<br />
|16bits<br />
|-<br />
|int<br />
|entero<br />
|16bits<br />
|-<br />
|long<br />
|largo-entero<br />
|32bits<br />
|-<br />
|float<br />
|real precisión simple<br />
|~7 dígitos significativos<br />
|-<br />
|double<br />
|real precisión doble<br />
|~15 dígitos significativos<br />
|-<br />
|long double<br />
|real precisión doble extendido<br />
|~15 dígitos significativos<br />
|-<br />
|}<br />
<br />
<br />
Hay que tener en cuenta, para los casos en los que se trabaje E/S (Entradas y Salidas) con el lenguaje de programación C++, se debe incluir la directiva o biblioteca estándar ''<iostream>'' que llegaría a ser el equivalente al ''stdio'' en C.<br />
<br />
<br />
#include <iostream><br />
<br />
<br />
Nótese, que no es necesario colocar ''.h'' en este formato, gracias a los nuevos tipos de archivos cabezera de ANSI implementados en dicho lenguaje.<br />
<br />
Dentro de esta directiva, se encuentran 2 tipos de representaciones tanto para la entrada como para la salida, istream y ostream respectivamente, en los cuales se definen los símbolos de transmisión y recepción de datos:<br />
{|align="center" border="1" style="border-bottom: solid black, border-top: solid black, border-left: solid black,border-right: solid black"<br />
|+<br />
|-<br />
|std:: cin <br />
|Canal de entrada estándar<br />
|-<br />
|std:: cout <br />
|Canal de salida estándar<br />
|-<br />
|std:: cerr <br />
|Canal de salida de error<br />
|-<br />
|std:: endl <br />
|Símbolo para avance de línea<br />
|-<br />
|}<br />
<br />
La entrada se realiza de manera estándar, a través de un canal como el teclado. La salida, tanto de dato como errores, se realiza de manera estándar, generalmente por pantalla. Estos canales tanto de entrada como de salida, son los que generalmente se usan, aunque pueden ser redirigidos los datos a otro canal capaz de transmitir o recibir datos, ya sea por sistema operativo o funciones de sistema.<br />
<br />
Para poder dirigir un dato por el canal de salida, se ha de usar el operador ''<<'', mientras que para entrada, ''>>''. Incluso, se puede llegar a encadenar múltiples salidas o entradas, por ejemplo, el trozo de código: <br />
''std:: cout << "Nací el día" << v_dia << "del mes" << v_mes << "del año" << v_agno << std::endl;'' (Siendo v_dia, v_mes y v_agno, las<br />
respectivas variables)<br />
<br />
Dicho formato también aplica para introducir múltiples entradas.<br />
<br />
'''Código ejemplo:'''<br />
<br />
#include <iostream><br />
<br />
int main()<br />
{<br />
int n1, n2;<br />
std::cout<< "Introducir dos números:" << std:: endl; // Indicando de salida el string o línea de caracteres ''Introducir dos números''<br />
std::cin >>n1 >>n2; // Tomando del canal de entrada los datos en el orden indicado.<br />
std:: cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << std::endl; // Muestra por el canal de salida, <br />
// el string de mostrar la suma.<br />
return 0;<br />
}<br />
<br />
Hay que cuidar el tipo de directivas que se estén incluyendo en nuestro programa, y la manera en que se estén introduciendo, ya que esto puede ayudar al programador a reducir líneas de código o incluso hacer el código mas cómodo a la hora de revisar procedimientos. Por ejemplo, si se incluye la libreria <iostream> sin la extensión ''.h'' es '''necesario''' escribir los espacios de nombres ''std::'' como en el ejemplo anterior. De introducir la directiva <iostream'''.h'''> no es necesario colocar los espacios de nombres ''std::''. Ahora bien, existen también mas combinaciones para lograr la mayor comodidad para el programador, como por ejemplo, agregar <iostream> seguido de la directiva ''using'', la cual permite disponer las definiciones de iostream en el programa.<br />
<br />
#include <iostream><br />
using namespace std;<br />
<br />
int main()<br />
{<br />
int n1, n2;<br />
cout<< "Introducir dos números:" << endl; // Indicando de salida el string o línea de caracteres ''Introducir dos números''<br />
cin >>n1 >>n2; // Tomando del canal de entrada los datos en el orden indicado.<br />
cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << endl; // Muestra por el canal de salida, el string de mostrar la suma.<br />
return 0;<br />
}<br />
<br />
<br />
Para efectos prácticos de este artículo, se configurará a continuación el ''Visual Studio 2012'' para trabajar con C++ y sus respectivas extensiones, debido a su fácil uso y relación con el lenguaje de programación C.<br />
<br />
<br />
==Configurar Visual Studio 2012 con pthreads (Posix Threads)==<br />
En primera instancia, se debe tener Visual Studio 2012 instaldo en la computadora a trabajar. Lo siguiente es descargar estos [https://www.dropbox.com/s/pl2qghdiu8nswtz/Archivos%20pthreads.rar '''Archivos para PThreads - Windows'''], los cuales incluyen las “librerías” e “includes” necesarios.<br />
<br />
===Creando Proyecto App Win32===<br />
Lo siguiente que se va a hacer, será crear un proyecto nuevo en Visual Studio, con la configuración Visual C++. Esto se puede realizar, dando click en “New Project” en el Start Page (Nuevo Proyecto en su defecto), como también buscando en la pestaña “FILE” o “ARCHIVO” -> “new” (nuevo) -> “Project” (proyecto). Para un acceso más rápido también puede presionar la combinación ''crtl+shift+n''.<br />
<br />
<br />
{|<br />
| [[File:1.2_new_proyect.png|thumb|100px|left|Creando proyecto 1]]<br />
| [[File:1.1_new_proyect.png|thumb|100px|right|Creando proyecto 2]]<br />
|}<br />
<br />
<br />
Lo siguiente que se quiere hacer, es configurar el proyecto nuevo como una Aplicación de Consola Win32. Para ello, en la ventana que emergió anteriormente, ubicamos del lado izquierdo, Templates -> Visual C++ -> Win32 Console Application (Aplicación de consola Win32). Le asignamos nombre y ubicación al proyecto ('''¡¡¡Tomar nota!!!'''), y presionamos la tecla aceptar. <br />
<br />
'''Nota:''' De estar trabajando en una computadora ubicada en el Laboratorio C, crear el proyecto en la carpeta Temp con un nombre especifico, para que de esa manera no sea eliminada por el personal.<br />
<br />
{|<br />
| [[File:2.1_Select_win32_console_app.png|100px|thumb|upright|left|Seleccionar win32 App Console 1]]<br />
| [[File:2.2_Select_win32_console_app.png|100px|thumb|upright|right|Seleccionar win32 App Console 2]]<br />
|}<br />
<br />
{|<br />
| [[File:2.3_Select_win32_console_app.png|100px|thumb|upright|Seleccionar win32 App Console 3]]<br />
|}<br />
<br />
En caso de no encontrar de manera manual el tipo de proyecto, uno siempre se puede apoyar en el buscador, ubicado en la esquina superior izquierda de dicha ventana.<br />
<br />
{|<br />
| [[File:2.4_Select_win32_console_app.png|100px|thumb|upright|Buscador]]<br />
|}<br />
<br />
Continuando con la configuración del proyecto, nos topamos con el asistente de aplicaciones Win32. En dicha ventana presionamos Siguiente, llevando a la configuración de aplicaciones, donde se escogerán las siguientes opciones:<br />
*'''''Tipo de aplicación:'''''<br />
**''Aplicación de consola''<br />
*'''''Opciones adicionales:'''''<br />
**''Proyecto vacío''.<br />
<br />
'''Nota:''' Dependiendo de los usos y fines de nuestro proyecto, estas opciones pueden variar, e incluso llevar a mas configuraciones. Para el caso actual, esas opciones no son de interés.<br />
<br />
{|<br />
| [[File:3_config_new_proyect.png|thumb|100px|left|Configurando proyecto 1]]<br />
| [[File:4_config_new_proyect.png|thumb|100px|right|Configurando proyecto 2]]<br />
|}<br />
<br />
===Archivo de Código Fuente===<br />
Ya con el proyecto creado, procedemos a agregar el archivo fuente de nuestro proyecto. Para ello, nos ubicamos en la carpeta Sources (Archivos de código fuente, o, Fuentes), que por defecto se encuentra en la parte derecha de nuestra pantalla. Damos click derecho, y abrimos el camino “Add -> New Item” (Agregar -> Nuevo elemento) ''Ctrl + Shift + A''.<br />
<br />
{|<br />
| [[File:5_Adding_lib's.png|thumb|100px|left|Agregando códigos fuentes 1]]<br />
| [[File:5.1_Adding_lib's.png|thumb|100px|right|Agregando códigos fuentes 2]]<br />
|}<br />
<br />
En la nueva ventana, seleccionamos el tipo de archivo “C++ File (.cpp)” (Archivo C++ (.cpp)) y lo nombramos “main.cpp” en la parte de debajo de la presente pantalla. Damos click, en agregar.<br />
<br />
{|<br />
| [[File:5.2_Adding_lib's.png|thumb|100px|right|Agregando códigos fuentes 3]]<br />
|}<br />
<br />
En esta nueva vista de la pantalla principal del Visual Studio es donde se incluirá el código del usuario<br />
<br />
=== Agregando Librerias de PThreads ===<br />
Interesa en este punto de la configuración tener listos los archivos de librerías e includes, descargados al inicio del artículo. Para ello, se copiará la carpeta pthread (ubicada dentro de x86) en una carpeta, preferiblemente, junto a la carpeta del proyecto en cuestión. Lo siguiente será vincular dichos archivos al proyecto. <br />
Ubicamos el nombre de nuestro proyecto, en el Explorador de Soluciones, justo debajo de Solución ‘nombredelproyecto’. Damos click derecho, y ubicamos “Properties” (Propiedades) o también, podemos acceder con la combinación ''Alt + Enter'', teniendo seleccionado el panel de Explorador de Soluciones.<br />
<br />
{|<br />
| [[File:6_Adding_pthreads_lib's.png|thumb|100px|left|Agregando PThreads lib's 1]]<br />
|}<br />
<br />
Una vez, dentro de la ventana de propiedades, ubicamos en el panel izquierdo “VC++ Directories” (Directorios VC++), y ahí los 3 directorios “Executable Directories”, “Include Directories” y “Library Directories” (Directorio de Archivos Ejecutables, Inclusión y bibliotecas respectivamente) donde vamos a seleccionar la ubicación de los archivos descargados. Seleccionamos uno de ellos, y damos click a la flecha lateral que aparece en la dirección de los archivos actualmente seleccionados y presionamos editar. De ahí, nos aparece una nueva ventana. Presionamos el botón de la carpeta, seguido de los “…”. <br />
<br />
{|<br />
| [[File:6.1_Adding_pthreads_lib's.png|thumb|100px|left|Agregando PThreads lib's 1]]<br />
| [[File:6.2_Adding_pthreads_lib's.png|thumb|100px|left|Agregando PThreads lib's 2]]<br />
|}<br />
<br />
Ubicamos las distintas carpetas en cada uno de los 3 casos:<br />
<br />
'''''Archivos ejecutables:'''''<br />
''pthread -> lib''<br />
<br />
'''''Archivos de inclusión:'''''<br />
''pthread -> include''<br />
<br />
'''''Archivos de bibliotecas:'''''<br />
''pthread -> lib''<br />
<br />
Quedando de la siguiente manera:<br />
<br />
{|<br />
| [[File:6.3_Adding_pthreads_lib's.png|thumb|100px|left|Agregando PThreads lib's 3]]<br />
|}<br />
<br />
Por último, vamos a la sección “Linker -> Input” (Vinculador -> Entrada) en el panel izquierdo. Ubicamos “Additional Dependencies” (Dependencias adicionales), y para efectos prácticos de este artículo, SÓLO agregamos antes de kernel32.lib lo siguiente:<br />
<br />
*''pthreadVC2.lib;''<br />
<br />
'''Nota:''' Recordar poner el “;” <<Punto y coma>> después de cada dependencia agregada, además del tipo de archivo que se está agregando. De tener cualquier dependencia adicional, necesaria para el programa o aplicación en cuestión ha de agregarse en esta sección.<br />
<br />
{|<br />
| [[File:6.4_Adding_pthreads_lib's.png|thumb|100px|left|Agregando PThreads lib's 4]]<br />
| [[File:6.5_Adding_pthreads_lib's.png|thumb|100px|left|Agregando PThreads lib's 5]]<br />
|}<br />
<br />
Una vez terminado, presionamos "Aplicar" luego "Aceptar", regresando a la pantalla principal de Visual Studio.<br />
<br />
Ahora es necesario agregar el archivo pthreadVC2.dll en la carpeta debug de nuestro proyecto, en caso de presentar error, colocar este archivo también en la carpeta de system32 (Para este ultimo paso necesitaras permiso de administrador). <br />
<br />
Ya con estos pasos, Visual Studio queda configurado para trabajar con lo básico de Hilos Posix, quedando pendiente probar los códigos. Dentro del comprimido descargado al principio del artículo se encuentra en un bloc de notas, un código de prueba, sacado de la página<br />
[http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html Linux Tutorial PThreads]<br />
<br />
<br />
'''Código:'''<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <pthread.h><br />
<br />
void *imprimir_mensaje( void *ptr );<br />
<br />
int main()<br />
{<br />
pthread_t hilo1, hilo2;<br />
char *mensaje1 = "Soy el Hilo 1";<br />
char *mensaje2 = "Soy el Hilo 2";<br />
int ret1, ret2;<br />
<br />
/* Crear dos hilos independientes cada uno va a ejecutar la funcion*/<br />
ret1 = pthread_create( &hilo1, NULL, imprimir_mensaje, (void*) mensaje1);<br />
ret2 = pthread_create( &hilo2, NULL, imprimir_mensaje, (void*) mensaje2);<br />
/* Esperar a que los hilos terminen antes que continue el main. Unless we */<br />
/* Si no esperamos se corre el riesgo de ejecutar un exit() el cual */<br />
/* finalizaria el proceso y todos los hilos antes de que terminen. */<br />
pthread_join( hilo1, NULL);<br />
pthread_join( hilo2, NULL);<br />
printf("Hilo 1 Valor de retorno: %d\n",ret1);<br />
printf("Hilo 2 Valor de retorno: %d\n",ret2);<br />
exit(0);<br />
}<br />
<br />
void *imprimir_mensaje( void *ptr )<br />
{<br />
char *mensaje;<br />
mensaje = (char *) ptr;<br />
printf("%s \n", mensaje);<br />
return 0;<br />
} <br />
<br />
<br />
<br />
===Shortcuts de interés===<br />
*'''''Crear nuevo proyecto:''' (Ventana activa: Principal)''<br />
**''Ctrl + Shift + N''<br />
*'''''Añadir nuevo elemento:''' (Ventana activa: Explorador de soluciones)''<br />
**''Ctrl + Shift + A''<br />
*'''''Propiedades de proyecto:''' (Ventana activa: Explorador de soluciones)''<br />
**''Alt + Enter''<br />
*'''''Contruir proyecto:''' (Ventana activa: principal)''<br />
**''Ctrl + Shift + B''<br />
*'''''Correr con debug:''' (Ventana activa: principal)''<br />
**''F5''<br />
*'''''Correr SIN debug:''' (Ventana activa: principal)''<br />
**''Ctrl + F5''<br />
<br />
<br />
==Referencias==<br />
*[http://books.google.com/books?id=_xvnuFzo7q0C&printsec=frontcover&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false '''Programming with POSIX threads.''' ''David R. Butenhof'']<br />
*[https://www.dropbox.com/s/5o2yzfxtqmig7y7/TutorialVisualStudio2010conPosixThreads.pdf '''Tutorial de configuración de Visual Studio 2010 con Posix Threads.''' ''Raúl Acuña'']<br />
*Joyanes Aguilar, L; Zahonero Martínez, I. ''Programación en C, C++, Java y UML''. McGrawHill (2010)<br />
*[http://www.cplusplus.com/ '''Información de C++: cplusplus.com''']<br />
<br />
Aún falta. Es para ir viendo como va quedando<br />
blah.<br />
<br />
<br />
Gustavo Rivera - 09-10717<br />
<br />
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Pthreads_visual_studio_2010&diff=1904Pthreads visual studio 20102012-11-19T21:53:43Z<p>Francjsalanova: </p>
<hr />
<div>En el siguiente artículo, se pretende ayudar al usuario a crear y configurar un proyecto en Visual Studio 2010, con el fin de trabajar con los hilos '''''POSIX''''' usando el lenguaje de programación '''''C++'''''. Esto nos brindará la posibilidad de trabajar con hilos de una manera amplia, cumpliendo los estandares POSIX, como tambien rutinas de sincronización.<br />
<br />
Para mayor información sobre estos últimos, consulte la sección de referencias ubicada al final del artículo. <br />
<br />
==Visual Studio 2010==<br />
<br />
{| style="border-bottom:3px solid black; border-left:3px solid black; border-top:3px solid black; border-right:3px solid black" border="1" cellpadding="0" cellspacing="1" align="center" <br />
|+'''Datos de programa'''<br />
|-<br />
! style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" colspan="3" align="center"| Microsoft Visual Studio 2010<br />
|-<br />
|style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" colspan="3"|'''Desarrollador'''<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" |Página oficial de<br />
|style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|[http://msdn.microsoft.com/en-us/library/dd831853(v=vs.100).aspx Microsoft Visual Studio]<br />
|-<br />
|style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" colspan="3"|'''Información General'''<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Fecha de Lanzamiento:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|12 Abril 2010<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Género:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|IDE<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|OS:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Windows 32 o 64-bits<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Licencia estudiantil:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|[http://e5.onthehub.com/WebStore/ProductsByMajorVersionList.aspx?ws=762c9a71-a39b-e011-969d-0030487d8897&vsro=8 Alianza USB-Microsoft]<br />
|-<br />
|}<br />
<br />
==Posix Threads==<br />
<br />
Los PThreads, o Posix Threads, es un estandar de POSIX para el control de hilos en un programa, o extensión. Mas específicamente, el estandar POSIX.1c (Extensiones de hilos), define un API para la creación y la manipulación de los ''hilos''.<br />
<br />
Existen alrededor de 100 procedimientos de este estandar, los cuales pueden ser categorizados en 4 grupos principales:<br />
*''Manejadores de Hilos''<br />
*''Variables con condiciones''<br />
*''Sincronización''<br />
*''Mutex''<br />
<br />
Lamentablemente, para los usuarios de Windows, no hay una compatibilidad directa con este tipo de estándares, a diferencia de Linux, MAC OS X,FreeBSD, OpenBSD, Solaris, entre otros. Para ello, se han creado librerías y paquetes independientes para brindarle a Windows y DR-DOR, la compatibilidad necesaria.<br />
<br />
'''Nota:''' En la sección [[Pthreads visual studio 2012|''Configurar Visual Studio 2012 con pthreads (Posix Threads)'']] se encuentra un comprimido con un paquete específico con el cual se podrá trabajar usando Visual Studio. Mas adelante, se explica con detenimiento como configurar dichos archivos.<br />
<br />
==C++==<br />
<br />
'''C++''' ''(C mas mas)'' es un lenguaje de programación, se puede considerar un lenguaje híbrido, que surgió como extensión del lenguaje de programación ''C'' a mediados de los 80. Dicho lenguaje, aporta mecanismos de programación orientada a objetos, como ''classes'' y definiciones de nuevos ''tipos de datos'' no incluidos en C, como wchar_t, permitiendo trabajar con caracteres UNICODE.<br />
<br />
{|align="center" style="border-bottom:3px solid black; border-left:3px solid black; border-top:3px solid black; border-right:3px solid black" cellspacing="10" <br />
|+'''Tipos aritméticos en C++'''<br />
|-<br />
!style="border-bottom: solid grey" |Tipo<br />
!style="border-bottom: solid grey" |Significado<br />
!style="border-bottom: solid grey" |Tamaño mínimo<br />
|-<br />
|bool<br />
|''boolean''(lógico)<br />
| --<br />
|-<br />
|char<br />
|carácter<br />
|8bits<br />
|-<br />
|wchar_t<br />
|carácter ancho<br />
|16bits<br />
|-<br />
|short<br />
|enter-corto<br />
|16bits<br />
|-<br />
|int<br />
|entero<br />
|16bits<br />
|-<br />
|long<br />
|largo-entero<br />
|32bits<br />
|-<br />
|float<br />
|real precisión simple<br />
|~7 dígitos significativos<br />
|-<br />
|double<br />
|real precisión doble<br />
|~15 dígitos significativos<br />
|-<br />
|long double<br />
|real precisión doble extendido<br />
|~15 dígitos significativos<br />
|-<br />
|}<br />
<br />
<br />
Hay que tener en cuenta, para los casos en los que se trabaje E/S (Entradas y Salidas) con el lenguaje de programación C++, se debe incluir la directiva o biblioteca estándar ''<iostream>'' que llegaría a ser el equivalente al ''stdio'' en C.<br />
<br />
<br />
#include <iostream><br />
<br />
<br />
Nótese, que no es necesario colocar ''.h'' en este formato, gracias a los nuevos tipos de archivos cabezera de ANSI implementados en dicho lenguaje.<br />
<br />
Dentro de esta directiva, se encuentran 2 tipos de representaciones tanto para la entrada como para la salida, istream y ostream respectivamente, en los cuales se definen los símbolos de transmisión y recepción de datos:<br />
{|align="center" border="1" style="border-bottom: solid black, border-top: solid black, border-left: solid black,border-right: solid black"<br />
|+<br />
|-<br />
|std:: cin <br />
|Canal de entrada estándar<br />
|-<br />
|std:: cout <br />
|Canal de salida estándar<br />
|-<br />
|std:: cerr <br />
|Canal de salida de error<br />
|-<br />
|std:: endl <br />
|Símbolo para avance de línea<br />
|-<br />
|}<br />
<br />
La entrada se realiza de manera estándar, a través de un canal como el teclado. La salida, tanto de dato como errores, se realiza de manera estándar, generalmente por pantalla. Estos canales tanto de entrada como de salida, son los que generalmente se usan, aunque pueden ser redirigidos los datos a otro canal capaz de transmitir o recibir datos, ya sea por sistema operativo o funciones de sistema.<br />
<br />
Para poder dirigir un dato por el canal de salida, se ha de usar el operador ''<<'', mientras que para entrada, ''>>''. Incluso, se puede llegar a encadenar múltiples salidas o entradas, por ejemplo, el trozo de código: <br />
''std:: cout << "Nací el día" << v_dia << "del mes" << v_mes << "del año" << v_agno << std::endl;'' (Siendo v_dia, v_mes y v_agno, las<br />
respectivas variables)<br />
<br />
Dicho formato también aplica para introducir múltiples entradas.<br />
<br />
'''Código ejemplo:'''<br />
<br />
#include <iostream><br />
<br />
int main()<br />
{<br />
int n1, n2;<br />
std::cout<< "Introducir dos números:" << std:: endl; // Indicando de salida el string o línea de caracteres ''Introducir dos números''<br />
std::cin >>n1 >>n2; // Tomando del canal de entrada los datos en el orden indicado.<br />
std:: cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << std::endl; // Muestra por el canal de salida, <br />
// el string de mostrar la suma.<br />
return 0;<br />
}<br />
<br />
Hay que cuidar el tipo de directivas que se estén incluyendo en nuestro programa, y la manera en que se estén introduciendo, ya que esto puede ayudar al programador a reducir líneas de código o incluso hacer el código mas cómodo a la hora de revisar procedimientos. Por ejemplo, si se incluye la libreria <iostream> sin la extensión ''.h'' es '''necesario''' escribir los espacios de nombres ''std::'' como en el ejemplo anterior. De introducir la directiva <iostream'''.h'''> no es necesario colocar los espacios de nombres ''std::''. Ahora bien, existen también mas combinaciones para lograr la mayor comodidad para el programador, como por ejemplo, agregar <iostream> seguido de la directiva ''using'', la cual permite disponer las definiciones de iostream en el programa.<br />
<br />
#include <iostream><br />
using namespace std;<br />
<br />
int main()<br />
{<br />
int n1, n2;<br />
cout<< "Introducir dos números:" << endl; // Indicando de salida el string o línea de caracteres ''Introducir dos números''<br />
cin >>n1 >>n2; // Tomando del canal de entrada los datos en el orden indicado.<br />
cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << endl; // Muestra por el canal de salida, el string de mostrar la suma.<br />
return 0;<br />
}<br />
<br />
<br />
Para efectos prácticos de este artículo, se configurará a continuación el ''Visual Studio 2012'' para trabajar con C++ y sus respectivas extensiones, debido a su fácil uso y relación con el lenguaje de programación C.<br />
<br />
==Configurar Visual Studio 2010 con pthreads (Posix Threads)==<br />
En primera instancia, se debe tener Visual Studio 2010 instaldo en la computadora a trabajar. Lo siguiente es descargar estos [https://www.dropbox.com/s/pl2qghdiu8nswtz/Archivos%20pthreads.rar '''Archivos para PThreads - Windows'''], los cuales incluyen las “librerías” e “includes” necesarios.<br />
<br />
===Creando Proyecto App Win32===<br />
Lo siguiente que se va a hacer, será crear un proyecto nuevo en Visual Studio, con la configuración Visual C++. Esto se puede realizar, dando click en “New Project” en el Start Page (Nuevo Proyecto en su defecto), como también buscando en la pestaña “FILE” o “ARCHIVO” -> “new” (nuevo) -> “Project” (proyecto). Para un acceso más rápido también puede presionar la combinación ''crtl+shift+n''.<br />
<br />
Lo siguiente que se quiere hacer, es configurar el proyecto nuevo como una Aplicación de Consola Win32. Para ello, en la ventana que emergió anteriormente, ubicamos del lado izquierdo, Templates -> Visual C++ -> Win32 Console Application (Aplicación de consola Win32). Le asignamos nombre y ubicación al proyecto ('''¡¡¡Tomar nota!!!'''), y presionamos la tecla aceptar. <br />
<br />
'''Nota:''' Cabe resaltar en este punto, que de estar trabajando en laboratorio (LabC) se debe ubicar la carpeta del proyecto en cuestión, en la carpeta c:/temp. De esta manera, se asegura por el trimestre que el proyecto no sea eliminado.<br />
<br />
{|<br />
| [[File:1_AbrirProyecto.png|thumb|100px|left|Creando proyecto]]<br />
| [[File:2_NombreProyecto.png|thumb|100px|left|Ubicación y nombre]]<br />
|}<br />
<br />
En caso de no encontrar de manera manual el tipo de proyecto, uno siempre se puede apoyar en el buscador, ubicado en la esquina superior izquierda de dicha ventana.<br />
<br />
{|<br />
| [[File:2.4_Select_win32_console_app.png|200px|thumb|upright|Buscador]]<br />
|}<br />
<br />
Continuando con la configuración del proyecto, nos topamos con el asistente de creación de proyecto, marcamos la opción de Crear proyecto vacío, quedando de la siguiente manera:<br />
<br />
*'''''Tipo de aplicación:'''''<br />
**''Aplicación de consola''<br />
*'''''Opciones adicionales:'''''<br />
**''Proyecto vacío''.<br />
<br />
'''Nota:''' Dependiendo de los usos y fines de nuestro proyecto, estas opciones pueden variar, e incluso llevar a mas configuraciones. Para el caso actual, esas opciones no son de interés.<br />
<br />
{|<br />
| [[File:3_Asistente1.png|thumb|100px|left|Configurando proyecto 1]]<br />
| [[File:3_Asistente2.png|thumb|100px|right|Configurando proyecto 2]]<br />
|}<br />
<br />
===Archivo de Código Fuente===<br />
Ya con el proyecto creado, procedemos a agregar el archivo fuente de nuestro proyecto. Para ello, nos ubicamos en la carpeta Sources (Archivos de código fuente, o, Fuentes), que por defecto se encuentra en la parte derecha de nuestra pantalla. Damos click derecho, y abrimos el camino “Add -> New Item” (Agregar -> Nuevo elemento) ''Ctrl + Shift + A''.<br />
<br />
{|<br />
| [[File:4_AgregarCodigo.png|thumb|100px|left|Agregando códigos fuentes 1]]<br />
| [[File:5_AgregarNuevoElementoCodigoFuente.png|thumb|100px|right|Agregando códigos fuentes 2]]<br />
|}<br />
<br />
En la nueva ventana, seleccionamos el tipo de archivo “C++ File (.cpp)” (Archivo C++ (.cpp)) y lo nombramos “main.cpp” en la parte de debajo de la presente pantalla. Damos click, en agregar.<br />
<br />
'''Nota:''' Cabe recordar que el lenguaje de programación C++ (y Visual C++ en su defecto), aceptan las extensiones .c del lenguaje C, por lo tanto, el introducir un código en C, no afectará en nada, siempre y cuando se estén agregando las librerías que se estén usando en dicho código.<br />
<br />
{|<br />
| [[File:6_AgregarNuevoElementoCodigoFuente_2.png|thumb|100px|right|Agregando códigos fuentes 3]]<br />
|}<br />
<br />
<br />
En la nueva vista de la pantalla principal del Visual Studio, es donde se incluirá el código del usuario<br />
<br />
<br />
=== Agregando Librerias de PThreads ===<br />
Interesa en este punto de la configuración tener listos los archivos de librerías e includes, descargados al inicio del artículo. Para ello, se copiará la carpeta pthread (ubicada dentro de x86) en una carpeta, preferiblemente, junto a la carpeta del proyecto en cuestión. Lo siguiente será vincular dichos archivos al proyecto. <br />
<br />
{|<br />
| [[File:8_Descargar_libreria_4.png|thumb|100px|left|Agregando archivos pthreads]]<br />
| [[File:8_Descargar_libreria_5.png|thumb|100px|right|Agregando archivos pthreads]]<br />
|}<br />
<br />
Ubicamos el nombre de nuestro proyecto, en el Explorador de Soluciones, justo debajo de Solución ‘nombredelproyecto’. Damos click derecho, y ubicamos “Properties” (Propiedades) o también, podemos acceder con la combinación ''Alt + Enter'', teniendo seleccionado el panel de Explorador de Soluciones.<br />
<br />
{|<br />
| [[File:9_PropiedadesProyecto.png|thumb|100px|left|Agregando PThreads lib's 1]]<br />
|}<br />
<br />
Una vez, dentro de la ventana de propiedades, ubicamos en el panel izquierdo “VC++ Directories” (Directorios VC++), y ahí los 3 directorios “Executable Directories”, “Include Directories” y “Library Directories” (Directorio de Archivos Ejecutables, Inclusión y bibliotecas respectivamente) donde vamos a seleccionar la ubicación de los archivos descargados. Seleccionamos uno de ellos, y damos click a la flecha lateral que aparece en la dirección de los archivos actualmente seleccionados y presionamos editar. De ahí, nos aparece una nueva ventana. Presionamos el botón de la carpeta, seguido de los “…”. <br />
<br />
{|<br />
| [[File:10_PropiedadesProyecto2.png|thumb|100px|left|Agregando PThreads lib's 1]]<br />
| [[File:11_PropiedadesProyecto3.png|thumb|100px|left|Agregando PThreads lib's 2]]<br />
|}<br />
<br />
Ubicamos las distintas carpetas en cada uno de los 3 casos:<br />
<br />
'''''Archivos ejecutables:'''''<br />
''pthread -> lib''<br />
<br />
'''''Archivos de inclusión:'''''<br />
''pthread -> include''<br />
<br />
'''''Archivos de bibliotecas:'''''<br />
''pthread -> lib''<br />
<br />
Quedando de la siguiente manera:<br />
<br />
{|<br />
| [[File:13_PropiedadesProyecto5.png|thumb|100px|left|Agregando PThreads lib's 3]]<br />
|}<br />
<br />
Por último, vamos a la sección “Linker -> Input” (Vinculador -> Entrada) en el panel izquierdo. Ubicamos “Additional Dependencies” (Dependencias adicionales), y para efectos prácticos de este artículo, SÓLO agregamos antes de kernel32.lib lo siguiente:<br />
<br />
*''pthreadVC2.lib;''<br />
<br />
'''Nota:''' Recordar poner el “;” <<Punto y coma>> después de cada dependencia agregada, además del tipo de archivo que se está agregando. De tener cualquier dependencia adicional, necesaria para el programa o aplicación en cuestión ha de agregarse en esta sección.<br />
<br />
{|<br />
| [[File:14_PropiedadesProyecto6.png|100px|left|Agregando PThreads lib's 4]]<br />
|}<br />
<br />
Una vez terminado, presionamos "Aplicar" luego "Aceptar", regresando a la pantalla principal de Visual Studio.<br />
<br />
Ahora es necesario agregar el archivo pthreadVC2.dll en la carpeta debug de nuestro proyecto, en caso de presentar error, colocar este archivo también en la carpeta de system32 (Para este ultimo paso necesitaras permiso de administrador). <br />
<br />
Ya con estos pasos, Visual Studio queda configurado para trabajar con lo básico de Hilos Posix, quedando pendiente probar los códigos. Dentro del comprimido descargado al principio del artículo se encuentra en un bloc de notas, un código de prueba, sacado de la página<br />
[http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html Linux Tutorial PThreads]<br />
<br />
<br />
'''Código:'''<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <pthread.h><br />
<br />
void *imprimir_mensaje( void *ptr );<br />
<br />
int main()<br />
{<br />
pthread_t hilo1, hilo2;<br />
char *mensaje1 = "Soy el Hilo 1";<br />
char *mensaje2 = "Soy el Hilo 2";<br />
int ret1, ret2;<br />
<br />
/* Crear dos hilos independientes cada uno va a ejecutar la funcion*/<br />
ret1 = pthread_create( &hilo1, NULL, imprimir_mensaje, (void*) mensaje1);<br />
ret2 = pthread_create( &hilo2, NULL, imprimir_mensaje, (void*) mensaje2);<br />
/* Esperar a que los hilos terminen antes que continue el main. Unless we */<br />
/* Si no esperamos se corre el riesgo de ejecutar un exit() el cual */<br />
/* finalizaria el proceso y todos los hilos antes de que terminen. */<br />
pthread_join( hilo1, NULL);<br />
pthread_join( hilo2, NULL);<br />
printf("Hilo 1 Valor de retorno: %d\n",ret1);<br />
printf("Hilo 2 Valor de retorno: %d\n",ret2);<br />
exit(0);<br />
}<br />
<br />
void *imprimir_mensaje( void *ptr )<br />
{<br />
char *mensaje;<br />
mensaje = (char *) ptr;<br />
printf("%s \n", mensaje);<br />
return 0;<br />
} <br />
<br />
<br />
<br />
===Shortcuts de interés===<br />
*'''''Crear nuevo proyecto:''' (Ventana activa: Principal)''<br />
**''Ctrl + Shift + N''<br />
*'''''Añadir nuevo elemento:''' (Ventana activa: Explorador de soluciones)''<br />
**''Ctrl + Shift + A''<br />
*'''''Propiedades de proyecto:''' (Ventana activa: Explorador de soluciones)''<br />
**''Alt + Enter''<br />
*'''''Contruir proyecto:''' (Ventana activa: principal)''<br />
**''Ctrl + Shift + B''<br />
*'''''Correr con debug:''' (Ventana activa: principal)''<br />
**''F5''<br />
*'''''Correr SIN debug:''' (Ventana activa: principal)''<br />
**''Ctrl + F5''<br />
*'''''Step over'''''<br />
**''F10''<br />
*'''''Step into'''''<br />
**''F11''<br />
*'''''Step out'''''<br />
**''Shift + F10''<br />
<br />
<br />
==Referencias==<br />
*[http://books.google.com/books?id=_xvnuFzo7q0C&printsec=frontcover&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false '''Programming with POSIX threads.''' ''David R. Butenhof'']<br />
*[https://www.dropbox.com/s/5o2yzfxtqmig7y7/TutorialVisualStudio2010conPosixThreads.pdf '''Tutorial de configuración de Visual Studio 2010 con Posix Threads.''' ''Raúl Acuña'']<br />
*Joyanes Aguilar, L; Zahonero Martínez, I. ''Programación en C, C++, Java y UML''. McGrawHill (2010)<br />
*[http://www.cplusplus.com/ '''Información de C++: cplusplus.com''']<br />
<br />
Aún falta. Es para ir viendo como va quedando<br />
blah.<br />
<br />
<br />
Gustavo Rivera - 09-10717<br />
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Pthreads_visual_studio_2010&diff=1903Pthreads visual studio 20102012-11-19T21:50:38Z<p>Francjsalanova: </p>
<hr />
<div>En el siguiente artículo, se pretende ayudar al usuario a crear y configurar un proyecto en Visual Studio 2010, con el fin de trabajar con los hilos '''''POSIX''''' usando el lenguaje de programación '''''C++'''''. Esto nos brindará la posibilidad de trabajar con hilos de una manera amplia, cumpliendo los estandares POSIX, como tambien rutinas de sincronización.<br />
<br />
Para mayor información sobre estos últimos, consulte la sección de referencias ubicada al final del artículo. <br />
<br />
==Visual Studio 2010==<br />
<br />
{| style="border-bottom:3px solid black; border-left:3px solid black; border-top:3px solid black; border-right:3px solid black" border="1" cellpadding="0" cellspacing="1" align="center" <br />
|+'''Datos de programa'''<br />
|-<br />
! style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" colspan="3" align="center"| Microsoft Visual Studio 2010<br />
|-<br />
|style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" colspan="3"|'''Desarrollador'''<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" |Página oficial de<br />
|style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|[http://msdn.microsoft.com/en-us/library/dd831853(v=vs.100).aspx Microsoft Visual Studio]<br />
|-<br />
|style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" colspan="3"|'''Información General'''<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Fecha de Lanzamiento:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|12 Abril 2010<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Género:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|IDE<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|OS:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Windows 32 o 64-bits<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Licencia estudiantil:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|[http://e5.onthehub.com/WebStore/ProductsByMajorVersionList.aspx?ws=762c9a71-a39b-e011-969d-0030487d8897&vsro=8 Alianza USB-Microsoft]<br />
|-<br />
|}<br />
<br />
==Posix Threads==<br />
<br />
Los PThreads, o Posix Threads, es un estandar de POSIX para el control de hilos en un programa, o extensión. Mas específicamente, el estandar POSIX.1c (Extensiones de hilos), define un API para la creación y la manipulación de los ''hilos''.<br />
<br />
Existen alrededor de 100 procedimientos de este estandar, los cuales pueden ser categorizados en 4 grupos principales:<br />
*''Manejadores de Hilos''<br />
*''Variables con condiciones''<br />
*''Sincronización''<br />
*''Mutex''<br />
<br />
Lamentablemente, para los usuarios de Windows, no hay una compatibilidad directa con este tipo de estándares, a diferencia de Linux, MAC OS X,FreeBSD, OpenBSD, Solaris, entre otros. Para ello, se han creado librerías y paquetes independientes para brindarle a Windows y DR-DOR, la compatibilidad necesaria.<br />
<br />
'''Nota:''' En la sección [[Pthreads visual studio 2012|''Configurar Visual Studio 2012 con pthreads (Posix Threads)'']] se encuentra un comprimido con un paquete específico con el cual se podrá trabajar usando Visual Studio. Mas adelante, se explica con detenimiento como configurar dichos archivos.<br />
<br />
==C++==<br />
<br />
'''C++''' ''(C mas mas)'' es un lenguaje de programación, se puede considerar un lenguaje híbrido, que surgió como extensión del lenguaje de programación ''C'' a mediados de los 80. Dicho lenguaje, aporta mecanismos de programación orientada a objetos, como ''classes'' y definiciones de nuevos ''tipos de datos'' no incluidos en C, como wchar_t, permitiendo trabajar con caracteres UNICODE.<br />
<br />
{|align="center" style="border-bottom:3px solid black; border-left:3px solid black; border-top:3px solid black; border-right:3px solid black" cellspacing="10" <br />
|+'''Tipos aritméticos en C++'''<br />
|-<br />
!style="border-bottom: solid grey" |Tipo<br />
!style="border-bottom: solid grey" |Significado<br />
!style="border-bottom: solid grey" |Tamaño mínimo<br />
|-<br />
|bool<br />
|''boolean''(lógico)<br />
| --<br />
|-<br />
|char<br />
|carácter<br />
|8bits<br />
|-<br />
|wchar_t<br />
|carácter ancho<br />
|16bits<br />
|-<br />
|short<br />
|enter-corto<br />
|16bits<br />
|-<br />
|int<br />
|entero<br />
|16bits<br />
|-<br />
|long<br />
|largo-entero<br />
|32bits<br />
|-<br />
|float<br />
|real precisión simple<br />
|~7 dígitos significativos<br />
|-<br />
|double<br />
|real precisión doble<br />
|~15 dígitos significativos<br />
|-<br />
|long double<br />
|real precisión doble extendido<br />
|~15 dígitos significativos<br />
|-<br />
|}<br />
<br />
<br />
Hay que tener en cuenta, para los casos en los que se trabaje E/S (Entradas y Salidas) con el lenguaje de programación C++, se debe incluir la directiva o biblioteca estándar ''<iostream>'' que llegaría a ser el equivalente al ''stdio'' en C.<br />
<br />
<br />
#include <iostream><br />
<br />
<br />
Nótese, que no es necesario colocar ''.h'' en este formato, gracias a los nuevos tipos de archivos cabezera de ANSI implementados en dicho lenguaje.<br />
<br />
Dentro de esta directiva, se encuentran 2 tipos de representaciones tanto para la entrada como para la salida, istream y ostream respectivamente, en los cuales se definen los símbolos de transmisión y recepción de datos:<br />
{|align="center" border="1" style="border-bottom: solid black, border-top: solid black, border-left: solid black,border-right: solid black"<br />
|+<br />
|-<br />
|std:: cin <br />
|Canal de entrada estándar<br />
|-<br />
|std:: cout <br />
|Canal de salida estándar<br />
|-<br />
|std:: cerr <br />
|Canal de salida de error<br />
|-<br />
|std:: endl <br />
|Símbolo para avance de línea<br />
|-<br />
|}<br />
<br />
La entrada se realiza de manera estándar, a través de un canal como el teclado. La salida, tanto de dato como errores, se realiza de manera estándar, generalmente por pantalla. Estos canales tanto de entrada como de salida, son los que generalmente se usan, aunque pueden ser redirigidos los datos a otro canal capaz de transmitir o recibir datos, ya sea por sistema operativo o funciones de sistema.<br />
<br />
Para poder dirigir un dato por el canal de salida, se ha de usar el operador ''<<'', mientras que para entrada, ''>>''. Incluso, se puede llegar a encadenar múltiples salidas o entradas, por ejemplo, el trozo de código: <br />
''std:: cout << "Nací el día" << v_dia << "del mes" << v_mes << "del año" << v_agno << std::endl;'' (Siendo v_dia, v_mes y v_agno, las<br />
respectivas variables)<br />
<br />
Dicho formato también aplica para introducir múltiples entradas.<br />
<br />
'''Código ejemplo:'''<br />
<br />
#include <iostream><br />
<br />
int main()<br />
{<br />
int n1, n2;<br />
std::cout<< "Introducir dos números:" << std:: endl; // Indicando de salida el string o línea de caracteres ''Introducir dos números''<br />
std::cin >>n1 >>n2; // Tomando del canal de entrada los datos en el orden indicado.<br />
std:: cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << std::endl; // Muestra por el canal de salida, <br />
// el string de mostrar la suma.<br />
return 0;<br />
}<br />
<br />
Hay que cuidar el tipo de directivas que se estén incluyendo en nuestro programa, y la manera en que se estén introduciendo, ya que esto puede ayudar al programador a reducir líneas de código o incluso hacer el código mas cómodo a la hora de revisar procedimientos. Por ejemplo, si se incluye la libreria <iostream> sin la extensión ''.h'' es '''necesario''' escribir los espacios de nombres ''std::'' como en el ejemplo anterior. De introducir la directiva <iostream'''.h'''> no es necesario colocar los espacios de nombres ''std::''. Ahora bien, existen también mas combinaciones para lograr la mayor comodidad para el programador, como por ejemplo, agregar <iostream> seguido de la directiva ''using'', la cual permite disponer las definiciones de iostream en el programa.<br />
<br />
#include <iostream><br />
using namespace std;<br />
<br />
int main()<br />
{<br />
int n1, n2;<br />
cout<< "Introducir dos números:" << endl; // Indicando de salida el string o línea de caracteres ''Introducir dos números''<br />
cin >>n1 >>n2; // Tomando del canal de entrada los datos en el orden indicado.<br />
cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << endl; // Muestra por el canal de salida, el string de mostrar la suma.<br />
return 0;<br />
}<br />
<br />
<br />
Para efectos prácticos de este artículo, se configurará a continuación el ''Visual Studio 2012'' para trabajar con C++ y sus respectivas extensiones, debido a su fácil uso y relación con el lenguaje de programación C.<br />
<br />
==Configurar Visual Studio 2010 con pthreads (Posix Threads)==<br />
En primera instancia, se debe tener Visual Studio 2010 instaldo en la computadora a trabajar. Lo siguiente es descargar estos [https://www.dropbox.com/s/pl2qghdiu8nswtz/Archivos%20pthreads.rar '''Archivos para PThreads - Windows'''], los cuales incluyen las “librerías” e “includes” necesarios.<br />
<br />
===Creando Proyecto App Win32===<br />
Lo siguiente que se va a hacer, será crear un proyecto nuevo en Visual Studio, con la configuración Visual C++. Esto se puede realizar, dando click en “New Project” en el Start Page (Nuevo Proyecto en su defecto), como también buscando en la pestaña “FILE” o “ARCHIVO” -> “new” (nuevo) -> “Project” (proyecto). Para un acceso más rápido también puede presionar la combinación ''crtl+shift+n''.<br />
<br />
Lo siguiente que se quiere hacer, es configurar el proyecto nuevo como una Aplicación de Consola Win32. Para ello, en la ventana que emergió anteriormente, ubicamos del lado izquierdo, Templates -> Visual C++ -> Win32 Console Application (Aplicación de consola Win32). Le asignamos nombre y ubicación al proyecto ('''¡¡¡Tomar nota!!!'''), y presionamos la tecla aceptar. <br />
<br />
'''Nota:''' Cabe resaltar en este punto, que de estar trabajando en laboratorio (LabC) se debe ubicar la carpeta del proyecto en cuestión, en la carpeta c:/temp. De esta manera, se asegura por el trimestre que el proyecto no sea eliminado.<br />
<br />
{|<br />
| [[File:1_AbrirProyecto.png|thumb|100px|left|Creando proyecto]]<br />
| [[File:2_NombreProyecto.png|thumb|100px|left|Ubicación y nombre]]<br />
|}<br />
<br />
En caso de no encontrar de manera manual el tipo de proyecto, uno siempre se puede apoyar en el buscador, ubicado en la esquina superior izquierda de dicha ventana.<br />
<br />
{|<br />
| [[File:2.4_Select_win32_console_app.png|200px|thumb|upright|Buscador]]<br />
|}<br />
<br />
Continuando con la configuración del proyecto, nos topamos con el asistente de creación de proyecto, marcamos la opción de Crear proyecto vacío, quedando de la siguiente manera:<br />
<br />
*'''''Tipo de aplicación:'''''<br />
**''Aplicación de consola''<br />
*'''''Opciones adicionales:'''''<br />
**''Proyecto vacío''.<br />
<br />
'''Nota:''' Dependiendo de los usos y fines de nuestro proyecto, estas opciones pueden variar, e incluso llevar a mas configuraciones. Para el caso actual, esas opciones no son de interés.<br />
<br />
{|<br />
| [[File:3_Asistente1.png|thumb|100px|left|Configurando proyecto 1]]<br />
| [[File:3_Asistente2.png|thumb|100px|right|Configurando proyecto 2]]<br />
|}<br />
<br />
===Archivo de Código Fuente===<br />
Ya con el proyecto creado, procedemos a agregar el archivo fuente de nuestro proyecto. Para ello, nos ubicamos en la carpeta Sources (Archivos de código fuente, o, Fuentes), que por defecto se encuentra en la parte derecha de nuestra pantalla. Damos click derecho, y abrimos el camino “Add -> New Item” (Agregar -> Nuevo elemento) ''Ctrl + Shift + A''.<br />
<br />
{|<br />
| [[File:4_AgregarCodigo.png|thumb|100px|left|Agregando códigos fuentes 1]]<br />
| [[File:5_AgregarNuevoElementoCodigoFuente.png|thumb|100px|right|Agregando códigos fuentes 2]]<br />
|}<br />
<br />
En la nueva ventana, seleccionamos el tipo de archivo “C++ File (.cpp)” (Archivo C++ (.cpp)) y lo nombramos “main.cpp” en la parte de debajo de la presente pantalla. Damos click, en agregar.<br />
<br />
'''Nota:''' Cabe recordar que el lenguaje de programación C++ (y Visual C++ en su defecto), aceptan las extensiones .c del lenguaje C, por lo tanto, el introducir un código en C, no afectará en nada, siempre y cuando se estén agregando las librerías que se estén usando en dicho código.<br />
<br />
{|<br />
| [[File:6_AgregarNuevoElementoCodigoFuente_2.png|thumb|100px|right|Agregando códigos fuentes 3]]<br />
|}<br />
<br />
<br />
En la nueva vista de la pantalla principal del Visual Studio, es donde se incluirá el código del usuario<br />
<br />
<br />
=== Agregando Librerias de PThreads ===<br />
Interesa en este punto de la configuración tener listos los archivos de librerías e includes, descargados al inicio del artículo. Para ello, se copiará la carpeta pthread (ubicada dentro de x86) en una carpeta, preferiblemente, junto a la carpeta del proyecto en cuestión. Lo siguiente será vincular dichos archivos al proyecto. <br />
<br />
{|<br />
| [[File:8_Descargar_libreria_4.png|thumb|100px|left|Agregando archivos pthreads]]<br />
| [[File:8_Descargar_libreria_5.png|thumb|100px|right|Agregando archivos pthreads]]<br />
|}<br />
<br />
Ubicamos el nombre de nuestro proyecto, en el Explorador de Soluciones, justo debajo de Solución ‘nombredelproyecto’. Damos click derecho, y ubicamos “Properties” (Propiedades) o también, podemos acceder con la combinación ''Alt + Enter'', teniendo seleccionado el panel de Explorador de Soluciones.<br />
<br />
{|<br />
| [[File:9_PropiedadesProyecto.png|thumb|100px|left|Agregando PThreads lib's 1]]<br />
|}<br />
<br />
Una vez, dentro de la ventana de propiedades, ubicamos en el panel izquierdo “VC++ Directories” (Directorios VC++), y ahí los 3 directorios “Executable Directories”, “Include Directories” y “Library Directories” (Directorio de Archivos Ejecutables, Inclusión y bibliotecas respectivamente) donde vamos a seleccionar la ubicación de los archivos descargados. Seleccionamos uno de ellos, y damos click a la flecha lateral que aparece en la dirección de los archivos actualmente seleccionados y presionamos editar. De ahí, nos aparece una nueva ventana. Presionamos el botón de la carpeta, seguido de los “…”. <br />
<br />
{|<br />
| [[File:10_PropiedadesProyecto2.png|thumb|100px|left|Agregando PThreads lib's 1]]<br />
| [[File:11_PropiedadesProyecto3.png|thumb|100px|left|Agregando PThreads lib's 2]]<br />
|}<br />
<br />
Ubicamos las distintas carpetas en cada uno de los 3 casos:<br />
<br />
'''''Archivos ejecutables:'''''<br />
''pthread -> lib''<br />
<br />
'''''Archivos de inclusión:'''''<br />
''pthread -> include''<br />
<br />
'''''Archivos de bibliotecas:'''''<br />
''pthread -> lib''<br />
<br />
Quedando de la siguiente manera:<br />
<br />
{|<br />
| [[File:13_PropiedadesProyecto5.png|thumb|100px|left|Agregando PThreads lib's 3]]<br />
|}<br />
<br />
Por último, vamos a la sección “Linker -> Input” (Vinculador -> Entrada) en el panel izquierdo. Ubicamos “Additional Dependencies” (Dependencias adicionales), y para efectos prácticos de este artículo, SÓLO agregamos antes de kernel32.lib lo siguiente:<br />
<br />
*''pthreadVC2.lib;''<br />
<br />
'''Nota:''' Recordar poner el “;” <<Punto y coma>> después de cada dependencia agregada, además del tipo de archivo que se está agregando. De tener cualquier dependencia adicional, necesaria para el programa o aplicación en cuestión ha de agregarse en esta sección.<br />
<br />
{|<br />
| [[File:14_PropiedadesProyecto6.png|100px|left|Agregando PThreads lib's 4]]<br />
|}<br />
<br />
Una vez terminado, presionamos "Aplicar" luego "Aceptar", regresando a la pantalla principal de Visual Studio.<br />
<br />
Ahora es necesario agregar el archivo pthreadVC2.dll en la carpeta debug de nuestro proyecto, en caso de presentar error, colocar este archivo también en la carpeta de system32 (Para este ultimo paso necesitaras permiso de administrador). <br />
<br />
Ya con estos pasos, Visual Studio queda configurado para trabajar con lo básico de Hilos Posix, quedando pendiente probar los códigos. Dentro del comprimido descargado al principio del artículo se encuentra en un bloc de notas, un código de prueba, sacado de la página<br />
[http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html Linux Tutorial PThreads]<br />
<br />
<br />
'''Código:'''<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <pthread.h><br />
<br />
void *imprimir_mensaje( void *ptr );<br />
<br />
int main()<br />
{<br />
pthread_t hilo1, hilo2;<br />
char *mensaje1 = "Soy el Hilo 1";<br />
char *mensaje2 = "Soy el Hilo 2";<br />
int ret1, ret2;<br />
<br />
/* Crear dos hilos independientes cada uno va a ejecutar la funcion*/<br />
ret1 = pthread_create( &hilo1, NULL, imprimir_mensaje, (void*) mensaje1);<br />
ret2 = pthread_create( &hilo2, NULL, imprimir_mensaje, (void*) mensaje2);<br />
/* Esperar a que los hilos terminen antes que continue el main. Unless we */<br />
/* Si no esperamos se corre el riesgo de ejecutar un exit() el cual */<br />
/* finalizaria el proceso y todos los hilos antes de que terminen. */<br />
pthread_join( hilo1, NULL);<br />
pthread_join( hilo2, NULL);<br />
printf("Hilo 1 Valor de retorno: %d\n",ret1);<br />
printf("Hilo 2 Valor de retorno: %d\n",ret2);<br />
exit(0);<br />
}<br />
<br />
void *imprimir_mensaje( void *ptr )<br />
{<br />
char *mensaje;<br />
mensaje = (char *) ptr;<br />
printf("%s \n", mensaje);<br />
return 0;<br />
} <br />
<br />
<br />
<br />
===Shortcuts de interés===<br />
*'''''Crear nuevo proyecto:''' (Ventana activa: Principal)''<br />
**''Ctrl + Shift + N''<br />
*'''''Añadir nuevo elemento:''' (Ventana activa: Explorador de soluciones)''<br />
**''Ctrl + Shift + A''<br />
*'''''Propiedades de proyecto:''' (Ventana activa: Explorador de soluciones)''<br />
**''Alt + Enter''<br />
*'''''Contruir proyecto:''' (Ventana activa: principal)''<br />
**''Ctrl + Shift + B''<br />
*'''''Correr con debug:''' (Ventana activa: principal)''<br />
**''F5''<br />
*'''''Correr SIN debug:''' (Ventana activa: principal)''<br />
**''Ctrl + F5''<br />
<br />
<br />
==Referencias==<br />
*[http://books.google.com/books?id=_xvnuFzo7q0C&printsec=frontcover&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false '''Programming with POSIX threads.''' ''David R. Butenhof'']<br />
*[https://www.dropbox.com/s/5o2yzfxtqmig7y7/TutorialVisualStudio2010conPosixThreads.pdf '''Tutorial de configuración de Visual Studio 2010 con Posix Threads.''' ''Raúl Acuña'']<br />
*Joyanes Aguilar, L; Zahonero Martínez, I. ''Programación en C, C++, Java y UML''. McGrawHill (2010)<br />
*[http://www.cplusplus.com/ '''Información de C++: cplusplus.com''']<br />
<br />
Aún falta. Es para ir viendo como va quedando<br />
blah.<br />
<br />
<br />
Gustavo Rivera - 09-10717<br />
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Pthreads_visual_studio_2010&diff=1902Pthreads visual studio 20102012-11-19T21:49:48Z<p>Francjsalanova: </p>
<hr />
<div>En el siguiente artículo, se pretende ayudar al usuario a crear y configurar un proyecto en Visual Studio 2010, con el fin de trabajar con los hilos '''''POSIX''''' usando el lenguaje de programación '''''C++'''''. Esto nos brindará la posibilidad de trabajar con hilos de una manera amplia, cumpliendo los estandares POSIX, como tambien rutinas de sincronización.<br />
<br />
Para mayor información sobre estos últimos, consulte la sección de referencias ubicada al final del artículo. <br />
<br />
==Visual Studio 2010==<br />
<br />
{| style="border-bottom:3px solid black; border-left:3px solid black; border-top:3px solid black; border-right:3px solid black" border="1" cellpadding="0" cellspacing="1" align="center" <br />
|+'''Datos de programa'''<br />
|-<br />
! style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" colspan="3" align="center"| Microsoft Visual Studio 2010<br />
|-<br />
|style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" colspan="3"|'''Desarrollador'''<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" |Página oficial de<br />
|style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|[http://msdn.microsoft.com/en-us/library/dd831853(v=vs.100).aspx Microsoft Visual Studio]<br />
|-<br />
|style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" colspan="3"|'''Información General'''<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Fecha de Lanzamiento:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|12 Abril 2010<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Género:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|IDE<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|OS:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Windows 32 o 64-bits<br />
|-<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Licencia estudiantil:<br />
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|[http://e5.onthehub.com/WebStore/ProductsByMajorVersionList.aspx?ws=762c9a71-a39b-e011-969d-0030487d8897&vsro=8 Alianza USB-Microsoft]<br />
|-<br />
|}<br />
<br />
==Posix Threads==<br />
<br />
Los PThreads, o Posix Threads, es un estandar de POSIX para el control de hilos en un programa, o extensión. Mas específicamente, el estandar POSIX.1c (Extensiones de hilos), define un API para la creación y la manipulación de los ''hilos''.<br />
<br />
Existen alrededor de 100 procedimientos de este estandar, los cuales pueden ser categorizados en 4 grupos principales:<br />
*''Manejadores de Hilos''<br />
*''Variables con condiciones''<br />
*''Sincronización''<br />
*''Mutex''<br />
<br />
Lamentablemente, para los usuarios de Windows, no hay una compatibilidad directa con este tipo de estándares, a diferencia de Linux, MAC OS X,FreeBSD, OpenBSD, Solaris, entre otros. Para ello, se han creado librerías y paquetes independientes para brindarle a Windows y DR-DOR, la compatibilidad necesaria.<br />
<br />
'''Nota:''' En la sección [[Pthreads visual studio 2012|''Configurar Visual Studio 2012 con pthreads (Posix Threads)'']] se encuentra un comprimido con un paquete específico con el cual se podrá trabajar usando Visual Studio. Mas adelante, se explica con detenimiento como configurar dichos archivos.<br />
<br />
==C++==<br />
<br />
'''C++''' ''(C mas mas)'' es un lenguaje de programación, se puede considerar un lenguaje híbrido, que surgió como extensión del lenguaje de programación ''C'' a mediados de los 80. Dicho lenguaje, aporta mecanismos de programación orientada a objetos, como ''classes'' y definiciones de nuevos ''tipos de datos'' no incluidos en C, como wchar_t, permitiendo trabajar con caracteres UNICODE.<br />
<br />
{|align="center" style="border-bottom:3px solid black; border-left:3px solid black; border-top:3px solid black; border-right:3px solid black" cellspacing="10" <br />
|+'''Tipos aritméticos en C++'''<br />
|-<br />
!style="border-bottom: solid grey" |Tipo<br />
!style="border-bottom: solid grey" |Significado<br />
!style="border-bottom: solid grey" |Tamaño mínimo<br />
|-<br />
|bool<br />
|''boolean''(lógico)<br />
| --<br />
|-<br />
|char<br />
|carácter<br />
|8bits<br />
|-<br />
|wchar_t<br />
|carácter ancho<br />
|16bits<br />
|-<br />
|short<br />
|enter-corto<br />
|16bits<br />
|-<br />
|int<br />
|entero<br />
|16bits<br />
|-<br />
|long<br />
|largo-entero<br />
|32bits<br />
|-<br />
|float<br />
|real precisión simple<br />
|~7 dígitos significativos<br />
|-<br />
|double<br />
|real precisión doble<br />
|~15 dígitos significativos<br />
|-<br />
|long double<br />
|real precisión doble extendido<br />
|~15 dígitos significativos<br />
|-<br />
|}<br />
<br />
<br />
Hay que tener en cuenta, para los casos en los que se trabaje E/S (Entradas y Salidas) con el lenguaje de programación C++, se debe incluir la directiva o biblioteca estándar ''<iostream>'' que llegaría a ser el equivalente al ''stdio'' en C.<br />
<br />
<br />
#include <iostream><br />
<br />
<br />
Nótese, que no es necesario colocar ''.h'' en este formato, gracias a los nuevos tipos de archivos cabezera de ANSI implementados en dicho lenguaje.<br />
<br />
Dentro de esta directiva, se encuentran 2 tipos de representaciones tanto para la entrada como para la salida, istream y ostream respectivamente, en los cuales se definen los símbolos de transmisión y recepción de datos:<br />
{|align="center" border="1" style="border-bottom: solid black, border-top: solid black, border-left: solid black,border-right: solid black"<br />
|+<br />
|-<br />
|std:: cin <br />
|Canal de entrada estándar<br />
|-<br />
|std:: cout <br />
|Canal de salida estándar<br />
|-<br />
|std:: cerr <br />
|Canal de salida de error<br />
|-<br />
|std:: endl <br />
|Símbolo para avance de línea<br />
|-<br />
|}<br />
<br />
La entrada se realiza de manera estándar, a través de un canal como el teclado. La salida, tanto de dato como errores, se realiza de manera estándar, generalmente por pantalla. Estos canales tanto de entrada como de salida, son los que generalmente se usan, aunque pueden ser redirigidos los datos a otro canal capaz de transmitir o recibir datos, ya sea por sistema operativo o funciones de sistema.<br />
<br />
Para poder dirigir un dato por el canal de salida, se ha de usar el operador ''<<'', mientras que para entrada, ''>>''. Incluso, se puede llegar a encadenar múltiples salidas o entradas, por ejemplo, el trozo de código: <br />
''std:: cout << "Nací el día" << v_dia << "del mes" << v_mes << "del año" << v_agno << std::endl;'' (Siendo v_dia, v_mes y v_agno, las<br />
respectivas variables)<br />
<br />
Dicho formato también aplica para introducir múltiples entradas.<br />
<br />
'''Código ejemplo:'''<br />
<br />
#include <iostream><br />
<br />
int main()<br />
{<br />
int n1, n2;<br />
std::cout<< "Introducir dos números:" << std:: endl; // Indicando de salida el string o línea de caracteres ''Introducir dos números''<br />
std::cin >>n1 >>n2; // Tomando del canal de entrada los datos en el orden indicado.<br />
std:: cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << std::endl; // Muestra por el canal de salida, <br />
// el string de mostrar la suma.<br />
return 0;<br />
}<br />
<br />
Hay que cuidar el tipo de directivas que se estén incluyendo en nuestro programa, y la manera en que se estén introduciendo, ya que esto puede ayudar al programador a reducir líneas de código o incluso hacer el código mas cómodo a la hora de revisar procedimientos. Por ejemplo, si se incluye la libreria <iostream> sin la extensión ''.h'' es '''necesario''' escribir los espacios de nombres ''std::'' como en el ejemplo anterior. De introducir la directiva <iostream'''.h'''> no es necesario colocar los espacios de nombres ''std::''. Ahora bien, existen también mas combinaciones para lograr la mayor comodidad para el programador, como por ejemplo, agregar <iostream> seguido de la directiva ''using'', la cual permite disponer las definiciones de iostream en el programa.<br />
<br />
#include <iostream><br />
using namespace std;<br />
<br />
int main()<br />
{<br />
int n1, n2;<br />
cout<< "Introducir dos números:" << endl; // Indicando de salida el string o línea de caracteres ''Introducir dos números''<br />
cin >>n1 >>n2; // Tomando del canal de entrada los datos en el orden indicado.<br />
cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << endl; // Muestra por el canal de salida, el string de mostrar la suma.<br />
return 0;<br />
}<br />
<br />
<br />
Para efectos prácticos de este artículo, se configurará a continuación el ''Visual Studio 2012'' para trabajar con C++ y sus respectivas extensiones, debido a su fácil uso y relación con el lenguaje de programación C.<br />
<br />
==Configurar Visual Studio 2010 con pthreads (Posix Threads)==<br />
En primera instancia, se debe tener Visual Studio 2010 instaldo en la computadora a trabajar. Lo siguiente es descargar estos [https://www.dropbox.com/s/pl2qghdiu8nswtz/Archivos%20pthreads.rar '''Archivos para PThreads - Windows'''], los cuales incluyen las “librerías” e “includes” necesarios.<br />
<br />
===Creando Proyecto App Win32===<br />
Lo siguiente que se va a hacer, será crear un proyecto nuevo en Visual Studio, con la configuración Visual C++. Esto se puede realizar, dando click en “New Project” en el Start Page (Nuevo Proyecto en su defecto), como también buscando en la pestaña “FILE” o “ARCHIVO” -> “new” (nuevo) -> “Project” (proyecto). Para un acceso más rápido también puede presionar la combinación ''crtl+shift+n''.<br />
<br />
Lo siguiente que se quiere hacer, es configurar el proyecto nuevo como una Aplicación de Consola Win32. Para ello, en la ventana que emergió anteriormente, ubicamos del lado izquierdo, Templates -> Visual C++ -> Win32 Console Application (Aplicación de consola Win32). Le asignamos nombre y ubicación al proyecto ('''¡¡¡Tomar nota!!!'''), y presionamos la tecla aceptar. <br />
<br />
'''Nota:''' Cabe resaltar en este punto, que de estar trabajando en laboratorio (LabC) se debe ubicar la carpeta del proyecto en cuestión, en la carpeta c:/temp. De esta manera, se asegura por el trimestre que el proyecto no sea eliminado.<br />
<br />
{|<br />
| [[File:1_AbrirProyecto.png|thumb|100px|left|Creando proyecto]]<br />
| [[File:2_NombreProyecto.png|thumb|100px|left|Ubicación y nombre]]<br />
|}<br />
<br />
En caso de no encontrar de manera manual el tipo de proyecto, uno siempre se puede apoyar en el buscador, ubicado en la esquina superior izquierda de dicha ventana.<br />
<br />
{|<br />
| [[File:2.4_Select_win32_console_app.png|200px|thumb|upright|Buscador]]<br />
|}<br />
<br />
Continuando con la configuración del proyecto, nos topamos con el asistente de creación de proyecto, marcamos la opción de Crear proyecto vacío, quedando de la siguiente manera:<br />
<br />
*'''''Tipo de aplicación:'''''<br />
**''Aplicación de consola''<br />
*'''''Opciones adicionales:'''''<br />
**''Proyecto vacío''.<br />
<br />
'''Nota:''' Dependiendo de los usos y fines de nuestro proyecto, estas opciones pueden variar, e incluso llevar a mas configuraciones. Para el caso actual, esas opciones no son de interés.<br />
<br />
{|<br />
| [[File:3_Asistente1.png|thumb|100px|left|Configurando proyecto 1]]<br />
| [[File:3_Asistente2.png|thumb|100px|right|Configurando proyecto 2]]<br />
|}<br />
<br />
===Archivo de Código Fuente===<br />
Ya con el proyecto creado, procedemos a agregar el archivo fuente de nuestro proyecto. Para ello, nos ubicamos en la carpeta Sources (Archivos de código fuente, o, Fuentes), que por defecto se encuentra en la parte derecha de nuestra pantalla. Damos click derecho, y abrimos el camino “Add -> New Item” (Agregar -> Nuevo elemento) ''Ctrl + Shift + A''.<br />
<br />
{|<br />
| [[File:4_AgregarCodigo.png|thumb|100px|left|Agregando códigos fuentes 1]]<br />
| [[File:5_AgregarNuevoElementoCodigoFuente.png|thumb|100px|right|Agregando códigos fuentes 2]]<br />
|}<br />
<br />
En la nueva ventana, seleccionamos el tipo de archivo “C++ File (.cpp)” (Archivo C++ (.cpp)) y lo nombramos “main.cpp” en la parte de debajo de la presente pantalla. Damos click, en agregar.<br />
<br />
'''Nota:''' Cabe recordar que el lenguaje de programación C++ (y Visual C++ en su defecto), aceptan las extensiones .c del lenguaje C, por lo tanto, el introducir un código en C, no afectará en nada, siempre y cuando se estén agregando las librerías que se estén usando en dicho código.<br />
<br />
{|<br />
| [[File:6_AgregarNuevoElementoCodigoFuente_2.png|thumb|100px|right|Agregando códigos fuentes 3]]<br />
|}<br />
<br />
<br />
En la nueva vista de la pantalla principal del Visual Studio, es donde se incluirá el código del usuario<br />
<br />
<br />
=== Agregando Librerias de PThreads ===<br />
Interesa en este punto de la configuración tener listos los archivos de librerías e includes, descargados al inicio del artículo. Para ello, se copiará la carpeta pthread (ubicada dentro de x86) en una carpeta, preferiblemente, junto a la carpeta del proyecto en cuestión. Lo siguiente será vincular dichos archivos al proyecto. <br />
<br />
{|<br />
| [[File:8_Descargar_libreria_4.png|thumb|100px|left|Agregando archivos pthreads]]<br />
| [[File:8_Descargar_libreria_5.png|thumb|100px|right|Agregando archivos pthreads]]<br />
|}<br />
<br />
Ubicamos el nombre de nuestro proyecto, en el Explorador de Soluciones, justo debajo de Solución ‘nombredelproyecto’. Damos click derecho, y ubicamos “Properties” (Propiedades) o también, podemos acceder con la combinación ''Alt + Enter'', teniendo seleccionado el panel de Explorador de Soluciones.<br />
<br />
{|<br />
| [[File:9_PropiedadesProyecto.png|thumb|100px|left|Agregando PThreads lib's 1]]<br />
|}<br />
<br />
Una vez, dentro de la ventana de propiedades, ubicamos en el panel izquierdo “VC++ Directories” (Directorios VC++), y ahí los 3 directorios “Executable Directories”, “Include Directories” y “Library Directories” (Directorio de Archivos Ejecutables, Inclusión y bibliotecas respectivamente) donde vamos a seleccionar la ubicación de los archivos descargados. Seleccionamos uno de ellos, y damos click a la flecha lateral que aparece en la dirección de los archivos actualmente seleccionados y presionamos editar. De ahí, nos aparece una nueva ventana. Presionamos el botón de la carpeta, seguido de los “…”. <br />
<br />
{|<br />
| [[File:10_PropiedadesProyecto2.png|thumb|100px|left|Agregando PThreads lib's 1]]<br />
| [[File:11_PropiedadesProyecto3.png|thumb|100px|left|Agregando PThreads lib's 2]]<br />
|}<br />
<br />
Ubicamos las distintas carpetas en cada uno de los 3 casos:<br />
<br />
'''''Archivos ejecutables:'''''<br />
''pthread -> lib''<br />
<br />
'''''Archivos de inclusión:'''''<br />
''pthread -> include''<br />
<br />
'''''Archivos de bibliotecas:'''''<br />
''pthread -> lib''<br />
<br />
Quedando de la siguiente manera:<br />
<br />
{|<br />
| [[File:13_PropiedadesProyecto5.png|thumb|100px|left|Agregando PThreads lib's 3]]<br />
|}<br />
<br />
Por último, vamos a la sección “Linker -> Input” (Vinculador -> Entrada) en el panel izquierdo. Ubicamos “Additional Dependencies” (Dependencias adicionales), y para efectos prácticos de este artículo, SÓLO agregamos antes de kernel32.lib lo siguiente:<br />
<br />
*''pthreadVC2.lib;''<br />
<br />
'''Nota:''' Recordar poner el “;” <<Punto y coma>> después de cada dependencia agregada, además del tipo de archivo que se está agregando. De tener cualquier dependencia adicional, necesaria para el programa o aplicación en cuestión ha de agregarse en esta sección.<br />
<br />
{|<br />
| [[File:14_PropiedadesProyecto6.png|100px|left|Agregando PThreads lib's 4]]<br />
|}<br />
<br />
Una vez terminado, presionamos "Aplicar" luego "Aceptar", regresando a la pantalla principal de Visual Studio.<br />
<br />
Ahora es necesario agregar el archivo pthreadVC2.dll en la carpeta debug de nuestro proyecto, en caso de presentar error, colocar este archivo también en la carpeta de System 32 (Para este ultimo paso necesitaras permiso de administrador). <br />
<br />
Ya con estos pasos, Visual Studio queda configurado para trabajar con lo básico de Hilos Posix, quedando pendiente probar los códigos. Dentro del comprimido descargado al principio del artículo se encuentra en un bloc de notas, un código de prueba, sacado de la página<br />
[http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html Linux Tutorial PThreads]<br />
<br />
<br />
'''Código:'''<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <pthread.h><br />
<br />
void *imprimir_mensaje( void *ptr );<br />
<br />
int main()<br />
{<br />
pthread_t hilo1, hilo2;<br />
char *mensaje1 = "Soy el Hilo 1";<br />
char *mensaje2 = "Soy el Hilo 2";<br />
int ret1, ret2;<br />
<br />
/* Crear dos hilos independientes cada uno va a ejecutar la funcion*/<br />
ret1 = pthread_create( &hilo1, NULL, imprimir_mensaje, (void*) mensaje1);<br />
ret2 = pthread_create( &hilo2, NULL, imprimir_mensaje, (void*) mensaje2);<br />
/* Esperar a que los hilos terminen antes que continue el main. Unless we */<br />
/* Si no esperamos se corre el riesgo de ejecutar un exit() el cual */<br />
/* finalizaria el proceso y todos los hilos antes de que terminen. */<br />
pthread_join( hilo1, NULL);<br />
pthread_join( hilo2, NULL);<br />
printf("Hilo 1 Valor de retorno: %d\n",ret1);<br />
printf("Hilo 2 Valor de retorno: %d\n",ret2);<br />
exit(0);<br />
}<br />
<br />
void *imprimir_mensaje( void *ptr )<br />
{<br />
char *mensaje;<br />
mensaje = (char *) ptr;<br />
printf("%s \n", mensaje);<br />
return 0;<br />
} <br />
<br />
<br />
<br />
===Shortcuts de interés===<br />
*'''''Crear nuevo proyecto:''' (Ventana activa: Principal)''<br />
**''Ctrl + Shift + N''<br />
*'''''Añadir nuevo elemento:''' (Ventana activa: Explorador de soluciones)''<br />
**''Ctrl + Shift + A''<br />
*'''''Propiedades de proyecto:''' (Ventana activa: Explorador de soluciones)''<br />
**''Alt + Enter''<br />
*'''''Contruir proyecto:''' (Ventana activa: principal)''<br />
**''Ctrl + Shift + B''<br />
*'''''Correr con debug:''' (Ventana activa: principal)''<br />
**''F5''<br />
*'''''Correr SIN debug:''' (Ventana activa: principal)''<br />
**''Ctrl + F5''<br />
<br />
<br />
==Referencias==<br />
*[http://books.google.com/books?id=_xvnuFzo7q0C&printsec=frontcover&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false '''Programming with POSIX threads.''' ''David R. Butenhof'']<br />
*[https://www.dropbox.com/s/5o2yzfxtqmig7y7/TutorialVisualStudio2010conPosixThreads.pdf '''Tutorial de configuración de Visual Studio 2010 con Posix Threads.''' ''Raúl Acuña'']<br />
*Joyanes Aguilar, L; Zahonero Martínez, I. ''Programación en C, C++, Java y UML''. McGrawHill (2010)<br />
*[http://www.cplusplus.com/ '''Información de C++: cplusplus.com''']<br />
<br />
Aún falta. Es para ir viendo como va quedando<br />
blah.<br />
<br />
<br />
Gustavo Rivera - 09-10717<br />
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Usuario:Francjsalanova&diff=1630Usuario:Francjsalanova2012-11-17T00:01:11Z<p>Francjsalanova: </p>
<hr />
<div>Francisco Salanova 09-10778. [[Usuario:Racuna|Racuna]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Usuario:Francjsalanova&diff=1628Usuario:Francjsalanova2012-11-17T00:00:50Z<p>Francjsalanova: </p>
<hr />
<div>Francisco Saalanova 09-10778. [[Usuario:Racuna|Racuna]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1625I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T23:59:48Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
<br />
==Introducción==<br />
<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del modulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: <br />
<br />
00 mul = 01<br />
<br />
01 mul = 02<br />
<br />
10 mul = 04<br />
<br />
11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. en modo de transmisión maestro, leer este registro inicia la transferensia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits <br />
<br />
1 Esquema de sireccion de 10-bits<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
'''IIC Protocol'''<br />
<br />
El bus del IIC utiliza na linea de datos serial (SDA) y una linea de reloj serial (SCL) para transferencia de datos. Todos los dispositivos deben tener salidas tipo open-drain o open collector. Un AND lógico se aplica en ambas lineas con resistencias de pull-up externas. El valor de estas resistencias depende del sistema.<br />
<br />
Generalmente, una comunicación standard esta compuesta de cuatro partes:<br />
• Señal de START<br />
• Transmisión de la direccion de esclavo<br />
• Transferencia de datos<br />
• Señal de STOP <br />
La señal de STOP no se debe confundir con la instrucción de CPU STOP.<br />
<br />
<br />
[[Archivo:IIC_Bus.png]]<br />
<br />
<br />
==Señal de START==<br />
<br />
Cuando el bus esta libre, ningun dispisotivo maestro esta controlando el bus (SCL y SDA estan el 1 lógico), un dispositivo maestro debe iniciar la comunicación enviando una señal de START. Com se muestra en la figura 12-9.<br />
Una señal de START se define como el cambio de 1 a cero lógico de la linea SDA mientras SCL esta en 1 lógico. esta señal denota el inicio de una nueva transferencia de datos (cada transmisión de datos debe contener varios bytes de data) y sacar a los esclavos fuera de su estado de espera.<br />
<br />
==Transmisión de la dirección de esclavo==<br />
<br />
<br />
El primer byte de data transmitido inmediatamente despues de la señal de START es la dirección de esclavo transmitida por el maestro. Esta es una dirección de llamada de siete bits seguida por el bit R/W. El bit R/W le dice al esclavo la dirección deseada de la transferencia de datos.<br />
<br />
1 = Transferencia tipo lectura, el esclavo transmite data a el maestro.<br />
<br />
0 = Transferencia tipo escritura, el maestro transmite data al esclavo.<br />
<br />
<br />
Sólo el esclavo con una dirección de llamada que coincida con la dirección transmitida por el maestro respondera enviando de vuelta un bit de acknowledge. Esto se logra oniendo en cero lógico la linea SDA en el noveno clock (ver Figura 12-9).<br />
Ningun esclavo en el sisttema debe tener la misma dirección de llamada. Si el modulo IIC es el maestro, no debe transmitir una dirección de llamada de esclavo igual a la suya. El IIC no puede ser maestro y esclavo al mismo tiempo.<br />
Si una perdida de arbitrariedad ocurre durante el ciclo de direccionamiento, el IIC cambiara a modo esclavo.<br />
<br />
<br />
==Transferencia de Datos==<br />
<br />
<br />
Antes de que se logre el direccionamiento correcto del esclavo, la transferencia de datos puede proceder byte por byte en la dirección especificada por el bit R/W enviado por el maestro que realizo la llamada.<br />
todas las transferencias de datos que le sigan a un ciclo de direccionamiento se interpretan cmo transferencia de datos, incluso si contienen informacion de sub-direcciones para el dispositivo esclavo.Cada byte de datos tiene 8 bits.<br />
<br />
<br />
Los datos solo pueden cambiar mientras SCL esta en cero lógico y deben ser sostenidos en un estado estable mientras SCL esta en uno lógico como muestra la Figura 12-9.<br />
<br />
<br />
<br />
==Resets==<br />
<br />
<br />
EL modulo IIC se inhabilita despues de cada reset. EL IIC no puede causar un reset del MCU.<br />
<br />
<br />
==Interrupciones==<br />
<br />
<br />
El IIC genera una sola interrupción.<br />
<br />
Las interrupciones se producen con cualquiera de los eventos de la tabla 12-11 y cuando el bit IICIEesta activado. La bandera IICIF debe ser borrada por software escribiendo un 1 en el, en la rutina de interrupcion. <br />
<br />
<br />
==Interrupción de transferencia de byte==<br />
<br />
<br />
La bandera TCF se activa en el borde de bajada al noveno clock para indicar quue se ha completado una transferecia.<br />
<br />
<br />
==Interrupción de detección de dirección==<br />
<br />
Cuando la direción de llamada coincide con la direccion de esclavo programada en el registro de direccióno cuando el bit GCAEN es activado y una llamada general es recibida, el bit IAAS se activa. El CPU es interrumpido cuando llega una interrupción. El CPU debe verificar el bit SRW y escribirlo de acuerdo al modo de Tx correcto.<br />
<br />
<br />
==Interrupción de perdida de arbitrariedad==<br />
<br />
<br />
La arbitrariedad se pierde en cualquiera de estas circunstancias:<br />
<br />
• Cuando se baja la linea SDA cuando el maestro la mantiene en alto durante un ciclo de dirección o de transmisión.<br />
• Cuando se baja la linea SDA cuando el maestro la mantiene en alto durante el envio del bit de acknowledge en un ciclo de dtos.<br />
• Al tratar de llevarse a cabo un ciclo de START cuando el bus esta ocupado.<br />
• Una ciclo de START repetido es solicitado en modo esclavo.<br />
• Una condición de STOP es detectada cuando el maestro no la solicito.<br />
Este bit debe ser borrado por software escribiendo un 1 lógico en el.<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1624I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T23:59:07Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del modulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: <br />
<br />
00 mul = 01<br />
<br />
01 mul = 02<br />
<br />
10 mul = 04<br />
<br />
11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. en modo de transmisión maestro, leer este registro inicia la transferensia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits <br />
<br />
1 Esquema de sireccion de 10-bits<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
'''IIC Protocol'''<br />
<br />
El bus del IIC utiliza na linea de datos serial (SDA) y una linea de reloj serial (SCL) para transferencia de datos. Todos los dispositivos deben tener salidas tipo open-drain o open collector. Un AND lógico se aplica en ambas lineas con resistencias de pull-up externas. El valor de estas resistencias depende del sistema.<br />
<br />
Generalmente, una comunicación standard esta compuesta de cuatro partes:<br />
• Señal de START<br />
• Transmisión de la direccion de esclavo<br />
• Transferencia de datos<br />
• Señal de STOP <br />
La señal de STOP no se debe confundir con la instrucción de CPU STOP.<br />
<br />
<br />
[[Archivo:IIC_Bus.png]]<br />
<br />
<br />
==Señal de START==<br />
<br />
Cuando el bus esta libre, ningun dispisotivo maestro esta controlando el bus (SCL y SDA estan el 1 lógico), un dispositivo maestro debe iniciar la comunicación enviando una señal de START. Com se muestra en la figura 12-9.<br />
Una señal de START se define como el cambio de 1 a cero lógico de la linea SDA mientras SCL esta en 1 lógico. esta señal denota el inicio de una nueva transferencia de datos (cada transmisión de datos debe contener varios bytes de data) y sacar a los esclavos fuera de su estado de espera.<br />
<br />
==Transmisión de la dirección de esclavo==<br />
<br />
<br />
El primer byte de data transmitido inmediatamente despues de la señal de START es la dirección de esclavo transmitida por el maestro. Esta es una dirección de llamada de siete bits seguida por el bit R/W. El bit R/W le dice al esclavo la dirección deseada de la transferencia de datos.<br />
<br />
1 = Transferencia tipo lectura, el esclavo transmite data a el maestro.<br />
<br />
0 = Transferencia tipo escritura, el maestro transmite data al esclavo.<br />
<br />
<br />
Sólo el esclavo con una dirección de llamada que coincida con la dirección transmitida por el maestro respondera enviando de vuelta un bit de acknowledge. Esto se logra oniendo en cero lógico la linea SDA en el noveno clock (ver Figura 12-9).<br />
Ningun esclavo en el sisttema debe tener la misma dirección de llamada. Si el modulo IIC es el maestro, no debe transmitir una dirección de llamada de esclavo igual a la suya. El IIC no puede ser maestro y esclavo al mismo tiempo.<br />
Si una perdida de arbitrariedad ocurre durante el ciclo de direccionamiento, el IIC cambiara a modo esclavo.<br />
<br />
<br />
==Transferencia de Datos==<br />
<br />
<br />
Antes de que se logre el direccionamiento correcto del esclavo, la transferencia de datos puede proceder byte por byte en la dirección especificada por el bit R/W enviado por el maestro que realizo la llamada.<br />
todas las transferencias de datos que le sigan a un ciclo de direccionamiento se interpretan cmo transferencia de datos, incluso si contienen informacion de sub-direcciones para el dispositivo esclavo.Cada byte de datos tiene 8 bits.<br />
<br />
<br />
Los datos solo pueden cambiar mientras SCL esta en cero lógico y deben ser sostenidos en un estado estable mientras SCL esta en uno lógico como muestra la Figura 12-9.<br />
<br />
<br />
<br />
==Resets==<br />
<br />
<br />
EL modulo IIC se inhabilita despues de cada reset. EL IIC no puede causar un reset del MCU.<br />
<br />
<br />
==Interrupciones==<br />
<br />
<br />
El IIC genera una sola interrupción.<br />
<br />
Las interrupciones se producen con cualquiera de los eventos de la tabla 12-11 y cuando el bit IICIEesta activado. La bandera IICIF debe ser borrada por software escribiendo un 1 en el, en la rutina de interrupcion. <br />
<br />
<br />
==Interrupción de transferencia de byte==<br />
<br />
<br />
La bandera TCF se activa en el borde de bajada al noveno clock para indicar quue se ha completado una transferecia.<br />
<br />
<br />
==Interrupción de detección de dirección==<br />
<br />
Cuando la direción de llamada coincide con la direccion de esclavo programada en el registro de direccióno cuando el bit GCAEN es activado y una llamada general es recibida, el bit IAAS se activa. El CPU es interrumpido cuando llega una interrupción. El CPU debe verificar el bit SRW y escribirlo de acuerdo al modo de Tx correcto.<br />
<br />
<br />
==Interrupción de perdida de arbitrariedad==<br />
<br />
<br />
La arbitrariedad se pierde en cualquiera de estas circunstancias:<br />
<br />
• Cuando se baja la linea SDA cuando el maestro la mantiene en alto durante un ciclo de dirección o de transmisión.<br />
• Cuando se baja la linea SDA cuando el maestro la mantiene en alto durante el envio del bit de acknowledge en un ciclo de dtos.<br />
• Al tratar de llevarse a cabo un ciclo de START cuando el bus esta ocupado.<br />
• Una ciclo de START repetido es solicitado en modo esclavo.<br />
• Una condición de STOP es detectada cuando el maestro no la solicito.<br />
Este bit debe ser borrado por software escribiendo un 1 lógico en el.<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1623I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T23:57:23Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del modulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: <br />
<br />
00 mul = 01<br />
<br />
01 mul = 02<br />
<br />
10 mul = 04<br />
<br />
11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. en modo de transmisión maestro, leer este registro inicia la transferensia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits <br />
<br />
1 Esquema de sireccion de 10-bits<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
'''IIC Protocol'''<br />
<br />
El bus del IIC utiliza na linea de datos serial (SDA) y una linea de reloj serial (SCL) para transferencia de datos. Todos los dispositivos deben tener salidas tipo open-drain o open collector. Un AND lógico se aplica en ambas lineas con resistencias de pull-up externas. El valor de estas resistencias depende del sistema.<br />
<br />
Generalmente, una comunicación standard esta compuesta de cuatro partes:<br />
• Señal de START<br />
• Transmisión de la direccion de esclavo<br />
• Transferencia de datos<br />
• Señal de STOP <br />
La señal de STOP no se debe confundir con la instrucción de CPU STOP.<br />
<br />
<br />
[[Archivo:IIC_Bus.png]]<br />
<br />
<br />
'''Señal de START'''Cuando el bus esta libre, ningun dispisotivo maestro esta controlando el bus (SCL y SDA estan el 1 lógico), un dispositivo maestro debe iniciar la comunicación enviando una señal de START. Com se muestra en la figura 12-9.<br />
Una señal de START se define como el cambio de 1 a cero lógico de la linea SDA mientras SCL esta en 1 lógico. esta señal denota el inicio de una nueva transferencia de datos (cada transmisión de datos debe contener varios bytes de data) y sacar a los esclavos fuera de su estado de espera.<br />
<br />
'''Transmisión de la dirección de esclavo'''<br />
El primer byte de data transmitido inmediatamente despues de la señal de START es la dirección de esclavo transmitida por el maestro. Esta es una dirección de llamada de siete bits seguida por el bit R/W. El bit R/W le dice al esclavo la dirección deseada de la transferencia de datos.<br />
<br />
1 = Transferencia tipo lectura, el esclavo transmite data a el maestro.<br />
<br />
0 = Transferencia tipo escritura, el maestro transmite data al esclavo.<br />
<br />
<br />
Sólo el esclavo con una dirección de llamada que coincida con la dirección transmitida por el maestro respondera enviando de vuelta un bit de acknowledge. Esto se logra oniendo en cero lógico la linea SDA en el noveno clock (ver Figura 12-9).<br />
Ningun esclavo en el sisttema debe tener la misma dirección de llamada. Si el modulo IIC es el maestro, no debe transmitir una dirección de llamada de esclavo igual a la suya. El IIC no puede ser maestro y esclavo al mismo tiempo.<br />
Si una perdida de arbitrariedad ocurre durante el ciclo de direccionamiento, el IIC cambiara a modo esclavo.<br />
<br />
<br />
'''Transferencia de Datos''' Antes de que se logre el direccionamiento correcto del esclavo, la transferencia de datos puede proceder byte por byte en la dirección especificada por el bit R/W enviado por el maestro que realizo la llamada.<br />
todas las transferencias de datos que le sigan a un ciclo de direccionamiento se interpretan cmo transferencia de datos, incluso si contienen informacion de sub-direcciones para el dispositivo esclavo.Cada byte de datos tiene 8 bits.<br />
<br />
<br />
Los datos solo pueden cambiar mientras SCL esta en cero lógico y deben ser sostenidos en un estado estable mientras SCL esta en uno lógico como muestra la Figura 12-9.<br />
<br />
<br />
<br />
==Resets==<br />
<br />
EL modulo IIC se inhabilita despues de cada reset. EL IIC no puede causar un reset del MCU.<br />
<br />
<br />
==Interrupciones==<br />
<br />
<br />
El IIC genera una sola interrupción.<br />
<br />
Las interrupciones se producen con cualquiera de los eventos de la tabla 12-11 y cuando el bit IICIEesta activado. La bandera IICIF debe ser borrada por software escribiendo un 1 en el, en la rutina de interrupcion. <br />
<br />
==Interrupción de transferencia de byte==<br />
<br />
La bandera TCF se activa en el borde de bajada al noveno clock para indicar quue se ha completado una transferecia.<br />
<br />
==Interrupción de detección de dirección==<br />
<br />
Cuando la direción de llamada coincide con la direccion de esclavo programada en el registro de direccióno cuando el bit GCAEN es activado y una llamada general es recibida, el bit IAAS se activa. El CPU es interrumpido cuando llega una interrupción. El CPU debe verificar el bit SRW y escribirlo de acuerdo al modo de Tx correcto.<br />
<br />
==Interrupción de perdida de arbitrariedad==<br />
<br />
<br />
La arbitrariedad se pierde en cualquiera de estas circunstancias:<br />
<br />
• Cuando se baja la linea SDA cuando el maestro la mantiene en alto durante un ciclo de dirección o de transmisión.<br />
• Cuando se baja la linea SDA cuando el maestro la mantiene en alto durante el envio del bit de acknowledge en un ciclo de dtos.<br />
• Al tratar de llevarse a cabo un ciclo de START cuando el bus esta ocupado.<br />
• Una ciclo de START repetido es solicitado en modo esclavo.<br />
• Una condición de STOP es detectada cuando el maestro no la solicito.<br />
Este bit debe ser borrado por software escribiendo un 1 lógico en el.<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1620I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T23:51:13Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del modulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: <br />
<br />
00 mul = 01<br />
<br />
01 mul = 02<br />
<br />
10 mul = 04<br />
<br />
11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. en modo de transmisión maestro, leer este registro inicia la transferensia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits <br />
<br />
1 Esquema de sireccion de 10-bits<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
'''IIC Protocol'''<br />
<br />
El bus del IIC utiliza na linea de datos serial (SDA) y una linea de reloj serial (SCL) para transferencia de datos. Todos los dispositivos deben tener salidas tipo open-drain o open collector. Un AND lógico se aplica en ambas lineas con resistencias de pull-up externas. El valor de estas resistencias depende del sistema.<br />
<br />
Generalmente, una comunicación standard esta compuesta de cuatro partes:<br />
• Señal de START<br />
• Transmisión de la direccion de esclavo<br />
• Transferencia de datos<br />
• Señal de STOP <br />
La señal de STOP no se debe confundir con la instrucción de CPU STOP.<br />
<br />
<br />
[[Archivo:IIC_Bus.png]]<br />
<br />
<br />
'''Señal de START'''Cuando el bus esta libre, ningun dispisotivo maestro esta controlando el bus (SCL y SDA estan el 1 lógico), un dispositivo maestro debe iniciar la comunicación enviando una señal de START. Com se muestra en la figura 12-9.<br />
Una señal de START se define como el cambio de 1 a cero lógico de la linea SDA mientras SCL esta en 1 lógico. esta señal denota el inicio de una nueva transferencia de datos (cada transmisión de datos debe contener varios bytes de data) y sacar a los esclavos fuera de su estado de espera.<br />
<br />
'''Transmisión de la dirección de esclavo'''<br />
El primer byte de data transmitido inmediatamente despues de la señal de START es la dirección de esclavo transmitida por el maestro. Esta es una dirección de llamada de siete bits seguida por el bit R/W. El bit R/W le dice al esclavo la dirección deseada de la transferencia de datos.<br />
<br />
1 = Transferencia tipo lectura, el esclavo transmite data a el maestro.<br />
<br />
0 = Transferencia tipo escritura, el maestro transmite data al esclavo.<br />
<br />
<br />
Sólo el esclavo con una dirección de llamada que coincida con la dirección transmitida por el maestro respondera enviando de vuelta un bit de acknowledge. Esto se logra oniendo en cero lógico la linea SDA en el noveno clock (ver Figura 12-9).<br />
Ningun esclavo en el sisttema debe tener la misma dirección de llamada. Si el modulo IIC es el maestro, no debe transmitir una dirección de llamada de esclavo igual a la suya. El IIC no puede ser maestro y esclavo al mismo tiempo.<br />
Si una perdida de arbitrariedad ocurre durante el ciclo de direccionamiento, el IIC cambiara a modo esclavo.<br />
<br />
<br />
'''Transferencia de Datos''' Antes de que se logre el direccionamiento correcto del esclavo, la transferencia de datos puede proceder byte por byte en la dirección especificada por el bit R/W enviado por el maestro que realizo la llamada.<br />
todas las transferencias de datos que le sigan a un ciclo de direccionamiento se interpretan cmo transferencia de datos, incluso si contienen informacion de sub-direcciones para el dispositivo esclavo.Cada byte de datos tiene 8 bits.<br />
<br />
<br />
Los datos solo pueden cambiar mientras SCL esta en cero lógico y deben ser sostenidos en un estado estable mientras SCL esta en uno lógico como muestra la Figura 12-9.<br />
<br />
<br />
<br />
==Resets==<br />
<br />
EL modulo IIC se inhabilita despues de cada reset. EL IIC no puede causar un reset del MCU.<br />
<br />
<br />
==Interrupciones==<br />
<br />
<br />
El IIC genera una sola interrupción.<br />
<br />
Las interrupciones se producen con cualquiera de los eventos de la tabla 12-11 y cuando el bit IICIEesta activado. La bandera IICIF debe ser borrada por software escribiendo un 1 en el, en la rutina de interrupcion. <br />
<br />
==Interrupción de transferencia de byte==<br />
<br />
La bandera TCF se activa en el borde de bajada al noveno clock para indicar quue se ha completado una transferecia.<br />
<br />
==Interrupción de detección de dirección==<br />
<br />
Cuando la direción de llamada coincide con la direccion de esclavo programada en el registro de direccióno cuando el bit GCAEN es activado y una llamada general es recibida, el bit IAAS se activa. El CPU es interrumpido cuando llega una interrupción. El CPU debe verificar el bit SRW y escribirlo de acuerdo al modo de Tx correcto.<br />
<br />
==Interrupción de perdida de arbitrariedad==<br />
<br />
<br />
La arbitrariedad se pierde en cualquiera de estas circunstancias:<br />
<br />
• SDA sampled as a low when the master drives a high during an address or data transmit cycle.<br />
• SDA sampled as a low when the master drives a high during the acknowledge bit of a data receive<br />
cycle.<br />
• A START cycle is attempted when the bus is busy.<br />
• A repeated START cycle is requested in slave mode.<br />
• A STOP condition is detected when the master did not request it.<br />
This bit must be cleared by software by writing a 1 to it.<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1616I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T23:46:31Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del modulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: <br />
<br />
00 mul = 01<br />
<br />
01 mul = 02<br />
<br />
10 mul = 04<br />
<br />
11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. en modo de transmisión maestro, leer este registro inicia la transferensia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits <br />
<br />
1 Esquema de sireccion de 10-bits<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
'''IIC Protocol'''<br />
<br />
El bus del IIC utiliza na linea de datos serial (SDA) y una linea de reloj serial (SCL) para transferencia de datos. Todos los dispositivos deben tener salidas tipo open-drain o open collector. Un AND lógico se aplica en ambas lineas con resistencias de pull-up externas. El valor de estas resistencias depende del sistema.<br />
<br />
Generalmente, una comunicación standard esta compuesta de cuatro partes:<br />
• Señal de START<br />
• Transmisión de la direccion de esclavo<br />
• Transferencia de datos<br />
• Señal de STOP <br />
La señal de STOP no se debe confundir con la instrucción de CPU STOP.<br />
<br />
<br />
[[Archivo:IIC_Bus.png]]<br />
<br />
<br />
'''Señal de START'''Cuando el bus esta libre, ningun dispisotivo maestro esta controlando el bus (SCL y SDA estan el 1 lógico), un dispositivo maestro debe iniciar la comunicación enviando una señal de START. Com se muestra en la figura 12-9.<br />
Una señal de START se define como el cambio de 1 a cero lógico de la linea SDA mientras SCL esta en 1 lógico. esta señal denota el inicio de una nueva transferencia de datos (cada transmisión de datos debe contener varios bytes de data) y sacar a los esclavos fuera de su estado de espera.<br />
<br />
'''Transmisión de la dirección de esclavo'''<br />
El primer byte de data transmitido inmediatamente despues de la señal de START es la dirección de esclavo transmitida por el maestro. Esta es una dirección de llamada de siete bits seguida por el bit R/W. El bit R/W le dice al esclavo la dirección deseada de la transferencia de datos.<br />
<br />
1 = Transferencia tipo lectura, el esclavo transmite data a el maestro.<br />
<br />
0 = Transferencia tipo escritura, el maestro transmite data al esclavo.<br />
<br />
<br />
Sólo el esclavo con una dirección de llamada que coincida con la dirección transmitida por el maestro respondera enviando de vuelta un bit de acknowledge. Esto se logra oniendo en cero lógico la linea SDA en el noveno clock (ver Figura 12-9).<br />
Ningun esclavo en el sisttema debe tener la misma dirección de llamada. Si el modulo IIC es el maestro, no debe transmitir una dirección de llamada de esclavo igual a la suya. El IIC no puede ser maestro y esclavo al mismo tiempo.<br />
Si una perdida de arbitrariedad ocurre durante el ciclo de direccionamiento, el IIC cambiara a modo esclavo.<br />
<br />
<br />
'''Transferencia de Datos''' Antes de que se logre el direccionamiento correcto del esclavo, la transferencia de datos puede proceder byte por byte en la dirección especificada por el bit R/W enviado por el maestro que realizo la llamada.<br />
todas las transferencias de datos que le sigan a un ciclo de direccionamiento se interpretan cmo transferencia de datos, incluso si contienen informacion de sub-direcciones para el dispositivo esclavo.Cada byte de datos tiene 8 bits.<br />
<br />
<br />
Los datos solo pueden cambiar mientras SCL esta en cero lógico y deben ser sostenidos en un estado estable mientras SCL esta en uno lógico como muestra la Figura 12-9.<br />
<br />
<br />
<br />
==Resets==<br />
<br />
EL modulo IIC se inhabilita despues de cada reset. EL IIC no puede causar un reset del MCU.<br />
<br />
<br />
==Interrupts==<br />
<br />
<br />
El IIC genera una sola interrupción.<br />
<br />
Las interrupciones se producen con cualquiera de los eventos de la tabla 12-11 y cuando el bit IICIEesta activado. La bandera IICIF debe ser borrada por software escribiendo un 1 en el, en la rutina de interrupcion. <br />
<br />
==Byte Transfer Interrupt==<br />
<br />
La bandera TCF se activa en el borde de bajada al noveno clock para indicar quue se ha completado una transferecia.<br />
<br />
==Address Detect Interrupt==<br />
<br />
Cuando la direción de llamada coincide con la direccion de esclavo programada en el registro de direccióno cuando el bit GCAEN es activado y una llamada general es recibida, el bit IAAS se activa. El CPU es interrumpido cuando llega una interrupción. El CPU debe verificar el bit SRW y escribirlo de acuerdo al modo de Tx correcto.<br />
<br />
12.6.3 Arbitration Lost Interrupt<br />
The IIC is a true multi-master bus that allows more than one master to be connected on it. If two or more<br />
masters try to control the bus at the same time, the relative priority of the contending masters is determined<br />
by a data arbitration procedure. The IIC module asserts this interrupt when it loses the data arbitration<br />
process and the ARBL bit in the status register is set.<br />
Arbitration is lost in the following circumstances:<br />
Table 12-11. Interrupt Summary<br />
Interrupt Source Status Flag Local Enable<br />
Complete 1-byte transfer TCF IICIF IICIE<br />
Match of received calling address IAAS IICIF IICIE<br />
Arbitration Lost ARBL IICIF IICIE<br />
Inter-Integrated Circuit (S08IICV2)<br />
MC9S08QE128 MCU Series Reference Manual, Rev. 2<br />
234 Freescale Semiconductor<br />
• SDA sampled as a low when the master drives a high during an address or data transmit cycle.<br />
• SDA sampled as a low when the master drives a high during the acknowledge bit of a data receive<br />
cycle.<br />
• A START cycle is attempted when the bus is busy.<br />
• A repeated START cycle is requested in slave mode.<br />
• A STOP condition is detected when the master did not request it.<br />
This bit must be cleared by software by writing a 1 to it.<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1541I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T21:00:06Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del modulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: <br />
<br />
00 mul = 01<br />
<br />
01 mul = 02<br />
<br />
10 mul = 04<br />
<br />
11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. en modo de transmisión maestro, leer este registro inicia la transferensia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits <br />
<br />
1 Esquema de sireccion de 10-bits<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
'''IIC Protocol'''<br />
<br />
El bus del IIC utiliza na linea de datos serial (SDA) y una linea de reloj serial (SCL) para transferencia de datos. Todos los dispositivos deben tener salidas tipo open-drain o open collector. Un AND lógico se aplica en ambas lineas con resistencias de pull-up externas. El valor de estas resistencias depende del sistema.<br />
<br />
Generalmente, una comunicación standard esta compuesta de cuatro partes:<br />
• Señal de START<br />
• Transmisión de la direccion de esclavo<br />
• Transferencia de datos<br />
• Señal de STOP <br />
La señal de STOP no se debe confundir con la instrucción de CPU STOP.<br />
<br />
<br />
[[Archivo:IIC_Bus.png]]<br />
<br />
<br />
'''Señal de START'''Cuando el bus esta libre, ningun dispisotivo maestro esta controlando el bus (SCL y SDA estan el 1 lógico), un dispositivo maestro debe iniciar la comunicación enviando una señal de START. Com se muestra en la figura 12-9.<br />
Una señal de START se define como el cambio de 1 a cero lógico de la linea SDA mientras SCL esta en 1 lógico. esta señal denota el inicio de una nueva transferencia de datos (cada transmisión de datos debe contener varios bytes de data) y sacar a los esclavos fuera de su estado de espera.<br />
<br />
'''Transmisión de la dirección de esclavo'''<br />
El primer byte de data transmitido inmediatamente despues de la señal de START es la dirección de esclavo transmitida por el maestro. Esta es una dirección de llamada de siete bits seguida por el bit R/W. El bit R/W le dice al esclavo la dirección deseada de la transferencia de datos.<br />
<br />
1 = Transferencia tipo lectura, el esclavo transmite data a el maestro.<br />
<br />
0 = Transferencia tipo escritura, el maestro transmite data al esclavo.<br />
<br />
<br />
Sólo el esclavo con una dirección de llamada que coincida con la dirección transmitida por el maestro respondera enviando de vuelta un bit de acknowledge. Esto se logra oniendo en cero lógico la linea SDA en el noveno clock (ver Figura 12-9).<br />
Ningun esclavo en el sisttema debe tener la misma dirección de llamada. Si el modulo IIC es el maestro, no debe transmitir una dirección de llamada de esclavo igual a la suya. El IIC no puede ser maestro y esclavo al mismo tiempo.<br />
Si una perdida de arbitrariedad ocurre durante el ciclo de direccionamiento, el IIC cambiara a modo esclavo.<br />
<br />
<br />
'''Transferencia de Datos''' Antes de que se logre el direccionamiento correcto del esclavo, la transferencia de datos puede proceder byte por byte en la dirección especificada por el bit R/W enviado por el maestro que realizo la llamada.<br />
todas las transferencias de datos que le sigan a un ciclo de direccionamiento se interpretan cmo transferencia de datos, incluso si contienen informacion de sub-direcciones para el dispositivo esclavo.Cada byte de datos tiene 8 bits.<br />
<br />
<br />
Los datos solo pueden cambiar mientras SCL esta en cero lógico y deben ser sostenidos en un estado estable mientras SCL esta en uno lógico como muestra la Figura 12-9.<br />
<br />
There is one clock pulse on SCL for each data bit, the MSB being<br />
transferred first. Each data byte is followed by a 9th (acknowledge) bit, which is signalled from the<br />
receiving device. An acknowledge is signalled by pulling the SDA low at the ninth clock. In summary, one<br />
complete data transfer needs nine clock pulses.<br />
If the slave receiver does not acknowledge the master in the 9th bit time, the SDA line must be left high<br />
by the slave. The master interprets the failed acknowledge as an unsuccessful data transfer.<br />
If the master receiver does not acknowledge the slave transmitter after a data byte transmission, the slave<br />
interprets this as an end of data transfer and releases the SDA line.<br />
In either case, the data transfer is aborted and the master does one of two things:<br />
• Relinquishes the bus by generating a STOP signal.<br />
• Commences a new calling by generating a repeated START signal.<br />
Inter-Integrated Circuit (S08IICV2)<br />
MC9S08QE128 MCU Series Reference Manual, Rev. 2<br />
230 Freescale Semiconductor<br />
12.4.1.4 STOP Signal<br />
The master can terminate the communication by generating a STOP signal to free the bus. However, the<br />
master may generate a START signal followed by a calling command without generating a STOP signal<br />
first. This is called repeated START. A STOP signal is defined as a low-to-high transition of SDA while<br />
SCL at logical 1 (see Figure 12-9).<br />
The master can generate a STOP even if the slave has generated an acknowledge at which point the slave<br />
must release the bus.<br />
12.4.1.5 Repeated START Signal<br />
As shown in Figure 12-9, a repeated START signal is a START signal generated without first generating a<br />
STOP signal to terminate the communication. This is used by the master to communicate with another<br />
slave or with the same slave in different mode (transmit/receive mode) without releasing the bus.<br />
12.4.1.6 Arbitration Procedure<br />
The IIC bus is a true multi-master bus that allows more than one master to be connected on it. If two or<br />
more masters try to control the bus at the same time, a clock synchronization procedure determines the bus<br />
clock, for which the low period is equal to the longest clock low period and the high is equal to the shortest<br />
one among the masters. The relative priority of the contending masters is determined by a data arbitration<br />
procedure, a bus master loses arbitration if it transmits logic 1 while another master transmits logic 0. The<br />
losing masters immediately switch over to slave receive mode and stop driving SDA output. In this case,<br />
the transition from master to slave mode does not generate a STOP condition. Meanwhile, a status bit is<br />
set by hardware to indicate loss of arbitration.<br />
12.4.1.7 Clock Synchronization<br />
Because wire-AND logic is performed on the SCL line, a high-to-low transition on the SCL line affects all<br />
the devices connected on the bus. The devices start counting their low period and after a device’s clock has<br />
gone low, it holds the SCL line low until the clock high state is reached. However, the change of low to<br />
high in this device clock may not change the state of the SCL line if another device clock is still within its<br />
low period. Therefore, synchronized clock SCL is held low by the device with the longest low period.<br />
Devices with shorter low periods enter a high wait state during this time (see Figure 12-10). When all<br />
devices concerned have counted off their low period, the synchronized clock SCL line is released and<br />
pulled high. There is then no difference between the device clocks and the state of the SCL line and all the<br />
devices start counting their high periods. The first device to complete its high period pulls the SCL line<br />
low again.<br />
<br />
[[Archivo:Clock_synch.png]]<br />
<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1515I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T19:57:53Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del modulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: <br />
<br />
00 mul = 01<br />
<br />
01 mul = 02<br />
<br />
10 mul = 04<br />
<br />
11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. en modo de transmisión maestro, leer este registro inicia la transferensia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits <br />
<br />
1 Esquema de sireccion de 10-bits<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
'''IIC Protocol'''<br />
<br />
El bus del IIC utiliza na linea de datos serial (SDA) y una linea de reloj serial (SCL) para transferencia de datos. Todos los dispositivos deben tener salidas tipo open-drain o open collector. Un AND lógico se aplica en ambas lineas con resistencias de pull-up externas. El valor de estas resistencias depende del sistema.<br />
<br />
Generalmente, una comunicación standard esta compuesta de cuatro partes:<br />
• Señal de START<br />
• Transmisión de la direccion de esclavo<br />
• Transferencia de datos<br />
• Señal de STOP <br />
La señal de STOP no se debe confundir con la instrucción de CPU STOP.<br />
<br />
<br />
[[Archivo:IIC_Bus.png]]<br />
<br />
<br />
'''Señal de START'''Cuando el bus esta libre, ningun dispisotivo maestro esta controlando el bus (SCL y SDA estan el 1 lógico), un dispositivo maestro debe iniciar la comunicación enviando una señal de START. Com se muestra en la figura 12-9.<br />
Una señal de START se define como el cambio de 1 a cero lógico de la linea SDA mientras SCL esta en 1 lógico. esta señal denota el inicio de una nueva transferencia de datos (cada transmisión de datos debe contener varios bytes de data) y sacar a los esclavos fuera de su estado de espera.<br />
<br />
'''Transmisión de la dirección de esclavo'''<br />
El primer byte de data transmitido inmediatamente despues de la señal de START es la dirección de esclavo transmitida por el maestro. Esta es una dirección de llamada de siete bits seguida por el bit R/W. El bit R/W le dice al esclavo la dirección deseada de la transferencia de datos.<br />
<br />
1 = Transferencia tipo lectura, el esclavo transmite data a el maestro.<br />
<br />
0 = Transferencia tipo escritura, el maestro transmite data al esclavo.<br />
<br />
<br />
Sólo el esclavo con una dirección de llamada que coincida con la dirección transmitida por el maestro respondera enviando de vuelta un bit de acknowledge. Esto se logra oniendo en cero lógico la linea SDA en el noveno clock (ver Figura 12-9).<br />
Ningun esclavo en el sisttema debe tener la misma dirección de llamada. Si el modulo IIC es el maestro, no debe transmitir una dirección de llamada de esclavo igual a la suya. El IIC no puede ser maestro y esclavo al mismo tiempo.<br />
Si una perdida de arbitrariedad ocurre durante el ciclo de direccionamiento, el IIC cambiara a modo esclavo.<br />
<br />
<br />
'''Transferencia de Datos''' Antes de que se logre el direccionamiento correcto del esclavo, la transferencia de datos puede proceder byte por byte en la dirección especificada por el bit R/W enviado por el maestro que realizo la llamada.<br />
todas las transferencias de datos que le sigan a un ciclo de direccionamiento se interpretan cmo transferencia de datos, incluso si contienen informacion de sub-direcciones para el dispositivo esclavo.<br />
Cada byte de datos tiene 8 bits. Data may be changed only while SCL is low and must be held stable while<br />
SCL is high as shown in Figure 12-9. There is one clock pulse on SCL for each data bit, the MSB being<br />
transferred first. Each data byte is followed by a 9th (acknowledge) bit, which is signalled from the<br />
receiving device. An acknowledge is signalled by pulling the SDA low at the ninth clock. In summary, one<br />
complete data transfer needs nine clock pulses.<br />
If the slave receiver does not acknowledge the master in the 9th bit time, the SDA line must be left high<br />
by the slave. The master interprets the failed acknowledge as an unsuccessful data transfer.<br />
If the master receiver does not acknowledge the slave transmitter after a data byte transmission, the slave<br />
interprets this as an end of data transfer and releases the SDA line.<br />
In either case, the data transfer is aborted and the master does one of two things:<br />
• Relinquishes the bus by generating a STOP signal.<br />
• Commences a new calling by generating a repeated START signal.<br />
Inter-Integrated Circuit (S08IICV2)<br />
MC9S08QE128 MCU Series Reference Manual, Rev. 2<br />
230 Freescale Semiconductor<br />
12.4.1.4 STOP Signal<br />
The master can terminate the communication by generating a STOP signal to free the bus. However, the<br />
master may generate a START signal followed by a calling command without generating a STOP signal<br />
first. This is called repeated START. A STOP signal is defined as a low-to-high transition of SDA while<br />
SCL at logical 1 (see Figure 12-9).<br />
The master can generate a STOP even if the slave has generated an acknowledge at which point the slave<br />
must release the bus.<br />
12.4.1.5 Repeated START Signal<br />
As shown in Figure 12-9, a repeated START signal is a START signal generated without first generating a<br />
STOP signal to terminate the communication. This is used by the master to communicate with another<br />
slave or with the same slave in different mode (transmit/receive mode) without releasing the bus.<br />
12.4.1.6 Arbitration Procedure<br />
The IIC bus is a true multi-master bus that allows more than one master to be connected on it. If two or<br />
more masters try to control the bus at the same time, a clock synchronization procedure determines the bus<br />
clock, for which the low period is equal to the longest clock low period and the high is equal to the shortest<br />
one among the masters. The relative priority of the contending masters is determined by a data arbitration<br />
procedure, a bus master loses arbitration if it transmits logic 1 while another master transmits logic 0. The<br />
losing masters immediately switch over to slave receive mode and stop driving SDA output. In this case,<br />
the transition from master to slave mode does not generate a STOP condition. Meanwhile, a status bit is<br />
set by hardware to indicate loss of arbitration.<br />
12.4.1.7 Clock Synchronization<br />
Because wire-AND logic is performed on the SCL line, a high-to-low transition on the SCL line affects all<br />
the devices connected on the bus. The devices start counting their low period and after a device’s clock has<br />
gone low, it holds the SCL line low until the clock high state is reached. However, the change of low to<br />
high in this device clock may not change the state of the SCL line if another device clock is still within its<br />
low period. Therefore, synchronized clock SCL is held low by the device with the longest low period.<br />
Devices with shorter low periods enter a high wait state during this time (see Figure 12-10). When all<br />
devices concerned have counted off their low period, the synchronized clock SCL line is released and<br />
pulled high. There is then no difference between the device clocks and the state of the SCL line and all the<br />
devices start counting their high periods. The first device to complete its high period pulls the SCL line<br />
low again.<br />
<br />
[[Archivo:Clock_synch.png]]<br />
<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1501I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T19:24:39Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del modulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: <br />
<br />
00 mul = 01<br />
<br />
01 mul = 02<br />
<br />
10 mul = 04<br />
<br />
11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. en modo de transmisión maestro, leer este registro inicia la transferensia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits <br />
<br />
1 Esquema de sireccion de 10-bits<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
'''IIC Protocol'''<br />
<br />
El bus del IIC utiliza na linea de datos serial (SDA) y una linea de reloj serial (SCL) para transferencia de datos. Todos los dispositivos deben tener salidas tipo open-drain o open collector. Un AND lógico se aplica en ambas lineas con resistencias de pull-up externas. El valor de estas resistencias depende del sistema.<br />
<br />
Generalmente, una comunicación standard esta compuesta de cuatro partes:<br />
• Señal de START<br />
• Transmisión de la direccion de esclavo<br />
• Transferencia de datos<br />
• Señal de STOP <br />
La señal de STOP no se debe confundir con la instrucción de CPU STOP.<br />
<br />
<br />
[[Archivo:IIC_Bus.png]]<br />
<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Archivo:IIC_Bus.png&diff=1500Archivo:IIC Bus.png2012-11-16T19:24:14Z<p>Francjsalanova: </p>
<hr />
<div></div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1483I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T19:05:38Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del modulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: <br />
<br />
00 mul = 01<br />
<br />
01 mul = 02<br />
<br />
10 mul = 04<br />
<br />
11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. en modo de transmisión maestro, leer este registro inicia la transferensia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits <br />
<br />
1 Esquema de sireccion de 10-bits<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1482I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T19:02:49Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del modulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: 00 mul = 01, 01 mul = 02, 10 mul = 04, 11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. en modo de transmisión maestro, leer este registro inicia la transferensia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits <br />
<br />
1 Esquema de sireccion de 10-bits<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1481I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T19:01:41Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del modulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: 00 mul = 01, 01 mul = 02, 10 mul = 04, 11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. en modo de transmisión maestro, leer este registro inicia la transferensia del siguiente byte de data.<br />
<br />
<br />
[[Archivo:IIC_control_reggister.png]]<br />
<br />
<br />
'''GCAEN''' Habilitar direcciones de llamada general — El bit GCAEN Habilita o inhabilita las direcciones de llamada general.<br />
<br />
0 Direcciones de llamada general inhabilitadas.<br />
1 Direcciones de llamada general habilitadas.<br />
<br />
<br />
'''ADEXT''' Extension de dirección — El bit ADEXT controla el numero de bits usado para las direcciones de esclavo.<br />
<br />
0 Esquema de sireccion de 7-bits <br />
1 Esquema de sireccion de 10-bits<br />
<br />
'''AD''' Dirección de esclavo — EL campo AD contiene los 3 bits mas altos de la dirección de esclavo en el esquema de 10-bits. Este campo es valido sólo si el bit ADEXT bit esta habilitado.<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Archivo:IIC_control_reggister.png&diff=1479Archivo:IIC control reggister.png2012-11-16T18:53:05Z<p>Francjsalanova: </p>
<hr />
<div></div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1478I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T18:52:25Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del modulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: 00 mul = 01, 01 mul = 02, 10 mul = 04, 11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Archivo:IIC_Data_register.png]]<br />
<br />
<br />
Data — En modo de transmisión maestro, cuando se escribe una data en el registro IICxD, se inicia la transferencia de la data. El bit mas significativo es enviado primero. en modo de transmisión maestro, leer este registro inicia la transferensia del siguiente byte de data.<br />
<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=Archivo:IIC_Data_register.png&diff=1470Archivo:IIC Data register.png2012-11-16T18:42:51Z<p>Francjsalanova: </p>
<hr />
<div></div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1468I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T18:38:55Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
===Inicialización del modulo en modo esclavo===<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: 00 mul = 01, 01 mul = 02, 10 mul = 04, 11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanovahttp://wikitronica.labc.usb.ve/index.php?title=I%C2%B2C_(Inter-Integrated_Circuit)_-_MC9S08QE128&diff=1467I²C (Inter-Integrated Circuit) - MC9S08QE1282012-11-16T18:38:14Z<p>Francjsalanova: </p>
<hr />
<div>'''Francisco Salanova 09-10778'''<br />
<br />
El módulo de demostraciones DEMOQE128 de Freescale posee 2 modulos de IIC (Inter-Integrated Circuit). Cada uno tien las siguientes características:<br />
*Compatible con el standart IIC bus.<br />
*Operaciones multi-maestro.<br />
*64 diferentes frecuencias de reloj seriales programables por software.<br />
*Bit de Acknowledge (acuse de recibido) seleccionable por software. <br />
*Transferencia de datos Byte a Byte por interrupciones.<br />
*Interrupción de perdida de arbitrariedad con cambio automatico de maestro a esclavo.<br />
*Interrupción de identificación de direcciones de llamada.<br />
*Generación y detección de señales START y STOP.<br />
*Generación repetida de la señal START.<br />
*Generación y detección del bit de Acknowledge.<br />
*Detección de bus ocupado.<br />
*Reconocimiento de llamadas generales.<br />
*10-bit de extensión de dirección.<br />
<br />
La interfaz esta diseñada para operar hasta 100 kbps con carga máxima de bus. El dispositivo es capaz de operar a mas altos niveles de baud rate, hasta un máximo de carga de bus de clock/20, con carga de bus reducida. La longitud máxima de comunicación y el nuero de dispositivos que se pueden conectar están limitados por una capacitancia máxima de 400 pF.<br />
<br />
Estos módulos también funcionan en los 3 modos de operación del DEMOQE128 como son:<br />
<br />
* Run mode Es el modo básico de operación, para conservar energía en este modo se recomienda inhabilitar el modulo.<br />
<br />
* Wait mode — El modulo continúa trabajando en este modo y puede generar una interrupción para despertar el MCU.<br />
<br />
* Stop mode — El modulo IIC esta inactivo en el modo stop3 para reducir el consumo de energia. La instrucción de STOP no afecta el estado de los registros del IIC. El modo Stop2 resetea el contenido de los registros. <br />
<br />
Los pines del IIC1, SDA y SCL pueden ser reubicados por software usando el registro SOPT2[IIC1PS] como se muestra en la tabla Tabla 12-1. El IIC2 no posee puertos re-asignables, estos son PTH6 para SCL2 y PTH7 para SDA2.<br />
<br />
<br />
[[Archivo:Tabla_12-1_Puertos.png]]<br />
<br />
----<br />
<br />
==Inicialización del modulo en modo esclavo==<br />
<br />
1. Se escribe el registro IICC2 para:<br />
* Habilitar o inhabilitar las llamadas generales.<br />
* Para seleccionar el modo de direccionmiento entre 10-bit o 7-bit.<br />
<br />
2. Escribir el registro IICA para:<br />
* Para establecer la dirección de esclavo. <br />
<br />
3. Escribir el registro IICC1 para:<br />
* Habilitar el modulo IIC y sus Interrupciones.<br />
<br />
4. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos.<br />
<br />
5. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
<br />
<br />
'''Inicializacion del modulo en modo maestro'''<br />
<br />
1. Escribir el registro IICF para:<br />
* Para seleccionar el baud rate del IIC.<br />
<br />
2. Escribir el registro IICC1 Para<br />
*Habilitar las interrupciones del IIC.<br />
<br />
3. Inicializar la variables RAM (IICEN = 1 and IICIE = 1) para la transmisión de datos<br />
<br />
4. Inicializar las variables RAM usadas para alcanzar la velocidad deseada del Internal Clock Source.<br />
<br />
5. Escribir el registro IICC1 para:<br />
*Habilitar TX (Modo de transmisión).<br />
<br />
6. Escribir el registro IICC1 para:<br />
* Habilitar MST (Modo maestro).<br />
<br />
7. Escribir el registro IICD:<br />
* Con la dirección del esclavo a comunicarse. (El bit menos significativo de este byte determinara si la comunicación es de recepción como maestro o transmisión como maestro.)<br />
<br />
[[Archivo:Registros_a_inicializar_IIC.png]]<br />
<br />
<br />
'''Uso del modulo'''<br />
<br />
Para operaciones como esclavo, un mensaje de IIC entrante que contenga la dirección apropiada comenzara la comunicación IIC. Para operaciones como maestro, la comunicación debe ser iniciada escribiendo el registro IICD.<br />
<br />
'''Descipción de los registros'''<br />
<br />
[[Archivo:Registros_de_direccion.png]]<br />
<br />
Dirección de esclavo - este campo contiene la dirección de esclavo del modulo IIC. Este campo es usado para el esquema de 7 bits de dirección y los 7 bits bajos del esquema de 10 bits.<br />
<br />
[[Archivo:Frencuency_Divider_Register.png]]<br />
<br />
'''MULT:''' IIC Multiplier Factor — MULT bits definen el factor de multiplicación. Este factor es usado junto al divisor de SCL para generar el baud rate. Los valores posibles son los siguientes: 00 mul = 01, 01 mul = 02, 10 mul = 04, 11 Reserved.<br />
<br />
<br />
<br />
*ICR: IIC Clock Rate —ICR bits son usados para pre-escalar el bus clock para un bit rate seleccionado. Estos bits junto con los MULT bits e usan para determinar el IIC baud rate, el tiempo de espera del SDA, el tiempo de espera del Start del SCL, y el tiempo de espera del Stop del SCL. La tabla siguiente provee los divisores y valores de espera correspondientes para el SCL del ICR. El divisor del SCL multiplicado por el factor mul se usa para generar el IIC baud rate.<br />
<br />
*IIC baud rate = velocidad del bus (Hz)/(mul * divisor de SCL)<br />
El tiempo de espera del SDA es el retardo desde el flanco de bajada del SCL hasta el cambio de SDA.<br />
<br />
*Tiempo de espera del SDA = periodo del bus (s) * mul * SDA <br />
El tiempo de espera del SCL es el retardo desde el flanco de bajada del SDA, mientras SCL esta en alto (condición inicial) hasta el flanco de bajada de SCL.<br />
<br />
*Tiempo de espera inicial del SCL = periodo del bus (s) * mul * tiempo de espera inicial del SCL<br />
<br />
El tiempo de espera de STOP del SCL es el retardo desde el flanco de subida del SCL (IIC clock) hasta el flanco de subida del SDA.<br />
<br />
*Tiempo de espera de Stop SCL = bus period (s) * mul * SCL Stop hold value <br />
<br />
[[Archivo:Divider_and_hold_values.png]]<br />
<br />
<br />
[[Archivo:Control_Register_IIC.png]]<br />
<br />
'''IICEN''' Habilitar IIC— El bit IICEN habilita el modulo IIC.<br />
0 IIC inhabilitados.<br />
1 IIC esta habilitado.<br />
<br />
'''IICIE''' Habilita las interrupciones IIC — El bit IICIE determina cuando una interrupcion de IIC es solicitada.<br />
<br />
0 IIC interrupciones inhabilitadas. <br />
1 IIC interrupciones habilitadas.<br />
<br />
'''MST''' Seleccion del modo maestro — El bit MST cambia de 0 a 1 cuando una señal de START es generada en el bus por lo que se selecciona el modo maestro.cuando este bit cambia de 1 a 0 una señal de STOP es generada y el modo de operación cambia de maestro a esclavo.<br />
<br />
0 Modo esclavo.<br />
1 Modo maestro.<br />
<br />
'''TX''' Selecciona el modo de transmicion — El bit TX selecciona la dirección de transición del maestro y del esclavo. En modo maestro este bit se debe escribir de acuerdo al tipo de transferencia requerido. Por lo tanto, para ciclos de diccionario, este bit siempre estará en 1.<br />
Cuando se direcciona como esclavo este bit deberá ser escrito por software de acuerdo al bit SRW en el registro de estado.<br />
<br />
0 Recibe.<br />
1 Transmite.<br />
<br />
'''TXAK''' Transmisión de Acknowledge habilitado — este bit especifica el valor enviado al SDA durante el ciclo de acknowledge para los receptores del maestro y esclavo.<br />
<br />
0 Una señal de acknowledge se envia al bus despues de recivir un byte de data.<br />
1 Ninguna señal de acknowledge de respuesta es enviada.<br />
<br />
'''RSTA''' Repetir señal de START — Escribir 1 en este bit generara una señal repetida de START si se es el maestro actual. Este bit siempre se leerá como bajo. Intentar repetir en un momento inadecuado causara la perdida de arbitrariedad.<br />
<br />
[[Archivo:IIC_status_register.png]]<br />
<br />
'''TCF''' Bandera de transferencia completada — Este bit se escribe en 1 cuando se completa la tranferencia de un byte de data. este bit es unicamente valido durante o inmediatamente después de una transferencia al modulo IIC o desde el modulo IIC. El bit TCF se borra leyendo el registro IICxD en modo de recepcion o escribiendo el registro IICxD en modo de transmisión.<br />
<br />
0 Transferencia en progreso.<br />
1 Transferencia completada.<br />
<br />
'''IAAS''' Direccionado como esclavo — El bit IAAS se escribe en uno cuando la direccion de llamada coincide con la direccion de esclavo programada para el modulo, o cuando el bit GCAEN se escribe en 1 y una llamada general es recivida. Escribir el registro IICxC borra este bit.<br />
<br />
0 No direccionado.<br />
1 Direccionado como esclavo.<br />
<br />
'''BUSY''' Bus ocupado — El bit BUSY indica el estado del bus a pesar de estar e modo esclavo o maestro. El bit BUSY se escribe cuando una señal de START es detectada y se borra cuando una señal de STOP es detectada.<br />
<br />
0 Bus esta en espera.<br />
1 Bus esta ocupado.<br />
<br />
'''ARBL''' Perdida de arbitraiedad — Este bit se activva por hardware cuando el procedimiento de arbitracion se pierde. El bit ARBL se debe borrar por software, escribiendo un 1 en el.<br />
<br />
0 Operación Standard del bus.<br />
1 Perdida de arbitrariedad.<br />
<br />
'''SRW''' Escritura/Lectura en modo esclavo — Cuando se direcciona como esclavo el bit SRW indica el valor del bit de comando R/W de la direccion de llamada enviada al maestro.<br />
<br />
0 Recepción modo esclavo, Escritura en el esclavo, en modo maestro.<br />
1 Transmisión modo esclavo, Lectura desde el esclavo, en modo maestro.<br />
<br />
'''IICIF''' Bandra de interrupcion IIC — El bit IICIF se activa cuando una interrupcion esta pendiente. Este bit debe ser borrado por software, escribiendo un 1 en el en la rutina de interrupción. Cualquiere de los siguientes evntos puede activar el bit IICIF:<br />
• Se completo la transferencia de un byte.<br />
• Coincidencia de la direccion de esclavo con la direccion de llamada.<br />
• Perdida de arbitrariedad.<br />
<br />
0 No hay interrupcion pendiente.<br />
1 Hay una interrupcion pendiente.<br />
<br />
'''RXAK''' Recepcion de Acknowledge— Cuando el bit RXAK esta en bajo, indica que una señal de acknowledge se ha recibido desues de la transmision de un byte de data en el bus. Si el bit RXAK esta en alto significa que no se ha detectado una señal de acknowledge.<br />
<br />
0 Señal de acknowledge recibida.<br />
1 No se ha recibido señal de acknowledge.<br />
<br />
<br />
[[Categoría: MC9S08QE128]]</div>Francjsalanova