Imprimir décimas en LCD PIC18F2550
Página 1 de 3 123 ÚltimoÚltimo
Resultados 1 al 10 de 30

Tema: Imprimir décimas en LCD PIC18F2550

  1. #1
    Usuario
    Ubicación
    Sinaloa
    Mensajes
    4
    Gracias
    1
    Agradecido 1 vez en 1 post

    Imprimir décimas en LCD PIC18F2550

    Que tal , estoy realizando un sistema que mida temperatura por medio de un LM35 con el pi18F2550 en C18 , tengo un pequeño problema que en este micro no se como hacerle, necesito que me indique la temp en la LCD con decimales solo me marca números enteros. a continuacion les muestro el codigo:

    Código:
    #include "p18F2550.h"
    #include "timers.h"
    #include "adc.h"
    #include "stdlib.h"
    #include "lcd.h"
    
    // Prototipos de función de interrupción
    void rsi_tmr0(void);
    
    
    // Variables Globales
    #pragma udata
    int c=0,f=0,k=0;
    int dig;
    char strADC[7];
    char strClean[] = " ";
    
    // Inicio de programa
    #pragma code
    void main()
    {
        char cadena[] = "TERMOMETRO";
        // configura LCD
        OpenLCD( FOUR_BIT & LINES_5X7);
        //Envia cadena "Probando LCD"
        putsLCD(cadena);
        // Activa timer0 de 16 bits, conteo de Tcy con prescaler de 1:64
        OpenTimer0 (TIMER_INT_ON & T0_SOURCE_INT & T0_16BIT & T0_PS_1_64);
        WriteTimer0(0xB6C2);
        // Configura y activa el módulo ADC
        OpenADC( ADC_FOSC_64 & // TAD = FOSC/64
        ADC_RIGHT_JUST & // Resultado justificado a la derecha
        ADC_2_TAD, // Tiempo de adq 2 TAD
        ADC_CH0 & // Selecciona Canal0 (AN0)
        ADC_INT_OFF & // Sin interrupción de ADC
        ADC_VREFPLUS_VDD & // Referencia+ VDD
        ADC_VREFMINUS_VSS, // Referencia- VSS
        14 ); // AN0 como pin analógico
        // Habilitación global de interrupciones
        INTCONbits.GIE = 1;
        while(1)
        {
        }
    }
    
    
    /////////////// Vector de Interrupción
    #pragma code high_vector=0x08
    void high_interrupt (void)
    {
        _asm GOTO rsi_tmr0 _endasm
    }
    
    
    #pragma code
    //////////////////////////////////////
    
    
    /****** RSI de TIMER0 *****/
    #pragma interrupt rsi_tmr0
    void rsi_tmr0 (void)
    {        
        ConvertADC(); // Inicia conversión
        while(BusyADC()); // Espera a que termine de convertir
        dig= ReadADC(); // Lee resultado de ADC
        // Convierte resultado a cadena
        
        SetDDRamAddr(0x40);
        c=dig*0.48875;
        itoa(c,strADC);
        putsLCD(strADC);
    
    
        SetDDRamAddr(0x4A);
        f=(c * 1.8) + 32;
        itoa(f,strADC);
        putsLCD(strADC);
    
    
        SetDDRamAddr(0x44);
        k= c + 273.15;
        itoa(k,strADC);
        putsLCD(strADC);
    
    
        // Reinicia el Timer0
        WriteTimer0(0xB6C2);
        // Limpia la bandera de interrupción
        INTCONbits.TMR0IF = 0;
    }
    Espero puedan ayudarme saludos! buen dia!
    Miniaturas adjuntadas Miniaturas adjuntadas Pulsa en la imagen para verla en tamaño completo

Nombre: 1.jpg
Visitas: 34
Tamaño: 18.4 KB
ID: 4019  
    Última edición por Mario; 23/08/2012 a las 00:45 Razón: Organizar código

  2. #2
    Usuario
    Mensajes
    2
    Gracias
    2
    Agradecido 0 veces en 0 posts

    Deciales en C18

    Bueno yo lo que he utilizado es que después del acondicionamiento de señal que realizas de tu sensor el valor lo multiplico por 100 luego declaro dos variables una para decimales y otro para enteros para obtener los decimales obtengo el restante de una división de 100 ejem:

    Código:
    Temp=((Temp*100)/2.046);//Acondicionamiento de Señal
    Entero=Temp/100;
    Decimales=Temp0;
    y ya lo mando como dos valores independientes.

    Bueno espero y sea de ayuda!!!!!
    Última edición por Mario; 23/08/2012 a las 00:46 Razón: Organizar código

  3. #3
    Usuario Avatar de jakala
    Mensajes
    361
    Gracias
    120
    Agradecido 273 veces en 139 posts
    Buenas!

    hace mucho que no hago programación en C, pero creo que deberias, inicialmente, definir tus variables C,F y K como float o double, asi el compilador las va a utilizar como tipo real y no entero. De hecho, cuando haces:

    c= dig * 0.48875;

    el compilador realiza la multiplicación, y el resultado lo tiene que meter en una variable de tipo entero. La solución es una conversion implicita a entero del resultado. Con lo que pierdes el decimal.
    Si la variable c esta definida como un float, la conversión implicita es hacia float, con lo que no perderias muchos decimales.


    Por otra parte, ¿PUTSLCD solo permite parametros de tipo cadena? si es asi, podrias utilizar la funcion sprintf. Esta ultima te asigna una cadena con el formato que tu le indiques, por lo que podrias hacer algo como:

    sprintf(cadena, "%f", c); // guardo en "cadena" la variable con formato Real
    putsLCD(cadena); // escribo en el LCD
    Última edición por jakala; 23/08/2012 a las 01:08
    Dicen que "rectificar" es de sabios...pero hay que tener "capacidad" y soportar la "tension"
    -------------------

    www.jakala.es
    Actualmente disponible dias y horas aleatorias (es decir, cuando enciendo el server)
    -------------------
    Cuatro cosas malas tiene el mundo:

    La boca de Jakala es lo primero;
    el buche del milano lo segundo;
    las manos de los monos es lo tercero;
    y, como nunca logra verse harto
    el ojo humano, siempre fue lo cuarto.

  4. #4
    Usuario Avatar de _Suky_
    Mensajes
    137
    Gracias
    28
    Agradecido 142 veces en 64 posts
    C18 no implementa el formateo de string en flotante, pero hay una función dando vueltas que lo hace... Por acá hay algo:

    Convert Float to ASCII in C18

    convert float to string? Revisar las dos opciones...


    Saludos!


  5. #5
    Usuario
    Mensajes
    2
    Gracias
    2
    Agradecido 0 veces en 0 posts
    Pido una disculpa por el codigo anterior tiene un error pero aqui pongo el ejemplo que indica la explicacion anterior:

    Código:
    Temp=((Temp*100)/2.046);//Acondicionamiento de Señal
    Entero=Temp/100;
    Decimales=Temp%100;
    comandXLCD(0X01);//Borra Pantalla LCD
    putrsXLCD("Temp= ");
    itoa(Entero,String);//Convierte Numero a ASCII
    putsXLCD(String);//Manda dato a LCD
    putrsXLCD(".");
    itoa(Decimales,String);
    putsXLCD(String);//Manda dato a LCD
    WriteDataXLCD(0b11011111);//ASCII º
    putrsXLCD("C");
    Última edición por Mario; 24/08/2012 a las 14:49

  6. #6
    Usuario Avatar de Mario
    Ubicación
    En mi corazón
    Mensajes
    2,219
    Gracias
    910
    Agradecido 2,354 veces en 1,118 posts
    Hola!

    Cita Iniciado por Rataman Ver mensaje
    Que tal , estoy realizando un sistema que mida temperatura por medio de un LM35 con el pi18F2550 en C18 , tengo un pequeño problema que en este micro no se como hacerle, necesito que me indique la temp en la LCD con decimales solo me marca números enteros.
    ¿Nunca pensaste en programar en BASIC rutinas sencillas de este tipo?
    BASIC te ofrece varibles del tipo FLOAT que te pueden brindar la cantidad de decimales que quieras.
    Para muchos, BASIC es una mala palabra, pero en BASIC ese programa lleva menos de la mitad de líneas de código y te queda igual de efectivo.

    Por supuesto, no necesitas pasarte a programar todo en la vida con BASIC (si te recomendase algo, te recomendaría ASM y no los lenguajes basados en C) pero es una alternativa sencilla que puede sacarte del apuro en pocas líneas de código.

    Saludos!
    Mario
    En Servisystem, hay un Foro para hablar de todos los montajes que realicé en esta web. No te olvides: todo lo que sea importante, también estará en el Blog.

  7. #7
    Usuario Avatar de _Suky_
    Mensajes
    137
    Gracias
    28
    Agradecido 142 veces en 64 posts
    Cita Iniciado por Mario Ver mensaje
    ¿Nunca pensaste en programar en BASIC rutinas sencillas de este tipo?
    BASIC te ofrece varibles del tipo FLOAT que te pueden brindar la cantidad de decimales que quieras.
    Eso se puede mal entender, tener en cuenta que se trabaja con un sistema digital en donde la variable se guarda en cierta cantidad de bits, que dependiendo del formato utilizado hay ciertos limites y por ello truncamientos. Por ejemplo:

    IEEE coma flotante - Wikipedia, la enciclopedia libre

    Saludos!

  8. Los siguientes usuarios agradecen a _Suky_ por este post:

    Mario (24/08/2012)

  9. #8
    Usuario Avatar de Mario
    Ubicación
    En mi corazón
    Mensajes
    2,219
    Gracias
    910
    Agradecido 2,354 veces en 1,118 posts
    Cita Iniciado por _Suky_ Ver mensaje
    Eso se puede mal entender, tener en cuenta que se trabaja con un sistema digital en donde la variable se guarda en cierta cantidad de bits, que dependiendo del formato utilizado hay ciertos limites y por ello truncamientos.
    Es verdad.
    Tal vez quise expresar que en BASIC se pueden obtener "muchos" decimales y no la "cantidad que se quiera", que es algo muy diferente. Es cierto, se puede prestar a confusión.

    De todos modos, por lo que tengo entendido y leído (quizás erróneamente y con poca solidez), Microchip utiliza una versión modificada de esa normativa (IEEE754), lo explica muy bien en estas notas de aplicación AN575 y AN660. Esas son las que usan los programas BASIC que trabajan con PIC, que al menos yo he ensayado y he hecho muchos montajes aquí, en NeoTeo (PROTON, AMICUS, etc.)

    Para redondear el concepto, yo he usado hasta diez decimales con BASIC, gracias a su sistema de coma flotante y no sabría decirles si puede expresar más. (Habría que buscar y leer más a fondo todos los "helps")

    Saludos!
    Mario
    En Servisystem, hay un Foro para hablar de todos los montajes que realicé en esta web. No te olvides: todo lo que sea importante, también estará en el Blog.

  10. #9
    Usuario Avatar de _Suky_
    Mensajes
    137
    Gracias
    28
    Agradecido 142 veces en 64 posts
    Cita Iniciado por Mario Ver mensaje
    Para redondear el concepto, yo he usado hasta diez decimales con BASIC, gracias a su sistema de coma flotante y no sabría decirles si puede expresar más. (Habría que buscar y leer más a fondo todos los "helps")
    Hay que aclarar en que rango podes expresar valores con 10 decimales, no es lo mismo números menores a 1 que números por ejemplo mayores a 100 Además flotante de 32 bits o 64 bits? Porque en uno de 32 bits mas de 7 decimales no se puede expresar para un numero menor a 1, el significante es de 23-bits es imposible mas decimales. Además el último decimal esta redondeado.

    Como indicas, en caso de necesitar este tipo de precisiones hay que buscar los helps y leer.

    Saludos!

  11. #10
    Usuario
    Ubicación
    Colombia
    Mensajes
    294
    Gracias
    167
    Agradecido 168 veces en 94 posts
    Que tal , estoy realizando un sistema que mida temperatura por medio de un LM35 con el pi18F2550 en C18 , tengo un pequeño problema que en este micro no se como hacerle, necesito que me indique la temp en la LCD con decimales solo me marca números enteros. a continuacion les muestro el codigo:
    Hola,

    Yo hice algo como lo que tratas de hacer, pero con un 16f88. Como dice Mario, en basic es muy facil el uso de los decimales, simplemente utilizando variables del tipo Float. Este termometro fue realizado en Basic Proton y me tomo solo unos 10 minutos, en hacerlo. Cada quien programa como quiera, pero utilizando Basic mas todo lo que puedas saber de ASM, podras crear muchos programas importantes.

    Dejo el codigo de ejemplo, por si a alguien le pueda servir.

    Código:
    '****************************************************************
    '* Name : Termometro Universal.BAS *
    '* Author : www.sharatronica.com *
    '* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
    '* : All Rights Reserved *
    '* Date : 23/07/2012 *
    '* Version : 1.0 *
    '* Notes : *
    '* : *
    '****************************************************************
    Device = 16F88 ' Pic a utilizar
    XTAL = 4 ' valor del oscilador
    TRISA = %00011111 'pines de entrada en puerto A
    TRISB = %00000000 'pines de salida en puerto B
    LCD_DTPIN = PORTB.4 'Configuracion del LCD
    LCD_RSPIN = PORTB.2
    LCD_ENPIN = PORTB.3
    LCD_INTERFACE = 4
    LCD_LINES = 2
    LCD_TYPE = 0
    Dim VAR1 As Word 'Variables utilizadas
    Dim TEMP As Float
    Dim FAREN As Float
    Dim KELVIN As Float
    Dim LEER As Byte
    Symbol CGRAM = $64
    Print $FE,$40,$06,$09,$09,$06,$00,$00,$00,$00
    DelayMS 150 'retardo para encender el display
    Cls
    TEMP = 0 ' valores iniciales
    LEER = 0 
    Low PORTB
    Main:
    ADIN_RES = 10 'configuracion del ADC
    ADIN_TAD = FRC
    ADIN_STIME = 50
    ANSEL = %00000001
    ADCON1 = %10100000
    LAZO: For LEER = 0 To 5 Step 1
    DelayMS 100
    Next 
    VAR1 = ADIn 0 ' para leer el ADC
    TEMP = VAR1 / 409.6
    TEMP = TEMP * 100
    FAREN = TEMP * 1.8 + 32
    KELVIN = TEMP + 273.15
    Print At 1,1,"TEMP ="," ",DEC1,TEMP,0,"C"," " 
    Print At 2,1,DEC1,FAREN,0,"F"," ",DEC1,KELVIN,0,"K"," " 'y minimo
    GoTo LAZO 'volver a leer
    
    End 'fin

    ... y una imagen de como se ve en el display



    Saludos!.
    www.sharatronica.com (No soy inteligente, simplemente soy curioso!! (Albert Einstein)

  12. Los siguientes 3 usuarios agradecieron a eduardo echeverry rodas por este post:

    Alde (28/08/2012), Guerra (25/08/2012), Mario (24/08/2012)

Página 1 de 3 123 ÚltimoÚltimo

Temas similares

  1. Entrenadora NeoTeo PIC18F2550
    Por Maxjmp en el foro Electrónica Digital
    Respuestas: 50
    Último mensaje: 11/03/2013, 21:25
  2. Conversor AD, PWM, LCD, motor DC y pic18F2550
    Por Zerg en el foro Electrónica Digital
    Respuestas: 14
    Último mensaje: 13/05/2012, 06:26
  3. Como imprimir los circuitos de Neoteo
    Por eduardo echeverry rodas en el foro Electrónica
    Respuestas: 3
    Último mensaje: 23/02/2012, 22:11
  4. Pic18f2550
    Por 3djolr en el foro Electrónica Digital
    Respuestas: 10
    Último mensaje: 07/12/2011, 06:49
  5. RS232 con PIC18F2550 con Proton
    Por Yesbond en el foro Electrónica Digital
    Respuestas: 0
    Último mensaje: 10/12/2010, 06:55

Los visitantes encuentran esta página buscando por:

modulo pwm con pic 18f2550

instruccion para convertir entero a string en el pic18f2550

sensor de temperatura lm35 codigo para xc8 programa en c

lcd

ejemplos de programa con pic 18f2550 lcd lm35temperatura lcd con decimasimprimir numeros en lcdcomoimprimir una entero en un lcd en picchello world con 18f2550 y ccstermometro digital pic 18f2550 y lm35 y lcdenviar numeros completos a lcd pic assemblerlcd pic18f2550 ccslm35 con pic 18f2550programa sensor temperatura lm35 en pic con 18f2550cuales son pines del modulo pwm pi18f2550CONFIG para el pi18f2550sensor de temperatura lm35 con pic 18f2550 ...pic18F2550como desplegar el valor de la temperatura en el lcd con un pic 18f2550como mostrar array en c en un lcdcomo imprimir en pic lcdmodulo pic18f2550 adlcd pic18f2550numeros flotantes en c displaycodigo hola mundo en ccs para 18f2550 lcd

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37