Microcontroladores PIC
-
para que es el codigo
-
LarryAg tengo un problema, soy estudiante de Ing. tec industrial en Alcala.
El caso es que para el proyecto fin de carrera tengo que realizar un montaje de una placa basada en el 8051 con teclado matricial 4x4 y display Lcd, entradas y salidas analogicas/digitales y bueno en ningun laboratorio he montado todo eso.
El caso es que mi tutor me ha dado una placa "tini m400 de maxim" pero tiene puertos I2C, CAN, SPI pero en ninguno puedo conectar todo eso que te acabo de comentar entonces no se que hacer.
He pensado pasarme a la tecnica wrapping y montarme un circuito simple montando todo eso.
¿Que me recominedas? no se que hacer, si tienes algun esquema de algo te estaría eternamente agradecido.
Muchas gracias.
PD. el proyecto es un sistema empotrado basado en el 8051 para la automatizacion de una casa, la programacion es sencilla (todo en C) y con eso no voy a tener ningun problema.
Muchas gracias
-
Bueno la verdad que el 8051 se presta a mucho, en concreto no se nada de esa placa, me informaré un poco en cuanto tenga algo de tiempo.
Después de haber visto tu mensaje lo único que se me ocurre decirte es que uses el puerto i2c que existen diversos dispotivos tanto del fabricante philips, como maxim, microchips, con los que puedes conseguir puertos de entrada salida, relojes en tiempo real, conversores A/D usando sólo dos líneas. Otra opcion sería usar el puerto can que es muy utilizado en los vehiculos o el puerto spi, que es más rápido que el i2c aunque también conlleva mayor número de cables…
Espero haberte ayudado a tomar una decisión, importante para comenzar...
También espero que me mantengas informado de tus avances... -
Hola LarryAg.
En primer lugar darte las gracias por contestarme
Me podrias facilitar alguna pagina o documento donde poder usar el puerto I2C?? Asi podre saber mas sobre este puerto y asi poder utilizarlo para la conversion A/D.
En cuanto a lo de conectar el display y el teclado me voy a fabricar una tarjeta con wrapping, en ella montare el teclado y el display con sus respectivos integrados y los colocare en el puerto I/O de la placa. Creo que es la forma más sencilla, además tambien colocare los sensores del sistema y en el caso de que me quede sin espacio de pines del micro los multiplexaré.
En cuanto tenga algo hecho si quieres te mando fotos o información de como va el proyecto.
Muchas gracias por tu tiempo, espero que me puedas facilitar la información del puerto I2C.
Muchas gracias
-
Muy agradecido estaría de la información recibida por tu parte, aunque creo que no entendí bien tu pregunta.
Bueno por partes: aún no he mirado nada acerca de la placa que vas a usar (fallo por mi parte).
La verdad que la opción más lógica es la que vas a usar, pines I/O y en caso de falta multiplexas.La opción que yo te decía era ampliar la placa colocando integrados que se comunican via i2c, can o spi y manejas infinidad de puertos como por ejemplo max7300 de maxim; en microchip también dispones de algunos. Puedes encontrar en maxim más dispositivos en interface and interconnect y buscando I/O port expander.
En cuanto a la información, lo único que debes hacer es mirar la documentación del integrado que vayas a usar y, por lo menos en maxim, y que yo halla visto te detallan los tiempos y protocolos de comunicación necesarias.
-
He estado hablando con el tutor del proyecto y me ha comentado que quiere que la conexion del teclado matricial y el display sean mediante el puerto ISP.
Yo no he visto nada en la carrera sobre ese tipo de comunicación asi que lo que hare será lo que me has aconsejado (me lo han dicho en una tienda de electrónica también, conectrol) que es que en la página de microchip mire aplicaciones que existen y haber que tal.
El tutor me ha comentado que con el ISP se puede controlar diversos periféricos pero supongo que sera mucho más dificil controlar un display y un teclado de esa forma que mediante el puerto paralelo I/O.
Muchas gracias y en cuanto tenga algo te lo mando.
Gracias
-
Hola de nuevo, he estado leyendo el datasheet del max7300. (Losiento donde antes quría decir ISP era I2C)
Esta opción es buena porque mediante el puerto I2C obtendría 28 puertos espandidos, lo malo es que serían comunicación serie, entonces tendría que usar registros de desplazamiento para poder comunicar los puertos del integrado max7300 con el display, ¿no? y al igual con el teclado llevar el codigo binario generado al pulsar una tecla a un registro de desplazamiento.
Lo que no llego a comprender mirando las hojas de caracteristicas del integrado es como se llega a hacer la comunicación, lo miraré más detenidamente.
Muchas gracias
-
La verdad es que es la mejor opción si tienes que prescindir de las entrada salidas digitales.
En cuanto a lo del registro de desplazamiento, este expansor te permite escribir/leer bit a bit o mediante byte, y puede que incluso mediante word; todo es cuestión de ver que es lo que más te conviene.Puedes leer bytes y a cada byte leido le corresponderá una tecla pulsada, al igual para la escritura en lcd, un byte determinará un caracter en el lcd, o contraste o posición… no creo que tenga muchos problemas, eso sí, un poco de paciencia...
Sigue comentandonos que cada vez tiene mejor pinta ... jeje...
-
hola, he pedido muestras a maxim del componente max7300, falta que me las traigan. al mismo tiempo ya he montado en una placa entrenadora (board normal) el teclado matricial con un componente integrado que controla la captura de las filas y de las columnas mas un registro para que se mantengan hasta que se produzca otro pilso en el teclado.
Muchas gracias por el aporte del componete max7300, en cuanto lo tenga empezare a cacharrear con el a ver que sale, segun he leido en el datasheet no es muy complicado de usarlo asi que haber que tal.
una duda tengo ahora, veras tengo que programas el sistema basado en 8051, yo me tiraria a hacerlo con el keil Uvision pero solo tengo la version de prueba pero no consigo en la mula el bueno con las claves, o he pensado en el IAR pero me pasa lo mismo que para Dallas/Maxim no encuentro una version que no sea de prueba.
Si sabes algun sitio de descarga, bueno comentamelo, gracias
Seguire informando, Gracias
-
Bueno, en la mula encontré la siguiente dirección
ed2k://|file|Keil%20Software%20uVision%207.20(PK51+Serial).iso|43069440|437DBF4B8440478F0FE82D42C34FC1B9|/
que seria una versión del keil como tu solicitas, supongo que no hago mal haciendo esto. Espero que te sirva…
Por curiosidad, programarás en ensamblador o usando C.??
-
Hola, lo siento por no contestar antes pero he estado liado con la asignatura que me queda (electronica de potencia) y con el proyecto.
Bueno pues a tu pregunta de como lo voy a programar sera en c todo el codigo menos las rutinas del display LCD (4lineas y 20 caracteres: para hacer menus accesibles desde usuario).
Hoy he recibido los "Samples" de Maxim, la verdad es que se han portado muy bien, me han mandado e-mails con las posibilidades que tiene el max7300 (no se como ponerlos aqui asi que si quieres me das tu email y te los mando). He recibido muchos max7300 pero he tenido el problema de que ninguno tiene el "pacage" (pcbfootprint) para hacer todas las pruebas en una placa board de estas de pincha los componentes.
Lo que primero voy a hacer es montar todo en una placa board (teclado, LCD, max7300, puertos…) y de ahi la conecto a la placa que tengo tini400 peo claro como el max7300 no se pincha, es de los que se sueldan (SSOP) pues me diseñare una placa impresa con lo necesario para que funcione y listo, otra posibilidad es poder encontar un zocalo que lo adapte que los he visto pero en internet y de estados unidos.
¿tu no sabras alguna tienda por casualidad que lo tengan?Lo que acabo de probar hoy es el teclado conectrado a un componente 74c922 para que me de la tecla que he pulsado en binario (asi me evito que hacer el control por i2c mediante software) y llevado aun registro para que almacene el dato hasta que pulse otra vez de nuevo.
He tenido problemas pero es que tenia que haber usado dos condensadores uno de 1uF y otro de 10uF y yo los he usado los dos de 1uF, espero que sea eso, lo habia leido mal de los datasheet del componente.
Bueno esto es todo que no es poco, cuando me funcione el teclado y encuentre el zocalo que espero que sea pronto (la proxima semana) te comento que tal va todo.
Ahhhhh, tembien me estoy leyendo los protocolos de i2c de la placa tini400 porque me ha dicho un profesor que no puedo usar las funciones tipicas de i2c porque al incorporar i2c de hardware tendre que usar lo que me proporcionen, tendre que hacerle caso al profesor por que es un hacha en electronica, se llama Julio Pastor Mendoza, y bueno a mi no me clase pero es una institucion en mi facultad.
Bueno muchas gracias por el link, ahora lo pondre a bajar. Muchas gracias porque sin tu aportación no hubiera encontrado la pieza clabe. Gracias.
-
Podías haber pedido el max7300 en encapsulado pdip que sí que los tienen, son los que yo pedí y por lo menos para las pruebas…
En cuanto a la ayuda, no hay de que, simplemente aporta tus avances así como nosotros te ayudamos... y nada más...
-
Hola
Te acabo de mandar los pdf´s de la placa de maxim que estoy usando y los manuales de microcontrolador tambien que son muy utiles para la gente que no sabe manejar un microcontrolador. Un manual que te he mandado es una asignatura de mi carrera, no se como colgarlos en el foro o si se puede asi que te los doy mejor a ti que haras un buen uso de ellos.
te comentaba en el email (ya sabes mi nombre y de donde soy, jejeje) que vaya chasco que me mandasen con encapsulado SSOP, no es mucho problema porque despues voy a desarrollar una tarjeta impresa y los soldare en ella los SSOP pero bueno para hacer las pruebas en la placa board pues necesitaba unos PDIP.
He preguntado en Electronica Alcala y en Conectrol pero no tienen asi que vaya chasco, ¿sabes donde los puedo conseguir en la comunidad de Madrid o en Internet pero que me tarden poco?
otro tema es la programacion de la comunicacion I2c, he estado leyendo y ya se como funciona la comunicacion I2c, pero aun asi me gustaria profundizar un poco más.
En los pdfs de la placa que estoy usando, tini400 no explica como usar la comunicacion I2c, les he mandado un email diciendo si me pueden facilitar algun documento de como poder hacerlo, porque me supongo que no sera con las funciones estandar de I2c:
*Inicio comunicacion.
*Delay
*…
*StopBueno con lo que me respindan yo te comento y bueno espero que me puedas decir algun sitio para comprar los componentes max7300 y max7318
-
Ahhhh el teclado ya funciona, al final he usado el componente que comente pero el registro lo he quitado porque no me funcionaba bien, no se porque pero no cambia bien cuando pulsaba la tecla.
Lo que he hecho ha sido montar el controlador con los dos condensdores y la sorpresa fue que el propio componente actua como un registro, es decir hasta que no pulso una tecla no cambian de nivel los pines y con la salida da "data available" que me genera un pulso a nivel alto me indica que se ha producido un cambio, con lo que solo tengo que leer directamente de las salidas y espero que ya este.
Por lo menos me cambiaba bien, algunas veces tenia que pulsar 2 veces para que cambiase pero aumentare la capacidad del segundo condensador para haber si aumenta la frecuencia de muestreo.
gracias y haber si me puedes orientar de donde comprar eso. garcias.
-
Pues la verdad es que he tenido problemas para recibir tu correo…
En cuando a donde encontrar los integrados, no te lo puedo decir, soy de Málaga y la verdad que madrid...me pilla lejos... Te vas a tener que dar prisa en hacer la placa o esperar a que te lleguen en otro encapsulado.
Puedes hacer una placa sencilla para no tener calentarte la cabeza ahora, y simplemente poner más accesibles los pines. Te adjunto un ejemplo para soic.
-
OK. te mando luego desde casa otro email a la direccion de hotmail. Muchas gracias por la ayuda. Me estoy creando una plaquita con Capture y Layout sencillita y luego la imprimire en la uni (sale muy barato hacerlo en la uni), la placa consta de 2 MAX7300AAX, 2 MAX7318AAG y conectores de pines para soldar de la libreria BCONT100 y listo. La verdad es que la complicacion sera cuando todo me funcione bien en la placa de entrenamiento hacer la placa final. Gracias por tu ayuda
He decidido poner 2 componentes de cada porque si luego probando necesito más pues solo tendria que soldar otro componente y no hacer otra placa que seria mas gasto para mi.
En cuanto a lo de pedir los PDIP me han contestado que no los fabrican ya con ese encapsulado, me ha dicho el que me ha contestado que se gastaba mucho plomo y por eso se han retirado ¿? No se porque pero bueno ya pues nada.
Yo creo que voy a usar tambien el 7318 porque es mas facil que el 7300 y bueno para conectar el teclado por ejemplo, he pensado hasta en controlar el display tambien con otro 7318 y dejar el 7300 para los sensores y las salidas digitales, analogicas y para sacar etapas de potencia pero bueno luego puedo de idea y hacerlo al reves.
Cuando termine la placa, que espero mañana por la mañana si quieres te mando el archivo *.DSN y *.MAX por si acaso algun dia pues lo usas.
Anda que envidia estar en Malaga, solete, playita y dentro de poco Sierra Nevada cerca.
Muchas gracias, esto ya va funcionando. jejeje
-
La verdad que no se está mal por akí… jeje
Veo que avanzas a pasos grandes, ya mismo tienes el proyecto listo; En realidad el manejo de LCD, analógico y demás tiene algún objetivo o simplemente lo implementas para investigar sobre ese campo??
Suerte en tus avances...
-
Hola, que tal?? yevo unas semnas muy liado por eso no he podido contarte los avances. Bueno pus la palca me ha dicho la empresa que para el martes estara imprimida y los componentes soldados.
Ahora estoy haciendo las funciones del protocolo I2C, en la página de maxim encontre las cabeceras de las funciones, aunque básicamente no sirve de mucho me dio una idea de por donde seguir.
Con esas cabeceras y las hojas de caracteristicas del max7300 y del max7318 he desarrollado 5 funciones, leer y escribir 1 bit, leer y escribir 1byte y luego la la condicion de start y de stop del protocolo I2C. Las funciones las he simulado con Keil3.0 (Muchas gracias por el link) y han funcionado bien.
Ahora me queda resolver el problema de la función delay, para el protocolo I2C se tienen que cumplir unos tiempos minimos para que el dato quede validado, yo lo he puesto con un bucle for de 10 ciclos pero no se si cumplira los 4uS que son necesarios para los componentes max7xxx, sera cuestion de probar y de averiguar la fercuencia de Osc que tiene la placa DS80C400.
Ahora ya simulado las funciones el siguiente paso es realizar un programita para leer del teclado y escribir en el display LCD. Y es este paso para mi el que puede ser más complicado.
Para empezar me he leido de cabo a rabo todas las hojas de caracteristicas, lo que no se aun muy bien es como detectar mediante el puerto que he pulsado una tecla, es decir. Ya tengo en un registro los 4bits del codigo binario de la tecla que se ha pulsado, al mismo tiempo tengo un pin que me da un pulso de nivel alto cada vez que se pulsa una tecla (esto es por si acaso se pulsa la misma tecla ver que se ha pulsado dos veces), pero no puedo estar consumiendo todos los recursos del I2c en ver si se ha pulsado una tecla.
No se si me explico bien, he leido en las hojas de caracteristicas que los componentes si estan configurados sus puertos a entrada (input) entonces estos pueden detectar cambios en las entradas, la cosa es que no se si funciona como interrupción o no se. El caso es que lo mejor sería tener en la placa una entrada de INT para asi mediante irq poder saber quien ha interrumpido y leer entonces del componente que gobierna al teclado.
Asi que ahora me dedicare a eso, mientras me darán la placa y terminare de montar todo, para entonces hacer las pruebas ya fisicamente y espero que no me den muchos errores, pero mi experiencia es que seguro que me darán.
Una vez hecho eso ya solo es programas los diagramas de estados que tengo hechos y espero que ya.
Dejo el codigo fuente *.c de las funciones de I2C, para que si alguien tiene que usarlas que no se rompa la cabeza como he hecho yo:
#include<reg51.h>
#include "uah_types.h"
//#include "uah_bit_access.h" esta dentro del uah_types.h#define I2C_SDA P3_4
#define I2C_SCL P3_5
#define I2C_ENABLE_SCL_WAIT_FOR_SLOW_SLAVES 0
#define I2C_MAXIMUM_SCL_WAITCOUNT 10000
#define I2C_DELAY_LOOP_COUNT 0//sbit SDA = p3^2;
//sbit SCL = p3^3;unsigned char SLAVE1 = 0x40; // Variable con la direccion del periferico MAX7318.
unsigned char SLAVE2 = 0x82; // Variable con la direccion del periferico MAX7300.
unsigned char byte_leido; // Byte leido de algun esclavo.
unsigned char bit_leido; // Bit leido de algun esclavo.void i2c_delay(void) // retardo minimo de 4.7uS.
{ // Fosc = 11.0592MHz.
byte wait;for (wait=0;wait<10;wait++)
{
;
}
}void i2c_start(void)
{
I2C_SDA = 1; // SDA en teoria debe estar ya a "1" para que tenga condicion de STOP
I2C_SCL = 1;
//P3_4 = 1;
//P3_5 = 1;
i2c_delay();
I2C_SDA = 0;
i2c_delay();
I2C_SCL = 0;
i2c_delay(); // START de la transmision}
void i2c_stop(void)
{
I2C_SCL = 1;
i2c_delay(); // Cumplo Tsu, STO
I2C_SDA = 1;
i2c_delay(); // STOP de la transmision
}void validar_escritura(void)
{
I2C_SCL=1; // Realizo la señal de reloj SCL
i2c_delay(); //
I2C_SCL=0; //
}unsigned char i2c_select(unsigned char address)
{
// SELECCION DEL PERIFERICO QUE VAMOS A USAR
// SE PUEDE HACER EN EL MISMO CODIGO DEL MAIN()
}void i2c_bit(unsigned char singlebit)
{
unsigned char bit_a_enviar;
unsigned char ACK;bit_a_enviar=singlebit; // Asocio el bit que me pasan como parametro
i2c_start(); // Inicio la transmisión
if (bit_a_enviar == '1') // Transmito el bit
{ //
I2C_SDA = 1; //
}
else{
I2C_SDA = 0;
}validar_escritura();
//I2C_SCL=1; // Lo realiza la función validar función,
//i2c_delay(); // asi me quito los errores de que no me ejecutaba
//I2C_SCL=0; // las lineas estas
i2c_delay(); //
i2c_stop(); // Fin transmision
//ACK=SDA; // Compruebo si he recibido el bit ACK
//
//if(ACK == 0) //
//{
// exit -1; // Problema grave: el esclavo no ha recibido el dato
// // (no ha mandado ACK)
//}}
unsigned char i2c_readbit(void)
{
unsigned char i; // Variable auxiliar.
i2c_start(); // Inicio la transmisión.
I2C_SCL=1;
i2c_delay();
if(I2C_SDA == 1) // Asigno a la variable auxiliar el valor de SDA
{ //
i=1; //
}else i=0;
I2C_SCL=0; //
i2c_stop(); // Fin recepciónreturn (i); // Devuelvo el valor leido
}
unsigned char i2c_readbyte(unsigned char doACK)
//doACK = NACK = 1 para el ultimo byte.
//doACK = ACK = 0 para cualquier valor que no sea el ultimo.{
unsigned char i; // Variable del contador del bucle
unsigned char aux; // Variable donde se va almacenar el dato leido temporalmentei2c_start(); // Inicio la transmisión.
for (i=0;i<8;i++) // Lo realizo 8 veces – 1 byte.
{
I2C_SCL=1; // Comienzo la adquisicion.
i2c_delay();
aux = aux<<1; // Desplazo un bit (concateno el dato).
if (I2C_SDA == 1) aux++; // Obtengo el valor del bit de SDA.
I2C_SCL=0; // Bajo la señal para preparar la captura del siguiente.
i2c_delay();
}
I2C_SDA = doACK; // Esto es para el bit de ACK
I2C_SCL=1;
i2c_delay();
I2C_SCL=0;
i2c_delay();
return (aux); // Devuelvo eñ dato leido.
}
unsigned char i2c_writebyte(unsigned char singlebyte)
{
unsigned char byte_enviar;
unsigned char ACK;
unsigned char i;
byte_enviar = singlebyte;i2c_start(); // Inicio la transmisión
for (i=0;i<8;i++)
{
if (byte_enviar & 0x80) // Realizo la transmision
{ //
I2C_SDA = 1; //
}else I2C_SDA = 0; //validar_escritura();
//I2C_SCL=1; // Lo realiza la función validar función,
//i2c_delay(); // asi me quito los errores de que no me ejecutaba
//I2C_SCL=0; // las lineas estas
i2c_delay(); //
byte_enviar=byte_enviar<<1; // Desplazo byte a enviar hacia la izqda
}i2c_stop(); // Fin transmision
ACK=I2C_SDA; // Compruebo si he recibido el bit ACK
//
// if(ACK == 0) //
// {
// exit -1; // Problema grave: el esclavo no ha recibido el dato
// (no ha mandado ACK)
// }}
unsigned char i2c_writeblock(unsigned char address,unsigned char *barr,int length);
unsigned char i2c_readblock(unsigned char address,unsigned char *barr,int length);
unsigned char i2c_writereadblock(unsigned char address,unsigned char *barr1,int length1,
unsigned char *barr2,int length2);void main (void)
{
// Mandar un bit//i2c_bit('1'); // PERFECTO
//Leer un bit // PERFECTO
//bit_leido=i2c_readbit();
//P3_6=bit_leido;//Mandar un byte
//i2c_writebyte(0x5F); // Perfecto//P2=i2c_readbyte(1); // Perfecto, he leido (forzando la entrada del puerto)
// SDA a los valores 0x53 y me ha devuelto en el puerto
// P2 los valores que he leido del puerto SDA
}
Bueno si sabes alguna manera de como hacer que la placa se entere de que ha cambiado el teclado pues como siempre estaré muy agradecido.
te mando un mail ahora con algunos archivos.En una semana espero poner más avances</reg51.h>
-
Hola de nuevo!
Generalmente los microcontroladores tienen una entrada de interrupción (como por ejemplo la RB0/INT en los pic) que te indican un suceso externo, aunque posteriormente, mediante software debes comprobar que es realmente lo que ha ocurrido. No se si me he explicado.
En tu placa, en el datasheets del microcontrolador (pag 89) viene el tema de interrupciones donde te indica que posee varias interrupciones externas, y el vector de interrución al que salta. Sólo debes comprobar que esa interrupción esté dispnible para su uso en algún conector que uses, de esa forma podrás utilizarlo; a no ser que sea utilizado por el controlador ethernet, can, etc…
No sé si te dejo claras las cosas... aunque ya llevas el proyecto avanzado... y a la vez sin problemas(mejor así ¿no?) jeje
-
Joder mira que tengo PDF´s pero no he visto nada de las interrupciones, he econtardo que esta en el J4, y que el puerto I2C tiene el SDA en P1.1 y SCL en P1.0.
Hoy me esta entrando un bajón porque se esta complicando bastante y la placa esta no encunentro el vector de atencion ni de como usarlo y no se si las funciones I2C funcionarán en el micro.
Dime si puedes cuando puedas que datasheet lo has buscado. He pensado en cambiar a un micro, algo más sencillo, lo mas parecido al 8051 con sus 4 puertos I/O, sus cuatro INT muy accesible.
Muchisimas gracias por toda la ayuda.