4/27/2007

Placa de prototipos


Si no me equivoco, pinchando en grande se ve mejor. Aun no me aclaro demasiado con Blogger...

Pero bueno, a lo importante. Esta es, más o menos, la placa que comentaba. Una sencilla placa de prototipos, para no tener que andar montando en la board las mismas chorradas una y otra vez. Simplemente he de acomodar mis diseños a la distribución de pines que he usado, pero vaya, la he hecho como suelo hacerlas, de modo que...

Antes de detallarla, comentar por qué no es la placa como es en realidad: primero porque no están todos los componentes en el proteus -sin ir más lejos, el 4550 no está...-, pero principalmente porque como la he hecho a mano -Si, como antaño, rotulador permanente resistente a ácido, paciencia, mucha paciencia, más paciencia, y luego a esnifar gases tóxicos mientras la mezcla de salfuman y agua oxigenada se come todas las zonas no pintadas de la placa virgen. No me quedan muchas, así que supongo que en breve pasaré a experimentar con las placas fotosensibles y el insolado, que en teoría ya me queda poco tiempo de estudiante y podré contar con más presupuesto, pero... hasta que no las termine, seguimos con el método tradicional.

Bien, here we go, que dicen los guiris, y mientras en el winamp suena "Returns of a King" de la banda sonora de 300, paso a detallar todo lo que tiene la plaquita, y como lo tiene...

Hardware básico:
*Oscilador
Un cristal oscilador de cuarzo de 20MHz, con dos condensadores de 22pF.
*Tensiones de alimentación
He dejado en la placa el típico plano de masa, y una linea gorda de 5V. pero como para el transductor del rs232 necesitaba tres con tres... pues he puesto también una toma, mediante un cutre divisor de tensión. Espero que no me de por saco... quizá deba revisar esto en un futuro...
*Reset
Pulsador, y resistencia a pull-up. Cutre, pero eficaz. Y ya que estaba, he colocado un led verde para saber si la placa tiene tensión.

Puertos digitales:
*Entradas
He optado por colocar todas las entradas digitales en el puerto B. Si los chicos de microchip dotan a los pics de resistencias de pull-up en este puerto, ¿por qué despreciar el gesto? Y como no le he metido teclado ni nada, pues estaba libre. De la linea 0 a la 3, pulsadores, principalmente por si utilizo interrupciones externas. De la linea 4 a la 7, un dip switch de 4 vías.
*Salidas
Como el puerto D no tiene ninguna función secundaria que me interese... -Ni spi, ni modo pwm mejorado para el eccp- pues 8 leds al canto. Si alguien llega a leer los valores de las resistencias limitadoras, se habrá esforzado para nada: no los he tocado en el dibujo. En la placa las he colocado de 330 ohmios, total, con que se vea me sobra, y así me duran más. Pensaba ponerlas de 180, pero para lo que se va a notar en luminosidad, me quedo con mayor vida :D

Otras entradas y salidas:
*Entradas analógicas
En An0 y An1, dos potenciometros. Así puedo simular sensores de respuesta en voltaje, o sencillamente probar el conversor. Iba a poner también en las lineas de referencia, pero como casi nunca las utilizo... pues he desistido.
*CCP y ECCP
He dejado los pines del CCP y ECCP preparados y soldados a una clema, junto a una toma de masa. Principalmente utilizo estos módulos para el pwm, de cara a controlar motores, de modo que es la solución más cómoda sin meter el motor fijo en la propia placa.

Comunicaciones:
*Puerto serie
He colocado un max232, uno de esos más nuevos con dos vías -desaprovecho una, lo sé, pero no tenia de una sola vía...- y le he puesto el conector en la misma placa. Se acabó el hacer el tonto con la cutrez del conector colgando y los hilos por ahí sueltos. No lo tenia muy claro, pero al final he optado por cortocircuitar las lineas de control de flujo. Para lo que es, tampoco las necesito, y me evito problemas.
*USB
He colocado las conexiones, e incluso un conector con el cable suficiente para no necesitar un alargador. Eso sí: del lado del pic he puesto un dip switch de cuatro vías, como el del puerto B, para poder cortar el usb. Quiera hacer un todo-nada, pero como lo que tenia por casa era el dip switch.. pues toca cortar las lineas una por una. De todos modos tampoco es tanto problema, ni algo que vaya a usar a menudo.




Bien, esto es todo, creo. Se admiten sugerencias, de cara a otras placas cuando esta casque :D cosa que espero suceda dentro de mucho tiempo...

4/25/2007

Stand-by

Tengo algunas entradas preparadas, pero es realmente triste comprobar como la falta de tiempo hace materialmente imposible el darles la preparación adecuada. Aun así, espero ir poniendo en breve alguna cosilla, como el programa para el micro del ThoronClock, y algunas gilipolleces -como una placa de prototipos para los 18F4550 que estoy haciendome-. Lo dicho, en cuanto me sea posible, iré poniendolo. Probablemente nadie pase por aquí, pero por si acaso yo lo digo. :)

1/18/2007

Fuente de alimentación.

Tercer intento para escribir esta entrada. No termina de gustarme este sistema, pero bueno. A lo que iba.


En casa no dispongo de fuente de alimentación, pero había visto por algunas webs (Esta y esta, por ejemplo) como convertir una fuente de pc ATX en fuente de pruebas. Solución fantastica, especialmente si tienes alguna fuente muerta de asco, como era mi caso. Principal diferencia: la que yo tenia era AT, de un viejo 486, aunque salvo por el tema de encendido por soft, creo que todo lo demás es casi idéntico.


Como se explica en esos articulos, adaptar la fuente es muy sencillo: una vez abierta (Y descargados los condensadores antes, por si acaso. Que viendo el tamaño... puede salir una buena mascletá :) ) se coloca en uno de los cables de +5 Voltios (Rojos) una resitencia de carga. En mi caso, una de 10 ohms y 10 watts. Teniendo en cuenta que la va a recorrer medio amperio... mejor que sea así (10 Watts) que arriesgar con una de 5. En esos articulos se comenta el tema de colocarla pegada a la carcasa, para que refrigere. Personalmente, veo más lógico -y así lo hice- adosarla a los radiadores de los semiconductores de potencia. La gente rara vez se pilla las manos ajustando tanto algo que es importante, asi que supuse que algunos watts más no se notarian. Y de momento al menos así es. Una vez hecho esto, ya puede arrancar, ya que las smps (o fuentes conmutadas) no pueden funcionar sin carga. De normal, en el pc, es el disco duro quien hace de carga, pero para el caso sirve la resitencia. También le puse un led, principalmente porque en su dia costó una pasta, por ser medianamente buena, y una de las virtudes que tiene es que el ventilador ni se oye. Así que... mejor un simple led, y así no hay dudas sobre si está encendida.


una vez hecho eso, pueden sellarse los cables que sobran. Yo me quedé con un par de cables de masa (negros), de cara a poder tener caminos de retorno a masa diferentes para hipotéticos circuitos híbridos, pero sobretodo por si llego a conectar demasiadas cosas, tener margen para la corriente. Luego un par más de 5 voltios (rojos), que son los más utilizados en mi caso -no en vano la mayoria de lo que hago son temas digitales- , y luego uno de +12 (Amarillo), uno de -12 (Azul) y uno de -5 (blanco). No cogi el de 3'3 porque aunque no viene mal (sobretodo para los PICs LF) tengo reguladores externos de microchip y linear, y como total la potencia maxima está compartida entre las lineas de 5 y 3'3 (no así con la de 12, va al margen). hecho esto tenia +12, +5, 0, -5 y -12. No cortocircuitables, vaya, pero con tener un poco de cuidado... aun así quiero buscar algún circuito de protección. Ya veremos. El caso es que las fuentes de la universidad tienen algo muy util: una linea variable entre 0 y 30 Voltios, con 2 amperios de salida máxima. Yo no aspiraba a tanto, pero... teniendo +-12, con un simple divisor de tensión y un seguidor con op amps, ya tenia mi fuente variable, de modo que...



Como se puede apreciar, la resitencia r2 es de 2k, r1 de 180 omhs, y el potenciometro de 22k. De modo que en los extremos :

Potenciometro a 0 --> Por Millmann: [(12*180)+(-12*2000)]/2180= -10V (Aprox)

Potenciometro a 2k --> Nuevamente: [(12*22180)+(-12*2000)]/24180= 10V (Aprox)

En ambos casos da unas centésimas más, pero... tampoco necesito tanta precisión, además de que la salida no es nunca de +-12 Voltios. Esto es así porque de normal la placa base demanda unos 20 amperios, y ese consumo en la linea de 5 voltios hace subir el voltaje en la de 12. En este uso, al no haber tanta demanda, la linea de 12 voltios está realmente a unos 11'3. Otro detalle a comentar: para que la salida del seguidor tenga más potencia, y dado que uso unos TL084CN de Texas, de esos cuádruples, tengo cortocircuitadas las salidas de los 4, con la misma entrada. De este modo, pueden aportar cuatro veces la Io máxima de un sólo opamp.

En cuanto al consumo del divisor, está pensado para que apenas se note: 11mA máximo, menos de un mA de corriente mínima. A todo esto solo me que añadirle un micro para monitorizar el voltaje variable, y controlar un par de displays de 7 segmentos. Pero eso... otro dia.

También, de cara a estar lo mejor equipado posible, dentro de mi pobre enconomia estudiantil, tengo en mente ponerme con uno de estos dos osciloscopios basados en PICs para la adquisición de datos y procesado en el pc. Están el basado en PIC12F675, comunicado por RS232, y con 20 kilosamples por segundo máximo, si no me equivoco, y el basado en PIC18F2550, comunicado por usb, que llega hasta los 60 ksps. Además, combinando este con un MAX114 parece que se puede llegar a 1Megasample por segundo. Personalmente, para lo que hago en casa, más que suficiente. Así que... probablemente cuando pasen examenes, me ponga a ello...

1/07/2007

Números en ruso

Bueno, esto no es de ahora, pero... por si a alguien le sirve de algo lo posteo. Este año pasado hice primero de ruso en la escuela oficial de idiomas, y llevaba idea de hacer un programilla en builder para cojugar verbos. Al final, como no he seguido, lo he dejado de lado, pero aun conservo el que hice para saber como se esribian los números del 1 al 100. Escribiendo eso, el número, el programa devolvia en una label, y en un textbox, el número escrito correctamente.Realmente es muy sencillo, ya que la raiz es la misma para cada decena - salvo excepciones - y las terminaciones tambien. De modo que basicamente si era un número del 1 al 20 los tenia tal cual, pues eran "singulares", y si era posterior descomponia el numero en decenas y unidades, convertia cada cosa por su lado, y finalmente mostraba el resultado.

Podeis descargar el instalador de http://personales.upv.es/jetomad/setup.exe

La fuente necesaria para ver todos los caracteres en cirilico (Si no os saldrian cosas raras) es la "Bulgarian Courier". Si no recuerdo mal, iba incluida en el instalador.

Del mismo modo, creo que algun numero concreto fallaba al mostrarlo. En fin, como se puede comprobar era para "uso personal" xD.

El código fuente, por si a alguien le interesa...

//---------------------------------------------------------------------------

#include
#pragma hdrstop
#define A 192
#include "numeros.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Label2->Font->Name = "Bulgarian Courier";
Label2->Font->Size = 36;
Label2->Font->Color = clRed;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int numero, espacio=-1;
char letras[40];

numero = Edit1->Text.ToInt();

// Zona decenas...

if (numero == 100) {
letras[0]=209;
letras[1]=210+32;
letras[2]=206+32;
}
if ((numero/10)==9) {
letras[0]=196;
letras[1]=197+32;
letras[2]=194+32;
letras[3]=223+32;
letras[4]=205+32;
letras[5]=206+32;
letras[6]=209+32;
letras[7]=210+32;
letras[8]=206+32;
espacio=9;
}
if ((numero/10)==8) {
letras[0]=194;
letras[1]=206+32;
letras[2]=209+32;
letras[3]=197+32;
letras[4]=204+32;
letras[5]=220+32;
letras[6]=196+32;
letras[7]=197+32;
letras[8]=209+32;
letras[9]=223+32;
letras[10]=210+32;
espacio=11;
}

if ((numero/10)==7) {
letras[0]=209;
letras[1]=197+32;
letras[2]=204+32;
letras[3]=220+32;
letras[4]=196+32;
letras[5]=197+32;
letras[6]=209+32;
letras[7]=223+32;
letras[8]=210+32;
espacio=9;
}

if ((numero/10)==6) {
letras[0]=216;
letras[1]=197+32;
letras[2]=209+32;
letras[3]=220+32;
letras[4]=196+32;
letras[5]=197+32;
letras[6]=209+32;
letras[7]=223+32;
letras[8]=210+32;
espacio=9;
}

if ((numero/10)==5) {
letras[0]=207;
letras[1]=223+32;
letras[2]=210+32;
letras[3]=220+32;
letras[4]=196+32;
letras[5]=197+32;
letras[6]=209+32;
letras[7]=223+32;
letras[8]=210+32;
espacio=9;
}

if ((numero/10)==4) {
letras[0]=209;
letras[1]=206+32;
letras[2]=208+32;
letras[3]=206+32;
letras[4]=202+32;
espacio=5;
}

if ((numero/10)==3) {
letras[0]=210;
letras[1]=208+32;
letras[2]=200+32;
letras[3]=196+32;
letras[4]=214+32;
letras[5]=192+32;
letras[6]=210+32;
letras[7]=220+32;
espacio=8;
}

if (numero/10==2) {
letras[0]=196;
letras[1]=194+32;
letras[2]=192+32;
letras[3]=196+32;
letras[4]=214+32;
letras[5]=192+32;
letras[6]=210+32;
letras[7]=220+32;
espacio=8;
}

//zona del 1 al 19. Si hay espacio, pongo simbolo...
if (espacio!=-1) letras[espacio]=32;
//seguimos del 1 al 19...

if ((numero==1) || (numero%10==1)){
letras[espacio+1]=206;
letras[espacio+2]=196+32;
letras[espacio+3]=200+32;
letras[espacio+4]=205+32;
if (numero>10) espacio=espacio+4;
else espacio=3;
}

if ((numero==2) || (numero%10==2)){
letras[espacio+1]=196;
letras[espacio+2]=194+32;
letras[espacio+3]=192+32;
if (numero>10) espacio=espacio+3;
else espacio=2;
}

if ((numero==3) || (numero%10==3)){
letras[espacio+1]=210;
letras[espacio+2]=208+32;
letras[espacio+3]=200+32;
if (numero>10) espacio=espacio+3;
else espacio=2;
}

if ((numero==4) || (numero%10==4)){
letras[espacio+1]=215;
letras[espacio+2]=197+32;
letras[espacio+3]=210+32;
letras[espacio+4]=219+32;
letras[espacio+5]=208+32;
letras[espacio+6]=197+32;
if (numero>10) espacio=espacio+6;
else espacio=5;
}

if ((numero==5) || (numero%10==5)){
letras[espacio+1]=207;
letras[espacio+2]=223+32;
letras[espacio+3]=210+32;
letras[espacio+4]=220+32;
if (numero>10) espacio=espacio+4;
else espacio=3;
if (numero==15) espacio--;
}

if ((numero==6) || (numero%10==6)){
letras[espacio+1]=216;
letras[espacio+2]=197+32;
letras[espacio+3]=209+32;
letras[espacio+4]=220+32;
letras[espacio+5]=220+32;
if (numero>10) espacio=espacio+5;
else espacio=4;
}

if ((numero==7) || (numero%10==7)){
letras[espacio+1]=209;
letras[espacio+2]=197+32;
letras[espacio+3]=204+32;
letras[espacio+4]=220+32;
if (numero>10) espacio=espacio+4;
else espacio=3;
}

if ((numero==8) || (numero%10==8)){
letras[espacio+1]=194;
letras[espacio+2]=206+32;
letras[espacio+3]=209+32;
letras[espacio+4]=197+32;
letras[espacio+5]=204+32;
letras[espacio+6]=220+32;
if (numero>10) espacio=espacio+6;
else espacio=5;
}

if ((numero==9) || (numero%10==9)){
letras[espacio+1]=196;
letras[espacio+2]=197+32;
letras[espacio+3]=194+32;
letras[espacio+4]=223+32;
letras[espacio+5]=210+32;
letras[espacio+6]=220+32;
if (numero>10) espacio=espacio+6;
else espacio=5;
}

if (numero==10){
letras[espacio+1]=196;
letras[espacio+2]=197+32;
letras[espacio+3]=209+32;
letras[espacio+4]=223+32;
letras[espacio+5]=210+32;
letras[espacio+6]=220+32;
letras[espacio+7]=0;
}

if ((numero<20) && (numero>10)){
letras[espacio+1]=205+32;
letras[espacio+2]=192+32;
letras[espacio+3]=196+32;
letras[espacio+4]=214+32;
letras[espacio+5]=192+32;
letras[espacio+6]=210+32;
letras[espacio+7]=220+32;
espacio=espacio+7;
}
letras[espacio+1]=0;
if ((numero<1) || (numero>100)) {Label4->Caption = "Numero no valido";
Label2->Caption = "";}
else {Label2->Caption = letras;
Label4->Caption = "";}


}
//---------------------------------------------------------------------------