tag:blogger.com,1999:blog-65613332511549009862024-03-05T19:58:46.406+01:00Blog de la asignatura Informática Industrial · Apuntes teoría y prácticas del cursoApuntes teoría sensores y material de prácticas para la asignatura del curso Informática IndustrialLuis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.comBlogger148125tag:blogger.com,1999:blog-6561333251154900986.post-70185153082853630202012-08-21T10:52:00.002+02:002013-04-30T15:56:27.530+02:00Sensor vibración miniatura Arduino prototiposEste sensor, por su tamaño y precisión, es perfecto para utilizar en dispositivos de control, sensorización, prototipos y ensayos, también para usar en proyectos con Arduino o con placas que incluyan algún otro microcontrolador y donde el espacio sea importante.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCbl5plcZhs0xjFEH-h-hLCGqHnU0StzW_mciQ045fGew4GMKCyPh_fr9l7hOK1IbuJOhWzuj2KbV1ONIpSTe1Kw6qeqpUsjbxLiewWimA_h9NRSce0JFt4KgSc4YbxOyQ9NfQfp_24iE/s1600/2012-08-21+10.39.27.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="199" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCbl5plcZhs0xjFEH-h-hLCGqHnU0StzW_mciQ045fGew4GMKCyPh_fr9l7hOK1IbuJOhWzuj2KbV1ONIpSTe1Kw6qeqpUsjbxLiewWimA_h9NRSce0JFt4KgSc4YbxOyQ9NfQfp_24iE/s320/2012-08-21+10.39.27.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">El sensor incluye pines de conexión y taladro de fijación.</td></tr>
</tbody></table>
<br />
Los componentes están soldados a una cara, de este modo, se reduce el tamaño y se hace más fácil su colocacióa en lugares de reducidas dimensiones. Incluye pines para una fácil conexión con cables estándard y un taladro para fijarlo, con un tornillo, a la superficie que se desea monitorizar.<br />
<br />
Con los pines de conexión se puede usar este mini sensor en una placa protoboard, para probar fácilmente los prototipos que estés realizando, puedes ver cuatro sensores en la siguiente figura:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA5AvP6iHOItXYPDWjKxd93SUbC_JKr9EXRh77x61rRiKNAASFpUn7GetA0i9XRpr-N3XZDKrbf_nWA-mdPeQsJJGQL3zZ5LgFXue8XZhqyeG3cHkVgUqLuJXT2phPIJg5f8EYSw81lGk/s1600/DSCN1216.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA5AvP6iHOItXYPDWjKxd93SUbC_JKr9EXRh77x61rRiKNAASFpUn7GetA0i9XRpr-N3XZDKrbf_nWA-mdPeQsJJGQL3zZ5LgFXue8XZhqyeG3cHkVgUqLuJXT2phPIJg5f8EYSw81lGk/s320/DSCN1216.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Cuatro mini sensores de vibración conectados a una placa protoboard.</td></tr>
</tbody></table>
<br />
El sensor es muy sensible, se diría que casi soplando se activa. Cuando el sensor está en reposo, los contactos están cerrados. Cuando se detecta movimiento, sus contactos se abren y se cierran mientras dura el movimiento. Puede verse un esquema del funcionamiento en la figura siguiente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibFsqKpLODH7GcayEnaW_QoV6swb5435My-WFh6I8CFaJrlzBTtfuqJOGm6JHXf_VkvC_UDUkfzBJSzkdUmeGXIXGcDNUZk5fINArrcdddC3_duqr9jvUUeiAg6imo7aUA74UZjl6F41Y/s1600/sensor.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="263" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibFsqKpLODH7GcayEnaW_QoV6swb5435My-WFh6I8CFaJrlzBTtfuqJOGm6JHXf_VkvC_UDUkfzBJSzkdUmeGXIXGcDNUZk5fINArrcdddC3_duqr9jvUUeiAg6imo7aUA74UZjl6F41Y/s400/sensor.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">En reposo, los contactos están cerrados.</td></tr>
</tbody></table>
<br />
Por lo tanto, es muy sencillo detectar un cambio de estado utilizando un microcontrolador. Sólo basta conectarlo a una de las entradas digitales y escribir un bucle que lea dicha entrada. Es omnidireccional, detecta movimiento en cualquier dirección, además, la posición de montaje no influye en la sensibilidad. Puede montarse tanto en horizontal como en vertical.<br />
<br />
Si quieres hacer un pedido, envía un correo electrónico a bitschips@gmail.com con tu dirección postal y el número de unidades que necesitas. El producto se envía contrarreembolso.Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-61131506266782232172011-06-07T08:42:00.000+02:002011-06-07T08:42:21.031+02:00Cuatro problemasDescargar ejercicio <a href="http://www.bitschips.com/infoind/cuatro_problemas_2.pdf">aquí</a>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-45388586349449487632011-05-31T08:42:00.000+02:002011-05-31T08:42:39.016+02:00Cuestionario final sobre interrupciones y temporizadoresDescargar <a href="http://www.bitschips.com/infoind/cuestionario_int_v.pdf">aquí</a>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-43112581419631276772011-05-24T00:07:00.000+02:002011-05-24T00:07:44.422+02:00Cuestionario martes 24 de mayoOs dejo <a href="http://www.bitschips.com/infoind/cuestionario_iv.pdf">aquí </a>el cuestionario con los problemas que hay que resolver.<br />
Por favor, entregádselo a Carlos Domínguez o bien me lo podéis dar la semana que viene.<br />
<br />
Un saludo,Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-29269253554574276772011-05-17T08:40:00.008+02:002011-05-22T14:51:02.896+02:00Ejercicios de repaso (puertos, temporizadores e interrupciones)Descargar <a href="http://www.bitschips.com/infoind/repaso1.pdf">aquí</a><br />
<div style="color: red;"><b><a href="http://www.bitschips.com/infoind/p_int0_t0.pdf" style="color: red;">Aclaración</a> </b><span style="color: black;">del problema que usa la interrupción externa "INT0" y el temporizador.</span></div>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-82924390687725580242011-05-10T13:11:00.000+02:002011-05-10T13:11:14.787+02:00Navegación 3D (gracias Francisco)<iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/zKLAeq1m2TY" width="480"></iframe>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-27228445003902709852011-05-10T07:21:00.002+02:002011-05-10T08:06:37.809+02:00Interrupciones<a href="http://www.bitschips.com/infoind/tema_int.pdf">Teoría</a><br />
<a href="http://www.bitschips.com/infoind/cuestionario_interrupciones.pdf">- Cuestionario I (hecho) </a><br />
<a href="http://www.bitschips.com/infoind/cuestionario_interrupciones_2.pdf">- Cuestionario 2 (hacer hoy)</a>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-11818112562484069502011-04-27T09:51:00.001+02:002011-04-27T10:18:31.302+02:00Revisiones de los problemas 1 y 2 del controlOs dejo aquí algunas notas de revisión de los problemas corregidos del control (preguntas 1 y 2).<br />
Descargar pdf <a href="http://www.bitschips.com/infoind/problemas1y2.pdf">aquí</a>.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguIxrmqIF47bNL4AfBGifrOE71J4rB1C_Mr-X8NMaIUYSNjj-UPbxcVhwcfjEqACZP37f5IV1UvGp6k12TEmbRj4xyu3AURclmrZLuwVx40rG2t_zyFmApiEYsfDwsXhe85mSX1Zg5lT8/s1600/pdf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-45234017973693885362011-04-21T21:03:00.001+02:002011-04-21T21:08:16.804+02:00Como buscar información sobre microcontroladoresUn alumno (Óscar) me plantea la siguiente pregunta por correo: <em>"Buenas Luis, tengo que prestar ayuda a un compañero de trabajo ex-alumno tuyo. Necesita encontrar información detallada sobre micros, en concreto de 8 bits, para realizar su proyecto final de carrera. Sería de Motorola e Intel. Si puedes facilitarme algún enlace o archivos pdf de consulta te lo agradecería".</em><br />
<br />
Aprovecho para publicar mi respuesta por si a alguien le resulta de interés:<br />
<br />
Bueno, yo creo que la primera opción es entrar en las páginas de los fabricantes. Supongo que estará buscando algunos micros en concreto, allí podrá encontrar los datasheets correspondientes.<br />
<br />
Otra opción es buscar estos micros en un proveedor de componentes electrónicos como <a href="http://www.farnell.com/">Farnell</a>, <a href="http://es.rs-online.com/web/home.html">RS</a>, <a href="http://www.digikey.es/">Digikey</a> u otros, allí encontrará información detallada. <br />
<br />
En este blog, en la columna de la derecha y abajo hay una lista de sitios web de componentes electrónicos que podría servir.<br />
<br />
También puede mirar en sitios como <a href="http://es.scribd.com/">Scribd</a> o <a href="http://www.slideshare.net/">Slideshare</a> donde se comparten ppts y documentos de todo tipo, también de electrónica, micros, informática..<br />
<br />
Por último se me ocurre que <a href="http://www.youtube.com/">Youtube</a> es una opción muy interesante donde los aficionandos a la electrónica publican sus experimentos y donde se puede aprender, buscando como lo harías en Google, poniendo el tipo de micro en el cuadro de búsqueda y navegando por los resultados.<br />
<br />
Si alguien quiere recomendar algún sitio web, que ponga un comentario en este post.Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-62575698094505834622011-04-19T18:56:00.001+02:002011-04-19T18:59:57.921+02:00Access violation..Error al depurar un programa en KeilCuando ejecutas en Keil paso a paso un programa para un microcontrolador y no has incluido el bucle "while(1){..}" tu programa se ejecutará sólo una vez y al llegar al final, continuará buscando instrucciones, produciendo un error. Supongamos que tenemos un programa así:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHBHIk-EJsdNWXQil1R5mPyl0ZvSXfijS9x6mSUdUO8nSaG_V84lEyhRLKXxDl2ZzuC5MEyCtj7Sw3FGHtrivhI3cAGTIX7XxDcGjNhN5vMl2kIowmR3wCoISc_UIFUAyIhKtGh1bN09U/s1600/while.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHBHIk-EJsdNWXQil1R5mPyl0ZvSXfijS9x6mSUdUO8nSaG_V84lEyhRLKXxDl2ZzuC5MEyCtj7Sw3FGHtrivhI3cAGTIX7XxDcGjNhN5vMl2kIowmR3wCoISc_UIFUAyIhKtGh1bN09U/s1600/while.png" /></a></div><br />
Debes añadir un bucle "while(1)" para que no termine su ejecución. Quedaría así:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2RMpSZueBhHVaqiUEmdcO3jxvZMO2jQ8wvN-DQO0o3GGXb7qGkaJ4jKqwWtB4CrTkEghHEQ_8z6a1Pa9nirjzjwSyNWwb2X8g-y437GAxw0Dse_CL-OLg-crVylPeq59JwNDP6dhWTx0/s1600/while2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2RMpSZueBhHVaqiUEmdcO3jxvZMO2jQ8wvN-DQO0o3GGXb7qGkaJ4jKqwWtB4CrTkEghHEQ_8z6a1Pa9nirjzjwSyNWwb2X8g-y437GAxw0Dse_CL-OLg-crVylPeq59JwNDP6dhWTx0/s1600/while2.png" /></a></div><br />
Descarga el programa <a href="http://www.bitschips.com/infoind/while.txt">aquí</a>.Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-74334843161704071742011-04-19T15:43:00.004+02:002011-04-21T13:46:52.481+02:00Bucle "while" con dos condicionesEn ocasiones necesitamos controlar la ejecución de ciertas instrucciones. Se pùede hacer utilizando sentencias tipo "while". Este tipo de sentencias permiten ejecutar las instrucciones del bucle (aquellas que están entre las llaves), mientras la condición sea cierta (flecha verde).<br />
<br />
Cuando dicha condición no se cumple (flecha roja), se sale del bucle y se ejecutan las instrucciones que están fuera del mismo. <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGhOvxM4QEnC75tkA9uXeSPEfRgNaR3ZhpxUfNRi7ghPT_Ns3EJwqjn2TzSqTNFwC5h5I-sISY7wLQo2cTc8Zke7we6jvZoKLeh5c2cWAE7iCrJzAFxd0duSYIiwmmwPAW5homoxsNCWg/s1600/bucle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="340" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGhOvxM4QEnC75tkA9uXeSPEfRgNaR3ZhpxUfNRi7ghPT_Ns3EJwqjn2TzSqTNFwC5h5I-sISY7wLQo2cTc8Zke7we6jvZoKLeh5c2cWAE7iCrJzAFxd0duSYIiwmmwPAW5homoxsNCWg/s400/bucle.png" width="400" /> </a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Si deseamos controlar 15 desbordamientos, nuestro bucle sólo tendrá una condición >> que el número de desbordes sea menor que quince:</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj3xq-UuYt2IFLWg137xcDDemgeOjjlh369iqtCQRYqrBqdxSCpJYJq13Ali0TAR2cGSrH7OyUYfDkpWbNTXGvTmp1qWevkj1CxV3EiEq_cAH3bD2tu21TkOCkCw5NfKVaADu-oh2J6k4/s1600/bucle2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="343" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj3xq-UuYt2IFLWg137xcDDemgeOjjlh369iqtCQRYqrBqdxSCpJYJq13Ali0TAR2cGSrH7OyUYfDkpWbNTXGvTmp1qWevkj1CxV3EiEq_cAH3bD2tu21TkOCkCw5NfKVaADu-oh2J6k4/s400/bucle2.png" width="400" /> </a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;">El bucle anterior ejecutará las instrucciones mientras la condición sea cierta (desbordes<15). Como se ejecutan las instrucciones del bucle, se comprueba si el temporizador desborda mirando "TF0" e incrementando la variable. Cuando llegue a quince, el bucle termina. En este caso sólo hay una condición.</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><b> Pero ¿cómo haríamos para detener el temporizador si el usuario pulsa "P0_0"?</b></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; color: blue; text-align: center;"><u><b>OPCIÓN I</b></u></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: left;">Si incluimos otra condición que compruebe el puerto, conseguiremos que el temporizador no llegue a la cuenta especificada, ya que saldrá del bucle, pero habrá que detenerlo incluyendo la instrucción "TR0=0":</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo0GRvEqHCjckZ3r14n9d7bcE6JEEd22YvhIbiaAsgZ8XWbtEI-Sll19O_DXzjZ6wZCvc4AhtvodsC8Rgx7B9G5YfviODq4Ubfp_MtEjfKMLPZ5Lop-7lcmvA9nnooKHWBfufYQ3gRI8M/s1600/bucle3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="351" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo0GRvEqHCjckZ3r14n9d7bcE6JEEd22YvhIbiaAsgZ8XWbtEI-Sll19O_DXzjZ6wZCvc4AhtvodsC8Rgx7B9G5YfviODq4Ubfp_MtEjfKMLPZ5Lop-7lcmvA9nnooKHWBfufYQ3gRI8M/s400/bucle3.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;">La explicación es sencilla. El bucle se ejecuta si se cumplan las dos condiciones: <b style="color: blue;">que no llegue al máximo de desbordes</b> Y <b style="color: blue;">que NO se pulse P0_0</b>.</div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><br />
</div>Cuando se pulse P0_0, al estar negado, su valor en la condición será "0" y la condición será "FALSE" (es una AND) y se terminará el bucle saltando a las instrucciones que haya detrás del mismo, en este caso, la instrucción que desactiva el temporizador (TR0=0).<br />
<div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; color: blue; text-align: center;"><b>OPCIÓN 2 (mejor)</b></div><div class="separator" style="clear: both; text-align: left;">También podemos incluir dentro del bucle la comprobación del puerto, de este modo, podemos detener el temporizador, pero nos mantenemos en el bucle, pudiendo reanudar la temporización cuando se deje de pulsar "P0_0". Es una gran diferencia.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPHWrvt96QjIWNv4L5EM6RqBZPp-_DLcp3z19ZiinQvJWFl1WZrfM7iUQyjMKVzXOmQi4s19ojseonJF8E01TG3mvE2scI-RuP8gwwJrXoFPjlXLY9UJPd3QC_3xNF4KJksmWkN8JP2Rs/s1600/bucle4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="367" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPHWrvt96QjIWNv4L5EM6RqBZPp-_DLcp3z19ZiinQvJWFl1WZrfM7iUQyjMKVzXOmQi4s19ojseonJF8E01TG3mvE2scI-RuP8gwwJrXoFPjlXLY9UJPd3QC_3xNF4KJksmWkN8JP2Rs/s400/bucle4.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;"></div>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-8085641120365263002011-04-17T12:07:00.001+02:002011-04-17T12:09:37.907+02:00Leer los bits 0 y 4 del puerto "P0"<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDwKaQUoQ_oWW9mYJ_IbrWWJF2BpNmx5S4kVxSgb4P111-9uWShI4JMmCmnqMx4HDleU3PIj3P8bixb2bzyUdQPVDo31TB5Tkc-Sj7yuWP_dVnCSX8rUSgfZwSNU4I5vr0g7XMF03YcZM/s1600/ex1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDwKaQUoQ_oWW9mYJ_IbrWWJF2BpNmx5S4kVxSgb4P111-9uWShI4JMmCmnqMx4HDleU3PIj3P8bixb2bzyUdQPVDo31TB5Tkc-Sj7yuWP_dVnCSX8rUSgfZwSNU4I5vr0g7XMF03YcZM/s1600/ex1.png" /></a></div><br />
Observa que la parte del programa principal es "void main(void)" porque no devuelve ningún valor. Sólo realiza una tarea: comprobar los bits 0 y 4 del puerto "P0", pero no devuelve ningún dato. <br />
<a href="http://www.bitschips.com/infoind/ex1.txt"> Descargar programa.</a>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-42195224440214076652011-04-17T11:25:00.001+02:002011-04-17T12:05:43.601+02:00Puedo poner sólo void main (void)En el ejercicio del examen, se pedía que se leyeran los bits "b0" y "b4" del puerto "P0" y si alguno de ellos fuera "1" entonces se pusiera a "1" todos los bits del puerto "P1".<br />
<br />
Algunos de vosotros en el programa habéis puesto "int main (void)" en el punto de entrada al programa. Recuerda que sólo si el programa devuelve un dato, debes utilizar "int". En nuestro caso, el programa controla unos bits de entrada y activa unos bits de salida, pero no devuelve ningún valor.<br />
<br />
El caso en que sí se haría, por ejemplo sería en el caso del cálculo del área de un círculo. Al programa se le pasa el radio y devolvería un entero con el valor del área.Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-79991322146276750872011-04-14T23:02:00.003+02:002011-04-14T23:02:30.623+02:00Concept Nokia: Morph (gracias anónimo)<iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/pwtMrwjFxns" title="YouTube video player" width="640"></iframe>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-81410866778991091622011-04-14T22:26:00.002+02:002011-04-14T22:27:21.417+02:00Futuros usos del grafeno (gracias Alfredo)<iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/-YbS-YyvCl4" title="YouTube video player" width="480"></iframe>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com1tag:blogger.com,1999:blog-6561333251154900986.post-65660319306379003472011-04-11T13:33:00.003+02:002011-04-11T13:39:32.398+02:00Temporizadores · Contar desbordamientosCuando el tiempo que deseamos temporizar es mayor que un desbordamiento, entonces necesitamos una variable externa (por ejemplo un entero) donde ir "acumulando" los desbordamientos.<br />
<br />
Suponiendo que usamos 16bits@12Mhz...<br />
- 1 desbordamiento --> 65.536µs...variable desbordes=1..<br />
- 2 desbordamientos --> 131.072µs...variable desbordes=2..<br />
- 3 desbordamientos --> 196.608µs...variable desbordes=3..<br />
<br />
Es la manera que tenemos de temporizar cantidades grandes. En estos casos, seguimos necesitando controlar cuando se produce el desbordamiento (mirando TF0) para ir incrementando la variable "desbordes".<br />
<br />
Pero sucede que necesitaremos comprobar cuando la variable "desbordes" alcance un valor determinado. Supongamos que deseamos temporizar 1s..<br />
<br />
- 1s = 1000000µs => dividimos entre un desborde completo 65536 = 15 (parte entera).<br />
Por lo tanto para el caso de temporizar 1 segundo, en el bucle de control, tendré que controlar cuando la variable "desbordes" alcanza el valor de 15. Aquí puedes ver un ejemplo:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4h0OnDlbGO-6XJhwPT-xd5B_7GVn-xahekKVnqAow1fugpb63rbDNaUfH-hD5Z5IE46KgSfu93Fbst9ZGznJrLTnvR0MAQVAYs11CDDM4kivcVLA-yoP-lOfunX-H3Vjwl3Ejs_BWzPM/s1600/t1s.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4h0OnDlbGO-6XJhwPT-xd5B_7GVn-xahekKVnqAow1fugpb63rbDNaUfH-hD5Z5IE46KgSfu93Fbst9ZGznJrLTnvR0MAQVAYs11CDDM4kivcVLA-yoP-lOfunX-H3Vjwl3Ejs_BWzPM/s1600/t1s.png" /> </a></div><div class="separator" style="clear: both; text-align: left;">Observa que en el bucle "while" hemos añadido la condición "desbordes<15" para controlar cuando se alcanza el tiempo acumulado correspondiente. Dentro del mismo, debe seguir comprobándose "TF0" para detectar el debordamiento e incrementar la variable. </div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">* Puedes descargar el código <a href="http://www.bitschips.com/infoind/t1s.txt">aquí</a>. </div>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-32230271929593314102011-04-11T12:29:00.013+02:002011-04-11T13:39:14.172+02:00Temporización de 10 msEn el ejemplo, se pedía temporizar 10ms usando el micro visto en clase. Como en todos los ejercicios de temporizadores, hay que seguir unos pasos sencillos:<br />
<br />
1. <b style="color: blue;">Definir </b><b><span style="color: blue;">todos los registros necesarios con "sfr" y "sbit"</span></b>.<br />
Necesitamos: "<span style="color: blue;">TMOD</span>", "<span style="color: blue;">TCON</span>", "<span style="color: blue;">TL0</span>" y "<span style="color: blue;">TH0</span>", además de algunos bits como: "<span style="color: blue;">TR0</span>" y "<span style="color: blue;">TF0</span>".<br />
<br />
2. <b><span style="color: blue;">Escribir el bloque principal de tu programa</span></b>.<br />
Todo programa debe tener un bloque "<span style="color: blue;">void main(void) { }</span>"donde se escriben las instrucciones.<br />
<br />
3. <b><span style="color: blue;">Calcular la cuenta inicial</span></b>.<br />
Nos piden 10ms=10000microsegundos --> 65.536-10.000=55536=0xD8F0. <br />
<br />
3. <b><span style="color: blue;">Asignar </span><span style="color: blue;">los valores a los registros</span></b>.<br />
Configurar el modo de funcionamiento del temporizador y fijar la cuenta inicial (10ms=0xD8F0). <br />
<br />
4. <b style="color: blue;">Empezar la temporización </b><b><span style="color: blue;">y esperar el desborde</span></b>.<br />
El temporizador se pone en marcha con "<span style="color: blue;">TR0</span>" y se espera el desborde mirando "<span style="color: blue;">TF0</span>". Se puede hacer cómodamente con una instrucción while. <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiIFRL6JlEpkMCV78hbBLPyKy-KZwJUkNQ5pJ_G82zluwBUssDdjcQm554gjtMbiQEyClGpsTpftGKAXRcUNAeRMJCUiaxNcQc72LtcoIQhrPQN-VBBTNZGRNJaw90-hqVuO3NZC2U76I/s1600/tem.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiIFRL6JlEpkMCV78hbBLPyKy-KZwJUkNQ5pJ_G82zluwBUssDdjcQm554gjtMbiQEyClGpsTpftGKAXRcUNAeRMJCUiaxNcQc72LtcoIQhrPQN-VBBTNZGRNJaw90-hqVuO3NZC2U76I/s1600/tem.png" /></a></div><br />
<br />
La instrucción "while" funciona del siguiente modo:<br />
<br />
- Si "<span style="color: blue;">TF0</span>" es "0" entonces la condición del bucle es "1" (está negada) y se queda en el bucle..<br />
- Si "<span style="color: blue;">TF0</span>" es "1" entonces la condición del bucle es "0" (está negada) y sale del bucle, ejecutando las instrucciones que tengamos más adelante. Por lo tanto dichas instrucciones se ejecutarán cuando finalice la temporización. Como puedes ver, es una de las muchas maneras que puedes usar para controlar los debordamientos.<br />
<br />
* Puedes descargar el ejercicio <a href="http://www.bitschips.com/infoind/ej1.txt">aquí</a>.Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-38829594536087959412011-04-10T20:41:00.005+02:002011-04-10T21:06:01.422+02:00Temporizadores y condiciones de carreraUn alumno me ha preguntado sobre las condiciones de carrera en los temporizadores. Por ejemplo cuando un temporizador está en modo "contador" para contar piezas, va almacenando el valor en dos registros, que como ya sabéis, son "TH0" y "TL0" para el temporizador "T0".<br />
<br />
Para conocer el valor de la cuenta en un momento dado, el micro mira primero la parte baja del temporizador "TL0" (para ello consume un poco de tiempo). Instantes después mira la para alta del temporizador "TH0" y entonces es cuando ya se tiene el valor real de la cuenta que se almacena en una variable de tu programa.<br />
<br />
Pero, ¿qué ocurre si entre las dos instrucciones de lectura, se produce una interrupción y el programa debe saltar a otra zona de código? Para cuando la ejecución prosiga y si el temporizador no se ha detenido, el valor del temporizador puede haber cambiado, habrá seguido incrementándose y la cuenta podría ser incoherente.<br />
<br />
<div style="color: red;">Un caso típico sería cuando tenemos: "TH0=11111111" y "TL0=11111111". Si se lee primero "TL0" tendremos "11111111". Imagina que en ese momento el programa salta a otra zona de código. El temporizador no se detiene y se producirá un desbordamiento (la cuenta empezará de cero).<br />
<br />
Cuando a la vuelta de la interrupción (pasado un tiempo desconocido) se lea "TH0", se podría tener "00000000" y el valor de "TL0" que habíamos guardado tampoco seria el real (que ha vuelto a empezar de cero incrementándose).</div><br />
Para evitar estas "<b>condiciones de carrera</b>", antes de realizar una lectura del valor del temporizador, siempre se detendrá con la instrucción "TR0=0" y se leerá entonces los registros. De este modo se evitarán las condiciones de carrera (resultados incoherentes), poniéndose en marcha inmediatamente con "TR0=1". En la figura puedes ver como se aplica en este ejemplo de contador de vehículos:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikxd8teXz1Ui2RPPsaNlujFZytFwBttQk4-XAr0YLS2MOwggBQvCFt4bT1Rj44IDGj5LHK0Y85_xeEZWlOhXlxorFNIK8Vd3smTCCib8s6j10BCkZyxz2UIVLVGpn2KS5Ks3i7qVdjAY0/s1600/carrera.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="428" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikxd8teXz1Ui2RPPsaNlujFZytFwBttQk4-XAr0YLS2MOwggBQvCFt4bT1Rj44IDGj5LHK0Y85_xeEZWlOhXlxorFNIK8Vd3smTCCib8s6j10BCkZyxz2UIVLVGpn2KS5Ks3i7qVdjAY0/s640/carrera.png" width="640" /></a></div><br />
<br />
<a href="http://es.wikipedia.org/wiki/Condici%C3%B3n_de_carrera">Condiciones de carrera por Wikipedia</a>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-40476691263244751042011-04-10T20:08:00.004+02:002011-04-10T20:16:03.349+02:00Uso de máscaras en los temporizadoresEn este ejemplo que vimos en clase, se configuraba el temporizador "T0" con un valor determinado. Nos fijaremos en las instrucciones: "<b>TMOD |= 0x01 y TMOD &= 0xF1</b>". En realidad fijan el modo de funcionamiento del temporizador (si es contador/temporizador, el número de bits, etc..) modificando las posiciones de bit del registro.<br />
<br />
La cuestión es ¿por qué para ello hemos utilizado dos operaciones?<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5k6Y-pwBsePqr2tz_uGNqb8w1bBH19WaXwQR01If-9vGScoOjd8noIxKccgdqLMj40TwQaiO5naTKhYve_OUiJdMHLkilRvmZpJotbH61rvpMd-PqFhu0Un7YzfyosIbQN-EyCjozOCU/s1600/pr%25C3%25A1ctica_tem.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5k6Y-pwBsePqr2tz_uGNqb8w1bBH19WaXwQR01If-9vGScoOjd8noIxKccgdqLMj40TwQaiO5naTKhYve_OUiJdMHLkilRvmZpJotbH61rvpMd-PqFhu0Un7YzfyosIbQN-EyCjozOCU/s1600/pr%25C3%25A1ctica_tem.png" /></a></div>Cuando aplicamos la primera operación "TMOD |= 0x01" hacemos una "OR" al registro "TMOD" y ponemos a "1" sólo el primer bit --> 0x01 = 0000000<b style="color: red;">1</b>.<br />
<br />
Lo importante es que al utilizar una "OR", sólo tocamos el bit donde hemos puesto "1s", <b style="color: red;">por lo tanto los demás bits se quedan como estaban</b>. La operación "OR" nos permite poner a "1" los bits que necesitemos manteniendo su estado anterior (sin tocar otros bits).<br />
<br />
No hemos terminado de configurar el registro "TMOD", sólo hemos puesto los "1s". Ahora nos falta poner "0s" en otras posiciones de bit y para ello usaremo la operación "AND". De hecho la línea "TMOD &= 0xF1" pone a cero tres posiciones del registro --> 0xF1 = 1111<b style="color: red;">000</b>1, <b><span style="color: red;">dejando los demás bits sin tocar</span></b>.<br />
<br />
<b>Como resumen, cuando queramos poner "1s" y "0s" en un registro, manteniendo los valores anteriores, debemos usar las máscaras y además hacerlo en dos pasos (OR para poner a "1" y AND para poner a "0").</b><br />
<br />
Y queda la pregunta del millón, ¿por qué querríamos hacerlo de esta manera? pues porque quizá otro programa podría estar usando el temporizador "T1" y los bits que controlan su funcionamiento están también en el mismo registro "TMOD". Si no usáramos máscaras y lo hiciéramos en una sóla operación, estaríamos "machacando" los valores en los bits que controlan el otro temporizador y si se estuviera usando, podríamos alterar su funcionamiento. Sencillo ¿no?Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-8265275090342140572011-04-10T15:29:00.006+02:002011-04-10T19:45:50.884+02:00Temporizadores y frecuencia de reloj (2)Otro caso, veamos el microcontrolador EM6580 de la empresa <a href="http://www.emmicroelectronic.com/default.asp">EM Microelectronic</a>. Echemos un vistazo a su arquitectura en la hoja de características. Indica que tiene un reloj interno, que no necesita componentes externo y que puede funcionar entre 30khz y 800khz. También puede verse que tiene un temporizador de 10 bits, por lo tanto un desbordamiento completo se producirá en 2^10=1024 cuentas.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcJa-88TMsbSc66XziUPI2r9W0ZyLtm7rvThF4lqkMFC6t4PK62xXhkxjQ7dTH9hwQkbrbvBby6_Z8yWKBDTcwvcOySV9ZvTl75kL_LtMuG7OB6HBcnetd4ifM6jwfCyfYJ7bLt4WlaiA/s1600/emm.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcJa-88TMsbSc66XziUPI2r9W0ZyLtm7rvThF4lqkMFC6t4PK62xXhkxjQ7dTH9hwQkbrbvBby6_Z8yWKBDTcwvcOySV9ZvTl75kL_LtMuG7OB6HBcnetd4ifM6jwfCyfYJ7bLt4WlaiA/s400/emm.png" width="382" /> </a></div><div class="separator" style="clear: both; text-align: left;">Ahora miramos, en la hoja de características del micro, el esquema del temporizador para saber a qué frecuencia trabaja y que relación tiene con el reloj del sistema. Se puede ver en la figura siguiente: </div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIjy-WS9WEMhT9BWHLxIYAbIiYUCb1f8QlH_4Zbg2LPBhfal4C7pOB-xHn-nwDlrB2yg14htmxbaCdftKy8q7KWDuPRW7nkYByPFmKGlk_1QqFcuNghU3GTDzRrd5cC3Xl5uB8bE1ZF3c/s1600/emm.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="371" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIjy-WS9WEMhT9BWHLxIYAbIiYUCb1f8QlH_4Zbg2LPBhfal4C7pOB-xHn-nwDlrB2yg14htmxbaCdftKy8q7KWDuPRW7nkYByPFmKGlk_1QqFcuNghU3GTDzRrd5cC3Xl5uB8bE1ZF3c/s640/emm.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Lo que podemos ver aquí es que la señal que incrementa el temporizador "Out-ck", no depende de la señal de reloj del sistema. No podemos ver algo como en el caso del PIC, donde la señal de reloj se divide para alimentar el temporizador. Lo que vemos es que hay una serie de frecuencias que pueden seleccionarse, desde 1hz (la mínima) hasta 16khz (la máxima). Se podrá elegir entre ellas.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;">Supongamos que tomamos la frecuencia mínima: 1hz. Su periodo T=1/1hz=1s.</div><div class="separator" style="clear: both; text-align: left;">Esto quiere decir que a cada tic (1segundo), el temporizador se incrementa. </div><div class="separator" style="clear: both; text-align: left;">Si utilizamos 10bits, un desbordamiento completo será 2^10=1024s= 17,07minutos.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Si miramos un poco más adelante en la hoja de características, veremos que coincide este valor (texto señalado en color rojo). También puedes ver que utilizando una frecuencia mayor, el tiempo de desbordamiento será mucho menor.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjim8xerrqtr4giNN8euMsZNCWRk-LlwiWlkGkiiLHT1GruhkLp38BMPvVh74eHwoQEosAy2-I_XJbhBe0ZiKmez05S0MTd1YUTl7Mjtpz1BmQtJX9_9uOvLyv0Rthefz8eZ73L359xxtY/s1600/emm2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjim8xerrqtr4giNN8euMsZNCWRk-LlwiWlkGkiiLHT1GruhkLp38BMPvVh74eHwoQEosAy2-I_XJbhBe0ZiKmez05S0MTd1YUTl7Mjtpz1BmQtJX9_9uOvLyv0Rthefz8eZ73L359xxtY/s640/emm2.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: left;">Como has podido comprobar en este ejemplo, la frecuencia de reloj utilizada para el temporizador, no está relacionada con la frecuencia de reloj del sistema en un factor proporcional como en otros micros. Aquí hay disponibles las frecuencias de 1hz, 8hz, 128hz, 512hz, 2khz y 16khz y para cada una de ellas, el tiempo de desbordamiento será diferente.</div>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-90206223332474592092011-04-09T19:08:00.003+02:002011-04-10T15:24:21.284+02:00Temporizadores y frecuencia de relojCuando trabajamos con temporizadores, lo primero que debemos tener en cuenta en su frecuencia de trabajo, que está relacionada directamente con el reloj del sistema. Sólo tienes que mirar las tablas y localizar el esquema del temporizador: Por ejemplo, en la figura de abajo, puedes ver el esquema del temporizador de un PIC16F84. Observa que está alimentado por 1/4 de la frecuencia del reloj. Este dato es importante, porque así puedes saber a cuanto tiempo corresponde un desbordamiento completo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJIIf50Fk0wAtKLTNu-P8q8yEXJ9p8HcYpU4vcItjeN-ObbsO6xPRc39ODCLq6y8CNMVTRtA9e5v98qt6Q7YYgkikMsOLg7PNGbRAemXZZy7E3-nhp8tcbuwbjrabLgaeFIHhxSvhxfaw/s1600/timepic.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="251" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJIIf50Fk0wAtKLTNu-P8q8yEXJ9p8HcYpU4vcItjeN-ObbsO6xPRc39ODCLq6y8CNMVTRtA9e5v98qt6Q7YYgkikMsOLg7PNGbRAemXZZy7E3-nhp8tcbuwbjrabLgaeFIHhxSvhxfaw/s640/timepic.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: left;"><br />
</div>Supongamos que este micro funciona con un reloj a 4Mhz. El periodo T=0,25µs.<br />
Según este esquema, el temporizador funcionaría a 4Mhz/4=1Mhz. El periodo T=1µs.<br />
<br />
Esto quiere decir que la cuenta del temporizador para este micro se incrementa cada 1µs.<br />
Para un temporizador de 16bit@4Mhz, una cuenta completa temporizará 65536µs.Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-42593255193597866532011-04-09T08:57:00.004+02:002011-04-09T17:57:29.728+02:00Temporizador en el micro AT89S8253Aquí puedes ver la estructura interna de un microcontrolador. Algunos tienen el oscilador interno, otros necesitan algunos componentes externos como en este caso. Observa el rectángulo remarcado en verde. Es el oscilador encargado de generar la señal de reloj que sincroniza todas las operaciones y que también es utilizada como base de tiempos para los temporizadores.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0_6G0qFDsnTH0bnAM1-yzGuorfUwPQq01rlvHBUZV6LPqgI6bO5sHoEtrNIS1cazW0SLRWh6w7p8V8UlGD3mM4tbc4E8DuZ4u5P2PsEklvpt5mSBIweZhXMq-b9zZXPcYXkcv0K-T9wU/s1600/timer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="632" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0_6G0qFDsnTH0bnAM1-yzGuorfUwPQq01rlvHBUZV6LPqgI6bO5sHoEtrNIS1cazW0SLRWh6w7p8V8UlGD3mM4tbc4E8DuZ4u5P2PsEklvpt5mSBIweZhXMq-b9zZXPcYXkcv0K-T9wU/s640/timer.png" width="640" /> </a></div><div class="separator" style="clear: both; text-align: left;">En este caso, que corresponde al micro visto en clase, puedes ver que hay que añadir dos condensadores y un cristal de cuarzo que determina la frecuencia del reloj. Nosotros usamos un cristal de 12Mhz pero en función del micro, podrás utilizar otros cristales. En la web de <a href="http://sites.google.com/site/rubenloredoamaro/microcontroladores/practica-1-programador-at89s8253">Rubén Loredo</a> puedes ver un esquema de un programador para este micro. Puedes descargar el esquemático y fabricarte tu placa. En el diagrama, señalado en color rojo, puedes ver el espacio para los dos condensadores y el cristal de cuarzo que configuran el reloj del sistema:</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: center;"><a href="http://sites.google.com/site/rubenloredoamaro/microcontroladores/practica-1-programador-at89s8253"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuyZWy5e84nYWfSBlyGO-dEr6ZRNpRXCy_w919Y1_sfRZcdri0q_2L_w-jPpPuIalstGqel0z3piH0tbcbaAVBlLqcFRASvT0b4deHkFIOZXJUfzE_YwGy2RICTdG95qvaouK780JNLEw/s400/reloj.png" width="328" /> Página de Rubén Laredo</a></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Este micro necesita elementos externos para activar el reloj, en otros micros se hacen innecesarios.</div>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-63026795077600017732011-04-08T17:44:00.003+02:002011-04-10T19:47:39.387+02:00¿De qué depende la cuenta máxima de un temporizador?<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: left;">Cuando usamos temporizadores, la cuenta se almacena en un registro que puede tener ser de 8, 13 ó 16 bits. Cada vez que el reloj del sistema hace "clic", el temporizador incrementa la cuenta. En el micro visto en clase, sabemos que el temporizador se incrementa cada microsegundo, por lo tanto su máxima cuenta será la que pueda alcanzar hasta que desborde. Recuerda que cuando llega a la máxima cuenta, vuelve a empezar desde cero.</div><div class="separator" style="clear: both; text-align: center;"><img border="0" height="329" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg0PlSphXvfTQhORVesdQqgUQrHtc_m1P6X0oLP0ehFd1jBbQC5HmFpkz9u92LK_5Zm5lWBV4pisarInW-ZIUmtMvga_wlqn9073VbWRaDo_6SZR9Y3ZjDJzZ_4L9u2G53omMFjO0MwbA/s640/nbits.png" width="640" /></div>Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-44691390196821193412011-04-05T07:17:00.005+02:002011-04-05T08:04:39.609+02:00Más temporizadoresHoy terminaremos el tema de temporizadores. Veremos como se usan las interrupciones y haremos ejercicios que grabaremos en Keil para comprobar la temporización.<br />
<br />
Realizar el <a href="http://www.bitschips.com/infoind/interrupciones.pdf">cuestionario</a>. <br />
<br />
<b>Práctica 1</b> · Escribe este programa en Keil. Corrige los errores y comprueba que realiza la temporización, definiendo una salida 0 del puerto "P0". ¿Cuánto tiempo está temporizando?<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5k6Y-pwBsePqr2tz_uGNqb8w1bBH19WaXwQR01If-9vGScoOjd8noIxKccgdqLMj40TwQaiO5naTKhYve_OUiJdMHLkilRvmZpJotbH61rvpMd-PqFhu0Un7YzfyosIbQN-EyCjozOCU/s1600/pr%25C3%25A1ctica_tem.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5k6Y-pwBsePqr2tz_uGNqb8w1bBH19WaXwQR01If-9vGScoOjd8noIxKccgdqLMj40TwQaiO5naTKhYve_OUiJdMHLkilRvmZpJotbH61rvpMd-PqFhu0Un7YzfyosIbQN-EyCjozOCU/s400/pr%25C3%25A1ctica_tem.png" width="400" /></a></div><br />
<b>Práctica 2</b> · Reescribe el programa anterior para conseguir una temporización de 5 segundos. Añade la opción de ponerlo en marcha sólo cuando el pin "P0.4" esté activo.Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0tag:blogger.com,1999:blog-6561333251154900986.post-34534454189063266812011-03-28T16:06:00.007+02:002011-04-19T08:14:14.538+02:00Uso de temporizadoresEmpezamos el estudio de los temporizadores.<br />
<br />
1. Descarga y estudia el tema <a href="http://www.bitschips.com/infoind/tema_temporizadores.pdf">aquí</a>.<br />
2. Realiza los ejercicios del <a href="http://www.bitschips.com/infoind/cuestionario_temporizadores.pdf">cuestionario</a>.<br />
3. Repasa haciendo estos 4 <a href="http://www.bitschips.com/infoind/4ejercicios.pdf">ejercicios</a>.<br />
4. Ejercicios <a href="http://www.bitschips.com/infoind/ejercicios_temporizadores.pdf">temporizadores/contadores</a>.<br />
5. Dos <a href="http://www.bitschips.com/infoind/problemas_examen.pdf">problemas </a>de examen (temporizadores por consulta).<br />
6. Cuatro <a href="http://www.bitschips.com/infoind/problemas_temporizadores_int.pdf">problemas </a>de temporizadores por interrupción.Luis Thttp://www.blogger.com/profile/10267697192186640295noreply@blogger.com0