Autor Tema: Visualizar voltaje en Lcd  (Leído 5856 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Visualizar voltaje en Lcd
« Respuesta #30 en: 04 de Febrero de 2016, 20:52:18 »
Citar
sprintf
int sprintf ( char * str, const char * format, ... );
Write formatted data to string
Composes a string with the same text that would be printed if format was used on printf, but instead of being printed, the content is stored as a C string in the buffer pointed by str.

The size of the buffer should be large enough to contain the entire resulting string (see snprintf for a safer version).

A terminating null character is automatically appended after the content.

Mirando el codigo parece todo correcto. Si

Insisto en que si quiere escribir 10.23 en el LCD, el '\0' cae en cualquier lugar de la RAM...

-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Visualizar voltaje en Lcd
« Respuesta #31 en: 04 de Febrero de 2016, 21:09:33 »
ahh pero pense que ya habia probado con eso de ponerle unos lugares mas al array

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #32 en: 05 de Febrero de 2016, 03:04:36 »
Perdón si que he probado de modificar el array como comenta elgarbe pero no esta aquí el fallo, de todos modos en las pruebas no tengo mas de 5 voltios, aun así si el fallo estuviera en el array no tendría porque funcionar bien con un Lcd y mal con otro,
otra cosa, he probado de modificar los valores de los delays como comenta KILLERJC y con estos valores no escribe en el Lcd.

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Visualizar voltaje en Lcd
« Respuesta #33 en: 05 de Febrero de 2016, 14:28:50 »
Bueno me quede sin ideas... La unica que me queda es:

Código: C
  1. while( BusyXLCD() );
  2.         gotoxyXLCD(1,1);
  3.         while( BusyXLCD() );
  4.         putrsXLCD("Bateria: ");
  5.         sprintf(cadena_de_texto,"%.2f",voltios);    //Visualizamos voltaje en formato float
  6.         while( BusyXLCD() );
  7.         putrsXLCD(cadena_de_texto);
  8.         while( BusyXLCD() );
  9.         gotoxyXLCD(1,2);
  10.         while( BusyXLCD() );
  11.         putrsXLCD("Estado: ");

Los delays como lo puse deberian ser correctos. De todas formas si tiene mas tiempo no deberia haber problemas.
Y tambien pone el buffer cadena_de_texto para que tenga unos 10 lugares masomenos y no salvamos de eso como dijo elgarbe

char cadena_de_texto[10];

Si ya con eso no se arregla entonces es el LCD :3 creo yo.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Visualizar voltaje en Lcd
« Respuesta #34 en: 05 de Febrero de 2016, 14:56:40 »
+1!!!
-
Leonardo Garberoglio

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #35 en: 05 de Febrero de 2016, 17:25:29 »
Nada he probado con el código de KILLERJC, he cambiado el Lcd por otro nuevo del mismo modelo y sigue sin funcionar, ya no se que probar eso me desespera. :cry:
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Visualizar voltaje en Lcd
« Respuesta #36 en: 05 de Febrero de 2016, 20:06:59 »
foto del circuito montado?
-
Leonardo Garberoglio

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #37 en: 06 de Febrero de 2016, 11:42:51 »
Tengo el Lcd conectado en modo 4bits en el Puerto B y el potenciometro en RA0.

Saludos.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Visualizar voltaje en Lcd
« Respuesta #38 en: 06 de Febrero de 2016, 12:48:57 »
El tema es que lo imprime como 3/4 veces bien. Y luego se pone re loco, y por lo que parece es el LCD, es como si el puntero a memoria ( el que debe barrer para refrescar el LCD ) se volviera re loco y saltara a cualquier lado.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #39 en: 06 de Febrero de 2016, 16:01:39 »
Con este código cumpliría su cometido, el problema creo que sera al leer los sensores que pasara lo mismo que antes.
Código: C
  1. /*
  2.  * File:   main.c
  3.  * Author: miquel
  4.  *
  5.  * Created on 23 de enero de 2016, 21:43
  6.  */
  7.  
  8. #include <xc.h>
  9. #include <delays.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include "MyXLCD.h"
  13. #include "word_config.h"
  14.  
  15. #define _XTAL_FREQ 48000000
  16.  
  17. /*
  18.  *
  19.  */
  20.  
  21. void DelayFor18TCY(void)    //Delay 0,00002sec => 20us => 0,02ms
  22. {
  23.     //Delay10TCYx(2);
  24.     Delay10TCYx(24);
  25. }
  26. void DelayPORXLCD(void)     //Delay 0,015sec => 15000us => 15ms
  27. {
  28.     //Delay1KTCYx(15);
  29.     Delay1KTCYx(180);
  30. }
  31. void DelayXLCD(void)        //Delay 0,002sec => 2000us => 2ms
  32. {
  33.     //Delay1KTCYx(2);
  34.     Delay1KTCYx(24);
  35. }
  36. /* Envia comando al LCD */
  37. void comandXLCD(unsigned char a)
  38. {
  39.     BusyXLCD();
  40.     WriteCmdXLCD(a);
  41. }
  42.  
  43. /* Ubica cursor en ( x = Posicion en linea , y = N de linea ) */
  44. void gotoxyXLCD(unsigned char x, unsigned char y)
  45. {
  46.     unsigned char direccion;
  47.  
  48.     if(y != 1)
  49.         direccion = 0x40;
  50.     else
  51.         direccion = 0;
  52.  
  53.     direccion += x-1;
  54.     comandXLCD(0x80 | direccion);
  55. }
  56.  
  57. void main(void)
  58. {
  59.     unsigned char i,j;
  60.     char cadena_de_texto[6];
  61.     unsigned int valor_adc;
  62.     float voltios;
  63.    
  64.     OpenADC(ADC_FOSC_RC & ADC_RIGHT_JUST & ADC_2_TAD,
  65.             ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VSS, ADC_0ANA);
  66.     OpenXLCD(FOUR_BIT & LINES_5X7);     // Iniciamos Lcd
  67.     comandXLCD(0x06);       // Nos aseguramos incremento de direccion, display fijo
  68.     comandXLCD(0x0C);       // Encendemos Lcd
  69.     gotoxyXLCD(1,1);
  70.     putrsXLCD("Test DIONE by");
  71.     gotoxyXLCD(1,2);
  72.     putrsXLCD("Miquel Servera");
  73.  
  74.     for(i=0; i<=15; i++)
  75.     {
  76.         for(j=0; j<=i; j++)
  77.         {
  78.             Delay10KTCYx(20);
  79.         }
  80.     }
  81.    
  82.     comandXLCD(0x01);       //Clear display
  83.     SetChanADC(0);  //Seleccionamos canal
  84.     ConvertADC();    //Iniciamos conversion
  85.     while(BusyADC()){}    //Esperamos que termine la conversion
  86.     valor_adc = ReadADC();  //Leemos conversion y la guardamos en valor_adc
  87.     voltios = (valor_adc/1024.0)*5.0;   //Convertimos valor ADC
  88.     gotoxyXLCD(1,1);
  89.     putrsXLCD("Battery: ");
  90.     sprintf(cadena_de_texto,"%.2f",voltios);    //Visualizamos voltaje en formato float
  91.     putrsXLCD(cadena_de_texto);
  92.     gotoxyXLCD(1,2);
  93.     putrsXLCD("State: ");
  94.    
  95.     if(voltios >= 3)
  96.     {
  97.         gotoxyXLCD(9,2);
  98.         putrsXLCD("OK");
  99.     }else{
  100.         gotoxyXLCD(9,2);
  101.         putrsXLCD("LOW");
  102.     }
  103.  
  104.     for(i=0; i<=15; i++)
  105.     {
  106.         for(j=0; j<=i; j++)
  107.         {
  108.             Delay10KTCYx(20);
  109.         }
  110.     }
  111.    
  112.     comandXLCD(0x01);       //Clear display
  113.     gotoxyXLCD(1,1);
  114.     putrsXLCD("ENT for Start");
  115.     gotoxyXLCD(1,2);
  116.     putrsXLCD("MOV for Menu.");
  117.    
  118.     while(1)
  119.     {
  120.        
  121.     }
  122. }


Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Visualizar voltaje en Lcd
« Respuesta #40 en: 06 de Febrero de 2016, 20:39:21 »
Bueno, pero ese LCD no parece estar roto!!!
Es el mismo que no funcionaba?

sds.
-
Leonardo Garberoglio

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #41 en: 06 de Febrero de 2016, 21:02:28 »
Si es el mismo LCD lo que pasa es que ahora todo el codigo esta fuera del while

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Visualizar voltaje en Lcd
« Respuesta #42 en: 06 de Febrero de 2016, 21:09:40 »
Hace el ejemplo mas corto y pasa el ASM / hex... es rarisimo, Igual el problema sucede cuando se actualiza una y otra ves. Me digno a navegar por el ASM para intentar ver que pasa en el main... ( Mejor si es un dissasembly :3 ). Y hablo del codigo cuando falla

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #43 en: 06 de Febrero de 2016, 21:42:55 »
Código: C
  1. /*
  2.  * File:   main.c
  3.  * Author: miquel
  4.  *
  5.  * Created on 31 de enero de 2016, 19:03
  6.  */
  7.  
  8. #include <xc.h>
  9. #include <delays.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include "MyXLCD.h"
  13. #include "word_config.h"
  14. #include <adc.h>
  15.  
  16. #define _XTAL_FREQ 48000000
  17.  
  18. /*
  19.  *
  20.  */
  21.  
  22. void DelayFor18TCY(void)    //Delay 0,00002sec => 20us => 0,02ms
  23. {
  24.     //Delay10TCYx(2);
  25.     Delay10TCYx(24);
  26. }
  27. void DelayPORXLCD(void)     //Delay 0,015sec => 15000us => 15ms
  28. {
  29.     //Delay1KTCYx(15);
  30.     Delay1KTCYx(180);
  31. }
  32. void DelayXLCD(void)        //Delay 0,002sec => 2000us => 2ms
  33. {
  34.     //Delay1KTCYx(60);
  35.     Delay1KTCYx(24);
  36. }
  37.  
  38. void Temp_menu(unsigned char i, unsigned char j)
  39. {
  40.     for(i=0; i<=15; i++)
  41.     {
  42.         for(j=0; j<=i; j++)
  43.         {
  44.             Delay10KTCYx(20);
  45.         }
  46.     }
  47. }
  48. /* Envia comando al LCD */
  49. void comandXLCD(unsigned char a)
  50. {
  51.     BusyXLCD();
  52.     WriteCmdXLCD(a);
  53. }
  54.  
  55. /* Ubica cursor en ( x = Posicion en linea , y = N de linea ) */
  56. void gotoxyXLCD(unsigned char x, unsigned char y)
  57. {
  58.     unsigned char direccion;
  59.  
  60.     if(y != 1)
  61.         direccion = 0x40;
  62.     else
  63.         direccion = 0;
  64.  
  65.     direccion += x-1;
  66.     comandXLCD(0x80 | direccion);
  67. }
  68.  
  69. void main(void)
  70. {
  71.     char cadena_de_texto [10];
  72.     unsigned int valor_adc;
  73.     float voltios;
  74.    
  75.     OpenXLCD(FOUR_BIT & LINES_5X7);     // Iniciamos Lcd
  76.     comandXLCD(0x06);       // Nos aseguramos incremento de direccion, display fijo
  77.     OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_16_TAD,
  78.             ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VSS, ADC_0ANA);
  79.     comandXLCD(0x0C);       // Encendemos Lcd
  80.     comandXLCD(0x01);   //Borramos pantalla
  81.    
  82.          while(1)
  83.         {
  84.             SetChanADC(0);  //Seleccionamos canal
  85.             ConvertADC();    //Iniciamos conversion
  86.            
  87.             while(BusyADC()){}    //Esperamos que termine la conversion
  88.             valor_adc = ReadADC();  //Leemos conversion y la guardamos en valor_adc
  89.             voltios = (valor_adc/1024.0)*5.0;   //Convertimos valor ADC
  90.             gotoxyXLCD(1,1);    //Nos posicionamos en el Lcd
  91.             putrsXLCD("Bateria: ");
  92.             sprintf(cadena_de_texto,"%.2f",voltios);    //Visualizamos voltaje en formato float
  93.             putrsXLCD(cadena_de_texto);
  94.             gotoxyXLCD(1,2);
  95.             putrsXLCD("Estado: ");
  96.         }
  97.     }

Código: ASM
  1. !void main(void)
  2. !{
  3. !    char cadena_de_texto [10];
  4. !    unsigned int valor_adc;
  5. !    float voltios;
  6. !    
  7. !    OpenXLCD(FOUR_BIT & LINES_5X7);     // Iniciamos Lcd
  8. 0x1496: MOVLW 0x28
  9. 0x1498: CALL 0x1888, 0
  10. 0x149A: NOP
  11. !    comandXLCD(0x06);       // Nos aseguramos incremento de direccion, display fijo
  12. 0x149C: MOVLW 0x6
  13. 0x149E: CALL 0x1F2C, 0
  14. 0x14A0: NOP
  15. !    OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_16_TAD,
  16. !            ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VSS, ADC_0ANA);
  17. 0x14A2: MOVLW 0x4
  18. 0x14A4: MOVWF __pcstackCOMRAM, ACCESS
  19. 0x14A6: SETF dividend, ACCESS
  20. 0x14A8: MOVLW 0xED
  21. 0x14AA: CALL 0x1BD4, 0
  22. 0x14AC: NOP
  23. !    comandXLCD(0x0C);       // Encendemos Lcd
  24. 0x14AE: MOVLW 0xC
  25. 0x14B0: CALL 0x1F2C, 0
  26. 0x14B2: NOP
  27. !    comandXLCD(0x01);   //Borramos pantalla
  28. 0x14B4: MOVLW 0x1
  29. 0x14B6: CALL 0x1F2C, 0
  30. 0x14B8: NOP
  31. !    
  32. !         while(1)
  33. !        {
  34. !            SetChanADC(0);  //Seleccionamos canal
  35. 0x14BA: MOVLW 0x0
  36. 0x14BC: CALL 0x1EE0, 0
  37. 0x14BE: NOP
  38. !            ConvertADC();    //Iniciamos conversion
  39. 0x14C0: CALL 0x1F60, 0
  40. 0x14C2: NOP
  41. !            
  42. !            while(BusyADC()){}    //Esperamos que termine la conversion
  43. 0x14C4: CALL 0x1F4C, 0
  44. 0x14C6: NOP
  45. 0x14C8: IORLW 0x0
  46. 0x14CA: BNZ 0x14C4
  47. !            valor_adc = ReadADC();  //Leemos conversion y la guardamos en valor_adc
  48. 0x14CC: CALL 0x1F42, 0
  49. 0x14CE: NOP
  50. 0x14D0: MOVFF __pcstackCOMRAM, valor_adc
  51. 0x14D2: NOP
  52. 0x14D4: MOVFF dividend, 0x91
  53. 0x14D6: NOP
  54. !            voltios = (valor_adc/1024.0)*5.0;   //Convertimos valor ADC
  55. 0x14D8: CLRF exp1, ACCESS
  56. 0x14DA: MOVLW 0x80
  57. 0x14DC: MOVWF exp1, ACCESS
  58. 0x14DE: MOVLW 0x44
  59. 0x14E0: MOVWF exp, ACCESS
  60. 0x14E2: MOVFF valor_adc, quotient
  61. 0x14E4: NOP
  62. 0x14E6: MOVFF 0x91, quot
  63. 0x14E8: NOP
  64. 0x14EA: CALL 0x1E6A, 0
  65. 0x14EC: NOP
  66. 0x14EE: MOVFF quotient, f1
  67. 0x14F0: NOP
  68. 0x14F2: MOVFF quot, counter
  69. 0x14F4: NOP
  70. 0x14F6: MOVFF quot, cntr
  71. 0x14F8: NOP
  72. 0x14FA: CALL 0x17D4, 0
  73. 0x14FC: NOP
  74. 0x14FE: MOVFF f1, f1
  75. 0x1500: NOP
  76. 0x1502: MOVFF counter, 0x1C
  77. 0x1504: NOP
  78. 0x1506: MOVFF cntr, 0x1D
  79. 0x1508: NOP
  80. 0x150A: CLRF f2, ACCESS
  81. 0x150C: MOVLW 0xA0
  82. 0x150E: MOVWF 0x1F, ACCESS
  83. 0x1510: MOVLW 0x40
  84. 0x1512: MOVWF 0x20, ACCESS
  85. 0x1514: CALL 0x164A, 0
  86. 0x1516: NOP
  87. 0x1518: MOVFF f1, voltios
  88. 0x151A: NOP
  89. 0x151C: MOVFF 0x1C, 0x8E
  90. 0x151E: NOP
  91. 0x1520: MOVFF 0x1D, 0x8F
  92. 0x1522: NOP
  93. !            gotoxyXLCD(1,1);    //Nos posicionamos en el Lcd
  94. 0x1524: MOVLW 0x1
  95. 0x1526: MOVWF f2, ACCESS
  96. 0x1528: CALL 0x1EC6, 0
  97. 0x152A: NOP
  98. !            putrsXLCD("Bateria: ");
  99. 0x152C: MOVLW 0x8
  100. 0x152E: MOVWF f2, ACCESS
  101. 0x1530: MOVLW 0x77
  102. 0x1532: MOVWF multiplicand, ACCESS
  103. 0x1534: CALL 0x1B7A, 0
  104. 0x1536: NOP
  105. !            sprintf(cadena_de_texto,"%.2f",voltios);    //Visualizamos voltaje en formato float
  106. 0x1538: MOVLW 0x8A
  107. 0x153A: MOVWF f, ACCESS
  108. 0x153C: MOVFF voltios, 0x4B
  109. 0x153E: NOP
  110. 0x1540: MOVFF 0x8E, 0x4C
  111. 0x1542: NOP
  112. 0x1544: MOVFF 0x8F, 0x4D
  113. 0x1546: NOP
  114. 0x1548: MOVLB 0x0
  115. 0x154A: MOVLW 0x83
  116. 0x154C: CALL 0x890, 0
  117. 0x154E: NOP
  118. !            putrsXLCD(cadena_de_texto);
  119. 0x1550: CLRF f2, ACCESS
  120. 0x1552: MOVLW 0x83
  121. 0x1554: MOVWF multiplicand, ACCESS
  122. 0x1556: CALL 0x1B7A, 0
  123. 0x1558: NOP
  124. !            gotoxyXLCD(1,2);
  125. 0x155A: MOVLW 0x2
  126. 0x155C: MOVWF f2, ACCESS
  127. 0x155E: MOVLW 0x1
  128. 0x1560: CALL 0x1EC6, 0
  129. 0x1562: NOP
  130. !            putrsXLCD("Estado: ");
  131. 0x1564: MOVLW 0x8

Gracias KILLERJC.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Visualizar voltaje en Lcd
« Respuesta #44 en: 06 de Febrero de 2016, 21:49:52 »
En ese codigo que no funciona. Si comentas la escritura en la segunda linea, el programa funciona?
-
Leonardo Garberoglio