14 julio, 2015

Alarma GSM con USB programable (3d)





Búsqueda personalizada

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

Alarma GSM con USB programable (3d)

Ampliación a través de I2C de la alarma

     En ocasiones hay que tener una memoria que se pueda sustituir, ampliar, modificar, etc. Es posible la necesidad de más entradas o salida. Colocar un reloj independiente al microcontrolador. El puerto I2C no está de más implementarlo en el circuito. 
     En la búsqueda por el famoso Internet no he podido localizar como conectar dos memoria 24LC256 al mismo controlador usando la librería estándar de Ccs. Veamos que hay que hacer para poder conectar dos o más memorias (sirve para saber que hay que modificar en otras estándar de otros modelos de I2C).
     Por lo general los pic tiene el hadware del I2C en el puerto N. Como está ocupado por el teclado, lo primero es cambiarlo a otro puerto. Como en el esquema se puede apreciar se ha colocado en el puerto E. Para poder trabajar por el hay que hacer una pequeña modificación en la librería estándar 24256.C del Ccs.
modificamos la original cambiando las patillas del SDA y SCL. por el puerto E según la conexión que se realice de las EEprom. El archivo quedaría así:
     El protocolo de escritura dice que hay que enviar el primero el número de dispositivo. El número se programa con la conexión de las patillas del 24LC256 A0, A1 Y A2. Colocando todas a GND sería el dispositivo 0 y en forma binaria si colocamos A0 a Vdd sería el dispositivo 1, y así progresivamente.
     El envío del número de dispositivo se envía en la línea 42  de la escritura y en la línea 58 que es de la lectura.
     El dato en hexadecimal empieza por 'a' lo que indica que es una memoria... (Ver datasheet del dispositivo) que no se ha de modificar. De esa forma el dispositivo sabe que se le está ablando a el. Como hay un cero no se puede enviar datos a otro dispositivo. Lo mismo ocurre con la lectura de un dato. Para poder manejar más dispositivos hay que realizar unas modificaciones. 
     Lo primero es poder enviar un dato más. Para ello modificamos las dos funciones (subrutinas, para mi).Como es un número lo que enviamos le asignamos a cada subrutina una variable más a la que llamaremos 'dispositivo'. (Aunque aparecela  variable como int hay que poner byte).
     Ahora manipulamos el dato para adaptarlo. Se enviará el número de dispositivo (del 0 al 7). Según el protocolo I2C el bit de menos peso representa la lectura o escritura.
     Corremos a la izquierda el número que enviamos y se le suma el tipo de dispositivo (recordar que la EEprom es el 0xA0). Con eso ya podemos escribir en la EEporm.
     Realizar lo mismo en la lectura de la EEprom. Y modificar la línea en la que pide la lectura (las primeras son para identificar el dispositivo).
     Ahora solo queda realizar la llamada al dispositivo cero (0) que funcionaba correctamente y llamar al dispositivo uno (1) que no funcionaba. Llamamos a la escritura y a la lectura del dato que escribimos
     Indica la escritura en el registro 21 el dato a guardar es 0xD1 en el dispositivo 1. La lectura es del registro 21 del dispositivo 1. Se pasa al LCD 
     Y el resultado una vez ejecutado el programa es:
     El dato enviado se visualiza en el LCD sin errores.


 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.

12 julio, 2015

Alarma GSM con USB programable (3b)




Búsqueda personalizada

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

Alarma GSM con USB programable (3b)

3b.- Activación del teclado
     Si llego a saber la que se venía encima para activar un puñetero teclado con los microcontroladores 18Fxxxx Me parece que lo iba a implementar su ...(piiiiii...piiii...)
     Empezamos por una conexión al puerto B ya que, después, podremos activarla por medio de interrupciones. de momento hacemos un escaneado cada 200ms.
     Se descartan las librerías que trae el Ccs ya que son difíciles de implementar en las interrupciones. No he podido. Quizás me haya rendido pronto pero el tiempo es lo que más valoro.
     Justo después del include del lcd colocamos las variables que vamos a usar y seguido se colocan las funciones. De esta forma ya se encuentra casi en el sitio para, luego, poder usar las interrupciones. Quedaría así:
     Ahora, como no hay activada ninguna interrupción, hay que llamar a la subrutina (función, para otros) y devolverá la tecla pulsada.
     La llamada se realiza así:
Tecla=Teclas[Test_Teclado()];
     En la variable Tecla está el valor pulsado, si lo hay, o devuelve un espacio (ascii 0x20, en decimal 32). Colocando un condicional evitamos darle trabajo al LCD. Así solo escribe si hay una tecla pulsada manteniéndola hasta que se pulsa otra.
     Ahora falta la conexión con el terminal GSM. Se incorporara un puerto I2C para otras ampliaciones de memoria y puertos.

¡¡CUIDADO con el output_x(xx)!!

      Pos anda que no funciona mal la rutina anterior para el teclado!! ¿Quién habrá sido el programador que la ha pasado? Esto me pasa por usar el pega y copia. No puedo ser más tonto.
      Al probarla daba errores. Sobre todo al pasarla al timer1. Sin pulsar nada salían números aleatorios y de vez en cuando. A poco que se simula se observa que el uso de:
output_b(xxx)
      cambia el TRISB por tanto cambia las entradas y salidas... Monta un follón de tres pares de cojones (perdón por la expresión) ¿No hay ningún sitio en que indique lo mal que lo hace?
      La interrupción queda así:
       Y la rutina que hemos colocado más abajo queda de la siguiente forma:
      No olvidar cargar el TRISB CORRECTAMENTE. Quedaría así:
      Ahora si podemos estar tranquilos con el puerto B. Anda que no se ha perdido el tiempo por culpa de los problemas con output_b(x). Para manejar el el puerto entero puede valer (para mi queda descartado para siempre su uso en cualquier programa) (no es tan difícil como parece pero se complica bastante)


 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.

11 julio, 2015

Alarma GSM con USB programable (3a)






Búsqueda personalizada

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

Alarma GSM con USB programable (3a)
Arrancando el LCD de la alarma

     Lo primero es configurar el esquema en Proteus para la visualización con el lcd. Con 2 lineas por 16 caracteres es más que suficiente de momento. Se usará para ver la configuración y los datos que se van enviando.
     La R3 Es para dar el contraste al LCD. Con 1k se ven estupendamente los caracteres. El archivo para el control se llama flex_lcd.c. A parte de no dar problemas en la simulación es muy facil de configurar. Basta con asignar las patillas como las tenemos conectadas en Proteus. Lo descargamos de:
y pegamos al principio de nuestro programa las definiciones de las patillas del LCD como nos indica el mismo archivo descargado.
     Colocando el valor del los PIN_xx igual que la configuración que realicemos en Proteus arranca y se visualiza sin problemas. Solo hay que llevar cuidado con las patillas a colector abierto del microcontrolador y las del MCRL.
     Realizamos un programa que nos inicialice el lcd y el usb y nos imprima en el lcd el dato enviado por usb y que lo devuelva al usb. El programa puede ser:
     Compilamos el programa, Arrancamos la simulación Proteus y arrancamos el Hiperterminal.
     Nada más arrancar ha salido la bienvenida. Como el cursor está en la segunda Línea, lo que enviemos se va a plasmar allí (lcd_gotoxy(1,2);). Se envía 6 9 4 L 7 T. y el resultado es:
El 54 pertenece al valor decimal del número 6
El 57 pertenece al valor decimal del número 9
El 52 pertenece al valor decimal del número 4
El 76 pertenece al valor decimal del número L
El 55 pertenece al valor decimal del número 7
El 84 pertenece al valor decimal del número T
     Ha salido todo junto en el LCD al no preveer los espacios. De momento queda así. 
     Ya tenemos dos cosas en marcha: El USB y el LCD. En estos momentos podemos transmitir, recibir y visualizar con el microcontrolador Pic 18F4455 sin usar un solo componente electrónico.



 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.

Alarma GSM con USB programable (1)






Búsqueda personalizada

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


Alarma GSM con USB programable
(1.- El usb Pic-PC con XP)

     Empezar es lo más complicado. Lo primero es ver como funciona el usb en el microcontrolador. Conectar al PC un microcontrolador y que windows lo reconozca. En esta ocasión se utiliza un 18F4455. Para usar otro Pic simplemente hay que cambiar el micro en el esquema y en el programa.
Aunque cambiará se empieza por lo más básico: El Mplab y Proteus Isis.
     Con Mpalb creamos un proyecto y en main.c colocamos el siguiente código:
     Ahora compilamos, indicará unos avisos y al final el tan esperado BUILD SUCCEEDED. Con esto ya tenemos, de momento, terminado el programa del microcontrolador. Ahora vamos al esquema anterior del circuito y realizamos doble clic sobre el microcontrolador. Se abre el editor de componentes y en Program File colocamos la dirección del archivo que se ha generado al compilar el programa en proteus: main.hex
     Guardamos con clic OK y salvamos el esquema (Ctrl + S). Instalamos los drivers del VIRTUAL USB de Proteus. Suele estar en la carpeta de instalación\Virtual USB\Install USB Drivers.
     Con esto ya podemos, no es verdad de momento, simular el microcontrolador sin usar nada de electrónica. Ningún componente electrónico físico va a participar.
Vamos a Proteus isis y simulamos:
     Abre correctamente el analizador de USB y ahora conectamos nuestro dispositivo al ordenador. Para ello hacemos clic en el conector de USB.
     Windows detecta que hay algo conectado. Seleccionamos No por el momento y Siguiente
     Ahora seleccionamos Instalar desde una lista o ubicación especifica.
     Ahora solo queda asignar el camino donde hemos descomprimido el archivo que hemos o vamos a bajar con el nombre de mchpcdc.inf que uno se puede descargar desde:
     Hay ocasiones, sobretodo cuando se han realizado unas cuantas pruebas, en que ya no informa del nuevo hadware conectado. Nos dirigimos al Administrador de dispositivos y allí está lo que hemos conectado.
     Si le pedimos que instale los drivers que se han descargado, seguramente no los reconocerá. y pedirá que busquemos otros. Probemos los que probemos no va a funcionar ninguno. Hay que realizar unas pequeñas modificaciones y también personalizaremos nuestro dispositivo.
     Abrimos  el archivo usb_desc_cdc.h que se ha cargado a nuestro proyecto al compilar
     Y nos vamos al final del archivo. Aquí es donde lo personalizamos.
     La longitud de la cadena tiene que ser exacta. Si el número de la cadena es mayor saldrán caracteres que no tienen que ver con nuestro dispositivo. Se suprimirán caracteres si el número de la cadena es inferior, para ello hay una fórmula muy sencilla que es:
(Número de letras + 1)*2 = longitud a poner

Ejemplo en string1 queremos poner JVMA, esta tiene 4 caracteres por tanto:

longitud a poner = ( 4 + 1 ) x 2 = 5 x 2 = 10
     Lo mismo ocurre con el string2. En este caso no cambia el valor del tamaño de la cadena al coincidir la longitud que había.
     Volvemos a guardar y compilamos de nuevo (Built All). Cargamos otra vez el main.hex en el 18F4455 (con detener la ejecución del simulador y reanudarla es suficiente)
Ahora le toca al Driver. Abriremos con el archivo mchpcdc.inf, que una vez descargado se ha de descompilar, y nos dirigimos al final del archivo.
     Cambiamos el DRIVERFILENAME y lo personalizamos cambiando DESCRIPTION. Una vez reconocido del dispositivo se verá que se ha personalizado el dispositivo. Lo aceptaremos naturalmente. ¿Cómo no va a pasar la firma si lo estamos haciendo nosotros?
     Es posible que quede una última cosa por hacer y no cuesta nada revisarlo. Si el dispositivo no es reconocido es que no coinciden unos datos que ahora mismo vamos a ver.
Abrimos el archivo usb_desc_cdc.h y buscamos este trozo de programa.
         0x61,0x04, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??)  ==8,9
Se intercambian los valores en el archivo mchpcdc.inf (0x0461)
         0x33,0x00, //product id   ==10,11
Se intercambian los valores en el archivo mchpcdc.inf (0x0033)
Mucho cuidado con eso. Abrimos el archivo mchpcdc.inf y al principio tiene que estar el dispositivo.
     Si no está hay que añadirla. De otra manera: EL DRIVER NO NOS SERVIRÁ. Windows no lo reconocerá como válido.
     Notese que los valores se han puesto acorde con el archivo usb_desc_cdc.h
     Los otros valores que aparecen indicando el cambio (no los he quitado para que se vea que pueden cambiar) son los que tenía el driver en un principio. Dependiendo del archivo cargaremos SIEMPRE los valores que nos marque usb_desc_cdc.h
     Una vez terminado de cargar ha de salir la ventana de Finalización del asistente
     Ya se puede ver recompensado el esfuerzo con la personalización de nuestro prototipo.
     Ahora ya podemos disfrutar de una simulación completa sin el uso de componentes electrónicos ni cables. Si enviamos el 1 nos devuelve el texto perteneciente al uno y si mandamos 2 nos devuelve el texto perteneciente al dos.
     Para configurar el puerto a nuestro gusto (en mi pc solo dispongo de un puerto COM y algunas veces, dependiendo del dispositivo que conecto, me cambia el puerto, se puede personalizar. Es decir: podemos asignar el puerto de comunicaciones que queramos. Para ello ir a:
Inicio -> Panel de Control -> Sistema -> Hardware -> Administrador de dispositivos
      y expandimos el puerto de comunicaciones Puertos (COM & LPT) Y doble clic sobre nuestro dispositivo.
      Nos vamos a la pestaña configuración de Puerto \ Opciones avanzadas
      y se puede cambiar el puerto COM en la pestaña: Número de puerto COM.
 La configuración del HyperTerminal, que es lo que puede dar problemas, está explicada en otro post.
 (próximamente)
CONFIGURAR EL HIPERTERMINAL PARA RECIBIR DATOS Y ENVIAR UN SOLO BIT


 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.