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

Temas similares

17/08/2009 #1

Avatar de dragondgold

Separar un numero decimal en C
hola quisiera saber si alguien sabe como podria separar un numero de 0 a 99 necesito separar por ejemplo:

si tengo el numero 52 que me lo separe en dos registro q tenga un 5 y un 2
si tengo el numero 15 que me lo separe en un 1 y un 5

me entienden? desde ya gracias
17/08/2009 #2

Avatar de agustinzzz

Si mal no recuerdo, puedes utilizar las funciones "ceil" y "floor" dividiendo o multiplicando por 10.
Ejemplo:
Si x=52
//Código de ejemplo
decena = floor(x/10); //Devuelve decena = 5, porque 52/10=5.2 y floor me lo redondea para abajo...
unidad = x-decena*10 //Devuelve unidad = 2, porque 52-5*10=2
//Fin codigo ejemplo
17/08/2009 #3

Avatar de dragondgold

huy muchas gracias de lujo! me re sirvio!
17/08/2009 #4

Avatar de dragondgold

cha te hago una pregunta yo uso el CCS compiler para mis programas en C y cuando creo un funcion que no devuelve un valor por lo tanto uso VOID me da este error al compilar: "a numeric expression must appear here" y no se que quiere q le ponga si no devuelve nada la funcion y asi no puedo compilar mis programas
17/08/2009 #5

Avatar de agustinzzz

Si puedes postear el código de la función quizás te pueda ayudar mejor, pero se me ocurre que al final de la función estás poniendo un "return", es decir un retorno. Pero si tu función no devuelve nada, esta instrucción no debería existir.
Saludos.
18/08/2009 #6
Moderador

Avatar de Chico3001

Intenta este codigo:

Código:
DIGITO0=NUMERO^0x0F;	// Obtiene primer digito
DIGITO1=NUMERO^0xF0;	// Obtiene segundo digito
DIGITO1=DIGITO1>>4;	// Recorre segundo digito 4 lugares a la izquierda
19/08/2009 #7

Avatar de dragondgold

muchas gracias chicos les presento aqui el programa que he hecho con un problema, cuando compilo me tira un error de compilacion que dice "Out of ROM, a segment or the program is too large convertir" y lei algo de poner una directiva llamada #separate pero no puedo solucionar el problema y por lo tanto no me deja compilar tengan en cuenta que soy nuevo en C disculpen por si hay errores muy obvios

Código:
#include <16f84a.h>
#include <math.h>             //libreria matematica
#fuses   XT,NOWDT
#byte    PORTB=0x06
#byte    TRISB=0x86
#byte    PORTA=0x05
#byte    TRISA=0x85
#use     delay(clock=4000000)
#use     fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7)
int      minutos1;            //minutos del reloj 1
int      segundos1;           //segundos del reloj 1
int      minutos2;            //minutos del reloj2
int      segundos2;          //segundos del reloj2
float    decena;
int      unidad;
int      x;
int      z;
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void convertir(int x){                     
          decena=floor(x/10); 
          unidad=x-(decena*10);
}
//////////////////////////////////////////////////////////////////////////////////////
void mostrar(int z){
          minutos1=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B0);
          output_high(PIN_B0);
          output_a(unidad);
          output_low(PIN_B1);
          output_high(PIN_B1);
          segundos1=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B2);
          output_high(PIN_B2);
          output_a(unidad);
          output_low(PIN_B3);
          output_high(PIN_B3);
          minutos2=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B4);
          output_high(PIN_B4);
          output_a(unidad);
          output_low(PIN_B5);
          output_high(PIN_B5);
          segundos2=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B6);
          output_high(PIN_B6);
          output_a(unidad);
          output_low(PIN_B7);
          output_high(PIN_B7);         
}
    
          
void main(void){
minutos1=0;
minutos2=0;
segundos2=59;
segundos1=59;
                while(true){
                       output_a(0);
                       output_b(0b00000000);
                       if(input(PIN_B0==1) && minutos1<=99){           //pin incrementa minutos reloj 1
                         ++minutos1;
                       }                      
                       mostrar(z);
                       if(input(PIN_B1==1) && minutos2<=99){          //pin incrementa minutos reloj 2
                         ++minutos2;
                       }
                       mostrar(z);
                       if(input(PIN_A4)==0){ //si RA4 cambia a 0 se apreto el pulsador START
                         break;
                       }
                }

reloj1:                for(z=0;segundos1>=0 && minutos1>=0;--segundos1){
                       mostrar(z);
                       if(input(PIN_B3)==1){                //si el pulsador es 1 va al otro reloj
                       goto reloj2;
                       }
                       delay_ms(999.8);
                }
                       --minutos1;
                       segundos1=59;
                       goto reloj1;
/////////////////////////////////////////////////////////////////////////////////////
reloj2:                for(z=0;segundos2>=0 && minutos2>=0;--segundos2){
                       mostrar(z);
                       if(input(PIN_B4)==1){
                       goto reloj1;
                       }
                       delay_ms(999.8);
}
                       --minutos2;
                       segundos2=59;
                       goto reloj2;
}
estoy usando un PIC 16f84 para hacer un reloj de ajedrez.
Archivos Adjuntos
Tipo de Archivo: c reloj_leo_184.c (3,9 KB (Kilobytes), 17 visitas)
19/08/2009 #8

Avatar de agustinzzz

dragongold, la verdad que tu código tiene muchos errores y el error que te tira es porque el programa ocupa más de 1024 bytes de espacio, o sea más espacio del que tiene el 16f84.
Por otro lado: ¿Qué es lo que intentas hacer?
La próxima vez que postees código, hazlo entre las etiquetas "[code][/ code]" (sin el espacio en /code) para que aparezca como lo posteo chico3001

Algunos errores en tu programa:
1) Defines muchas variables innecesariamente.
2) Revisa el código desde cero, es decir desde que comienza el main. Si te fijas estas utilizando la función mostrar(z) y z no tiene ningún valor. También dentro de esa función utilizas "x" y nunca se le asigna un valor.
3) Trata de ser un poco más prolijo con los nombres de las variables y de utilizar menor cantidad, cuando escribas mucho código te puede ayudar a identificar mejor el objetivo de cada variable.
4) Si no entiendes lo que te dije más arriba, intenta leer algún tutorial introductorio a C++.

Saludos!
19/08/2009 #9
Moderador

Avatar de Chico3001

Algunos consejos para programacion en C con microcontroladores:

-Evitar al maximo posible las variables globales.... usar variables locales que puedan ser destruidas al terminar la rutina
-Usar variables tipo unsigned char en vez de int.. asi el compilador reduce el tamaño del codigo

Mas consejos en nuestro proximo capitulo.....
20/08/2009 #10

Avatar de tecnogirl

dragondgold: En que formato estan originalmente los digitos 0 a 99 que quieres separar ?, porque hay muchos... Ascii, entero corto (8 bits), entero largo (16 bits), signed/unsigned long (32 bits) complemento a dos o en flotante sin punto decimal, etc. En cada caso aplica un procedimiento diferente!. Salu2.
20/08/2009 #11


Yo uso algo así para separar un número en centenas, decenas y unidades:
Código:
    char centenas = 0;
    char decenas = 0;
    char unidades = 0;

    while(registro>=100)
    {
        registro= registro -100;
        centenas++;
    }
    while(registro>=10)
    {
        registro=registro -10;
        decenas++;
    }
    while(registro>0)
    {
        registro=registro-1;
        unidades++;
    }
Utiliza las opciones de optimización del compilador si no lo estás haciendo para disminuir el uso de memoria en el micro.
20/08/2009 #12

Avatar de dragondgold

el compilador me dice algo de usar la directiva #SEPARATE y cuando lo pongo el programa me funciona bien no me da ningun error exepto por una que me dice que una expresion numérica ejemplo (A,A+B) debe aparecer
20/08/2009 #13

Avatar de dragondgold

ca he modificado el programa disculpen por errores tan obvios estoy en 4º año de electronica y me he dedicado a los PICS por mi cuenta y he aprendido a programar ASM y C por mi cuenta aca les dejo el programa cambiado y con la directiva #separate agregada pero ahora me da un error diferente no ya el de la memoria ROM si no este: "Exepting a basic type" y me lo da al error en la misma linea en que puse el #separate
Código:
#include <16f84a.h>
#include <math.h>             //libreria matematica
#fuses   XT,NOWDT
#byte    PORTB=0x06
#byte    TRISB=0x86
#byte    PORTA=0x05
#byte    TRISA=0x85
#use     delay(clock=4000000)
#use     fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7)
int      minutos1;            //minutos del reloj 1
int      segundos1;           //segundos del reloj 1
int      minutos2;            //minutos del reloj2
int      segundos2;          //segundos del reloj2
float    decena;
int      unidad;
int      x;
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void convertir(int x){                     
          decena=floor(x/10); 
          unidad=x-(decena*10);
}
//////////////////////////////////////////////////////////////////////////////////////

void mostrar(){
          minutos1=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B0);
          output_high(PIN_B0);
          output_a(unidad);
          output_low(PIN_B1);
          output_high(PIN_B1);
          segundos1=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B2);
          output_high(PIN_B2);
          output_a(unidad);
          output_low(PIN_B3);
          output_high(PIN_B3);
          minutos2=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B4);
          output_high(PIN_B4);
          output_a(unidad);
          output_low(PIN_B5);
          output_high(PIN_B5);
          segundos2=x;
          convertir(x);
          output_a(decena);
          output_low(PIN_B6);
          output_high(PIN_B6);
          output_a(unidad);
          output_low(PIN_B7);
          output_high(PIN_B7);         
}
              
void main(void){
minutos1=0;
minutos2=0;
segundos2=59;
segundos1=59;

                while(true){
                       output_a(0);
                       output_b(0b00000000);
                       if(input(PIN_B0==1) && minutos1<=99){           //pin incrementa minutos reloj 1
                         ++minutos1;
                         ++minutos2;
                       }                      
                       mostrar();
                       if(input(PIN_A4)==0){ //si RA4 cambia a 0 se apreto el pulsador START
                         break;
                       }
                }

reloj1:                for(;segundos1>=0 && minutos1>=0;--segundos1){
                       mostrar();
                       if(input(PIN_B3)==1){                //si el pulsador es 1 va al otro reloj
                       goto reloj2;
                       }
                       delay_ms(999.8);
                }
                       --minutos1;
                       segundos1=59;
                       goto reloj1;
/////////////////////////////////////////////////////////////////////////////////////
reloj2:                for(;segundos2>=0 && minutos2>=0;--segundos2){
                       mostrar();
                       if(input(PIN_B4)==1){
                       goto reloj1;
                       }
                       delay_ms(999.8);
}
                       --minutos2;
                       segundos2=59;
                       goto reloj2;
}
/////////////////////////////////////////////////////////////////////////////////////
                       

                       
                       
                      
                       
                       
                        

     
                   
                   
                   
      



#SEPARATE
[/code]
21/08/2009 #14

Avatar de agustinzzz

Ya está, el problema que te tira es porque en la ayuda que te dí más arriba te dije que utilices la función floor.
El problema es que para poder utilizar esa función, tuviste que incluir la librería math.h, esto ocasionó que tu programa sea demasiado grande.
Aquí posteo el programa, que al menos a mí me compiló sin problemas. El único cambio que hice, fue borrar el #separate del final y cambiar el tipo de dato de decena a entero (de esta forma haces lo mismo que con floor)
Código:
    #include <16f84a.h>
//    #include < math.h >   //libreria matematica
    #fuses XT, NOWDT
    #byte PORTB = 0x06
    #byte TRISB = 0x86
    #byte PORTA = 0x05
    #byte TRISA = 0x85
    #use delay (clock = 4000000)
       #use fixed_io (b_outputs = PIN_B0, PIN_B1, PIN_B2, PIN_B3, PIN_B4, PIN_B5, PIN_B6, PIN_B7)
   INT minutos1;   //minutos del reloj 1
   INT segundos1;   //segundos del reloj 1
   INT minutos2;   //minutos del reloj2
   INT segundos2;  //segundos del reloj2
   int decena;

    INT unidad;
    INT x;

    //////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////
    VOID convertir (int x)
    {
       
       decena = x / 10;
       unidad = x - (decena * 10);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    #SEPARATE

    VOID mostrar ()
    {
       minutos1 = x;
       convertir (x);
       output_a (decena);
       output_low (PIN_B0);
       output_high (PIN_B0);
       output_a (unidad);
       output_low (PIN_B1);
       output_high (PIN_B1);
       segundos1 = x;
       convertir (x);
       output_a (decena);
       output_low (PIN_B2);
       output_high (PIN_B2);
       output_a (unidad);
       output_low (PIN_B3);
       output_high (PIN_B3);
       minutos2 = x;
       convertir (x);
       output_a (decena);
       output_low (PIN_B4);
       output_high (PIN_B4);
       output_a (unidad);
       output_low (PIN_B5);
       output_high (PIN_B5);
       segundos2 = x;
       convertir (x);
       output_a (decena);
       output_low (PIN_B6);
       output_high (PIN_B6);
       output_a (unidad);
       output_low (PIN_B7);
       output_high (PIN_B7);
    }

    VOID main (void)
    {
       minutos1 = 0;
       minutos2 = 0;
       segundos2 = 59;
       segundos1 = 59;

       WHILE (true)
       {
          output_a (0);
          output_b (0b00000000);

          IF (input (PIN_B0 == 1)&&minutos1 <= 99)
          {
             //pin incrementa minutos reloj 1
             ++minutos1;
             ++minutos2;
    }

          mostrar ();

          IF (input (PIN_A4) == 0)
          {
             //si RA4 cambia a 0 se apreto el pulsador START
             BREAK;
    }
    }

       reloj1: FOR (; segundos1 >= 0 &&minutos1 >= 0; --segundos1)
       {
          mostrar ();

          IF (input (PIN_B3) == 1)
          {
             //si el pulsador es 1 va al otro reloj
             GOTO reloj2;
    }

          delay_ms (999.8);
    }

       --minutos1;
       segundos1 = 59;
       GOTO reloj1;

       /////////////////////////////////////////////////////////////////////////////////////
       reloj2: FOR (; segundos2 >= 0 &&minutos2 >= 0; --segundos2)
       {
          mostrar ();

          IF (input (PIN_B4) == 1)
          {
             GOTO reloj1;
    }

          delay_ms (999.8);
    }

       --minutos2;
       segundos2 = 59;
       GOTO reloj2;
    }

    /////////////////////////////////////////////////////////////////////////////////////
23/08/2009 #15

Avatar de dragondgold

huy muchas gracias!! te lo agradesco!!
Respuesta
¿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.