<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Gzaloprgm</title><link>http://gzaloprgm.com.ar/</link><description>Feed RSS de posts de Gzaloprgm</description><language>es</language><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Gzaloprgm" /><feedburner:info uri="gzaloprgm" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>¡Felices fiestas!</title><description><![CDATA[<p>Espero que tengan una buena navidad y año nuevo!</p>

<p>Muchas gracias por visitar diariamente mi sitio.</p>

<p>Cambié el diseño del sitio por uno un poco más "bloggero" y agregué un sistema de comentarios. Espero que les guste.</p>
]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/69a-PcAtrtU/</link><feedburner:origLink>http://gzaloprgm.com.ar/navidad2011/</feedburner:origLink></item><item><title>Placa entrenadora para 8052</title><description><![CDATA[<p>Esta placa permite iniciarse con microcontroladores compatibles con 8051/2 (con programación serial) como por ejemplo el AT89S52 o el AT89S8253.</p>

<p>
<a href="/descargar/8052training/">Descargar esquemático e impreso editable en proteus</a>
</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/LnNn7NWV_Cc/</link><feedburner:origLink>http://gzaloprgm.com.ar/entrenadora8052/</feedburner:origLink></item><item><title>Placa para acelerómetro</title><description><![CDATA[<p>Esta placa puede ser usada con el acelerómetro de dos ejes MMA3202KEG</p>

<p><a href="/descargar/accelerometer/">Descargar circuito impreso editable en proteus</a></p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/-zyYT0EU97Y/</link><feedburner:origLink>http://gzaloprgm.com.ar/acelerometro/</feedburner:origLink></item><item><title>Calculador de divisor resistivo</title><description><![CDATA[<script type="text/javascript">
//

function roundNumber(num, dec) {
	var result = Math.round( Math.round( num * Math.pow( 10, dec + 1 ) ) / Math.pow( 10, 1 ) ) / Math.pow(10,dec);
	return result;
}
function parse(val, scale){
	var l = parseFloat(val);

	if(scale == "Pico") 	l /= 1000000000000;
	if(scale == "Nano")		l /= 1000000000;
	if(scale == "Micro")	l /= 1000000;
	if(scale == "Mili")		l /= 1000;
	
	if(scale == "Kilo")		l *= 1000;
	if(scale == "Mega")		l *= 1000000;
	if(scale == "Giga")		l *= 1000000000;	
	
	return l;
}
function compute(){
	var r1 = parse($("#r1").val(), $("#r1Scale").val());
	var r2 = parse($("#r2").val(), $("#r2Scale").val());
	
	if((r2+r1) == 0) return false;
	
	var t = (r2 / ( r2 + r1) ) *  $("#vin").val();
		
	$("#vout").val(roundNumber(t,3) + " volts");
	
	if(t<1){
		$("#vout").val(roundNumber(t*1000,3) + " milivolts");
	}
	
	return false;
}
$(document).ready(function () {
	$("input").keyup(compute);
	$("select").change(compute);
	compute();	
});
//
</script>
<p>Dadas dos resistencias y un voltaje de entrada, esta página calcula cual será el voltaje de salida del divisor resistivo.</p>
<form action="">
<p>R1: <input name="r1" value="2.7" id="r1"/><select name="r1Scale" id="r1Scale">
  <option></option>
  <option selected="selected">Kilo</option>
  <option>Mega</option>
</select>Ohms</p>
<p>R2: <input name="r2" value="5.6" id="r2"/><select name="r2Scale" id="r2Scale">
  <option></option>
  <option selected="selected">Kilo</option>
  <option>Mega</option>
</select>Ohms</p>
<p>Vin: <input name="vin" value="5" id="vin"/> Volts</p>
<p>Vout: <input name="vout" disabled="disabled" id="vout"/></p>
</form>
<img src="/images/divisorresistivo.png" alt="Divisor resistivo"/>
<p>Un divisor resistivo (también llamado divisor de tensión o de potencial) es un circuito lineal que produce un voltaje de salida (Vout) que es una fracción del voltaje de entrada (Vin)</p>
<p>El divisor de voltaje más sencillo cuenta con dos resistencias puestas en serie, tomando el nodo del medio como el voltaje de salida. Suele ser usado para crear un voltaje de referencia, o para obtener una señal de bajo voltaje proporcional a un voltaje medido (atenuador de señal).</p>
<p>La carga conectada a la salida produce un efecto carga. Es decir, al conectarla disminuye la tensión de salida. Por esto, conviene que la corriente de entrada sea mucho mayor a la corriente de salida. La desventaja de hacer esto es que la mayor parte de la corriente de entrada se pierde en forma de calor en las resistencias.</p>
<p>La impedancia de salida del divisor resistivo es igual a la resistencia cuando R1 y R2 están en paralelo, es decir Rout = (R1*R2)/(R1+R2).</p>
<p>Palabras clave: calcular tension resistencia, resistencias en series, impedancias en serie</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/g1ZhaX-6jYo/</link><feedburner:origLink>http://gzaloprgm.com.ar/divisor_resistivo/</feedburner:origLink></item><item><title>Control de motores con puente H</title><description><![CDATA[<p>Hay tres tipos de control de motor de corriente continua:</p>
<ul>
	<li>Apagado/Prendido: El motor se puede apagar y prender</li>
	<li>Apagado/Adelante/Atrás: El motor se puede apagar y hacer girar en ambas direcciones</li>
	<li>Apagado/Adelante/Atrás/Frenado: Además del anterior, el motor se puede "frenar", cortocircuitando sus terminales</li>
</ul>
<p>Además, es posible controlar la velocidad de los motores por modulación de ancho de pulso (PWM), siempre que el sistema lo permita.</p>
<h3>Primer modo: Apagado/Prendido</h3>
<p>Este es el modo más sencillo, se puede realizar tanto con un transistor como con un relé:</p>
<p><img src="/images/ph1.png" alt="Control apagado-prendido de motor con transistor"/>
   <img src="/images/ph1_r.png" alt="Control apagado-prendido de motor con relé"/>
</p>
<p>Como se puede ver en el primer circuito, es un transistor operando como interruptor. El diodo es necesario porque, al ser el motor una carga inductiva, cuando se le corta la tensión retiene parte de la energía y la libera en el sentido inverso, lo que podría quemar los transistores. Los diodos deberían ser del tipo ultrarrápido si la señal de comando usa PWM.</p>
<p>El segundo circuito es similar, con la diferencia que el elemento de control es el relé. Es mucho más sencillo, soporta un motor de mucha más corriente, tiene menos caída de tensión y el motor puede utilizar otra fuente de tensión (es decir, está teóricamente aislado). El problema es que los relé tienen una vida útil limitada, no se puede usar PWM de alta frecuencia, y la bobina del relé agrega un consumo considerable en el caso que se manejen motores de baja corriente.</p>
<h3>Segundo modo: Apagado/Adelante/Atrás</h3>
<p>Este método es interesante porque se puede usar para realizar robots, autos radio controlados, entre muchas otras cosas. Al igual que el anterior, se puede realizar con transistores como con relés:</p>
<p><img src="/images/ph2.png" alt="Control apagado-adelante-atrás con relés"/>
   <img src="/images/ph2_t.png" alt="Control apagado-adelante-atrás con transistores"/>
</p>
<p>En el primer circuito, cada relé controla a qué tensión va conectada cada una de las terminales del motor, por lo que hay 4 combinaciones:</p>
<table>
	<tr><td class="f">Relé izquierdo</td><td class="f">Relé derecho</td><td class="f">Resultado</td></tr>
	<tr><td>Apagado</td><td>Apagado</td><td>Motor frenado</td></tr>
	<tr><td>Apagado</td><td>Prendido</td><td>Motor girando para adelante</td></tr>
	<tr><td>Prendido</td><td>Apagado</td><td>Motor girando para atrás</td></tr>
	<tr><td>Prendido</td><td>Prendido</td><td>Motor frenado</td></tr>
</table>
<p>En el segundo circuito, cada transistor interrumpe o deja pasar corriente al motor, por lo que hay 16 combinaciones:</p>
<table>
	<tr><td class="f">A</td><td class="f">B</td><td class="f">C</td><td class="f">D</td><td class="f">Resultado</td></tr>
	<tr><td>0</td><td>0</td><td>0</td><td>0</td><td>Motor cortocircuitado a +V</td></tr>
	<tr><td>0</td><td>0</td><td>0</td><td>1</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>0</td><td>0</td><td>1</td><td>0</td><td>Motor flotando</td></tr>
	<tr><td>0</td><td>0</td><td>1</td><td>1</td><td>Motor girando para adelante</td></tr>
	<tr><td>0</td><td>1</td><td>0</td><td>0</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>0</td><td>1</td><td>0</td><td>1</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>0</td><td>1</td><td>1</td><td>0</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>0</td><td>1</td><td>1</td><td>1</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>1</td><td>0</td><td>0</td><td>0</td><td>Motor flotando</td></tr>
	<tr><td>1</td><td>0</td><td>0</td><td>1</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>1</td><td>0</td><td>1</td><td>0</td><td>Motor flotando</td></tr>
	<tr><td>1</td><td>0</td><td>1</td><td>1</td><td>Motor flotando</td></tr>
	<tr><td>1</td><td>1</td><td>0</td><td>0</td><td>Motor girando para atrás</td></tr>
	<tr><td>1</td><td>1</td><td>0</td><td>1</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>1</td><td>1</td><td>1</td><td>0</td><td>Motor flotando</td></tr>
	<tr><td>1</td><td>1</td><td>1</td><td>1</td><td>Motor cortocircuitado a masa</td></tr>
</table>
<p>Como se puede ver, este circuito también se lo conoce con el nombre de Puente H "quemable", porque una entrada puede quemar todos los transistores. Por esto se le acopla lógica externa para evitar que esto suceda. Con transistores buenos (poco VCEmin) es posible lograr un rendimiento del orden del 90%, a diferencia de los relés, cuya corriente de bobina reduce el rendimiento. Además, con los transistores es posible regular la velocidad del motor, usando PWM.</p>
<h3>Tercer modo: Híbrido</h3>
<p>Considerando que por lo general en un sistema es poco frecuente el cambio de dirección de un motor, es posible combinar los dos sistemas anteriores y hacer un híbrido, en el que un relé se use para cambiar la dirección, y un transistor para variar la velocidad. Este método está en el medio de los dos:</p>
<ul>
	<li>Corriente extra: consume más que el puente H puro con transistores, pero menos que el hecho todo con relés</li>
	<li>Rendimiento: tiene una caída de tensión media, más que el hecho con relés, pero menos que el hecho con transistores</li>
	<li>Costo: al necesitar solamente dos transistores (solamente uno de potencia) y un relé, es bastante barato</li>
	<li>Control de velocidad: Es posible controlarla usando PWM en el transistor que apaga y prende el motor</li>
	<li>Facilidad de uso: No hay una combinación en la que exploten los transistores</li>
</ul>
<p><img src="/images/ph3.png" alt="Puente H híbrido con transistores y relés"/>
</p>
<p>Estos métodos pueden ser utilizados tanto con motores como con cualquier otra carga a la que sea necesario cambiar su polaridad, como por ejemplo una celda peltier. Sería posible controlar la temperatura via PWM (con un lazo de realimentación) y además invertir su polaridad, para hacer que caliente en vez de enfriar.</p>
<p>Palabras clave: Puente h con relevadores, puente h con relés, puente h, girar motor con transistores, puente h con 2 relevadores, puente h con transistores</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/DXya4UAuWjs/</link><feedburner:origLink>http://gzaloprgm.com.ar/puenteh/</feedburner:origLink></item><item><title>Juego de cartas de electrónica</title><description><![CDATA[<p>Es un juego que hice de proyecto final de una materia para el colegio. Es un juego de cartas multijugador (anda via LAN e internet). La idea era hacer algo similar al juego de las cartas pokémon, pero con cartas graciosas. 
</p>
<p><a href="http://code.google.com/p/electronica-tgc/">Bajar código y ejecutable</a> 
(Licencia: GPL2) </p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/fi_D7FyrQKk/</link><feedburner:origLink>http://gzaloprgm.com.ar/electronica-tcg/</feedburner:origLink></item><item><title>Motor de tiles con HTML5/Canvas</title><description><![CDATA[<p>Es un "motor" de tiles que corre en el navegador, soporta scrolling y cambios dinámicos. No usa Flash, usa HTML5, por lo que seguramente funcione en iPad/iPod. Pueden usarlo para crear RPGs vistos desde arriba, juegos de plataforma, de defensa de torres, entre otras cosas. </p>

<p><a href="/descargar/te/">Descargar código</a> ( (Licencia: Dominio público salvo el tileset que es de JohnSmith27) </p>
]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/srbLZ24es88/</link><feedburner:origLink>http://gzaloprgm.com.ar/te/</feedburner:origLink></item><item><title>CMDNotepad - Ejecutá comandos discretamente</title><description><![CDATA[<p>Básicamente es un clon del bloc de notas de windows (Copìé menúes, iconos, interfaz), pero con algunos comandos ocultos que permiten ejecutar comandos como si estuvieras en la línea de comandos (CMD.exe) pero de forma más discreta, haciendo que parezca que estás escribiendo un texto en bloc de notas. </p>

<p>Lo hice en el 2008, usando visual basic 6, en un par de horas. En la descarga pueden encontrar el código fuente, si lo quieren modificar y redistribuir no hay ningún problema (siempre que me nombren)</p>

<p>Por un pequeño bug no funciona si no son administradores, pero lo pueden corregir cambiando c:\temp.txt por temp.txt y recompilando el proyecto.
</p>
<p><a href="/descargar/cmdnotepad/">Descargar fuente + ejecutable</a></p>
]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/3E32MU5LRTU/</link><feedburner:origLink>http://gzaloprgm.com.ar/cmdnotepad/</feedburner:origLink></item><item><title>Convertir una tensión en un valor digital, sin usar ADC</title><description><![CDATA[<p>Hay veces en las que necesitamos leer desde sensores, potenciómetros u otros dispositivos analógicos, desde un microcontrolador barato sin ADC.</p>
<p>Acoplar un ADC externo hace que necesitemos más patas en el micro (generalmente el valor sampleado se da en un bus de datos de 8 bits, como en el ADC0808), más espacio en el circuito impreso, o más complejidad en el software (por ejemplo, habría que programar rutinas para comunicarse via I2C con el ADC)</p>
<p>Si no nos interesa la resolución, precisión, linealidad, tiempo de sampleo, una solución es usar un circuito RC, usando un estilo de conversión similar al de doble rampa, pero sin integrar, unicamente contando el tiempo que tarda en descargarse el RC</p>
<img src="/images/rc.png" alt="Circuito RC"/>
<p>La resistencia puede ser cambiada por un termistor (PTC o NTC) si se quiere medir temperatura, o un LDR si se quiere medir luminosidad. También es posible usar un sensor capacitivo, manteniendo fija la resistencia en algún valor conocido.</p>
<p>Es necesario tener una pata de E/S en el microcontrolador, que permita poner la pata en estado de alta impedancia</p>
<p>El principio de funcionamiento es el siguiente: </p>
<ul>
	<li>Ponemos la pata en positivo durante 1 ms, para cargar el capacitor</li>
	<li>Ponemos la pata en modo entrada (alta impedancia) y medimos cuanto tarda en descargarse el capacitor</li>
	<li>Repetimos este ciclo cada 50ms</li>
</ul>
<img src="/images/descarga.png" alt="Ciclo carga descarga capacitor"/>
<p>Si no tenemos puertos con posibilidad de setear un modo de entrada/alta impedancia (como en el 8052), podemos usar un par de componentes más, como se muestra en el circuito siguiente:</p>
<img src="/images/rcz.png" alt="ADC sin puertos de alta impedancia"/>
<p>Como se puede ver, el diodo hace que el capacitor solo pueda ser cargado, la resistencia extra evita algún posible cortocircuito en caso de que el potenciómetro esté en 0 ohms (puede ser removido si sabemos que tiene límite el puerto). El transistor y la resistencia de base se usan para sensar cuando la tensión del capacitor es menor a 0.7v</p>
<p>Un problema de este tipo de conversor es que depende de la tensión (por ejemplo si el circuito fuese alimentado a 3.3v, el capacitor tardaría mucho menos en cargarse), la baja resolución (que se puede mejorar usando interrupciones y no midiendo manualmente), y que necesita bastante tiempo de sampleado (pero se puede tunear para cada aplicación)</p>
<p>Cómo usarlo (en C)</p>
<pre><code>
	unsigned short tiempo=0;
	PIN_CARGA = 1; delay1ms(); PIN_CARGA = 0; //Cargar el capacitor	
	while(EJE0_LECTURA == 0) tiempo++; //Esperar descarga
	
</code></pre>
<p>Al valor resultante (16 bits) habría que restarle una constante, y escalarlo para obtener un valor entre 0 y 0xFF.</p>
<p>Palabras clave: sigma delta, doble rampa, rampa, integración, adc pic, adc avr, adc 8052</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/_x-mHyojLDg/</link><feedburner:origLink>http://gzaloprgm.com.ar/adcsinadc/</feedburner:origLink></item><item><title>Calculadora con 8052</title><description><![CDATA[<p>Hice una pequeña calculadora con un 8052, un lcd alfanumérico y un teclado de 4x4.</p>
<p>El esquemático seguro está incompleto o tiene errores ya que la hice en una placa universal, pero las conexiones se pueden deducir mirando el código. Soporta notación natural (infija), multiplicaciones, sumas, restas, divisiones, potencias, raices, paréntesis. La precisión depende del compilador usado (SDCC tiene unas librerías de float menos precisas que el Keil uVision)</p>
<p>El algoritmo usado es Shunting-Yard (para pasar la expresión a notación postfija) y luego se evalua la pila resultante de forma sencilla. Se usan algunos trucos para aprovechar mejor la memoria (necesita menos de 256 Bytes de RAM!) reusando estructuras.</p>
<p><a href="/descargar/calc8052">Descargar esquemático y programación</a></p>
<p><img src="/images/calc.jpg" alt="8052 calculadora"/></p>
<p>Palabras clave: hacer calculadora pic, calculadora avr, calculadora 8052, calculadora con microcontrolador, calculadora electronica, lcd alfanumerico, hacer una calculadora</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/IuilwACWb48/</link><feedburner:origLink>http://gzaloprgm.com.ar/calc8052/</feedburner:origLink></item><item><title>GonGraphIX</title><description><![CDATA[<p>GonGraphIX es un motor para diseñar juegos, enfocado en tener código sencillo y fácil de entender. Está siendo desarrollado en C++, usando OpenGL 3.0 y GLFW.</p>
<p>Cosas que soporta:
	<ul>
		<li>Iluminación dinámica usando sombreado diferido.</li>
		<li>Luces direccionales, punto, spot</li>
		<li>Shaders: Mapeo de normales, agua, cielo, mapeo reflectivo</li>
		<li>Multiplataforma, soporte multihilo, librería matemática</li>
		<li>OpenGL 3 core profile usando GLFW</li>
		<li>Sistema de audio 3D usando FMOD</li>
		<li>Soporte de cámaras en 1era y 3era persona</li>
		<li>Manejador de eventos con soporte para mouse, teclado, joysticks, joypads</li>
		<li>Juegos en red usando UDP, server multihilo</li>
		<li>Carga de archivos Obj, texturas PNG</li>
		<li>Interfaz con soporte para botones, etiquetas, listas, menúes, barras deslizadoras, cajas de texto</li>
		<li>Sistemas de partículas usando point sprites</li>
	</ul>
</p>
<p><img src="/images/ggfx1.png" alt="Normal mapping"/> <img src="/images/ggfx2.png" alt="Iluminación dinámica"/><br/>
<img src="/images/ggfx3.png" alt="Terreno y cielo"/> <img src="/images/ggfx4.png" alt="Interfaz, carga de modelos"/></p>
<p>En desarrollo junto a <a href="http://twitter.com/#!/JosAtJarvix">Jos Kuijpers</a>. Diseño de ventanas por <a href="http://www.taringa.net/perfil/Roprgm">Rodrigo Belfiore</a></p>
<p>Palabras clave: motor opengl, juegos opengl, juegos glsl, shaders glsl, bump mapping, normal mapping, iluminación deferida, deferred shading, glew, glee, glfw, sdl, fmod</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/x5H3rYcDvJo/</link><feedburner:origLink>http://gzaloprgm.com.ar/ggfx/</feedburner:origLink></item><item><title>Compilando programas de C o C++ usando GCC/G++</title><description><![CDATA[<p>Los programas de un proyecto suelen estar compuestos de varios archivos de código fuente, con extensión .c o .cpp (en caso de ser C++). Compilar cada uno de estos archivos resulta en archivos .o, llamados código objeto. Estos archivos contienen el código fuente traducido a código máquina.</p>
<p>Luego de tener todos los archivos .o resultantes (y los .a que corresponden a librerías dinámicas), es necesario juntarlos para formar el .exe final, usando un enlazador. Este proceso se encarga de unirlos, haciendo que las referencias entre las distintas partes funcione correctamente. </p>
<p>El proceso completo se puede ver en esta imagen:<br/><img src="/images/com_enlazado.png" alt="Proceso de compilación y enlazado"/></p>
<p>En la implementación de compiladores de GCC (tanto el de Linux como el que se puede instalar en Windows mediante Mingw), el ejecutable principal se llama <code>gcc</code>, y se encarga tanto de la compilación como del enlazado.</p>
<p>Supongamos que quisieramos armar el "Programa.exe" como muestra la imagen. Estos serían los pasos:</p>
<ol>
	<li>Primero necesitamos compilar Archivo1.c para generar Archivo1.o. Esto se puede hacer con el siguiente comando: <code>gcc Archivo1.c -o Archivo1.o</code></li>
	<li>Luego necesitamos compilar Archivo2.c, al igual que el paso anterior. Para eso usamos un comando similar: <code>gcc Archivo2.c -o Archivo2.o</code></li>
	<li>Finalmente, enlazamos las tres cosas (los dos .o y la librería .a), mediante el comando <code>gcc Archivo1.o Archivo2.o Lib1.a -o Programa.exe</code></li>
</ol>
<p>Luego de este último paso, si no hubieron errores, se debería haber creado un ejecutable Programa.exe.</p>
<p>Si estuviésemos compilando archivos de C++, cambiar <code>gcc</code> por <code>g++</code>, y las extensiones por .cpp debería ser suficiente.</p>
<p>El proceso de compilación puede ser automatizado usando un archivo .bat que contenga todas los comandos a ejecutar (en orden, uno por línea). También es posible automatizarlo aún más, utilizando una herramienta llamada <code>make</code>, que permite, entre otras cosas, evitar la recompilación de algúnos códigos fuente que no hayan cambiado.</p>
<p>Palabras clave: compilando con mingw, compilando con dev-cpp, devc++, djgpp, geany, gedit, notepad++, compilación de programas de c++</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/oAs2DuKurY8/</link><feedburner:origLink>http://gzaloprgm.com.ar/tut_compilando/</feedburner:origLink></item><item><title>Haciendo un editor simple de fuentes pixeladas</title><description><![CDATA[<p>En este pequeño tutorial mostraré como hacer un editor de fuentes píxel de 8x8, útil para diseñar tu propia tipografía. Usaré C++ y SDL (para acceder a la pantalla y eventos). Conocimiento de C/C++ es recomendado.</p>
<p>Primero necesitamos incluir todas los archivos cabecera (headers, extensión .h) de todas las librerías que vayamos a usar en el editor. Estos archivos incluyen prototipos de funciones (dicen como se llaman, la cantidad y tipos de argumentos, el tipo de retorno) y son necesarios para que el compilador pueda escribir correctamente la referencia a lo que necesitemos.</p>
<p><pre><code>#include &lt;SDL/SDL.h&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;
using namespace std;
</code></pre>Incluímos la librería principal de SDL, la librería fstream (para trabajar con archivos) y la librería iostream (para trabajar con la consola). Las funciones de estas dos últimas librerías están contenidas en un nombre de espacio llamado <code>std</code>. Para no tener que escribir <code>std::</code> antes de cualquier función (de la stl) que usemos, escribimos <code>using namespace std;</code>.</p>
<p><pre><code>int fuente[8][8];</code></pre>Declaramos un array bidimensional de enteros de 8x8, que contentrá los valores de cada celda (1 si está pintado de negro, 0 si está pintado de blanco). Para mantener las cosas simples, el tamaño de cada glifo será fijo.</p>
<p><pre><code>int main(int argc, char* args[]){
	if(SDL_Init(SDL_INIT_EVERYTHING) != 0){
		cerr << "Error al iniciar SDL" << endl;
		return -1;
	}</code></pre>
Declaramos la función principal del programa. Intentamos inicializar la librería SDL. Si falla (es decir, si la función <code>SDL_Init</code> devuelve algo distinto de cero, imprimimos un error por la consola.</p>

<p>
<pre><code>	SDL_Surface *pantalla = SDL_SetVideoMode( 8*32, 8*32, 32, SDL_SWSURFACE );
	
	if(pantalla == NULL){
		cerr << "Error al crear la superficie de video" << endl;
	}</code></pre>
	Intentamos crear una ventana de 256*256 píxeles, 32 bits de profundidad y no acelerada por hardware (SW vs HW). Si falla, escribimos un mensaje de error.</p>
<p><pre><code>	SDL_WM_SetCaption("Editor de fuentes",NULL);</code></pre>
Cambiamos el título de la ventana.</p>

<p><pre><code>
	bool cerrado=false;	
	int botonApretado = 0;
	</code></pre>Declaramos dos variables, una booleana que indica si el programa se sigue ejecutando (para cerrar el programa hay que ponerla en verdadero) y otra que indica si hay algún boton apretado (0=ninguno, 1=izquierdo, 2=derecho).</p>
<p><pre><code>
	while(!cerrado){
</code></pre>Siempre que no hayan cerrado la ventana, seguimos haciendo el loop principal.</p>	
	<p><pre><code>
		SDL_Event event;
		while(SDL_PollEvent(&event)){ 
		</code></pre>Siempre que haya algún evento, lo procesamos.</p>
			<p><pre><code>
			if(event.type == SDL_QUIT)
				cerrado = true;
			</code></pre>Si se apretó la X de la ventana, establecemos la variable cerrado en verdadero, así en el próximo frame se cierra.</p>
				
			<p><pre><code>
			if(event.type == SDL_MOUSEBUTTONDOWN){
				if(event.button.button == SDL_BUTTON_LEFT)
					botonApretado = 1;
				else if(event.button.button == SDL_BUTTON_RIGHT)
					botonApretado = 2;	
			}
			</code></pre>Si se apretó algún botón, nos fijamos cual fue apretado y establecemos la variable al valor correspondiente.</p>
			
			<p><pre><code>
			if(event.type == SDL_MOUSEBUTTONUP)
				botonApretado = 0;
			</code></pre>Si se soltó algún botón, lo recordamos.</p>
			
			<p><pre><code>
			if(botonApretado != 0){ 
				int posX = event.motion.x; 
				int posY = event.motion.y; 
				</code></pre>Si hay algún botón apretado, almacenamos la posición del mouse.</p>
				<p><pre><code>
				if(posX<32*8 && posY<32*8){
					int celdaX = posX/32;
					int celdaY = posY/32;
					
					if(botonApretado == 1){
						fuente[celdaY][celdaX] = 1;
					}else{
						fuente[celdaY][celdaX] = 0;
					}
				}
				
			}
		}
		</code></pre>Si el mouse está dentro de la ventana, calculamos a qué celda corresponde dividiendo la posición por el tamaño de cada celda (32 píxeles en este caso). Si está apretado el botón izquierdo, establecemos el valor a de la celda correspondiente a 1, caso contrario lo ponemos a 0.</p>
		
		<p><pre><code>
		for(int y=0;y<8;y++){
			for(int x=0;x<8;x++){
			
				SDL_Rect rect;
				rect.x = x*32;
				rect.y = y*32;
				rect.h = 32;
				rect.w = 32;
				</code></pre>Vamos por cada una de las 8x8 celdas y calculamos la posición de cada cuadrado.</p>
				
				<p><pre><code>
				if(fuente[y][x]==0){
					SDL_FillRect(pantalla,&rect,0x00FFFFFF);
				}else{
					SDL_FillRect(pantalla,&rect,0x00000000);
				}
			}
		}
		</code></pre>Si el valor de la celda estaba en 0, llenamos el rectángulo correspondiente de la pantalla con el color blanco, caso contrario negro.</p>
		<p><pre><code>
		SDL_Flip(pantalla);
		SDL_Delay(1);
	}
	</code></pre>Forzamos a que la ventana se redibuje, esperamos un milisegundo para disminuir un poco el consumo de CPU.</p>
	
	<p><pre><code>
	ofstream of("salida.txt");
	for(int y=0;y<8;y++){
		for(int x=0;x<8;x++){
			of << fuente[y][x] << ",";
		}
	}
	of.close();
	</code></pre>Si llegamos a este punto es porque cerraron la aplicación, por lo que abrimos el archivo "salida.txt" como salida, vamos por cada celda e imprimimos el valor correspondiente. Luego cerramos el archivo.</p>

	<p><pre><code>
	SDL_Delay(100);
	system("notepad salida.txt");
	</code></pre>Esperamos un tiempo y abrimos el archivo con el bloc de notas.</p>
<p><pre><code>
	SDL_Quit();
	return 0;
}
</code></pre>Le decimos a SDL que puede devolver toda la memoria que haya usado, y le decimos al sistema operativo que el proceso se terminó correctamente.</p>

<p><a href="/descargar/editorfuentes">Descargar código fuente y ejecutable</a></p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/KbVfSrbWtLg/</link><feedburner:origLink>http://gzaloprgm.com.ar/tut_editorfuentes/</feedburner:origLink></item><item><title>Calculadora de overflow de timer</title><description><![CDATA[<script type="text/javascript">
// 
function roundNumber(num, dec) {
	var result = Math.round( Math.round( num * Math.pow( 10, dec + 1 ) ) / Math.pow( 10, 1 ) ) / Math.pow(10,dec);
	return result;
}

function parse(val, scale){
	var l = parseFloat(val);

	if(scale == "Pico") 	l /= 1000000000000;
	if(scale == "Nano")		l /= 1000000000;
	if(scale == "Micro")	l /= 1000000;
	if(scale == "Mili")		l /= 1000;
	
	if(scale == "Kilo")		l *= 1000;
	if(scale == "Mega")		l *= 1000000;
	if(scale == "Giga")		l *= 1000000000;	
	
	return l;
}

function calc(t){
	var val = "";
	if(t>=0.000000001){
		val = (roundNumber(t*1000000000,3) + " nano");
	}
	if(t>=0.000001){
		val = (roundNumber(t*1000000,3) + " micro");
	}
	if(t>=0.001){
		val = (roundNumber(t*1000,3) + " mili");
	}
	if(t>=1){
		val = (roundNumber(t,3));
	}
	if(t>=1000){
		val = (roundNumber(t/1000,3) + " kilo");
	}
	if(t>=1000000){
		val = (roundNumber(t/1000000,3) + " mega");
	}
	return val;
}

function compute(){
	var c = parse($("#cristal").val(), $("#cristalScale").val());
	
	$("#ciclo").val(calc(1/c) + "segundos");
	
	var prescaler = $("#prescaler").val();
	
	$("#tickTimer").val(calc(prescaler/c) + "segundos");
	
	var reload = $("#reload").val();
	
	$("#rH").val(parseInt(reload / 256));
	$("#rL").val(reload % 256);
	
	$("#timeover").val(calc((65535-reload)*prescaler/c) + "segundos");
	
	$("#freqover").val(calc(1/((65535-reload)*prescaler/c)) + " Hertz");
}
$(document).ready(function () {
	$("input").keyup(compute);
	$("select").change(compute);
	compute();	
});
// 
</script>
<p>Dada la configuración del timer, calcula el tiempo de overflow del mismo.</p>
<form action="">
<p>Cristal: <input id="cristal" value="12"/><select id="cristalScale">
  <option>Kilo</option>
  <option selected="selected">Mega</option>
</select> Hertz</p>
<p>Ciclo de máquina cada: <input id="ciclo" disabled="disabled"/></p>
<p>Prescaler: <input id="prescaler" value="12"/></p>
<p>Tick de timer: <input id="tickTimer" disabled="disabled"/></p>

<p>Valor de recarga: <input id="reload" value="64535"/></p>

<p>Frecuencia de overflow: <input id="freqover" disabled="disabled"/></p>
<p>Período de overflow: <input id="timeover" disabled="disabled"/></p>
<p>Valor de recarga: 	<input id="rH" disabled="disabled" style="width:50px"/>
							<input id="rL" disabled="disabled" style="width:50px"/></p>
</form>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/Q7fWFh_M_hA/</link><feedburner:origLink>http://gzaloprgm.com.ar/timer/</feedburner:origLink></item><item><title>Resumen de temas del primer parcial de análisis - CBC</title><description><![CDATA[<pre>Resumen de Análisis Matemático para Exactas e Ingeniería (1er parcial)

INECUACIONES:
	• Al multiplicar o dividir por algo negativo, cambia el signo
	• Si queda una fracción y está comparada (mayor o menor) con 0, dividirlo en dos casos de acuerdo a los signos

FUNCIONES:
	Definiciones:
		f: X -> Y
		
		Inyectividad: para cada X hay un Y distinto (en X no hay dos elementos con misma imagen)
		Subyectiva: cuando la imagen de F es igual a Y
		Biyectiva: Inyectiva + Subyectiva
		
	• Tienen inversa si son biyectivas
	• Una funcion puede ser biyectiva al cambiar el codominio
	
	Asíntota vertical:
		Analizar puntos fuera del dominio y "bordes" de funcion por parte
		
	Asíntota horizontal:
		Analizar límites a +- inf
	
	Asíntota oblicua:
		Analizar lim x-> inf de f(x)/x = M
				 lim x-> inf de f(x)-Mx = B
				 
	Continuidad:
		Para que sea contínua en un punto x0:
			Tiene que existir F(x0)
			Tiene que existir lim x->x0 de f(x)  (mismos límites laterales)
			Los límites tienen que ser igual a F(x0)
				
		Teoremas de continuidad:
			f y g continuas en (a;b) => f+-g también continua en (a;b)
			f y g continuas en (a;b) => f*g también continua en (a;b)
			f y g continuas en (a;b) y g!=0 => f/g también continua en (a;b)
			f y g continuas en (a;b) => fog también continua en (a;b)
			
			Conservación del signo:
				Si es contínua en (a;b), con x E (a;b) cerca al valor, la función tiene el mismo signo que su límite
			
			Bolzano:
				Si F es contínua en [a;b] y el signo f(a) != signo f(b), hay al menos una raíz en [a;b]
		
			Teorema de los valores intermedios:
				Generalización del teorema de Bolzano, f(x) contínua en [a;b] toma todos los valores intemedios entre f(a) y f(b)
				

Derivada:
		
	"Pendiende de la recta tangente al gráfico de f en cierto punto"
	"Rapidez de cambio de una función en el tiempo"
	
	Cociente incremental
		(f(x0+h)-f(x0))/h
		
	Cociente incremental con límite: Pendiente de la recta tangente al gráfico de f en x=x0
	
	Si la derivada en un punto no existe:
		La función no es contínua,
		la recta tangente es vertical o
		hay un "punto anguloso"	
	
	Teorema de la derivada de la función inversa EN UN PUNTO:
		[f-1(y0)] ' = 1/f'(x0)
		
		Donde y0 = f(x0) (CUIDADO!)
	
	Derivadas
		sen x 	-> cos x
		cos x 	-> -sen x
		x^n   	-> n x^(n-1)
		k		-> 0
		log_a x -> 1/x * ln a 
		a^x		-> a^x * ln a
		
	Reglas de derivación:
		(f+-g)' = f' +- g'
		(f*g)' = f' g + f g'
		(f/g)' = (f' g - f g') / g^2
		(fog)' = (f(g(x)))' = f'(g(x)) * g(x)'
		
	Teorema de Fermat:
		F derivable en (a;b)
		F contínua en [a;b]
		
		Si F tiene un extremo en x=x0 (con x0 E (a;b)), entonces F'(x0) = 0
		
	Puntos críticos: Candidatos a extremos
		Puntos en el dominio de F donde la derivada no exista o valga 0
		
	Teorema del valor medio de Rolle:
		F derivable en (a;b)
		F contínua en [a;b]
		F(a) = F(b)
		
		Entonces existe algún c dentro de (a;b) tal que f'(c) = 0
		
	Teorema del valor medio de Lagrange:
		F derivable en (a;b)
		F contínua en [a;b]
		
		Existe alguna punto c dentro de (a;b) tal que la recta tangente es paralela a la recta (a;f(a)) (b;f(b))
		
		Por lo tanto, si la derivada de una función es estrictamente negativa, la función es estrictamente decreciente
		(mismo con positivo y creciente)
		
		"La velocidad media entre dos puntos (a;b) tiene que ser igual a la velocidad instantánea en alguno de los puntos en el intervalo"
		
	Teorema del valor medio de Cauchy:
		Es más complicado y no tiene mucho uso, pero sirve para demostrar L'Hopital
		
	L'Hopital:
		Si lim f(x)/g(x) da indeterminación 0/0 o inf/inf, es posible derivar y ver si existe el límite de f'(x)/g'(x). 
		Sí el límite existe, el original también existía y valía lo mismo. En cambio, si no existe, no dice nada.
		
		Si hay un 0*inf, es posible invertir alguno de los dos términos y así podér usar L'H
		
	Concavidad negativa (triste)
	Concavidad positiva (contenta) / convexa
	
	En un punto de inflexión cambia la concavidad (puede estar fuera del dominio de f)
	
	El signo de la segunda derivada indica la concavidad.
	
	Dada una función contínua, en un intervalo de monotonía estricta hay UNA o NINGUNA solución de f(x) = k
		Uso: Decir cuantas soluciones tiene (por intervalo de monotonía - TVI + Límites de c/ borde de intervalo)
		
	Teorema de Weierstrass:
		Una función contínua definida en un intervalo cerrado alcanza su mínimo y máximo absoluto en puntos del intervalo
	
	Criterio de la segunda derivada:
		Sirve para analizar si un extremo local es mínimo o máximo, analizando el signo de la segunda derivada (es decir, la concavidad en ese punto)
		Siendo X un extremo:
			Si f''(x) es positiva, x es un mínimo local
			Si f''(x) es negativa, x es un máximo local
			Si f''(x) es 0, no dice nada (puede ser máximo, mínimo o ninguno)
	
Axioma de completitud:
	Los reales "completan" la recta numérica sin dejar agujeritos
	
Límites:
	
	El álgebra de límites SOLAMENTE vale si los límites existen (es decir, dan REALES)
	
	Si el límite no tiene incógnitas, es posible calcular una aproximación del límite con la calculadora (MUY UTIL)
	
	Si los límites laterales coinciden, existe el límite puntual y vale eso
	
	• División de polinomios: 0/0 e inf/inf - Factorizar ambos y simplificar raíces
	• División de polinomios y otras cosas: 0/0 e inf/inf - Factorizar mayor grado en numerador y denominador
	• División de cosas con raices y sumas: 0/0 e inf/inf - Racionalizar y simplificar cosas (recordar dif. de cuadrados)
	• Juntar sumas y restas de fracciones para usar L'H
		Tratar de que queden muchas sumas y pocas multiplicaciones (para derivar más facil)
		
	• Exponenciales "jodidas":
		lim a^b = e^lim (b*ln(a))
		Calcular derivadas del estilo a^b, hacer ln de ambos lados, pasar potencia como multiplicacion y derivar de ambos lados
		
	• sen(x)/x tiende a 1 (si x tiende a 0)
		También es cierto el recíproco
		
	• x^(1/x) tiende a 1 (si x tiende a inf) 
	
	• Cero por acotado
		Especialmente útil cuando aparecen funciones trigonométricas acotadas en [-1;+1] (OJO con la tangente)
		
	• 1^inf: Pasar a forma (1+1/a)^a = e (con a->inf)
		Otra forma: (1+a)^(1/a) = e (con a->0)
			
	• Propiedad del sandwich: 
		Basicamente a <= b <= c
		Entonces lim a <= lim b <= lim c (Limites tendiendo cierta variable al infinito)
		Si lim a = lim c entonces lim c = lim a
		Dificil de usar porque necesitás "intuir" límites y además tienen que tender a lo mismo
	
SUCESIONES:
	
	Notación "pctn": Cierta propiedad se verifica en una sucesión para todo n mayor a un número (por lo que también se cumple en el infinito)
	
	Si una sucesión es estrictamente creciente, y está acotada superiormente, tiene límite (converge) y es el supremo
	
	Monótonas = No oscilantes
	
	Cota inferior: Un número es cota inferior de una sucesión si es menor o igual que todos los elementos de la misma
	Cota superior: Un número es cota superior de una sucesión si es mayor o igual que todos los elementos de la misma
	
	Principio de Arquímedes: Siempre hay un 1/n (con n entero) más chico que un real cualquiera mayor a 0
	
	Supremo: La menor de las cotas superiores
		Si pertenece al conjunto, es el máximo
	Ínfimo: La mayor de las cotas inferiores
		Si pertenece al conjunto, es el mínimo
	
	Si dos subsucesiones convergen a distinta cosa, la sucesión original no tiene límite
	
	Forma recurrente: Tipo fibonacci (más dificil de analizar límites)
	
	Hay que probar que es de términos positivos pctn para hacer algo de esto:
		• D'Alembert (si tiene factoriales)
			lim n->inf {(A_n+1) / (A_n)} = L
			Si L < 1, A_n converge a 0
			Si L > 1, A_n diverge a +inf
			Si L = 1, no dice nada
			Generalmente k^(n+1) se puede escribir como k*k^n
		• Cauchy (si son exponenciales multiplicados)
			lim n->inf {A_n^(1/n)} = L
			Misma lógica que D'Alembert		
			Útil para probar que una exponencial le "gana" a un polinomio
		• Recordar que D'Alembert implica Cauchy
			Necesario para ver que (n!)^(1/n) diverge
	
Optimización:
	Hallar función a la que se quiere encontrar máximo o mínimo (generalmente volúmen, superficie, costo, etc)
	Derivarla, ver posibles extremos y devolver el absoluto pedido
</pre>
]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/ypXoszuqLMQ/</link><feedburner:origLink>http://gzaloprgm.com.ar/analisis1erparcial/</feedburner:origLink></item></channel></rss>

