Autor Tema: Ejemplitos en C: Mis Funciones favoritas en CCS C  (Leído 63416 veces)

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

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #45 en: 13 de Julio de 2006, 10:42:36 »
Yo me hice una libreria para la lectura y escritura de la EEPROM aprovechandome de los ejemplos que da el CCS.
Lo mejorcito es que comprueba si el valor a escribir es igual al que esta escrito, evitando consumir las operaciones de escritura sin sentido de hacerlo.
La adjunto por si les sirve a alguno. :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #46 en: 15 de Enero de 2007, 12:08:26 »
En que tipo de display piensas mostrar este valor?
Si es en LCD no necesitas hacer la conversion extraña que haces, ya que CCS permite mostrar un valor float o entero doble con los decimales que necesites... :-) :-) :-)
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #47 en: 15 de Enero de 2007, 14:31:49 »
Hola Amigos.

Doctor , le comento mi caso.  :D

Estoy intentando convertir un numero float a BCD para poderlo mostrar en display.

A mi parecer la mejor manera de hacerlo es con la funcion sprintf

Sigo los pasos de nuestro amigo RedPic


char miascii = 'K';
char mistring[3];
mistring = sprintf("%H",miascii);


aproposito me saca un error elcompilador y mirando la ayuda de CCS, el tiene otra forma de usar el sprintf.

char mystring[20];

long mylong;

 

mylong=1234;

sprintf(mystring,"<%lu>",mylong);

// mystring now has:

//      < 1 2 3 4 > \0


Maestro RedPic,sera que tienes un error de escritura?, ¿o es que yo no la se utilizar?

Mi programa tiene lo siguiente:

float    lectura_ADC;
float    TEMPERATURA;
float    RESISTENCIA;



lectura_ADC=read_adc();
lectura_ADC=lectura_ADC*5;
lectura_ADC=lectura_ADC/1023;

for(i=0;i<=9;i++) temperatura_BCD=0;

sprintf(temperatura_BCD,"%f",lectura_ADC);
umil=temperatura_BCD[0];
centena=temperatura_BCD[1];
decena=temperatura_BCD[2];



Compila bien y todo, pero no funciona! :cry:

Mi pregunta es la siguiente:

En el vector en donde se guarda el resultado del sprintf, quedan numeros ascii o quedan ya en decimal?. Porque probe para ambos casos y no funciona.

Ustedes me recomiendan otra forma? Esta del sprintf si la puedo usar para esta tarea?.

Muchas Gracias.



Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #48 en: 15 de Enero de 2007, 15:15:29 »
Bueno, ya esta funcionando.

De esta forma fue en la que trabajo.

      lectura_ADC=read_adc();
      lectura_ADC=lectura_ADC*5;
      lectura_ADC=lectura_ADC/1023;
      sprintf(temperatura_BCD,"%2.2f",lectura_ADC);

      umil=ascci_dec(temperatura_BCD[0]);
      centena=ascci_dec(temperatura_BCD[1]);
      decena=ascci_dec(temperatura_BCD[3]);
      unidad=ascci_dec(temperatura_BCD[4]);


Bueno la conclucion es que en la variable temperatura_BCD quedan guardados los BCD pero en ascii.
Lo otro que me ayudo fue el truco de condicionar la funcion sprintf , indicandole que necesito 2 enteros y 2 decimales. es por ello que aparece %2.2f.

me explico con un ejemplo.
sea:
lectura_ADC un variable tipo float, con el valor de 12.1203

temperatura_BCD[5] un vector tipo char.

cuandose se ejecuta

sprintf(temperatura_BCD,"%2.2f",lectura_ADC);

Se obtiene :

temperatura_BCD[5]  = {'1','2','.','1','2'}




Lo que tengo ahora es el siguiente problema. Uso el PIC18F452. Tiene un cristal de32768hz.  Por hacer los procedimientos anteriores, el display Parapadea demasiado, tanto que se dificulta leerlo. ¿Hay alguna forma de elevar la velocidad de trabajo sin cambiar el cristal?

 
« Última modificación: 15 de Enero de 2007, 15:24:38 por PICmouse »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #49 en: 15 de Enero de 2007, 15:28:47 »
Bueno, ya esta funcionando.

De esta forma fue en la que trabajo.

      lectura_ADC=read_adc();
      lectura_ADC=lectura_ADC*5;
      lectura_ADC=lectura_ADC/1023;
      sprintf(temperatura_BCD,"%2.2f",lectura_ADC);

      umil=ascci_dec(temperatura_BCD[0]);
      centena=ascci_dec(temperatura_BCD[1]);
      decena=ascci_dec(temperatura_BCD[3]);
      unidad=ascci_dec(temperatura_BCD[4]);


Bueno laconclucion es que en la variable temperatura_BCD quedan guardados los BCD pero en ascii.

Lo que tengo ahora es el siguiente problema. Uso el PIC18F452. Tiene un cristal de32768hz.  Por hacer los procedimientos anteriores, el display Parapadea demasiado, tanto que se dificulta leerlo. ¿Hay alguna forma de elevar la velocidad de trabajo sin cambiar el cristal?

 

Bueno, por lo que veo utilizas displays de 7 segmentos, cosa que no habias aclarado.

Algunos consejos utiles

Donde pones:
Código: [Seleccionar]
lectura_ADC=read_adc();
      lectura_ADC=lectura_ADC*5;
      lectura_ADC=lectura_ADC/1023;

Ahorras algo de ROM, conviertes a float en un solo paso y ademas es mas legible esto:
Código: [Seleccionar]
float const resoluc=5.0/1023.0;

i=read_adc();
lectura_ADC=i*resoluc;

Para el parpadeo del display lo que creo que debes hacer es poner ese cristal en Tock1 (seguramente quieres temporizar bien o hacer funciones de reloj) y en su lugar poner un cristal de al menos 4 MHz, asi podras manejar bien los tiempos de muestreo de cada numero en los displays antes de rotarlos... :mrgreen: :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #50 en: 15 de Enero de 2007, 16:15:58 »
MGLSOFT  tienes razon, solo habia dicho que eran display, pero no 7 segmentos, son 4.Para la operacion matematica, tienes toda la razon, no tiene sentido que el Pic realice las operaciones matematicas que ya se sabe de antemano el resultado.

Bueno, respecto a cambiar el timer,pues lo que pasa es que ya el circuito imrpeso esta fabricado y no es posible cambiar ya nada. La solucion que encontre es cambiar de PIC por el 18F4520 que si tiene oscilador interno creo que de 4Mhz y escompatible pin a pin.

Gracias, y comentare resultados.


Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #51 en: 17 de Enero de 2007, 16:56:57 »
Hola Amigos. Aquí tengo una función que permite llevar un long a string pero en binario, tal vez pueda serles útil

Código: [Seleccionar]
void   long_to_strBIN(long   value){
int   i;
  for(i=0;i<16;i++){   // limpia el array
     cadena[i]='0';
   }
   for(i=0;i<16;i++){
      if(bit_test(value,i)){  // prueba cada bit del long
         cadena[15-i]='1';    // asigna el caracter "1" al array si el bit es uno
      }
      else{
         cadena[15-i]='0'; // asigna el caracter "0" al array si el bit es cero
      }
   }
}

un código ejemplo para usarlo:

Código: [Seleccionar]
#include <16f877.h> //archivo de cabecera

#fuses XT,NOWDT,NOPROTECT // el fuse que configuramos anteriormente (CORREGIDO)
#use delay(clock=4000000) // el clock que tendremos a la entrada del CPU

#define use_portb_lcd TRUE
#include <LCD.c>
char  cadena[16];  // usada dentro de long_a_binario.c
#include <long_a_binario.c>

void main(){
long  value;
set_tris_c(0x1);  //RC0<- entrada
lcd_init();       // inicia la LCD
 value = 0xffff;  // carga value con un long de 65535
   while(1){   //bucle eterno
      while(!input(PIN_C0)){ // pregunta por RC0
         long_to_strBIN(value); //convierte un LONG en un arrays de 16 caracteres
         delay_ms(10);
         printf(lcd_putc,"\f%s\n",cadena); //muestra en binario
         printf(lcd_putc,"%lu",value);    // muestra en decimal
         value--;                         //decrementa el long
         delay_ms(100);                   //retardo
      }
   }
}




la simulación en proteus:




Salu2
Pedro

y el adjunto:
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado walvarez

  • PIC10
  • *
  • Mensajes: 2
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #52 en: 20 de Enero de 2007, 13:52:26 »
no conozco nada sobre programacion en c y quiero aprender desde cero.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #54 en: 26 de Junio de 2011, 14:13:49 »
Hola, a raiz de pedir ayuda para un proyecto con el PIC18F4523, el cual no llego a buen puerto porque era para la empresa en que trabajo y a la hora de compensar el trabajo a quien lo iba a realizar, se echaron atras y todo quedo en nada. Como decia a raiz de eso y ademas que hacia tiempo que tenia ganas de ponerme a estudiar las distintas formas de programar los PIC's, me he decidido a dar un paso adelante. Con la ayuda de un colega del foro, que desde el principio me estuvo ayudando con el susodicho proyecto y que sigue ayudandome en este otro reto y la de todos ustedes, seguro que avanzare en el tema.
De momento ya estoy leyendo y preparandome para hacer algunas cosillas segun vaya entendiendo lo que estudio.
Por otro lado quiero aportar lo que si controlo, que es la electronica, si alguien necesita mi ayuda en ese campo y esta a mi alcance, no dudeis en os ayudare.

Saludos.

Desconectado jukaceledon

  • PIC10
  • *
  • Mensajes: 15
Re: RE: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #55 en: 17 de Julio de 2014, 22:16:21 »
Unirme a mis compañeros en las felicitaciones!y para mi vuesamerced RedPic, amigo, forero y maestro solo me queda decir que el titulo de ingeniero se te queda pequeño!!!

Cada dia me gusta mas este foro!tanto por la informacion que contiene como la gente que lo habita!


Suerte!!!<img   src="http://pics.miarroba.com/caretos/wink.gif" alt="Giño" title="Giño" />

hola estimado mi nombre Juan Carlos, en mis estudios debo ahcer un programa con pic c compiler, tiene los siguientes condiciones

1.- Debe trabajar con un dato decimal y otro entero
2.- se deben ver en un lcd
3.- Via un pulsador se debe aumentar o disminuir el decimal en fraccion de uno y en entero en 1 y verse en el lcd
4.- Se debe guardar en memoria ( el entero en entero y float en float)
5.- al reiniciar el pic los valores guardados en memoria se deben leer y ver en la lcd
6,. y asi sucesivamente

Espero me pueda ayudar

Juka 

Desconectado jukaceledon

  • PIC10
  • *
  • Mensajes: 15
Re: RE: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #56 en: 17 de Julio de 2014, 22:19:40 »
Unirme a mis compañeros en las felicitaciones!y para mi vuesamerced RedPic, amigo, forero y maestro solo me queda decir que el titulo de ingeniero se te queda pequeño!!!

Cada dia me gusta mas este foro!tanto por la informacion que contiene como la gente que lo habita!


Suerte!!!<img   src="http://pics.miarroba.com/caretos/wink.gif" alt="Giño" title="Giño" />

hola estimado mi nombre Juan Carlos, en mis estudios debo ahcer un programa con pic c compiler, tiene los siguientes condiciones

1.- Debe trabajar con un dato decimal y otro entero
2.- se deben ver en un lcd
3.- Via un pulsador se debe aumentar o disminuir el decimal en fraccion de uno y en entero en 1 y verse en el lcd
4.- Se debe guardar en memoria ( el entero en entero y float en float)
5.- al reiniciar el pic los valores guardados en memoria se deben leer y ver en la lcd
6,. y asi sucesivamente

Espero me pueda ayudar

Juka 


Se me olvido agragar lo que llevo, el entero esta bien lo hace pero en el float no me resulta


#include <16f877a.h>
#device  adc = 8 // ADC a 8 bits
#use     delay(crystal = 4MHz)
#include <lcd420.c>
#include <internal_eeprom.c>
#define pulsador pin_c0
#define reset pin_c1
void main (void)
{
int8 entero;
float decimal;
//leo las memorias
   entero = read_eeprom(0);
read_float_eeprom(02);
lcd_init();                   // Inicializar la pantalla.
    while (true)
   {
     
     if(input(pulsador))
     {
   
   entero=entero + 1.9;             // varia el valor.
   decimal=decimal + 1.1;           // Varia el valor.
          }
           
     if(input(reset))
     {
 
   lcd_init();
   entero=00;             //`pone a cero la cuenta.
   decimal=0;             // pone a cero la cuenta.
          }
     
lcd_gotoxy(1,1);
printf(lcd_putc,"ent=");// impr
lcd_gotoxy(8,1);
printf(lcd_putc,"dec=");//imprime tem actual
lcd_gotoxy(5,1);
printf(lcd_putc,"%d",entero);//
delay_ms(100);
lcd_gotoxy(13,1);
printf(lcd_putc,"%f",decimal);
delay_ms(100);
     
//aqui debo escribir en memoria

write_eeprom(0,entero);
delay_ms(10);         
write_float_eeprom(02,decimal);
delay_ms(10);
   }
}

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #57 en: 18 de Julio de 2014, 01:09:19 »
int8 entero;
float decimal;
//leo las memorias
   entero = read_eeprom(0);


pero no veo que decimal tenga asignado valor inicial. Eso hace que decimal arranque con un valor aleatorio que depende del valor de las posiciones de memoria asociadas a la variable.

Hacé

float decimal = 0.0;

Ninguna variable debería quedar con valor inicial desconocido.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything