Autor Tema: Convertir binario a decimal y almacenar el dato en un char  (Leído 2061 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nahueldiaz1992

  • PIC12
  • **
  • Mensajes: 75
Convertir binario a decimal y almacenar el dato en un char
« en: 25 de Febrero de 2016, 10:36:01 »
Buenas , estoy teniendo un inconveniente ya que no me hago de una buena idea , a ver si me pueden ayudar :)

El proyecto q tengo es para mostrar cualquier dato recolectado por el adc en 3 displays 7 segmentos . La idea es tomar el dato del adc , convertir de binario a decimal , tomar ese dato decimal y operarlo de forma que sea necesaria y luego mostrarlo por los displays .

El codigo que uso es el siguiente :

Código: [Seleccionar]
/*
 * File:   vumetro2.c
 * Author: nahueldiaz
 *
 * Created on 27 de enero de 2016, 21:20
 */

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <plib.h>
#include <plib/adc.h>
#include <math.h>




#define _XTAL_FREQ 2000000

// CONFIG1
#pragma config FOSC = INTOSCIO 
#pragma config WDTE = OFF       
#pragma config PWRTE = OFF     
#pragma config MCLRE = OFF     
#pragma config BOREN = OFF     
#pragma config LVP = OFF       
#pragma config CPD = OFF       
#pragma config WRT = OFF       
#pragma config CCPMX = RB0     
#pragma config CP = OFF         

// CONFIG2
#pragma config FCMEN = ON       
#pragma config IESO = ON     

unsigned char high,low,fvalue;
unsigned long mv;
unsigned char cnt,msb,lsb ;
unsigned long result ;


void interrupt alta(void){ //interrupcion de alta
   
    INTCONbits.GIE = 0; //deshabilita las int. para nocausar varias int a la vez
   
    if (PIR1bits.ADIF == 1){ // si salto flag de ADC entonces..
       
            high = ADRESH; // rescatar valores de ADC
            low  = ADRESL;

            ADRESH = 0X00 ;
            ADRESL = 0X00 ;
           
        PIR1bits.ADIF = 0;
    }
   
}

unsigned char display (unsigned char no){ //display 7 segmentos
    unsigned char patern;
    unsigned char segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    patern = segment[no];
    return (patern);
}

void main (){
   
        OSCCON = 0x50 ;// clock 2MHz
        __delay_ms (10);
   
        TRISA = 0X02;
        TRISB = 0X00;
        PORTA = 0X00;
        PORTB = 0X00;
       
        ADRESL = 0X00;
        ADRESH = 0X00;
        ANSEL  = 0b00000010; // ADC en RA1
        ADCON0 = 0b10001001; // clock 2 mhz dividido 64 = 31250
        ADCON1 = 0b11000000; // 32us de tiempo de adquisicion
       
        INTCON = 0b01000000; // interrupciones habilitadas ADC
        PIR1bits.ADIF = 0;
        PIE1bits.ADIE = 1;
        INTCONbits.GIE = 1;
       
        __delay_ms (30);

        while (1){
           
            __delay_ms(10);
           
            //result = 0x0F;
             PORTB = low;
             
             result = high ;
             result <<= 8 ;
             result += low ;
             
             result *= 5000 ;
             result >>= 10 ;
             
             // a partir de aqui esta el bloque de codigo utilizado para la conversion
             
             unsigned int value = result;
             const unsigned int digits[4] = {1000, 100, 10,1};
             unsigned char string[5];
             for (int i = 0; i<4; i++) {
                           string[i] = '0';
                            while (value >= digits[i])
                            {
                               
                                value -= digits[i];
                                string[i]++;
                            }
                                        }
                           string[4] = '\0';
                           
            // aqui termina               
                           
             PORTB = PORTB ;
             
             
           
           
            INTCONbits.GIE = 1;
            ADCON0 = 0b10001101;
           
        }
       
        // el siguiente bloque se coloca si se quiere
        //realizar manualmente la consulta del adc
       
        //while (1){
        //if (ADCON0 == 0b10001001) { // si completo la conversion , entra en
            //high = ADRESH;         //el ciclo y toma los valores del ADC
            //low  = ADRESL;
            //PORTB = low;
        //}
         //__delay_ms (30);
   
       
        //ADCON0 = 0b10001101;
       
               
       
        }//}


El pedazo de codigo que utilizaria para poder mostrar el dato via displays es el siguiente , colocando el dato tomado por el adc y ya habiendo realizado las operaciones matematicas necesarias colocaria ese dato en DECIMAL en una variable "cnt" y asi haciendolo pasar por el sig codigo, simillar =

Código: [Seleccionar]
/*
 * File:   2Segmentedisplay.c
 * Author: nahueldiaz
 *
 * Created on 9 de septiembre de 2015, 09:38
 */

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

// CONFIG1
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB0      // CCP1 Pin Selection bit (CCP1 function on RB0)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

// CONFIG2
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal External Switchover mode enabled)

#define _XTAL_FREQ 8000000

unsigned char s,j,i ;


unsigned char display (unsigned char no){
    unsigned char patern;
    unsigned char segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    patern = segment[no];
    return (patern);
}

unsigned char cnt,msb,lsb ;

void main ()
{
   
   
    ANSEL = 0x00 ;
    TRISA = 0x00 ;
    TRISB = 0x00 ;
    PORTA = 0x00 ;
    PORTB = 0x00 ;
    for(;;){
        for (cnt=0;cnt<99;cnt++){
   
        msb = cnt /10 ;
        PORTB = display(msb);
        PORTAbits.RA0 = 1 ;
        __delay_ms(50);
        PORTAbits.RA0 = 0 ;
       
        lsb = cnt % 10;
        PORTB = display(lsb);
        PORTAbits.RA1 = 1;
        __delay_ms(50);
        PORTAbits.RA1 = 0;
       
       
        __delay_ms(50);
       
   
        }}}


Mi pregunta seria , como saco el dato de string [4] = '\0' ; y lo coloco en una variable aparte ? , entiendo el bloque que utilizaron para realizar la conversion de binario a decimal , pero todavia no me llevo bien con los strings , si se como crearlos y llamar variables de los mismos pero en esta ocasion me confunde y no logro entenderlos .

Código: [Seleccionar]
    unsigned int value = result;
             const unsigned int digits[4] = {1000, 100, 10,1};
             unsigned char string[5];
             for (int i = 0; i<4; i++) {
                           string[i] = '0';
                            while (value >= digits[i])
                            {
                               
                                value -= digits[i];
                                string[i]++;
                            }
                                        }
                           string[4] = '\0';
                           

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Convertir binario a decimal y almacenar el dato en un char
« Respuesta #1 en: 25 de Febrero de 2016, 13:11:47 »
No te entiendo que queres hacer realmente.. O en realidad por que te la complicas tanto, hace un tiempo te di esto:

http://www.todopic.com.ar/foros/index.php?topic=45897.0

Código: C
  1. for(milesima=0;milesima<10 && valor > 1000;milesima++,valor-=1000);
  2.         for(centena=0;centena<10 && valor > 100;centena++,valor-=100);
  3.         for(decena=0;decena<10 && valor > 10;decena++,valor-=10);
  4.         unidad=valor;

Supongamos que ahora lo quiero poner en un array y tenerlos todos alli

Código: C
  1. for(string[0]=0;string[0]<10 && valor > 1000;string[0]++,valor-=1000);
  2.         for(string[1]=0;string[1]<10 && valor > 100;string[1]++,valor-=100);
  3.         for(string[2]=0;string[2]<10 && valor > 10;string[2]++,valor-=10);
  4.         string[3]=valor;

en string[0] tenes los miles, en string[1] tenes las centenas, en string[2] tenes las decenas, y string[3] tenes las unidades
valor, es lo retornado por el ADC es decir un numero entre 0  a 1023


 

anything