TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Pibuleta en 09 de Junio de 2008, 02:52:19

Título: Como mostrar un valor binario en decimal?
Publicado por: Pibuleta en 09 de Junio de 2008, 02:52:19
Hola amigos!

Tengo un "problemilla" os cuento...

Estoy usando el SourceBoost IDE para programar un PIC16F877 y he llegado a un punto que necesito leer el valor de tmr0= 8 bits en binario y mostrarlo en el LCD.


Por ejemplo si tengo el valor en binario (00110010) que en decimalñ es  50, quiero mostrarlo en el LCD.

Sé escribir y manejar el LCD, pero no tengo muy claro como pasar del valor en binario que leo del tmr0 a decimal? O no sé de que forma pode rmostrarlo en el LCD.


Gracias
Título: Re: Com omostrar un valor binario en LCD decimal?
Publicado por: Pibuleta en 09 de Junio de 2008, 06:58:19
Hola...

Alguien sabría decirme si es muy complejo?
O por donde tirar?
Gracias
Título: Re: Com omostrar un valor binario en LCD decimal?
Publicado por: elmasvital en 09 de Junio de 2008, 07:03:21
usa el buscador y encontrarás resuelto lo que necesitas

conversion binario a bcd
Título: Re: Com omostrar un valor binario en LCD decimal?
Publicado por: Pibuleta en 09 de Junio de 2008, 07:55:17
usa el buscador y encontrarás resuelto lo que necesitas

conversion binario a bcd

He buscado, pero por lo que veo igual no he puesto las palabras acertadas.

Gracias, voy a ver si veo algo.

Saludos
Título: Re: Com omostrar un valor binario en LCD decimal?
Publicado por: pocher en 09 de Junio de 2008, 09:16:14
Si mal no recuerdo lo único que tienes que hacer, es en el print(lcd_putc, ...) usar el formato decimal.
Título: Re: Com omostrar un valor binario en LCD decimal?
Publicado por: Pibuleta en 09 de Junio de 2008, 10:16:52
Si mal no recuerdo lo único que tienes que hacer, es en el print(lcd_putc, ...) usar el formato decimal.

Hola pocher!

Pero con el sourceboost existe el print(lcd_putc,)?

Saludos
Título: Re: Com omostrar un valor binario en LCD decimal?
Publicado por: firepic en 09 de Junio de 2008, 11:48:33
Si mal no recuerdo lo único que tienes que hacer, es en el print(lcd_putc, ...) usar el formato decimal.
Pero con el sourceboost existe el print(lcd_putc,)?
No, no existe. Creo que ya te había mencionado antes que ese compilador que tú usas lo usa muy poca gente aquí en el foro. Cuando entras al subforo de C casi se da por entendido que es CCS, es el que la mayoría usamos; algunos C30 y Hi-Tech. Pero no creo que consigas códigos para el source boost aquí en el foro. No obstante, todo está en que veas los ejemplos que hay en la página oficial, y que puedes descargar.

Por ejemplo, ellos proporcionan este archivo, lcd.c, que contiene este código para el manejo de un lcd:

Código: C
  1. /*************************************************************
  2.  
  3. * 7-pins LCD interface code
  4.  
  5. *
  6.  
  7. * Drives an LCD in 4-bit mode, using the three control
  8.  
  9. * signals. This has the advantage that the code is
  10.  
  11. * independent of the LCD, since there are no
  12.  
  13. * timing loops in the code. The code is blocking
  14.  
  15. * and used the LCD busy signal to determine if the
  16.  
  17. * display is ready to accept new data.
  18.  
  19. *
  20.  
  21. * (c) Lieven Hollevoet
  22.  
  23. * most recent version on http://boostc.lika.be
  24.  
  25. *************************************************************/
  26.  
  27.  
  28.  
  29. #include "lcd.h"
  30.  
  31.  
  32.  
  33. // Local variable
  34.  
  35. bit lcd_found = 0;
  36.  
  37.  
  38.  
  39. ////////////////////////////////////////////////////////////
  40.  
  41. // Drive a certain nibble on the LCD data pins, the nibble
  42.  
  43. // is taken from the lsb's of the input char
  44.  
  45. ////////////////////////////////////////////////////////////
  46.  
  47. void lcd_clock_nibble(char nibble){
  48.  
  49.        
  50.  
  51.         // Since there seems to be no way to extract a bit from a byte in BoostC -> do it in asm.
  52.  
  53.         // It is replicated 4 times here, since a function cannot return a bit eiter.
  54.  
  55.        
  56.  
  57.         // Set the d4 depending on the state of nibble bit 0
  58.  
  59.         asm {
  60.  
  61.         btfss _nibble, 0
  62.  
  63.         goto  clear_lcd4
  64.  
  65.         bsf       _lcd_d4, F
  66.  
  67.         goto  done_lcd4
  68.  
  69.         clear_lcd4:
  70.  
  71.         bcf       _lcd_d4, F
  72.  
  73.         done_lcd4:
  74.  
  75.         }
  76.  
  77.        
  78.  
  79.         // Set the d5 depending on the state of nibble bit 1
  80.  
  81.         asm {
  82.  
  83.         btfss _nibble, 1
  84.  
  85.         goto  clear_lcd5
  86.  
  87.         bsf       _lcd_d5, F
  88.  
  89.         goto  done_lcd5
  90.  
  91.         clear_lcd5:
  92.  
  93.         bcf       _lcd_d5, F
  94.  
  95.         done_lcd5:
  96.  
  97.         }      
  98.  
  99.  
  100.  
  101.         // Set the d6 depending on the state of nibble bit 2
  102.  
  103.         asm {
  104.  
  105.         btfss _nibble, 2
  106.  
  107.         goto  clear_lcd6
  108.  
  109.         bsf       _lcd_d6, F
  110.  
  111.         goto  done_lcd6
  112.  
  113.         clear_lcd6:
  114.  
  115.         bcf       _lcd_d6, F
  116.  
  117.         done_lcd6:
  118.  
  119.         }      
  120.  
  121.  
  122.  
  123.         // Set the d7 depending on the state of nibble bit 3
  124.  
  125.         asm {
  126.  
  127.         btfss _nibble, 3
  128.  
  129.         goto  clear_lcd7
  130.  
  131.         bsf       _lcd_d7, F
  132.  
  133.         goto  done_lcd7
  134.  
  135.         clear_lcd7:
  136.  
  137.         bcf       _lcd_d7, F
  138.  
  139.         done_lcd7:
  140.  
  141.         }      
  142.  
  143.  
  144.  
  145.         lcd_toggle_e;
  146.  
  147.        
  148.  
  149.         return;
  150.  
  151. }
  152.  
  153.  
  154.  
  155. ////////////////////////////////////////////////////////////
  156.  
  157. // Read the busy flag of the LCD and wait to return until
  158.  
  159. // the LCD is ready.
  160.  
  161. // Skipped when running in debug mode.
  162.  
  163. ////////////////////////////////////////////////////////////
  164.  
  165. void lcd_wait_busy(){
  166.  
  167.  
  168.  
  169.         // Skip this function if we are running in debug mode.
  170.  
  171. #ifdef DEBUG
  172.  
  173.         return;
  174.  
  175. #endif
  176.  
  177.  
  178.  
  179.         // If we have not detected an LCD in a previous call to this function,
  180.  
  181.         // then we just skip it this time, since else the program will hang later
  182.  
  183.         // on in this function.
  184.  
  185.         if (!lcd_found){
  186.  
  187.                 return;
  188.  
  189.         }
  190.  
  191.        
  192.  
  193.         // Save the current LCD mode
  194.  
  195.         bit mode = lcd_rs;
  196.  
  197.                
  198.  
  199.         // The data lines are inputs
  200.  
  201.         lcd_tris_d4 = 1;
  202.  
  203.         lcd_tris_d5 = 1;
  204.  
  205.         lcd_tris_d6 = 1;
  206.  
  207.         lcd_tris_d7 = 1;
  208.  
  209.  
  210.  
  211.         // Enter command mode
  212.  
  213.         lcd_cmd_mode;
  214.  
  215.         lcd_rw      = 1;
  216.  
  217.  
  218.  
  219.         // Put lcd_e high
  220.  
  221.         lcd_e_hi;      
  222.  
  223.        
  224.  
  225.         char counter = 0;
  226.  
  227.        
  228.  
  229.         // Wait for completion of the operation, with a timeout of ~.5 seconds
  230.  
  231.         // LCD d7 is high if the operation is complete.
  232.  
  233.         while (lcd_d7 && counter < 0xFF){
  234.  
  235.                 lcd_e_lo;
  236.  
  237.                 lcd_e_hi;
  238.  
  239.                 lcd_e_lo;
  240.  
  241.                 lcd_e_hi;
  242.  
  243.                 delay_ms(2);
  244.  
  245.                 counter++;
  246.  
  247.         }
  248.  
  249.        
  250.  
  251.         // Check if the previous loop timed out        
  252.  
  253.         if (counter == 0xFF) {
  254.  
  255.                 // If it was a timeout -> disable the flag.
  256.  
  257.                 lcd_found = 0;
  258.  
  259.         }
  260.  
  261.        
  262.  
  263.         // And put the lcd_lo again
  264.  
  265.         lcd_e_lo;      
  266.  
  267.                
  268.  
  269.         // Restore the TRIS
  270.  
  271.         lcd_tris_d4 = 0;
  272.  
  273.         lcd_tris_d5 = 0;
  274.  
  275.         lcd_tris_d6 = 0;
  276.  
  277.         lcd_tris_d7 = 0;
  278.  
  279.        
  280.  
  281.         // Restore LCD RS mode.
  282.  
  283.         lcd_rs = mode;
  284.  
  285.         lcd_rw = 0;
  286.  
  287.  
  288.  
  289.         return;
  290.  
  291. }
  292.  
  293.  
  294.  
  295. ////////////////////////////////////////////////////////////
  296.  
  297. // Send a byte to the LCD. Don't forget to set the mode
  298.  
  299. // (data or cmd) before calling this function.
  300.  
  301. ////////////////////////////////////////////////////////////
  302.  
  303. void lcd_send_byte(char data){
  304.  
  305.  
  306.  
  307.         char temp = data >> 4;
  308.  
  309.  
  310.  
  311.         lcd_rw = 0;     // Write mode
  312.  
  313.  
  314.  
  315.         // Clock the high nibble
  316.  
  317.         lcd_clock_nibble(temp);
  318.  
  319.  
  320.  
  321.         // Clock the low nibble
  322.  
  323.         lcd_clock_nibble(data);
  324.  
  325.        
  326.  
  327.         // Wait until the LCD is finished
  328.  
  329.         lcd_wait_busy();
  330.  
  331. }
  332.  
  333.  
  334.  
  335. ////////////////////////////////////////////////////////////
  336.  
  337. // Initialisation sequence of the LCD
  338.  
  339. ////////////////////////////////////////////////////////////
  340.  
  341. void lcd_init(){
  342.  
  343.  
  344.  
  345.         // Wait for internal reset
  346.  
  347.         delay_ms(15);
  348.  
  349.  
  350.  
  351.         // Set all pins as output
  352.  
  353.         lcd_tris_rs = 0;
  354.  
  355.         lcd_tris_rw = 0;
  356.  
  357.         lcd_tris_e  = 0;
  358.  
  359.         lcd_tris_d4 = 0;
  360.  
  361.         lcd_tris_d5 = 0;
  362.  
  363.         lcd_tris_d6 = 0;
  364.  
  365.         lcd_tris_d7 = 0;
  366.  
  367.        
  368.  
  369.         clear_bit(trisa, 1);
  370.  
  371.         clear_bit(porta, 1);
  372.  
  373.        
  374.  
  375.         // Clear the control bits
  376.  
  377.         lcd_rw = 0;
  378.  
  379.         lcd_cmd_mode;
  380.  
  381.  
  382.  
  383.         // Init sequence (see datasheet)
  384.  
  385.         /// attention (clock 0x03 twice)
  386.  
  387.         lcd_clock_nibble(0x03);
  388.  
  389.         delay_ms(5);
  390.  
  391.         lcd_toggle_e;
  392.  
  393.         delay_10us(15);
  394.  
  395.         /// 4bit mode (clock 0x03 and 0x02)
  396.  
  397.         lcd_toggle_e;
  398.  
  399.         delay_ms(5);
  400.  
  401.         lcd_d4 = 0;
  402.  
  403.         lcd_toggle_e;
  404.  
  405.         delay_10us(15);
  406.  
  407.        
  408.  
  409.         // Assume we have an LCD attached
  410.  
  411.         lcd_found = 1;
  412.  
  413.        
  414.  
  415.         /// We're in 4 bit mode now, program general settings  
  416.  
  417.         lcd_send_byte(FUNCTION_SET);
  418.  
  419.         lcd_send_byte(DISP_OFF);
  420.  
  421.         lcd_send_byte(DISP_ON);
  422.  
  423.         lcd_send_byte(ENTRY_INC);
  424.  
  425.         lcd_send_byte(DISP_CLR);
  426.  
  427.         lcd_send_byte(LINE1);
  428.  
  429.  
  430.  
  431.         // Init done, you can start writing characters now
  432.  
  433.         lcd_data_mode;
  434.  
  435.  
  436.  
  437.         return;
  438.  
  439.  
  440.  
  441. }
  442.  
  443.  
  444.  
  445. ////////////////////////////////////////////////////////////
  446.  
  447. // Send a command to the LCD
  448.  
  449. ////////////////////////////////////////////////////////////
  450.  
  451. void lcd_send_cmd(char command){
  452.  
  453.         lcd_cmd_mode;
  454.  
  455.         lcd_send_byte(command);
  456.  
  457. }
  458.  
  459.  
  460.  
  461. ////////////////////////////////////////////////////////////
  462.  
  463. // Send a line to the LCD
  464.  
  465. ////////////////////////////////////////////////////////////
  466.  
  467. void lcd_printf(const char* line){
  468.  
  469.     char i = 0;
  470.  
  471.     lcd_data_mode;
  472.  
  473.     while(line[i] != 0)
  474.  
  475.         lcd_send_byte(line[i++]);
  476.  
  477. }
  478.  
  479.  
  480.  
  481. ////////////////////////////////////////////////////////////
  482.  
  483. // Print a character to the LCD
  484.  
  485. ////////////////////////////////////////////////////////////
  486.  
  487. void lcd_printf(char value){
  488.  
  489.         lcd_data_mode;
  490.  
  491.         lcd_send_byte(value);
  492.  
  493. }
  494.  
  495.  
  496.  
  497. ////////////////////////////////////////////////////////////
  498.  
  499. // Print a hex value to the LCD
  500.  
  501. ////////////////////////////////////////////////////////////
  502.  
  503. void lcd_print_hex(char value){
  504.  
  505.         lcd_data_mode;
  506.  
  507.        
  508.  
  509.         char hexChar;
  510.  
  511.     char i;
  512.  
  513.    
  514.  
  515.     for(i = 0; i < 2; i++)
  516.  
  517.     {
  518.  
  519.         if(i == 0)
  520.  
  521.             hexChar = value >> 4;
  522.  
  523.         else
  524.  
  525.             hexChar = value & 0x0F;
  526.  
  527.         if(hexChar < 10)
  528.  
  529.             hexChar = hexChar + '0';
  530.  
  531.         else
  532.  
  533.             hexChar = hexChar + ('A' - 10);
  534.  
  535.         lcd_send_byte(hexChar);
  536.  
  537.     }
  538.  
  539. }
  540.  
  541.  
  542.  
  543. ////////////////////////////////////////////////////////////
  544.  
  545. // Print a 16-bit hex value to the LCD
  546.  
  547. ////////////////////////////////////////////////////////////
  548.  
  549. void lcd_print_hex(short value){
  550.  
  551.  
  552.  
  553.     char value1 = (char)((value >> 8) & 0x00FF);
  554.  
  555.    
  556.  
  557.         lcd_print_hex(value1);
  558.  
  559.  
  560.  
  561.     char value0 = (char)(value & 0x00FF);
  562.  
  563.    
  564.  
  565.         lcd_print_hex(value0);
  566.  
  567.        
  568.  
  569.         return;
  570.  
  571. }

Parece que la función que necesitas es lcd_print_hex(valor)... viendo el código de la librería que coloqué arriba. Creo que el compilador cambia de hexadecimal a decimal automáticamente.
Entonces tienes dos opciones Pibuleta:
1- Sigues con el source boost y vas a tener que fajarte pues no hay mucho soporte en la web (ni si quiera en el manual que ellos proporcionan, pues no explica nada, sólo te manda a que veas las librerías).
2- Te cambias de compilador al CCS u otro más conocido del cual puedas tener más soporte en la web. Esta es la opción que yo te recomendaría.

Ok saludos, nos leemos!  :mrgreen:

Título: Re: Com omostrar un valor binario en LCD decimal?
Publicado por: Pibuleta en 09 de Junio de 2008, 17:44:57
Gracias firepic!

Pues llevo dandole vueltas y nada, al final algo vo ya tener que hacer... usar el CCS pero no tengo ni idea...


Yo manejar el LCd ya sé, el problema es ese que sé enviar número al LCD, pero no sé como con el numero binario mostralo en el LCD.

El número máxim osería 0-255 osea que sé que debo mostrar como máximo 3 cifras, pero no sé como hace rpara saber esas cifras teniendo el binario...

Saludos
Título: Re: Com omostrar un valor binario en LCD decimal?
Publicado por: Pibuleta en 09 de Junio de 2008, 18:46:21
Por lo que veo t ambién se puede escribir en ASM...

Si añado ese trozo de programa en asm como sería?

Saludos
Título: Re: Com omostrar un valor binario en LCD decimal?
Publicado por: firepic en 09 de Junio de 2008, 19:48:41
Pero viejo, para qué te vas a complicar la vida con asm -y no es que esté en contra de este lenguaje, tiene sus utilidades, pero tal vez no debas meterte con él ahora que estás echando tus primeros códigos- si el C te lo hace todo solito? Usa el CCS, hay versiones gratuitas que puedes descargar de la web. Y el manual es muy fácil de entender e ilustrativo. Además conseguirás montones de códigos aquí en el foro con lenguaje C para ese compilador.
Bueno es mi recomendación, la decisión final es tuya.
Saludos, nos leemos!  :mrgreen:
Título: Re: Com omostrar un valor binario en LCD decimal?
Publicado por: migsantiago en 09 de Junio de 2008, 20:02:13
Hola amigos!

Tengo un "problemilla" os cuento...

Estoy usando el SourceBoost IDE para programar un PIC16F877 y he llegado a un punto que necesito leer el valor de tmr0= 8 bits en binario y mostrarlo en el LCD.


Por ejemplo si tengo el valor en binario (00110010) que en decimalñ es  50, quiero mostrarlo en el LCD.

Sé escribir y manejar el LCD, pero no tengo muy claro como pasar del valor en binario que leo del tmr0 a decimal? O no sé de que forma pode rmostrarlo en el LCD.


Gracias

Hola

No conozco tu compilador, pero de lo que encontré en internet, puedes usar la librería "lcd_driver.h" y luego iniciar la lcd con la función lcd_setup();. Después solo escribes lprintf();

Intenta con esto:
Código: [Seleccionar]
#include <lcd_driver.h>

...

lcd_setup();
lprintf("%u",timer0);

...

La variable timer0 no sé cómo la obtengas, pero seguramente eso ya lo sabes hacer, asegúrate que sea una variable unsigned char.

Aquí la página con el ejemplo...

http://forum.sourceboost.com/index.php?showtopic=3274&view=findpost&p=12400

Tampoco sé si esa librería funciona con modo nibble de 4bits.

Avísanos de tus resultados.
Título: Re: Com omostrar un valor binario en LCD decimal?
Publicado por: Pibuleta en 10 de Junio de 2008, 02:38:00
Hola

No conozco tu compilador, pero de lo que encontré en internet, puedes usar la librería "lcd_driver.h" y luego iniciar la lcd con la función lcd_setup();. Después solo escribes lprintf();

Intenta con esto:
Código: [Seleccionar]
#include <lcd_driver.h>

...

lcd_setup();
lprintf("%u",timer0);

...

La variable timer0 no sé cómo la obtengas, pero seguramente eso ya lo sabes hacer, asegúrate que sea una variable unsigned char.

Aquí la página con el ejemplo...

http://forum.sourceboost.com/index.php?showtopic=3274&view=findpost&p=12400

Tampoco sé si esa librería funciona con modo nibble de 4bits.

Avísanos de tus resultados.
[/quote]

Descudia, os mantendré informados en los avances jejeje


tl tmr0, es un registro de 8 bits, cuenta de 0 a 255. No sé si es unsigned char...

Voy a probar cosillas.

Saludos
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: Pibuleta en 10 de Junio de 2008, 04:41:51
Lightweight Conversion Functions

The standard conversion functions offer a lot of flexibility at the cost of ROM, RAM
and execution time. For application that are short of RAM and ROM, or require
shorter execution time, it maybe desirable to use the following lightweight
functions.

void uitoa_hex( char* buffer, unsigned int val, unsigned char digits )
(Function) Unsigned integer to ASCII, hexadecimal representation. This function
converts a 16 bit unsigned integer into a hex value with leading zeros. The number
of digits is specified using by the digits parameter.

void uitoa_bin( char* buffer, unsigned int val, unsigned char digits )
(Function) Unsigned integer to ASCII, binary representation. This function converts
a 16 bit unsigned integer into a binary value with leading zeros. The number of
digits is specified using by the digits parameter.

void uitoa_dec( char* buffer, unsigned int val, unsigned char digits )
(Function) Unsigned integer to ASCII, decimal representation. This function
converts and 16 bit unsigned integer into a decimal value with leading zeros. The
number of digits is specified using by the digits parameter.

unsigned int atoui_hex( const char* buffer )
(Function) ASCII to unsigned integer, hexadecimal representation. This function
converts a hexadecimal string value into 16 bit unsigned integer.

unsigned int atoui_bin( const char* buffer )
(Function) ASCII to unsigned integer, binary representation. This function converts
a binary string value into 16 bit unsigned integer.

unsigned int atoui_dec( const char* buffer)
(Function) ASCII to unsigned integer, decimal representation. This function
converts a decimal string value into 16 bit unsigned integer.

unsigned char sqrt1( unsigned short val )
(Function) Integer square root. Function that returns square root from an unsigned
16 bit integer. Unlike sqrt this function is far shorter but its execution time may be
longer than sqrt.



En el manual del sourceboost salen estas opciones... creeís que alguna me puede servir para pasar el binario a decimal?

Enviar datos al LCD ya lo se hacer, eso no es el problema.

El problema es "casar" el numero binario con la tabla del LCD, por ejemplo el 9 en binario con el 9 del LCD.


Saludos
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: migsantiago en 10 de Junio de 2008, 11:18:52
Hola

¿Qué tal así?

Código: [Seleccionar]
#include <system.h>
#include <boostc.h>
#include <stdlib.h>

...

void main()
{
char buf[4]; //3 caracteres + null
unsigned int tmr0;

... //obtienes el valor del timer 0 y lo depositas en tmr0

    uitoa_dec(  buf, tmr0,  3 );
}

Si tmr0 tiene (00110010) ahora en buf tendrás lo siguiente:

buf[0]=0x30; //caracter 0 en ascii
buf[1]=0x35; //caracter 5 en ascii
buf[2]=0x30; //caracter 0 en ascii
buf[3]=0x00; //caracter NULL en ascii, útil para trabajar con cadenas

Los caracteres ascii son con los que trabaja la lcd. Puedes enviar caracter por caracter el dato ahora que ya sabes convertirlo.

Si por alguna razón el resultado no da bien, pon esta función...

uitoa_dec(  buf, tmr0,  4 );
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: Pibuleta en 10 de Junio de 2008, 11:35:45

Entre hoy y mañana lo pruebo y te digo algo.

A ver si hay suerte!

Recuerda que uso SourceBoost IDE.

Gracias socio
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: firepic en 10 de Junio de 2008, 11:39:18
Saludos!
Excelentes aportes migsantiago, eres todo un maestro!  :P
Pibuleta una observación: no tienes que citar todo lo que ha dicho la otra persona para responder... a menos que quieras hacer un comentario sobre una parte de la frase en particular y veas necesario citarlo... de lo contrario no te preocupes, la conversación se va siguiendo... por eso un tema es bien llamado "hilo".
Solo es un detalle pero es para que no se haga tan larga la página. Por comodidad y para que se vean mejor tus mensajes  :lol:
Ok que tengas éxito, nos leemos!  :mrgreen:
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: Pibuleta en 11 de Junio de 2008, 02:56:34
Amigo firepic... tienes razón... que te parece ahora?  :mrgreen:

Por cierto, voy a probar ahora vuestras ideas y os comento.

Hasta ahora
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: Pibuleta en 11 de Junio de 2008, 04:24:30

failure
C:\Archivos de programa\SourceBoost\include\stdlib.h(64): error:  failure
Exit code was 1.
Removing target: Prueba_2.obj
Failed to locate output file 'Prueba_2.obj'
Done

Failed

Es en esta expresión de la libreria stdlib.h donde me salta el error...

La libreria la he descargado de internet.
 
extern double strtod ();
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: Pibuleta en 11 de Junio de 2008, 08:14:56
migsantiago, no sé que pasa que no me deja compilar...

me marca error en la siguiente expresión:

uitoa_dec(buf,timer0,3);

Estoy programando en SourceBoost no sé si tiene algo que ver...

Saludos
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: migsantiago en 11 de Junio de 2008, 11:37:12
Hola

¿Qué error te da con uitoa_dec?

La librería stdlib.h debe ser la que se diseñó en específico para el compilador sourceboost, no la que sea.

¿Incluiste la librería boostc.h del mismo sourceboost?

Todo el código que te estoy dando es en base al sourceboost, el cual no tengo, pero en internet encuentro las pistas. Ahora mismo lo voy a bajar porque acabo de ver que es gratuito y voy a probar el código.
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: migsantiago en 11 de Junio de 2008, 11:56:36
Ya instalé sourceboost ide 6.87 y compilé el código, aquí el archivo...

http://www.4shared.com/file/50935967/89845e91/prueba.html

El código que compilé es el siguiente...

Código: [Seleccionar]
#include <system.h>
#include <boostc.h>
#include <stdlib.h>

//Target PIC16F877 configuration word
#pragma DATA _CONFIG, _PWRTE_OFF & _BODEN_OFF & _WDT_OFF & _LVP_OFF & _CPD_OFF & _DEBUG_OFF & _XT_OSC & _CP_OFF

//Set clock frequency
#pragma CLOCK_FREQ 4000000

void main( void )
{
char buf[4]; //3 caracteres + null
unsigned int tmr0;

tmr0=50;

uitoa_dec(  buf, tmr0,  3 );

//Endless loop
while( 1 );
}

No hubo errores.

Pibuleta, te toca probarlo y modificarlo para que tu lcd funcione.

Por cierto, sourceboost ide se ve muy bien, tiene un ambiente gráfico muy amigable, más amigable que las versiones 3 del compilador CCS.
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: Pibuleta en 11 de Junio de 2008, 16:38:45
Hola

¿Qué error te da con uitoa_dec?

La librería stdlib.h debe ser la que se diseñó en específico para el compilador sourceboost, no la que sea.

¿Incluiste la librería boostc.h del mismo sourceboost?

Todo el código que te estoy dando es en base al sourceboost, el cual no tengo, pero en internet encuentro las pistas. Ahora mismo lo voy a bajar porque acabo de ver que es gratuito y voy a probar el código.

Amigo, te invito a lo que quieras  :-/


Esta mañana he estado dale que te pego y nada, me salian varios errores.

Pudiera ser que las librerias que he descargado de internet no fuera específicas para SourceBoost.

Si te funciona el código, lo que haré será hacer solo es aparte y ver si funciona y me muestra el valor por el LCD y luego aplicarlo al programa en general que estoy haciendo.


Espero noticias con ansia  :g)

Saludos y miles de gracias
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: migsantiago en 11 de Junio de 2008, 17:11:17
Todo lo que compilé fue sin descargar librerías, solo escribí el código que ahí ves.

Espero que hayas leído este mensaje:

http://www.todopic.com.ar/foros/index.php?topic=22105.msg174353#msg174353
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: Pibuleta en 12 de Junio de 2008, 06:28:53
Todo lo que compilé fue sin descargar librerías, solo escribí el código que ahí ves.

Espero que hayas leído este mensaje:

http://www.todopic.com.ar/foros/index.php?topic=22105.msg174353#msg174353

Socio, estoy probando y me dá error en la expresión
uitoa_dec(  buf, tmr0,  3 );


Voy a probar de instalar la versión que dices (6.87) porque yo tengo la 6.25...

Ahora te cuento.

Por cierto una vez se utiliza la expresión  uitoa_dec(  buf, tmr0,  3 ); realmente lo que hace que es?

Y una vez procesada la orden donde debo de ir a buscar los 3 dígitos?

Gracias por la ayuda
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: Pibuleta en 12 de Junio de 2008, 09:55:19
migsantiago eres la máquina!!!

OEEEEE OEEEEEE OEEEEE OEEEEE! Funciona! Gracias a todos!

El problema era la versión de SourceBoost que utilizaba, que no admitia la expresión uitoa_dec(buf,a,3 ), he instalado la 6.87 y ya no me daba error.

Luego simplemente tocando un poco mi programa he conseguido que me muestre 000 el display, y luego envio buf[0], buf[1], buf[3] al LCD y si cuenta por ejemplo 12 pulsos, me muestra 012 en el LCD.


Increible, que buenos sóis...

PEro me gustaría saber que es lo que hace exáctamente la expresión uitoa_dec(buf,a,3 ); para pasar un numero binario por ejemplo (00001100) 12 en decimal, es decir, que hace la funcion para yo tener un 0 en buf[1] 1 en buf[2] y un 2 en buf[3].

Gracias, que felicidad
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: migsantiago en 12 de Junio de 2008, 11:43:29
 :D :D :D

Qué bien que ya funciona, tardé en ayudar pero es que nunca había usado sourceboost  :P

Lo que hace uitoa_dec es que convierte datos en binario entero a datos en tipo char código ascii, llenando un string con los números convertidos.

Ya te lo había explicado unos posts arriba.

Si tmr0 tiene (00110010) ahora en buf tendrás lo siguiente:

buf[0]=0x30; //caracter 0 en ascii
buf[1]=0x35; //caracter 5 en ascii
buf[2]=0x30; //caracter 0 en ascii
buf[3]=0x00; //caracter NULL en ascii, útil para trabajar con cadenas

Viendo la cadena completa sería "050" y el null char del final se usa con printf o cualquier función de cadenas para indicar que ahí terminan.

Una solución alternativa a tu problema es la siguiente, sustituye uitoa_dec por:

buf=sprintf("%03u",tmr0);

Obtienes el mismo resultado que con uitoa_dec, pero según la ayuda de sourceboost, las funciones uito son más eficientes en código que las printf.

Título: Re: Como mostrar un valor binario en decimal?
Publicado por: firepic en 12 de Junio de 2008, 11:49:02
Por algo le dicen el Ser Supremo MigSantiago  :D
Migsantiago, eres un genio!
Por cierto, he estado siguiendo el hilo y me ha entrado cierta curiosidad por el compilador Source Boost... es gratuito?
Porque si es así creo que vale la pena probarlo!  :P
Ok te deseo éxito pibuleta!
Saludos, nos leemos!  :mrgreen:
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: Pibuleta en 12 de Junio de 2008, 12:20:36
:D :D :D

Qué bien que ya funciona, tardé en ayudar pero es que nunca había usado sourceboost  :P

Lo que hace uitoa_dec es que convierte datos en binario entero a datos en tipo char código ascii, llenando un string con los números convertidos.

Ya te lo había explicado unos posts arriba.

Si tmr0 tiene (00110010) ahora en buf tendrás lo siguiente:

buf[0]=0x30; //caracter 0 en ascii
buf[1]=0x35; //caracter 5 en ascii
buf[2]=0x30; //caracter 0 en ascii
buf[3]=0x00; //caracter NULL en ascii, útil para trabajar con cadenas

Viendo la cadena completa sería "050" y el null char del final se usa con printf o cualquier función de cadenas para indicar que ahí terminan.

Una solución alternativa a tu problema es la siguiente, sustituye uitoa_dec por:

buf=sprintf("%03u",tmr0);

Obtienes el mismo resultado que con uitoa_dec, pero según la ayuda de sourceboost, las funciones uito son más eficientes en código que las printf.



Amigo! He cantado victoria antes de tiempo... ahora mismo estoy peleandome con el circuito, y sí parece que cuenta, pero me ha mostrado un par de veces números raros (no coinciden con los pulsos).

Ahora estoy retocando y poniendo a 0 las variables.

Ahora os digo, pero menos mal estaba atascado si no es por vosotros...

P.D: uitoa_dec(  buf, tmr0,  3 ); EL 3 que funcion tiene? Es decir, que pasa si pongo 4? Y buf tiene que llamarse buf? O puedo llamarle como quierA?

Saludos
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: migsantiago en 12 de Junio de 2008, 12:23:30

Por cierto, he estado siguiendo el hilo y me ha entrado cierta curiosidad por el compilador Source Boost... es gratuito?
Porque si es así creo que vale la pena probarlo!  :P

Tan gratis como el aire que ahora respiras.

SourceBoost Package V6.87
http://www.sourceboost.com/CommonDownload.html

Y la lista de pics programables es grraaaaaande XD, la pude obtener abriendo la carpeta include pero no encontré en la página web ni en la ayuda una lista...

Código: [Seleccionar]
PIC12C671.h      PIC12C672.h      PIC12CE673.h     PIC12CE674.h
PIC12F609.h      PIC12F615.h      PIC12F629.h      PIC12F635.h
PIC12F675.h      PIC12F683.h      PIC12HV609.h     PIC12HV615.h
PIC16C432.h      PIC16C433.h      PIC16C554.h      PIC16C557.h
PIC16C558.h      PIC16C61.h       PIC16C62.h       PIC16C620.h
PIC16C620A.h     PIC16C621.h      PIC16C621A.h     PIC16C622.h
PIC16C622A.h     PIC16C62A.h      PIC16C62B.h      PIC16C63.h
PIC16C63A.h      PIC16C64.h       PIC16C642.h      PIC16C64A.h
PIC16C65.h       PIC16C65A.h      PIC16C65B.h      PIC16C66.h
PIC16C662.h      PIC16C67.h       PIC16C71.h       PIC16C710.h
PIC16C711.h      PIC16C712.h      PIC16C715.h      PIC16C716.h
PIC16C717.h      PIC16C72.h       PIC16C72A.h      PIC16C73.h
PIC16C73A.h      PIC16C73B.h      PIC16C74.h       PIC16C745.h
PIC16C74A.h      PIC16C74B.h      PIC16C76.h       PIC16C765.h
PIC16C77.h       PIC16C770.h      PIC16C771.h      PIC16C773.h
PIC16C774.h      PIC16C781.h      PIC16C782.h      PIC16C84.h
PIC16C923.h      PIC16C924.h      PIC16C925.h      PIC16C926.h
PIC16CE623.h     PIC16CE624.h     PIC16CE625.h     PIC16CR62.h
PIC16CR620A.h    PIC16CR63.h      PIC16CR64.h      PIC16CR65.h
PIC16CR72.h      PIC16CR83.h      PIC16CR84.h      PIC16F610.h
PIC16F616.h      PIC16F627.h      PIC16F627A.h     PIC16F628.h
PIC16F628A.h     PIC16F630.h      PIC16F631.h      PIC16F636.h
PIC16F639.h      PIC16F648A.h     PIC16F676.h      PIC16F677.h
PIC16F684.h      PIC16F685.h      PIC16F687.h      PIC16F688.h
PIC16F689.h      PIC16F690.h      PIC16F716.h      PIC16F72.h
PIC16F722.h      PIC16F723.h      PIC16F724.h      PIC16F726.h
PIC16F727.h      PIC16F73.h       PIC16F737.h      PIC16F74.h
PIC16F747.h      PIC16F76.h       PIC16F767.h      PIC16F77.h
PIC16F777.h      PIC16F785.h      PIC16F818.h      PIC16F819.h
PIC16F83.h       PIC16F84.h       PIC16F84A.h      PIC16F87.h
PIC16F870.h      PIC16F871.h      PIC16F872.h      PIC16F873.h
PIC16F873A.h     PIC16F874.h      PIC16F874A.h     PIC16F876.h
PIC16F876A.h     PIC16F877.h      PIC16F877A.h     PIC16F88.h
PIC16F882.h      PIC16F883.h      PIC16F884.h      PIC16F886.h
PIC16F887.h      PIC16F913.h      PIC16F914.h      PIC16F916.h
PIC16F917.h      PIC16F946.h      PIC16HV610.h     PIC16HV616.h
PIC16HV785.h     PIC18C242.h      PIC18C252.h      PIC18C442.h
PIC18C452.h      PIC18C601.h      PIC18C658.h      PIC18C801.h
PIC18C858.h      PIC18F1220.h     PIC18F1230.h     PIC18F1320.h
PIC18F1330.h     PIC18F2220.h     PIC18F2221.h     PIC18F2320.h
PIC18F2321.h     PIC18F2331.h     PIC18F2410.h     PIC18F242.h
PIC18F2420.h     PIC18F2423.h     PIC18F2431.h     PIC18F2439.h
PIC18F2450.h     PIC18F2455.h     PIC18F2458.h     PIC18F248.h
PIC18F2480.h     PIC18F24J10.h    PIC18F24K20.h    PIC18F2510.h
PIC18F2515.h     PIC18F252.h      PIC18F2520.h     PIC18F2523.h
PIC18F2525.h     PIC18F2539.h     PIC18F2550.h     PIC18F2553.h
PIC18F258.h      PIC18F2580.h     PIC18F2585.h     PIC18F25J10.h
PIC18F25K20.h    PIC18F2610.h     PIC18F2620.h     PIC18F2680.h
PIC18F2682.h     PIC18F2685.h     PIC18F26K20.h    PIC18F4220.h
PIC18F4221.h     PIC18F4320.h     PIC18F4321.h     PIC18F4331.h
PIC18F4410.h     PIC18F442.h      PIC18F4420.h     PIC18F4423.h
PIC18F4431.h     PIC18F4439.h     PIC18F4450.h     PIC18F4455.h
PIC18F4458.h     PIC18F448.h      PIC18F4480.h     PIC18F44J10.h
PIC18F44K20.h    PIC18F4510.h     PIC18F4515.h     PIC18F452.h
PIC18F4520.h     PIC18F4523.h     PIC18F4525.h     PIC18F4539.h
PIC18F4550.h     PIC18F4553.h     PIC18F458.h      PIC18F4580.h
PIC18F4585.h     PIC18F45J10.h    PIC18F45K20.h    PIC18F4610.h
PIC18F4620.h     PIC18F4680.h     PIC18F4682.h     PIC18F4685.h
PIC18F46K20.h    PIC18F6310.h     PIC18F6390.h     PIC18F6393.h
PIC18F63J11.h    PIC18F63J90.h    PIC18F6410.h     PIC18F6490.h
PIC18F6493.h     PIC18F64J11.h    PIC18F64J90.h    PIC18F6520.h
PIC18F6525.h     PIC18F6527.h     PIC18F6585.h     PIC18F65J10.h
PIC18F65J11.h    PIC18F65J15.h    PIC18F65J50.h    PIC18F65J90.h
PIC18F6620.h     PIC18F6621.h     PIC18F6622.h     PIC18F6627.h
PIC18F6628.h     PIC18F6680.h     PIC18F66J10.h    PIC18F66J11.h
PIC18F66J15.h    PIC18F66J16.h    PIC18F66J50.h    PIC18F66J55.h
PIC18F66J60.h    PIC18F66J65.h    PIC18F6720.h     PIC18F6722.h
PIC18F6723.h     PIC18F67J10.h    PIC18F67J11.h    PIC18F67J50.h
PIC18F67J60.h    PIC18F8310.h     PIC18F8390.h     PIC18F8393.h
PIC18F83J11.h    PIC18F83J90.h    PIC18F8410.h     PIC18F8490.h
PIC18F8493.h     PIC18F84J11.h    PIC18F84J15.h    PIC18F84J90.h
PIC18F8520.h     PIC18F8525.h     PIC18F8527.h     PIC18F8585.h
PIC18F85J10.h    PIC18F85J11.h    PIC18F85J15.h    PIC18F85J50.h
PIC18F85J90.h    PIC18F8620.h     PIC18F8621.h     PIC18F8622.h
PIC18F8627.h     PIC18F8628.h     PIC18F8680.h     PIC18F86J10.h
PIC18F86J11 .h   PIC18F86J11.h    PIC18F86J15.h    PIC18F86J16.h
PIC18F86J50.h    PIC18F86J55.h    PIC18F86J60.h    PIC18F86J65.h
PIC18F8720.h     PIC18F8722.h     PIC18F8723.h     PIC18F87J10.h
PIC18F87J11.h    PIC18F87J50.h    PIC18F87J60.h    PIC18F96J60.h
PIC18F96J65.h    PIC18F97J60.h    PIC18LF2423.h    PIC18LF2523.h
PIC18LF4423.h    PIC18LF4523.h    
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: migsantiago en 12 de Junio de 2008, 12:26:04
Amigo! He cantado victoria antes de tiempo... ahora mismo estoy peleandome con el circuito, y sí parece que cuenta, pero me ha mostrado un par de veces números raros (no coinciden con los pulsos).

Ahora estoy retocando y poniendo a 0 las variables.

Ahora os digo, pero menos mal estaba atascado si no es por vosotros...

P.D: uitoa_dec(  buf, tmr0,  3 ); EL 3 que funcion tiene? Es decir, que pasa si pongo 4? Y buf tiene que llamarse buf? O puedo llamarle como quierA?

Saludos

La ayuda de sourceboost no es clara al respecto, tengo entendido que el 3 es para pasar los 3 digitos máximos posibles de una variable de 8 bits (2^8 = 256).

Pero intenta poner 4 en vez de 3 porque no consideré el null char, a ver qué hace el compilador.

buf puede llamarse como quieras pero debe ser un arreglo de 4bytes para almacenar los 3 máximos dígitos  más el null char que uitoa entrega.

EDITO: Y asegúrate de que utilices buf[0], buf[1] y buf[2].

buf[3] contiene el null char y no sirve para la lcd por ahora.
Título: Re: Como mostrar un valor binario en decimal?
Publicado por: firepic en 12 de Junio de 2008, 12:29:51
Gracias por la respuesta migsantiago!  :P
Pues me está entrando la piquiña de probar ese compilador... en cuanto tenga tiempo lo haré.
Y la lista de pics programables es grraaaaaande XD, la pude obtener abriendo la carpeta include pero no encontré en la página web ni en la ayuda una lista...
Bueno pues sí, eso sí lo había leído, que puedes programar para todos los pics de la gama de 8bits... es decir, todos menos las serie 24H, 24F, y los dspic.
Me imagino que ya tú lo estás probando mig, si logras compilar un programita aplicativo, tal vez usando interrupciones y eso, me dices porfa.
Lo único que no me gusta es que el manual no te ayuda casi nada, tienes que aprender tú solo fijándote de los ejemplos.
Bueno pero es gratis! Nada es perfecto...  :D Y bueno, tampoco es imposible hacer eso.
Ok saludos, nos leemos!  :mrgreen: