Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

04/01/2015 #21


Eso sucede porque antes de enviar al integrado pcf8574, grabo el dato en la eprom y luego lo envio.
Te digo algo en PCF8574 enciende el ultimo dato que envias, sivos envias 1 para que encienda la pata 1 lo hace pero si envias para que encienda la pata 6 apaga la uno y enciende la 6, como se corrige eso facil sumando. Si vos grabas enla eprom en la direccion 00 el valor 01 enciende la pata 1 cuando va a buscar el valor enla eprom y lo envia por I2C para que encienda.

Si vos queres queencienda la Pata 6 del integrado no podes enviar enl valor 6 sino 32 osea 2 a la n. si queres la pata 8 envias 128, asi enciende la que seleccionas porque sienvias el valor 6 hace la combinacion binaria de 6 y te enciende la 1 la 2 y la 3.

Entonces si tengo encendida la 1 y quiero encender la pata 6 no puedo enviar 32 solamente porque si enciende la 6 pero apaga la 1 eso se corrige sumando val += read_eeprom(i); hace eso sumalo de la direccion dela eprom 00 con valor 01 y sumalo de la direccion 05 (eeprom)con el valor guardado 20, dando comore sultado 20+ 01 = 21 por lo tanto al enviar por I2C al pcf8574 ese valor como la 1 estaba encendida sigue asi y me enciende la pata 6.

y el for lo que hace es leer de a grupos de a 8 en la eeprom, osea que seria el equivalente a las 8 patas de cada integrado.
direccion 00 a 07 para integrado 1, 08h a 0Fh (15d) Integrado 2, 20h (16d) a 27h (23d) y asi entonces si dato es 0 va a leer las 8 primeras direcciones para el integrado (PCF8574) 1(0 a 7), si dato es 8 osea de 8 a 15 para el integrado 2 y asi...

si dato es =16,for(i=16;i<=(16+7);++i) osea de 16 a 23 y ahi ya tenes para el integrado 3.

Asi trabaja esto.

Peroel problema es que si leo uno de los 8 pulsadores para el AN0 funciona, si hago solo para el AN1 funciona que coreesponde para elintegrado 2 AN1, y asi. pero cuando coloco enel main para que lea AN0 envie luego AN1 y envie ya no funciona.

Sera porque no estoy utilizando todas las entradas Analogicas habilitadas que tengo??? estoy en un protoboard.

Lo que quiero hacer es encender las luces de una casa hay unas 50 teclas ponele y lospcf van a controlarlos reles que van a encender, eso estoy haciendo. necesito muchas entradas y salidas las salidascon PCF8574 y las entradas 8por cada AN con divisor resistivo.
05/01/2015 #22
Moderador

Avatar de D@rkbytes

dcsalg dijo: Ver Mensaje
¿Será porqué no estoy utilizando todas las entradas analógicas habilitadas que tengo?
No lo creo, aunque las tengas habilitadas y no se usen, las que uses deberían responder, siempre y cuando establezcas el canal que vas a usar con "Set_ADC_Channel(Canal)".

Te recomiendo que entres en modo de depuración en tiempo real usando ICD para que vayas viendo como se va ejecutando el código y veas cuando no responde.
06/01/2015 #23


Uh. ¿Te puedo preguntar algo? ¿Cómo se utiliza eso del ICD? ¿Se necesita algo?
Nunca utilicé eso. Otra cosa. ¿Te puedo pasar el programa y el diseño de proteus para que lo utilices y así ves como funciona?

---------- Actualizado después de 21 minutos ----------

Ahí agregué dos ZIP uno que es el programa y el otro el circuitode proteus, así lo usas.
Tengo otro problema, hay un teclado que es para menú en el Display, pero cuando utilizo la Entrada AN4 y presiono el primer botón, también entra al menú. ¿No entiendo?
Si coloqué un IF que justamente dice que funciona si es AN5. Esa parte está en el subprograma Valoradc, la selección y la parte que envía el canal está en el main.

---------- Actualizado después de 1 hora ----------

Una cosa, me esta dando dolor de cabeza, ya cuando creo que está no funciona a veces si, me refiero que cuando pongo a escanear las entradas y presiono el botón, a veces funciona, otras no.
Proteus anda en la vida real. ¿No es así?
Yo quiero conectar unas 50 pulsadores, del cual 8 son para el menú como se ve en los archivos ZIP anteriores y controlar varias salidas con los PCF8574 para armarlo en una casa. ¿Cómo hago?
Ya estoy dejando de lado los divisores, con entradas análogas como que no funciona.
¿Abro un nuevo tema para colocar el inconveniente?
Archivos Adjuntos
Tipo de Archivo: zip Domotica DP887.zip (288,3 KB (Kilobytes), 16 visitas)
Tipo de Archivo: zip cto 887 proteus.zip (62,5 KB (Kilobytes), 11 visitas)
06/01/2015 #24
Moderador

Avatar de D@rkbytes

  • Sobre la depuración usando ICD, puedes encontrar información en el Foro o por Internet.
  • La depuración la tienes que realizar tú, porque eres quien tiene el circuito físico.
  • Proteus no anda en "Vida real", es un simulador de circuitos, pero también sirve como depurador.
  • No debes abrir un nuevo tema, pues aquí ya estás tratando ese problema.
06/01/2015 #25

Avatar de Saint_

... No desacreditemos a Proteus, si bien es cierto que es un simulador este hace bien su trabajo salvo algunas situaciones donde los errores son más de los humanos. Por mi parte no confio ciegamente en Proteus pero con el criterio adecuado todo me a funciona bien.

dcsalg si dices que todo funciona bien en el simulador pero no en el circuito real, es probable que la falla sea más de conexiones, ruido en la fuente, o simplemente el "proto" (asi le llamamos por esta parte del mundo).
Por otro lado la versión de proteus que usas es la 8 y por lo menos yo no puedo abrirla ya que manejo la versión 7.10, sería mejor subas el esquema en una versión anterior o por lo menos una imagen de tu circuito.

---------- Actualizado después de 40 minutos ----------

dcsalg, en el ultimo codigo que subiste le faltan los procedimientos correspondientes a:
escanea_envia(AD0);
escanea_envia(AD1);
escanea_envia(AD2);
escanea_envia(AD3);
escanea_envia(AD4);
Imágenes Adjuntas
Tipo de Archivo: png Sin título.png (70,0 KB (Kilobytes), 86 visitas)
07/01/2015 #26


El programa está completo, fíjate en los ZIP que está escanea_envia, y no creo que sea problema de ruido, porque cuando lo hago con AN0 anda bárbaro, cuando utilizo los otros comienzan los problemas.
Si fuera ruido no funcionaría ninguno, porque lo tengo armado uno al lado del otro y por separado si funciona.
Yo quiero conectar unos 50 pulsadores al pico. ¿Cómo hacer eso?
Yo apliqué eso pero veo que no va, todo lindo las teorías, pero la práctica no.

---------- Actualizado después de 21 minutos ----------

Por eso conectaba con divisor resistivo y en las entradas análogas 8 pulsadores pero si es muy problemático, porque veo que es así, porque ya da dolores de cabeza de lo inestable que es, bueno, hacerlo en forma digital los 50 pulsadores.
El asunto es; ¿Cómo lo hago ahora? Yo quería hacerlo por el método ADC pero veo que no va, necesito que funcione bárbaro.

Nota del Moderador:
Por favor, edita tus mensajes en vez de crear nuevos.
07/01/2015 #27
Moderador

Avatar de D@rkbytes

dcsalg dijo: Ver Mensaje
El asunto es; ¿Cómo lo hago ahora? Yo quería hacerlo por el método ADC pero veo que no va, necesito que funcione bárbaro.
Necesitas corregir los varios errores que tienes en el programa, pues estás creando bucles sin abrir ni cerrar.

Mira las siguientes rutinas del archivo SubFuncDCS.c:
void eeprom_ini()
int BCD(int y)
char leeEPROM(char dato)
void TodasLasSalidas (char dato)

En esas rutinas hace falta envolver las instrucciones.

Otro detalle:
Las definiciones para los pines de reloj y datos del bus I2C, también son erróneas.
Tienes:
#define C_SCL PIN_C3
#define C_SDA PIN_C4

Pero en el esquema tienes RB6 como SCL y RB7 como SDA

Posiblemente existan mas errores.
07/01/2015 #28

Avatar de Saint_

dcsalg, te comento que en el archivo DomoticaDP887.zip que subiste encuentro los siguientes archivos y en ninguno de ellos esta el procedimiento de escanea_envia(xx); y en el archivo cto 887 proteus.zip tampoco se encuentra el procedimiento mencionado.
Imágenes Adjuntas
Tipo de Archivo: png Dibujo1.PNG (86,4 KB (Kilobytes), 80 visitas)
07/01/2015 #29


En SubFuncdcs.c están todos los sub programas.
Observa bien, si no estaría, te da error el compilador al crear el Hex.
Lo de BCD y otras funciones si devuelven el valor, si no, no se grabarían los datos en la EEPROM ni me encenderían las patas poniendo en 1 la de los PCF 8574.

Puede ser en el proteus que esté mal, pero el problema grave está en el protoboard, yo quiero leer como 50 pulsadores mediante entradas análogas y la verdad resulta que no es así, yo pasé el proteus como referencia pero repito, quiero que si presionó un botón encienda un led, bueno, así con los ocho botones de cada entrada analógica.
Estoy o mejor dicho, voy a utilizar 8 entradas analógicas, y antes de que encienda el led, quiero que grabe en la EEPROM el valor del botón presionado.

Bueno, todo eso en la ficción muy lindo, la realidad no.
Por favor, pido que se enfoquen en lo que es entradas analógicas, seleccionar canal, leer dato, y buscar en la tabla, para que según el valor devuelva entre 0 y 7, después mediante la función BCD obtengo un valor de 2 a la N y eso lo guardo en la EEPROM para luego más tarde ser leído para ser enviado por i2c a cada uno de los PCF.

Otra cosa, es raro, porque miré el circuito de proteus que subí, o sea el domo887 de proteus y está conectado en RC3 y RC4, no está en el puerto B.
Los archivos a utilizar es el domo887 para proteus y el domoticadp887 que es la programación. Menciono esto porque si me preguntan sobre los subprogramas (funciones) es que no están leyendo el programa completo.
Y el error no sé donde está y si se complica se usa digital y dejo lo analógico.
07/01/2015 #30

Avatar de Saint_

dcsalg, entiendo que si no existiera el procedimiento escanea_envia(xx); no podrias compilarlo pero como lo compilaste y generaste el archivo *.hex entonces debe existir, pero si existiera en el archivo que subiste yo no debería tener problemas para recopilarlo pero resulta que si tengo problemas y es que el compilador no encuentra dicho procedimiento.
... este el archivo que que descomprimi a partir de lo que subiste anteriormente, ahora dime donde esta el procedimiento escanea_envia(xx);
Código:
//=========================================================================== 
//                         INICIALIZA LA EEPROM
//===========================================================================
void eeprom_ini()
{
   int i;
   for(i=0;i<=39;++i)
      write_eeprom(i,0);      //Escribe 0 en la EEPROM
}//FIN eeprom_ini

//=========================================================================== 
//           CONVIERTE EL NUMERO A SU SALIDA EN BINARIO
// Estado: Depurado
//===========================================================================
int BCD(int y)
{
   unsigned int r=1,i;
   
   for(i=1;i<y;i++)
         r*=2;
   return r;
}//FIN BCD


void i2c_envia(char addr,char data)
{ 
   i2c_start(); 
   i2c_write(addr); 
   i2c_write(data); 
   i2c_stop(); 
}//FIN i2c_envia

unsigned char i2c_lee(char addr) 
{ 
char data; 
   i2c_start(); 
   i2c_write(addr); 
   data=i2c_read(0); 
   i2c_stop(); 
return data; 
}//FIN i2c_lee

//===========================================================================
//         GUARDA EL VALOR  EN LA EPROM MEDIANTE LA DIRECCION Y DATO
// Estado: Depurado
//===========================================================================
void grabaEEPROM(char addr, char dato)
{
   int val;
   val = read_eeprom(addr);
   delay_us(10);
   if(val!=0)
      dato = 0;

   write_eeprom(addr,dato);
   delay_us(10);   
      
}// FIN grbaEEPROM

//=========================================================================== 
//                LEE la EEPROM Y LO TRANSMITE POR I2C
//===========================================================================
char leeEPROM(char dato)
{
   int i,val;
   val=0;
   for(i=dato;i<=(dato+7);++i)
      val += read_eeprom(i);
   
   return val;
}// FIN leeEEPROM


int rangos_adc(int16 dato)
{
      if((dato>204)&&(dato<307))             //1V-1.5V
         return 0;
      if((dato>307)&&(dato<409))             //1.5V-2V
         return 1;
      if((dato>409)&&(dato<511))             //2V-2.5V
         return 2;
      if((dato>511)&&(dato<614))             //2.5V-3V
         return 3;
      if((dato>614)&&(dato<716))             //3V-3.5V
         return 4;
      if((dato>716)&&(dato<818))             //3.5V-4V
         return 5;   
      if((dato>818)&&(dato<920))             //4V-4.5V
         return 6;
      if((dato>920)&&(dato<1023))            //4.5V-5V
         return 7;
     
     return -1;
   
}//FIN RANGO ADC


//=========================================================================== 
//           SELECCIONA el canal ADC y lo guarda en la memoria
// Estado: Depurado
//  Agrupa cada integrado de 8 en 8:  8, 16,24...
//===========================================================================
int valoradc(int chan) //,int1 save, int val)
{  
   int v, v2;
   int16 muestra=0;
   
   set_adc_channel(chan);        //SElecciona Canal
   delay_us(20);
   muestra=read_adc();           //Toma una muestra del ADC
   delay_us(10);                 
   
   if(muestra>180){         //SI se precionoel boton entra al IF
      delay_us(50);         //Retardo minimo porel cambio de estado del boton
      muestra=read_adc();   // Lee el adc y loalmacena en muestra
      v=rangos_adc(muestra);//Elije un numero entre 0 y 7 segun el rango medido
      
      v2=v+1;               //Suma El valor del Rango uno mas arriba
      while(read_adc()) delay_us(20);  //Espera que se suelte la tecla
   }//FIN IF MUESTRA
   
   
   if(v!=-1&&chan!=AD5) {    // Limita entre -1 y Ultimo canal AD
         v += chan*8;            //Multiplica por 8 cada Integrado
         grabaEEPROM(v,BCD(v2)); //Graba en la eprom el boton Precionado
   }// FIN IF 
   
   
   return v2;                    //Retorna un valor entre 1 y 8
}// FIN valor adc


void TodasLasSalidas (char dato)
{ int i;

   for(i=AD0;i<=AD5;++i)
      i2c_envia(ADDRE[i],dato);                 //Ponea cero el Integrado 1
}//FIN TodasLasSalidas
07/01/2015 #31
Moderador

Avatar de D@rkbytes

dcsalg dijo: Ver Mensaje
Otra cosa, es raro, porque miré el circuito de proteus que subí, o sea el domo887 de proteus y está conectado en RC3 y RC4, no está en el puerto B.
Los archivos a utilizar es el domo887 para proteus y el domoticadp887 que es la programación. Menciono esto porque si me preguntan sobre los subprogramas (funciones) es que no están leyendo el programa completo.
Y el error no sé donde está y si se complica se usa digital y dejo lo analógico.
Pues no, no sé que archivo estés viendo, porque el que adjuntas en el post #23 no corresponde a lo que mencionas.
Aquí lo adjunto en PDF.

También lo que dice Saint_ es cierto, esas rutinas que menciona, no se encuentran.
De hecho para tratar de compilar el programa, se tienen que acomodar algunas cosas, de otra forma surgen demasiados errores.

Así tal cual sin modificar: Sin modificar.jpg
Ya ordenado "para tratar de compilar": Ordenado.jpg
Archivos Adjuntos
Tipo de Archivo: pdf domo887.pdf (200,3 KB (Kilobytes), 8 visitas)
07/01/2015 #32


Código:
void escanea_envia(int canal)
{  char v,ve;
         v=valoradc(canal);           
         v=canal*8;                   //Mul. por 8 asi despues busca en la EEPROM
         ve=leeEPROM(v);            //Guarda en iel valor delaeeprom
         i2c_envia(ADDRE[canal],ve);  //Utiliza i para enviar el dato por I2C
}
Esta rutina quedó entre /* */
Lo que pasa es que a medida que voy escribiendo en el foro voy probando alternativas y capaz lo anulé por algo.
Está dentro del archivo C subfuncdcs al final.

Pero bueno, escanea_envia(AD0) o sea canal 0 funciona, escanea_envia(AD1) funciona siempre que son por si solos.
Si pones ambos, ya para que vaya escaneando los canales no funciona.
Pero me parece que lo logro hacer funcionar agregándole esto: Las 4 primeras líneas es cuando comencé con el programa y las consultas en el foro, las otras cuatro que agregué ayudaron a leer un poco mejor cuando comencé a escanear las otras entradas analógicas.
Código:
set_adc_channel(chan);        //SElecciona Canal
   delay_us(20);
   muestra=read_adc();           //Toma una muestra del ADC
   delay_us(10);
Código:
if(muestra>180){         //SI se precionoel boton entra al IF  180
      delay_us(50);         //Retardo minimo porel cambio de estado del boton
      muestra=read_adc();   // Lee el adc y loalmacena en muestra
      v=rangos_adc(muestra);//Elije un numero entre 0 y 7 segun el rango medido
Pero si en el MAIN ya comienzo agregarle las rutinas para el LCD y otras cosas más, ya quedan todos los leds encendidos.
¿Y todo esto saben por qué pasa? Porque proteus miente, proteus si quieres hacer encender un led con un botón y un pic, funciona, se la complicas un poco a proteus y comienzas con cosas de verdad ya mas elaboradas, no sirve, y eso que sólo hablo de entradas analógicas y un display, pero a ese programa le falta un montón aún.
Para ver cositas va, pero esto me defraudó totalmente.

Bueno, si se complica, lo que voy a hacer es reemplazar para entrar en forma digital.
Voy a seguir un poco más, si no funciona, lo hago digital.
Repito, son 50 botones, capaz alguien a utilizado conectar esa cantidad en un pic.
07/01/2015 #33

Avatar de Saint_

Déjeme comentar a favor de proteus... ya que francamente a afrontado problemas de diseño electrónico mas complicados que combinaban circuitos analógicos y digitales y todo deputado bajo proteus y siempre sali airoso.
... ahora si, creo que ya podemos ir por buen camino...voy a ver como anda todo ese código.

A grandes rasgos puedo notar que:

Se hace un uso exhaustivo de la escritura de la eeprom del pic, es decir que cada vez que se lee una entrada analógica se escribe la eeprom y como dicha lectura esta en un bucle infinito y asumiendo (por ser optimista) que eso se hace cada 10 mili segundos tenemos que:
según la hoja de datos de microchip la eeprom tiene un tiempo de vida de 1000000 ciclos de escritura, esto implica que si escribimos en esa memoria cada diez mili segundo tenemos:
10ms*1000000=10000s=>167 minutos y eso nos da algo mas de 2 horas y media de tiempo de vida útil de la eeprom del pic. Debido a esto no me parece buena idea usar la eeprom para este caso o al menos usarla de ese modo.

"lastimosamente este es un detalle que proteus no detectara pero para eso estamos nosotros..."

dcsalg me gustaría que subas una imagen del circuito que tienes ya que el "proteus" que subiste no lo puedo abrir debido a que uso una version anterior al proteus 8.
07/01/2015 #34


Yo el circuito de en serio, está realizado en diptrace, pero el que puse en Proteus es básico, como para probar, que no deja de ser muy diferente del real.
Es un PIC16F887, que por sus I2C para RC3 y RC4 conecto unos seis PCF8574 porque necesito muchas salidas.
Y las muchas entradas es por divisores resistivos conectando ocho pulsadores por cada entrada analógica del pic, utilizando AN0 hasta AN5 y más, capaz.
Nada de otro mundo y otro puesto lo utilizo para el LCD, que con sólo agregar la linea LCD_INIT() ya deja de funcionar lo que poco funcionaba.
O sea, ya no sólo tengo problemas con las entradas analógicas que ya algo funciona, ahora de tanto modificar lo que expliqué en el post #32, sino que agrego LCD_INIT() y ya no anda.
No me lee ninguna entrada análoga, porque presiono el botón y no funciona.

Proteus Capaz dice que anda el display y los botones pero no es así en la realidad.


Otra Cosa despreocupate si no te abre proteus total miente.
Y una Mas, si miras bien el programa, la Eprom solo graba si preciono el boton sino no.

Bueno Alguien sabe que paso,que por lo visto envia datos por I2C y me pone todo en 1 solo con agregar LCD_INIT(), hay cosas que no comprendo si uno logra que valla funcionando me pasa esto. solo agregue una linea a lo que tenia para inicializar y paso esto.
Algo hace la inicializacion del LCD que no haga que funciona lo que viene andando.
Imágenes Adjuntas
Tipo de Archivo: jpg cto887.jpg (119,3 KB (Kilobytes), 9 visitas)
08/01/2015 #35

Avatar de Saint_

dcsalg, con lo ultimo que subiste ya pude compilar correctamente tu programa y esto es lo que me salio al depurarlo en proteus.

Son un "kilo" de mensajes que dicen que una transición espurea se presento en el pin SCL del bus i2c... de lo que no estoy seguro es que si esa situación se presenta solo en proteus o también en el circuito real, si fuera el segundo caso eso explicaría el porque hay veces que si te funciona el circuito y hay veces que no.

Hice unas pequeñas modificaciones a tu programa y esto es lo que salio al final.

Espero que con esto se solucione el problema.
adjunto el programa corregido (domo.rar).

te pido que no lo recompiles y que lo cargues asi como esta a tu microcontrolador y verifiques su funcionamiento.

también puedes probar con este otro programa que hice(ejemplo.rar), conceptualmente es lo mismo pero tiene un enfoque distinto en cuanto a su metodología, ten en cuenta que para este ejemplo.rar los valores de los resistores que use son distintos a los que tu usas en tu circuito.
Este es el resultado de dicho programa.
Igualmente te pido que no lo recompiles y que lo cargues así como esta a tu microcontrolador y verifiques su funcionamiento.

si estos programas funcionan correctamente recién los puedes recompilar y volver a ver si funcionas bien.
Un saludo y espero que te sirva.
Imágenes Adjuntas
Tipo de Archivo: png Dibujo1.PNG (79,4 KB (Kilobytes), 64 visitas)
Tipo de Archivo: png Dibujo2.PNG (82,0 KB (Kilobytes), 64 visitas)
Tipo de Archivo: png Dibujo3.PNG (83,7 KB (Kilobytes), 65 visitas)
Archivos Adjuntos
Tipo de Archivo: rar Domo.rar (86,4 KB (Kilobytes), 10 visitas)
Tipo de Archivo: rar ejemplo.rar (92,7 KB (Kilobytes), 12 visitas)
09/01/2015 #36


Lo voy a probar a ver como funciona y comento

Bueno el primero osea domo.rar no funciono,y elsegundo osea ejemplo.rar tampoco.

el que te habia pasado tenia el problema con lcd_init() al agregarlo ya no funcionaba quedando los leds encendidos de sal salidas de los PCF. y si lo anulaba con // funcionaba.

Ahora una acotacion te felicito igual por lo de ejemplo.rar el programa esta barbaro porque hace lo mismo sin almacenar nada en la eprom y enecendes el pin que queres. Yo nosoy capo en C, pero la verdad me gusto lo que hiciste voy a tratar de entenderlo comorepitono soy guau y veo que usaste cosas que nunca utilice en los programas.

Volviendo no hay problema si molesta mucho lo del ADC, usare los ADC para leer otras cosascomo valores de tension si se corta laluz y demas y bueno el sistema de botones sera digital nose si es practico lo que tengo pensadopero seria cuestion de probar. Es utilizar4 pines del puerto b como salida y los otros4 como entrada entonces con un 74HC154 salgo del pin 1 al 16 y lo ire chequeando con los otos 4 de entrada quedaria una gran matriz 16x4 64 teclas. esono tendria que fallar o son 5v o 0v y conectare lasteclas de la casa a cada uno de esos. Que opinas?
09/01/2015 #37

Avatar de Saint_

Dcsalg, así como lo planteas es una buena idea, pero es obvio que no existe una librería para este caso tan particular…, pero nada que no se pueda lograr. Debido a los antecedentes que comentas en los anteriores post especialmente.

Nada de otro mundo y otro puesto lo utilizo para el LCD, que con sólo agregar la linea LCD_INIT() ya deja de funcionar lo que poco funcionaba.
O sea, ya no sólo tengo problemas con las entradas analógicas que ya algo funciona, ahora de tanto modificar lo que expliqué en el post #32, sino que agrego LCD_INIT() y ya no anda.
Suena a síntoma de “bug” del compilador, alguna vez me paso en versiones anteriores de CCS y también en MikroC y solo pude percatarme de la raíz del problema usando a fondo el depurador de proteus, revisando el asm que genera el compilador y enviando por puerto serie los valores “clave” (registros, variables, mediciones voltajes con el voltímetro) y todo lo necesario para descubrir hasta donde funcionaba bien el programa…, en fin es algo que hice hace un buen tiempo.
Francamente espero que sea más un problema de hardware ya que así no se tendría que desconfiar de las herramientas programación que tienes.
10/01/2015 #38


Hola. Mira, te comento que lo del ADC lo dejé de lado ya.
Estoy usando 74HC154, escaneo los botones y estoy entrando por el puerto B de 4 a 7.
Funcionó de una eso, y el problema es cuando utilizo el display, yo no lo tengo conectado el display, pero al agregar la librería del display LCD y utilizar el comando LCD_INIT(), ya no funciona nada, anulo eso con // y funciona.
Evidentemente no es hardware es un problema en el programa, algo hace que no me funcione y al anularlo sí. ¿Será problema de la librería LCD del CCS?

#define LCD_ENABLE_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_RS_PIN PIN_D2
#define LCD_DATA4 PIN_D3
#define LCD_DATA5 PIN_D4
#define LCD_DATA6 PIN_D5
#define LCD_DATA7 PIN_D6

Así está declarado. Es lo mismo que utilizaba en el programa anterior cuando quería hacer los botones con ADC.
Pero bueno, la verdad no funciona el programa. He insisto, para mi es el programa LCD del CCS que me hace algo para que el mío no funcione.

Nota: Descubrí algo. Cuando utilizo esa librería la de LCD y coloco LCD_INIT(); lo que veo es que los LED quedan todos encendidos y demás, porque no funciona el I2C, no envía los datos.
Puse una memoria EEPROM en el circuito, y cuando no utilizo esa librería graba los datos.
Al colocarla ya no graba porque no envía los datos por I2C. ¿Qué pasa?
Ese es el problema, sin librería anda, con la librería el I2C no funciona.
12/01/2015 #39

Avatar de Saint_

dcsalg, por lo que comentas queda en evidencia que el problema es del compilador y te recomiendo que uses una version anterior o una superior a la que tienes, pero entes de prueba esto:

#define LCD_ENABLE_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_RS_PIN PIN_D2

#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#ZERO_RAM
13/01/2015 #40


Una consulta el #ZERO RAM ese es importante donde este ubicado, osea puede estar antes o despues? varia en algo eso?

Lo del compilador me dejaste como raro,oseaque los muchachos de CCS a medida que sacan versiones superiores hacen macanas? supuestamente tendrian que correjir lo errores no empeorar. Bueno te comento que lo habia hecho eso y no funciono, termine bajando un lcd de internet que hizo alguno no es sofisticado como el original pero funciona pora hora. Pero los de CCS tendrian que ver esas cosas no puede ser que no funcione declarando asi, ojo en preoteus funciona pero cuando lo hacer realno, osea como siempre, acostumbrado ver que lo que funciona en proteus en lo real no.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.