jueves, 23 de junio de 2016

Programación EEPROM 24cXX 24c01-24c02-24c04-24c08-24c16 con Arduino y Gambas

Página principal



Programación EEPROM 24cXX
24c01-24c02-24c04-24c08-24c16
con
Arduino y Gambas

xsetaseta@gmail.com


En el anterior montaje  (programación EEPROM 24c02 24c01) había realizado un grabador de memorias 24c01 y 24c02 de 128bytes y 256 bytes. Estos modelos tienen un direccionamiento de 1byte, 256 posiciones de memoria. El bus I2C se había diseñado para en principio para direccionar  256 tipos de dispositivos (Circuitos integrados), y era mas que suficiente. Pero que ocurrió que se utilizó para memorias EEPROM, y las memorias crecieron en capacidad, y ahora es fácil encontrar memoria de hasta 8Mbytes.
Para memorias de entre 256 bytes a 2Kbytes, quitaron los ping de selección de chip E0,E1,E2  para internamente utilizarlos como direccionamiento.
En memorias 24c32 al 24c256, 4Kbytes a 64Kbytes, se mandan dos bytes para sacar la dirección de la memoria. Cuando me lleguen estos modelos de chip actualizaré el programa. Recomiendo leer las hojas de características  de los chip para entender su funcionamiento.

Cuando empece a programar los chip 24c04-24c08-24c16 desde arduino no encontré ningún ejemplo, y el que vi resulto que direccionaba mal la memoria, mandando 2Bytes.
Tampoco entendía que en la librería Wire de arduino , asignaran para las memorias la dirección 0x50, #define EEPROM_I2C_ADDRESS 0x50 ,cuando en realidad era 0xA0  (0b10100000). Después de investigar, descubrí que desplazaba 1 bit a la derecha para eliminar el bit de escritura, claro está que luego la librería Wire, vuelve a desplazar a la izquierda para volver a colocar el verdadero valor.
Ahora entendido como se debía utilizar la EEPROM_I2C_ADDRESS como parte de direccionamiento de la memoria, se modifica la programación del arduino. Utilizo los bits A8,A9,A10 de la dirección de memoria, para colocarlos en el Device Select Code en la posición b1,b2,b3.  deviceaddress=deviceaddress | (eeaddress >> 8) ;




Conexionado de la memoria con el arduino nano para memorias 24c01-24c02-24c04-24c08-24c16 .


Circuito montado.


Adaptando los modelos  SO8 Pin Connections


Programa en gambas.

El programa en gambas (VB para Linux) es sencillo, pero tiene un poco de todo, lee, graba,compara, guarda, restaura, y un pequeño editor.
Para evitar ciclos de escritura, conviene leer la memoria a programar, y cuando se graban datos en dicha memoria se compara el dato que hay en esa posición de memoria y el dato que va se va ha escribir, sin son el mismo no graba nada. Esto evita muchas grabaciones innecesarias y hace grabaciones rápidas. A esto llamo WriteComparación.

Para empezar el programa debemos seleccionar el puerto, normalmente /dev/ttyUSB0 , y pulsamos start . Si todo nos va bien nos saldrá EMPIEZA 24C 01/02 .
Insertada la memoria, leemos sus datos con el botón Read, se visualizaran automáticamente. Si queremos cambiar el modo de visualización seleccionamos DEc , Char,  Hex .
Si queremos editar algún dato, pulsamos sobre la pantalla de los datos y mediante los cursores seleccionamos la dirección que queramos modificar. Ahora introducimos el valor en la casilla de Valor y pulsamos Enter, automáticamente cambia el dato e incrementamos la posición de memoria.
Ahora podemos grabar los datos en memoria o guardarlos en un fichero.

Espero que le sirva a alguien este programa.
Mi intención es actualizar el programa para grabar todo tipo de memorias

Programa

Saludos.
Juan Galaz

martes, 21 de junio de 2016

Programación EEPROM 24c02 24c01 con Arduino y Gambas

Página principal

Programación EEPROM 24c02 24c01
con
Arduino y Gambas

xsetaseta@gmail.com

Las memorias 24Cxx son del tipo EEPROM (programadas eléctricamente) , antes había que borrarlas mediante luz ultravioleta, pero eso es el pasado, ahora en un chip de 8 patillas puedes tener hasta 8Mbytes.
Tengo bastantes memorias del tipo 24cxx procedentes del reciclado, y me voy hacer un programador mediante el arduino. Por uno de mis cajones tengo el programador TE20-SE que utilizo para alguna programación de los PIC , este programador dispone de zócalos para programar memorias 24Cxx, pero al ser la conexión del tipo serie no se puede utilizar en los ordenadores nuevos.
Este montaje de momento solo programará los 24c01 y 24c02 de 128bytes y 256 bytes, respectivamente.
Para modelos de memoria mayor de 256bytes  ,24c04 ,24c08 y 24c16 ,  se debe direccionar de otra forma, utilizando parte del Device code para la dirección de memoria. En otros modelos con mas memoria se mandan dos bytes para sacar la dirección de la memoria. Recomiendo leer las hojas de características  de los chip para entender su funcionamiento.

Memoria EEPROM.


Conexionado de la memoria con el arduino nano.


Circuito montado.


Programa en gambas.

El programa en gambas (VB para Linux) es sencillo, pero tiene un poco de todo, lee, graba,compara, guarda, restaura, y un pequeño editor.
Para evitar ciclos de escritura, conviene leer la memoria a programar, y cuando se graban datos en dicha memoria se compara el dato que hay en esa posición de memoria y el dato que va se va ha escribir, sin son el mismo no graba nada. Esto evita muchas grabaciones innecesarias y hace grabaciones rápidas. A esto llamo WriteComparación.

Para empezar el programa debemos seleccionar el puerto, normalmente /dev/ttyUSB0 , y pulsamos start . Si todo nos va bien nos saldrá EMPIEZA 24C 01/02 .
Insertada la memoria, leemos sus datos con el botón Read, se visualizaran automáticamente. Si queremos cambiar el modo de visualización seleccionamos DEc , Char,  Hex .
Si queremos editar algún dato, pulsamos sobre la pantalla de los datos y mediante los cursores seleccionamos la dirección que queramos modificar. Ahora introducimos el valor en la casilla de Valor y pulsamos Enter, automáticamente cambia el dato e incrementamos la posición de memoria.
Ahora podemos grabar los datos en memoria o guardarlos en un fichero.

Espero que le sirva a alguien este programa.
Mi intención es actualizar el programa para grabar todo tipo de memorias

Programa

Saludos.
Juan Galaz

miércoles, 15 de junio de 2016

Teclado para acceso con contraseña. Arduino nano

Página principal



Teclado para acceso con contraseña
Arduino nano

xsetaseta@gmail.com


En este montaje realizo un circuito de autorización mediante teclado, con una contraseña de 4 dígitos.
La realización está hecha con arduino nano debido a que tiene dos entradas mas A6 y A7 , aunque solo se utilice la entrada A6 en modo analógico debido a que no funciona como entrada digital.
Se debe teclear el código de 4 dígitos y pulsar la tecla # .
Si nos equivocamos pulsamos la tecla * ,  borramos todos los dígitos introducidos.
Si no pulsamos ninguna tecla antes de 10 segundos todos los dígitos tecleados se borran.
Si nos equivocamos al introducir el código, los 4 led parpadean.
Si hemos introducido el código correcto el led verde se enciende durante 1 segundo.





Para ahorrar 3 resistencia he hecho una pequeña trampa, colocar una resistencia para los 4 diodos.





PROGRAMA




Hubiese sido fácil hacer una rutina para poder cambiar la contraseña, pero eso lo dejo para que vosotros trabajéis un poco.


Saludos.
Juan Galaz



jueves, 9 de junio de 2016

wxMunicipios wxwidgets

09/06/2016 - wxMunicipios
Había realizado un programa para buscar los municipios, en primer lugar lo había realizado para Android, luego lo hice en Gambas (vb linux) , y como hacia tiempo que no había realizado nada en wxwidgets, y antes de que se me olvidase, me puse manos a la obra.
Lo que me satisface más, es el poder compilar para las dos plataformas, Linux o Windows, con solo cambiar la directiva YesWindows 0 por #define YesWindows 1 en el fichero define.h  .

Programas de linux y windows

Windows
 


















Linux

sábado, 4 de junio de 2016

ANDROID - Códigos postales de España - openRawResource(getResources().getIdentifier


Android

ANDROID
Códigos postales de España
getResources().openRawResource(getResources().getIdentifier(miProvincia, "raw", getPackageName()));

Encontré una base de datos de códigos postales de España y era una buena ocasión de hacer una aplicación que buscara los códigos por provincias y calles o pueblos.
En este caso había realizado esta aplicación en gambas(VB linux), luego la he realizado para android.
Estos datos de CP(códigos postales) se colocan en el directorio /res/raw ,y solo son de lectura. Estos datos están organizados por capitales y provincias, y en algún que otro caso en ciudades grandes como Reus, Fuenlabrada, etc.
El fichero indice se llama codciuz.txt donde figuran nombres de capitales y provincias, y el nombre de fichero que corresponde a dicha capital o provincia.

280:MADRID
28X:MADRID
150:A CORUÑA
030:ALACANT/ALICANTE

Para el ejemplo de Madrid capital el fichero se llamará a280codpos.txt . El fichero original se llamaba 280codpos.txt  , pero en los recursos internos los ficheros no deben empezar por numero, no distingue entre mayúsculas y minúsculas , además la extensión no se utiliza, por lo que tuve que renombrar los ficheros.
En el fichero  están los datos postales ordenados de la siguiente forma:

28021:A (EL SALOBRAL)
28032:ABAD JUAN CATALAN
28013:ABADA
28012:ABADES
28039:ABADESA
28043:ABALOS
28037:ABANICO

En este fichero se recorre buscando concordancias con el nombre de la calle que se quiere buscar.



Recomiendo ver el anterior androj.html programa para entender este.
Lo diferente de este programa frente al anterior es el nombre de fichero de la provincia. En este caso no sabemos su nombre hasta que no nos lo proporcione la búsqueda por provincia, y esto lo solucionamos con la siguiente orden:
ISentrada2 = getResources().openRawResource(getResources().getIdentifier(miProvincia, "raw", getPackageName()));
Donde miProvincia es el nombre del fichero de recursos internos.
Utilizamos un buffer para aumentar la velocidad de acceso al fichero.
BFentrada2 = new BufferedReader(new InputStreamReader(ISentrada2));
Leemos línea por línea buscando concordancias con el nombre de calle.
while ((Sentrada=BFentrada2.readLine()) != null)
            {
                String SentradaT[]= Sentrada.split(":");
                if(SentradaT[1].contains(Scalle))    
                    {
                        Ncalles++;  
                        Mcallel.append(Sentrada);
                        Mcallel.append("\n");
                    }
            }     
public void cuantosCX(String Lprovincia)
    {                 
        String miProvincia;
        Scalle=Mcalle.getText().toString();       
        Scalle=Scalle.toUpperCase();
        Mcalle.setText(Scalle); 
        miProvincia = Lprovincia.substring(0, Lprovincia.length()-4);
       
        try
        {
            if(ISentrada2 != null)    ISentrada2.close();       
            ISentrada2 = getResources().openRawResource(getResources().getIdentifier(miProvincia, "raw", getPackageName()));
            BFentrada2 = new BufferedReader(new InputStreamReader(ISentrada2));
           
            while ((Sentrada=BFentrada2.readLine()) != null)
            {
                String SentradaT[]= Sentrada.split(":");
                if(SentradaT[1].contains(Scalle))    
                    {
                        Ncalles++;  
                        Mcallel.append(Sentrada);
                        Mcallel.append("\n");
                    }
            }       
           
            ISentrada2.close();
        }
        catch (IOException e)
        {
            Log.e("Provincias->",e.getMessage(),e);
        }       
       
    }


PROGRAMA

Saludos
Juan Galaz


Bibliografía:

http://seta43.duckdns.org/android.html
http://android.okhelp.cz/java_android_code.php?s=openRawResource
http://www.programmershare.com/1333689/

ANDROID 4: DESARROLLO DE APLICACIONES (En papel)
ISBN 9788441531970
WEI MENG LEE , ANAYA MULTIMEDIA, 2012

EL GRAN LIBRO DE ANDROID (3ª ED.) (En papel)
ISBN 9788426719768
JESUS TOMAS GIRONES , S.A. MARCOMBO, 2013