02 diciembre, 2010

Leyes de Morgan

Búsqueda personalizada



 Como siempre: No es tan difícil como parece.


     La negación se verá representada por ~. Se obtiene pulsando Alt-Gr + 4.

La primera ley dice:
          Un producto negado es igual a la suma de las negadas.

     Representamos el primer miembro de la función que es una NAND:
      Ahora representamos el segundo miembro de la función que es una OR con sus entradas negadas:


      Fijándose en las tablas de la verdad, se observa que son iguales. Esto demuestra la la 1ª Ley de        Morgan. Resumiendo:

La segunda ley dice:

     Una suma negada es igual al producto de sus negadas
     Representamos el primer miembro de la función que es una NOR:
     Ahora representamos el segundo miembro de la función que es una AND con sus entradas negadas:

     Fijándose en las dos tablas de la verdad se observa que son iguales. Esto demuestra la 2ª Ley de Morgan.

     Con estas dos leyes se pueden realizar puertas lógicas a partir de otras. Veamos unos ejemplos:
     Para obtener una puerta AND puedes utilizar una puerta NOR con sus entradas negadas
     Para obtener una puerta OR puedes utilizar una puerta NAND con sus entradas negadas:

     Para obtener una puerta NAND utiliza una puerta OR con sus dos entradas negadas, como indica la primera ley de De Morgan:
     Para obtener una puerta NOR utiliza una puerta AND con sus entradas negadas, eso dice la 2º ley de De Morgan
     La puerta XOR tiene la particularidad de entregar un nivel alto cuando una y sólo una de sus entradas se encuentra en nivel alto.
     La ecuación indica las puertas a utilizar:
     Para obtener una puerta EXNOR agregas una compuerta NOT a la salida de la puerta XOR vista anteriormente:
     Para obtener Inversores (NOT) puedes hacer uso de compuertas NOR o compuertas NAND, simplemente uniendo sus entradas.



 Como siempre: No es tan difícil como parece.

Gracias por visitar mi blog personal. Si te ha gustado: haz el favor de hacer clic en los anuncios de google que aparecen al principio de cada entrada y date una vuelta por por ellos. Son céntimos lo que aporta pero me ayudas a seguir subiendo cosas. Gracias.


22 octubre, 2010

Generador de reset al conectar la alimentación

Búsqueda personalizada

 Como siempre: No es tan difícil como parece.


    En ocasiones la electrónica necesita resetearse al iniciarse la alimentación para poder predecir su estado en las salidas. Para poder realizar dicha función vamos a usar un comportamiento del condensador.
     La mayoría de circuitos integrados generan un reset por nivel bajo. Vamos a resetear el 4532 que está alimentado a 12V. 
     Viendo el datasheet se observa que el reset es por nivel bajo. La misión es que la patilla del reset se encuentre a nivel bajo durante un tiempo y después se mantenga a nivel alto. Un condensador descargado es como un cortocircuito (ya se comentó en el detector de flancos) por ello lo conectamos a masa y para que se vaya cargando conectamos una resistencia a nivel alto.
     La entrada de reset no es trigger smith y no podrá definir el tiempo de reset a la conexión. Es decir: cuando se alimenta el circuito el condensador está descargado. En el extremo conectado al reset, como se comporta como un cortocircuito, se refleja su conexión a masa y hay un nivel bajo y empieza a cargarse a través de la resistencia. Sabemos que el condensador se considera cargado transcurridos 5t (cinco tau) y no sabemos claramente cuando cuando tiempo se va mantener el reset. Para tener el tiempo controlado le añadimos un par de puertas inversoras trigger smith.
     La puerta inversora (según el datasheet) verá el nivel alto a los 8,5V. Ya podemos calcular un tiempo de reset. Para ello usaremos la formula:
t = Tiempo
R = Resitencia
C = Capacidad
K = e * V/V-Vc
donde: e = logaritmo neperiano
          V = Tensión
          Vc = Tensión trigger
     La corriente de carga tiene que ser muy pequeña ya que la entrada del CMOS apenas consume. Por ello probaremos con una resistencia elevada a ver que capacidad necesitamos. Determinamos un tiempo de 100us y probamos con una R de 100K:
     Como es un valor que no vamos a encontrar nos vamos al valor superior normalizado que es de 1nF y siempre será más fácil tenerlo en nuetro tallerEl valor de la tensión (11,5) es el valor que consideramos de carga de los 5 tau.
     Por tanto podemos decir que con una R de 100k y un condensador de 1nF tendremos un reset aproximado de 100us. Digo aproximado por el valor del condensador y las tolerancias que vamos a encontrar en los componentes.
     Al desconectar la tensión la descarga del condensador se efectuará con el mismo tiempo que la carga lo que no garantiza un nuevo reset si la desconexión no es grande. Por ello hay que efectuar una descarga rápida del condensador. La descarga rápida se efectúa con un diodo inverso colocado en paralelo a la resistencia. El circuito quedará así:


 Como siempre: No es tan difícil como parece.

Gracias por visitar mi blog personal. Si te ha gustado: haz el favor de hacer clic en los anuncios de google que aparecen al principio de cada entrada y date una vuelta por por ellos. Son céntimos lo que aporta pero me ayudas a seguir subiendo cosas. Gracias.

19 octubre, 2010

El mapeado de memoria del 18F2550: escribir y leer la flash



!! No es posible pregrabar el pic con la directiva #rom!! ¿¿o no sabemos hacerlo??
     Si Belando es capaz de comprender esto sin sacarme de mis casillas es que el escribir y leer de la flash es tan sencillo como sumar o restar con los dedos. A ver como me explico sin meter caña.
     El paso del 16F al 18F es duro y hay que tener paciencia. El mapeado es de 16bits o lo que es lo mismo 2 bytes de 8 bits cada uno. Vamos a demostrarlo sobre nuestro programa y visualizado con el Winpic800. Algo de publicidad hay que hacerle.
     Aquí tenemos nuestro programa cargado:
     Trabaja en 16 Bits ó 2Bytes de 8bits, que al caso es lo mismo, y numera de izquierda a derecha. Hasta aquí no hay nada raro. ¿Cómo numera contando a 8bits? pues no! no es de izquierda a derecha. De la posición 0x0000 (contado de 8 en 8bits el primero es el de la derecha y el segundo el de la izquierda del 0x0000. Vamos a contar la primera fila y queda más claro:

     !Vaya! Ahora se entiende lo mal que va el compilador, va estupendamente. Verdaderamente no nos importa ya que guardamos o leemos sin importarnos donde lo hace. El problema viene cuando querremos grabar algo y el compilador hace lo que quiere (aparentemente,claro está) Nosotros somos los que no lo hacemos bien. Vamos a ver si es verdad lo dicho y entendemos como funciona la flash y así usarla de EEprom. Para ello vamos a usar:

write_program_eeprom (address, data); //para escribir
read_program_eeprom (address); //para leer
     Para ello metemos en el programa que nos lea una posición de memoria y la grabe al final de la memoria y 0x3344 por la mitad:
                           ddd = read_program_eeprom(Alarm1[0]);
                           write_program_eeprom(0x5ff8,0x3344);
                           write_program_eeprom(0x7ff0,ddd);
     La posición 0x5FF8 se sale del mapeado pero escribirá en la posición: 0x5FF8 / 2 = 0x2FFC . La otra: idem de lo mismo. Ejecutamos el programa y  la posición 0x2FFC tiene que contener 0x44 en el octeto de menor peso y 0x33 en el de mayor peso. Vamos a verificar lo que ocurre:
     Nos ha detectado el grabado. No hace falta que lo busquemos... Si! ya que vamos a realizar otra prueba:
     y la otra al final:
     Si todo lo dicho anteriormente es cierto: si grabamos a partir del 0x5ff9 (uno más) tiene que meter el 0x44 donde esta el 0x33 y el 0x33 dos octetos a la derecha de donde está el 0x44. Veamos al ejecutar  write_program_eeprom(0x5ff9,0x3344); que ocurre:
     Para empezar no está mal. El error lo da en la misma posición de memoria al verificar y se aprecia el 0x44 en el byte de mayor peso. Vamos a verlo en el mapeado:
     Ahora es comprensible y ya no nos asusta que al grabar de la posición de memoria 8 a la 9 haya un poco de despiste (aparentemente lo graba al revés) y de la 9 a la A haya un mayor despiste (aparentemente se lo lleva a donde le da la gana y no es así). Espero que haya sido comprensible.
     Comprendido esto ya podemos usar la directiva #rom. Ahora si sabemos como se hace y donde va a parar lo que hacemos.

#rom 0x7f18={0x1832,0x3053,0x1944,0x1f20,0x1143,0x2433,0x2631,0x3233,0x0d0a}
                             //FALLO DE ELCTRICIDAD pte programar 32 caracteres
#rom 0x7f28={0x1841,0x3053,0x1944,0x1f20,0x1143,0x2449,0x2641,0x1441,0x304c,0x1120
                  ,0x1c41,0x3045,0x1e54,0x2241,0x1441,0x0a20,0x3030 ,0x0d0a}
                            //HA SIDO ACTIVADA LA LA ENTRADA: 0
     Ahora si está controlada la cosa. Tampoco era tan dificil ¿no?

11 octubre, 2010

Enviar sms en formato PDU

-->


 Como siempre: No es tan difícil como parece.

     Al conectar nuestra alarma a siemens C60 se encuentra el problema del envío del sms en modo Texto. Este teléfono sólo acepta formato PDU.
     Este formato parece complicado pero no lo es. Aquí tenemos las primeras pruebas enviando "Hola Mundo" al numero de teléfono 123456789.


     Desglosando la trama:
  1. 00 Centro de envío del sms. Se usa el del teléfono.
  2. 11 Tipo de sms. se usa PDU.
  3. 00 Referencia sms. Es indiferente.
  4. 09 Longitud Telf destinatario. Es este caso 9
  5. 81 Tipo de Num Telf. Es nacional
  6. 21 Número de teléfono del destinatario. Como se ve hay que invertir los números
  7. 43    "
  8. 65    "
  9. 87    "
  10. F9    "
  11. 00 Protocolo
  12. 00 Codificación
  13. A7 Periodo de validez del sms (el máximo)
  14. 0A Número de bytes del Texto a enviar (no tiene porque coincidir una vez codificado a PDU)
  15. C8 Texto del sms a enviar
  16. 37     "
  17. 3B     "
  18. 0C     "
  19. 6A     "
  20. D6     "
  21. DD     "
  22. E4     "
  23. 37     "
 Codificación del Número de teléfono a formato PDU
     Por lo general lo tendremos en una cadena de caracteres. La forma más sencilla es leer el segundo caracter y restarle 0x30. Después desplazamos 4 veces a la izquierda y le sumamos el primer caracter -0x30.
               base= telefono[1]-0x30;
               base <<=4;
               code[xbuff++]= base+ (telefono[0]-0x30);
     El número lo tenemos guardado en la cadena teléfono[] y guardamos sobre la cadena code[] para después enviar toda la secuencia. Sólo queda hacer lo mismo con los demás números hasta llegar al último que tenemos que rellenar el nibble más alto con F.
              code[xbuff++]= 0xF0+ (telefono[8]-0x30);
     Con esto ya tenemos el número codificado.
Codificación del Texto a enviar a formato PDU
     Para moverse en código ASCII basta con 7bits por lo que se desaprovecha uno en la transmisión de bytes(8bits) El formato PDU aprovecha ese bit. Veamos como se hace:


     Una forma de realizarlo, La más sencilla y comprensible es:
                base = cadena[contador+1]& 0x01;
                base <<=7;
                code[xbuff++]=base+ cadena[contador+0]; //1
                cadena[contador+1]>>=1;
                base= cadena[contador+2] &0x03;
                base <<=6;
                code[xbuff++]=base+ cadena[contador+1]; //2
                cadena[contador+2]>>=2;
                base= cadena[contador+3] &0x07;
                base <<=5;
                code[xbuff++]=base+ cadena[contador+2]; //3
                cadena[contador+3]>>=3;
                base= cadena[contador+4] &0x0f;
                base <<=4;
                code[xbuff++]=base+ cadena[contador+3];
                cadena[contador+4]>>=4;
                base= cadena[contador+5] &0x1f;
                base <<=3;
                code[xbuff++]=base+ cadena[contador+4];
                cadena[contador+5]>>=5;
                base= cadena[contador+6] &0x3F;
                base <<=2;
                code[xbuff++]=base+ cadena[contador+5];
                cadena[contador+6]>>=6;
                base= cadena[contador+7] &0x7F;
                base <<=1;
                code[xbuff++]=base+ cadena[contador+6];
                base = cadena[contador+9]& 0x01;
                base <<=7;
                code[xbuff++]=base+ cadena[contador+8]; //1
                cadena[contador+9]>>=1;
                base= cadena[contador+10] &0x03;
                base <<=6;
                code[xbuff++]=base+ cadena[contador+9]; //2
    
Ahora queda meterlo en una subrutina para poder manejar cualquier longitud de texto y simplificar lo expuesto y ya lo tenemos. No olvidar que hay que incluir otros datos antes detallados.Para ver si está correctamente configurado

     Para enviarlo no queda ahí la cosa. Lo primero,  al arrancar el móvil, le cargamos:
          printf("AT+CSMS=0\r\n" ); //Formato PDU
     Cuando deseemos enviar un sms procedemos así:
  1. Enviamos:      printf("AT+CMGS=");
  2. Seguido de la cantidad de bytes a enviar (o la cantidad de septetos del sms +12) pero OJO en ascii y en decimal contando desde cero. Si tenemos 22 no lo podemos enviar tal cual. Hay que enviar 0x32 0x32. Ojo a eso!. Por tanto;     printf("%U",22);  seguido del retorno de carro;   printf("\r");
  3. Esperamos que nos devuelva ">" y le enviamos la cadena de texto (también es ascii) que tenemos:  printf("00110009917689x99xFx0000AA0AC8373B0C6AD7DDE437");
  4. seguido de ctrl+Z. o lo que es lo mismo 0x1A : printf("\x1A"); 
  5. seguido de un fin de linea:   printf("\r\n");
     Ojo a la cadena que hemos formado que hay que enviarla en ascii. Es decir:
el primer dato de la cadena era 0x00. Por tanto hay que enviar 0x30,0x30. El segundo es 0x11. Por tanto hay que enviar 0x31,0x31. Así sucesivamente. Ojito a eso que se tiene la tendencia a enviar la cadena en hexadecimal y nos devuelve, al ratito de enviar la trama: +CMS: ERROR 500.


 Como siempre: No es tan difícil como parece.

Gracias por visitar mi blog personal. Si te ha gustado: haz el favor de hacer clic en los anuncios de google que aparecen al principio de cada entrada y date una vuelta por por ellos. Son céntimos lo que aporta pero me ayudas a seguir subiendo cosas. Gracias.


-->

09 octubre, 2010

Rectificador Trifásico




 Como siempre: No es tan difícil como parece.

     Un rectificador de tensión se realiza mediante cuatro diodos (puente Graetz). Para rectificar una red trifásica es tan sencillo como aplicar dos diodos más a dicho puente siguiendo el mismo procedimiento.

     Los hay comerciales de potencia preparados para 400V y 25A.
12-01-2011 El VUO 36-12 NO8  aguanta los 1200V 35A.


 Como siempre: No es tan difícil como parece.

Gracias por visitar mi blog personal. Si te ha gustado: haz el favor de hacer clic en los anuncios de google que aparecen al principio de cada entrada y date una vuelta por por ellos. Son céntimos lo que aporta pero me ayudas a seguir subiendo cosas. Gracias.


07 octubre, 2010

Fuente de alimentación para alarma gsm con pic

-->
    
  

     Después de tener la alarma funcionando calculados los consumos y vistos los reales se desecha el cargador del móvil como fuente de transformación por los armónicos que genera. Otra cosa que se desecha tras las pruebas con los módulos Telit es el móvil con batería. La fuente de alimentación que se presenta en una de las entradas soporta perfectamente los picos de comunicación con condensadores discretos (de bajo valor) y no ha presentado el LM317 calentamiento alguno incluso estando sin atornillar a la placa para una mejor disipación.
     Se han colocado dos formatos de encapsulado para los estabilizadores por la sencilla razón que tengo de los dos. La disipación de calor del LM7812 y del LM 7805 si hay que tener cuidado. No dejar sin atornillar. No pasa nada pero no es recomendable. En ciertos momentos (y cargando la batería siempre) se calientan un poco. La PCB queda, del esquema, así:

 

       Y la pcb por la cara de las pistas:

     Los componentes smd son como la droga: si lo pruebas engancha. Una de las razones es la ausencia de taladros. El ruteado de pistas se complica pero se sale "al paso" mezclando los encapsulados.


     No es que se tengan que montar los dos estabilizadores. O se monta uno u otro o mezclados. Lo bueno de este diseño es que tengas lo que tengas lo sacas adelante.
     Como se verá en unas próximas revisiones, se ha colocado un cargador para pilas recargables NiCd y NiMH. En la foto "todo funcionando" el móvil se encuentra sin batería. La batería utilizada es de plomo. El consumo (visto en el amperímetro de la fuente) es de 90 mA con el móvil en reposo. En llamada el consumo alcanza algún pico de 300mA lo que hace que sea conveniente atornillar a la placa el LM317 por si se mantienen mucho las llamadas. LA explicación de la fuente ya la enlazaré.
     Aquí lo tenemos: "todo funcionando"
     A los dos reguladores 78xx se han atornillado a la placa y se ha puesto silicona térmica. En el montaje final se va a dotar de leds para el control de tensiones. 


-->