DTForuM

Noticias:

  • ..:: D T F o r u M ::.. - Comunidad Técnica -
  • CAR STEREO UNLOCK CODES --> Ahora solo Accesible para Miembros Premium

Noticias

CAR STEREO UNLOCK CODES --> Ahora solo Accesible para Miembros Premium

Premium Membership

Si abona su suscripción

con PAYPAL

solo costará

U$D 18 POR AÑO

Pague con Paypal o con Tarjeta de Crédito de forma SEGURA!

Nota: Si Ud. anula, elimina o desactiva la suscripción, perderá su calidad de Miembro Premium.

¿Qué es PayPal?

SUSCRÍBASE YA !

Otras formas de pago:

Donar + PREMIUM

Conviertase en MIEMBRO PREMIUM y acceda a más de 10 TeraBytes de información, de forma ilimitada.


No cobramos los archivos ni el material que los usuarios suben, solo les pedimos que cada uno pague por el ancho de banda que consume, ya que cada vez es más costoso el bandwidth y no podemos pagar lo que los usuarios descargan sin ningún tipo de control.

Bienvenido(a), Visitante. Por favor, ingresa o regístrate. ¿Perdiste tu email de activación?
abril 26, 2019, 11:52:24 am

Ingresar con nombre de usuario, contraseña y duración de la sesión

AllDataSheets

Buscar Datasheet

CuentaDigital

Web Amiga

DT-PhoneS

SITEMAP

-----------


Clase Nro 8 Curso C para PICs

Visitante · 16484

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

hector27

  • Visitante
on: julio 11, 2009, 11:35:50 am
En esta clase veremos el uso del ADC
Adjunto el TP34


Desconectado tachunda

  • Miembro PREMIUM
  • *
    • Mensajes: 228
    • ACTIVIDAD:
      0%
    • DT$ 242
Respuesta #1 on: julio 12, 2009, 22:20:23 pm
Hola compañero, estoi siguiendo el curso, a mi ritmo, pero lo sigo :D
Te felicito por tremenda iniciativa, UN SALUDO.
PD: Ye te preguntare alguna duda que tengo. ::)


hector27

  • Visitante
Respuesta #2 on: julio 12, 2009, 22:36:34 pm
La primera funcion que debemos usar para el ADC es la que lo inicializa. Para nuestro PIC18F2550 es:

void OpenADC( unsigned char config,
              unsigned char config2,
              unsigned char portconfig)
{
    ADCON0 = 0;
    ADCON2 = 0;

    ADCON0 = (config2 >> 1) & 0b00111100;   // GET CHANNELS
    ADCON1 = portconfig |                   // GET CONFIG
            ((config2 << 4) & 0b00110000); //GET  Vref
    ADCON2 = (config & 0b10000000)   |   // RESULT
             ((config >> 4) & 0b00000111) |   // CONV CLK
             ((config << 2) & 0b00111000);   // ACQ TIME

    if( config2 & 0b10000000 )         // ADC INT.
    {
      PIR1bits.ADIF = 0;
      PIE1bits.ADIE = 1;
      INTCONbits.PEIE = 1;
    }
    ADCON0bits.ADON = 1;
}

Como podemos observar recibe tres variables:
config,
config2,
portconfig

La primera actua sobre el registro ADCON2, y con ello definimos la velocidad del ADC, si el resultado esta "justificado" a la derecha o izquierda y el retardo.
Nosotros le ingresamos un and de tres constantes definidas en adc.h
ADC_FOSC_32 &ADC_RIGHT_JUST &ADC_12_TAD

Y con ello indicamos que la velocidad esta definida por un cuarto de la frecuencia del reloj del PIC dividido 32, luego definimos justificacion a la derecha, lo cual significa que los 10 bits del resultado del ADC se distribuyen de la siguiente manera: los 8 mas significativos el el registro ADRESH y los 2 menos significativos en los bits 7 y6 del registro ADRESL; y finalmente definimos el retardo para estabilizar la señal de entrada al ADC en 12 periodos de reloj.

La segunda varible actua sobre los registros ADCON0, PIE1, PIR1 e INTCON0 y nosotros le ingresamos un AND de 4 constantes definidas el adc.h:
ADC_CH1 &ADC_VREFPLUS_VDD &ADC_VREFMINUS_VSS &ADC_INT_OFF

Con la primer constante definimos el canal 1 (RA1 es decir terminal 3 del PIC), con la segunda definimos que el polo positivo de la tension de referencia del ADC la tomamos de VDD, es decir los 5V, con la tercera constate definimos que el terminal negativo de la referencia del adc es masa y con la cuarta constante definimos que no usamos la interrupcion del ADC.

Por ultimo la tercer variable define que entradas las usamos como analogicas y cuales digitales, segun esta tabla:

ADC_0ANA        All digital
ADC_1ANA        analog:AN0                    
ADC_2ANA        analog:AN0-AN1            
ADC_3ANA        analog:AN0-AN2            
ADC_4ANA        analog:AN0-AN3            
ADC_5ANA        analog:AN0-AN4            
ADC_6ANA        analog:AN0-AN5            
ADC_7ANA        analog:AN0-AN6            
ADC_8ANA        analog:AN0-AN7            
ADC_9ANA        analog:AN0-AN8                        
ADC_10ANA      analog:AN0-AN9                        
ADC_11ANA     analog:AN0-AN10                      
ADC_12ANA     analog:AN0-AN11

Nosotros deberiamos haber usado ADC_2ANA, pues usamos el AN1, pero puse otro valor, que no es correcto, pues pone el puerto A con mas entradas analogicas, pero como no las usamos funcionó igualmente.



hector27

  • Visitante
Respuesta #3 on: julio 12, 2009, 22:38:30 pm
Hola compañero, estoi siguiendo el curso, a mi ritmo, pero lo sigo
Te felicito por tremenda iniciativa, UN SALUDO.
PD: Ye te preguntare alguna duda que tengo.


Gracias, me alegra que participes del curso.
Saludos!
Héctor


hector27

  • Visitante
Respuesta #4 on: julio 13, 2009, 20:40:16 pm
La siguiente funcion usada es:

void SetChanADC(unsigned char channel)
{

  ADCON0 = ((channel >> 1) & 0b00111100) |
           (ADCON0 & 0b11000011);

}

Que nos permite elegir por que canal se va a realizar la medicion.
En nuestro caso en canal 1 (RA1), pero aunque esta puesto es innecesario en nuestro caso, ya que usamos un sólo canal y por lo tanto no es necesario cambiarlo, y con la funcion anterior ya lo habiamos ajustado a canal 1.
La funcion trabaja sobre el registro ADCON0.




hector27

  • Visitante
Respuesta #5 on: julio 15, 2009, 20:02:20 pm
La funcion que da comienzo a la conversion del ADC es muy simple, actua sobre el registro ADCON0, poniendo el 1 el bit 0.


void ConvertADC(void)
{
  ADCON0bits.GO = 1;
}


La funcion para saber si el adc termino la conversion, tambien es muy simple, lee el bit 0 del registro ADCON0

char BusyADC(void)
{
  return(ADCON0bits.GO);
}

La funcion para leer el resultado del ADC tambien es muy simple; el PIC coloca el resultado en dos registros, ADRESL, para los bits menos significativos y ADRESH para los bits mas significativos, la funcion multiplica por 256, desplazando 8 bits a la izquierda el registro ADRESH y lo suma al registro  ADRESL, devolviendo ese resultado como un entero.

int ReadADC(void)
{
  return (((unsigned int)ADRESH)<<8)|(ADRESL);
}


Finalmente para pasar el entero a ASCII usamos la funcion estándar itoa, como ya hemos visto.



Lucho2007

  • Visitante
Respuesta #6 on: agosto 18, 2009, 13:27:23 pm
Alli va el video del TP34; el ADC esta claro, esta semana voy a hacer una aplicacion, alguna duda que tenga la doy a conocer
saludos

 abrazoo



Lucho2007

  • Visitante
Respuesta #7 on: agosto 27, 2009, 13:38:00 pm
Por cuestiones de recarga de trabajo estuve alejado, pero ahora de nuevo, solicitando su apoyo.
Estoy haciendo una aplicacion de ADC y me surgio una duda, necesito hacer un calculo matematico ejm:

A=(17 x 10)/25   ¿ en C solo tengo que copiar la expresion matematica tal com la menciono y ya el compilador se encarga de arreglarlo o yo tengo que hacer la funcion que multiplique y luego divida tal vez con desplazamientos de bits a la derecha o izquierda, tal como se hacia en assembler.
Tambien queri saber si hay alguna manera de identificar el residuo de una division y trabajar con ese

cordial saludo


hector27

  • Visitante
Respuesta #8 on: agosto 27, 2009, 16:26:41 pm
Es tal cual lo escribistes, pero el simbolo de multiplicacion es el asterisco:
A=(17 * 10)/25 ;
Y no olvides el punto y coma final.

Conviene que las variables sean del mismo tipo, la lectura del ADC será un entero, pero las operaciones, en general convienen en coma flotante, si es asi, tienes que pasar a flotante la lectura del ADC. Supon que tienes que multiplicar la lectura por un factor, y tienes la lectura del ADC en una variable entera, y el resultado en una varible flotante, deberias hacer algo como:
Resultado= (float)LecturaADC*1.16874;

Saludos!
Héctor


Lucho2007

  • Visitante
Respuesta #9 on: agosto 27, 2009, 19:45:08 pm
Gracias Hector, se facilita bastante el trabajo en C, sospechaba que tenia que hacer un "casting" en esa operacion.
Una pregunta, cuales son los limites de las operaciones matematicas que puedo hacer?,; me refiero a si puedo hacer potenciacion, radicacion, funciones trigonometricas, etc.

Saludos


hector27

  • Visitante
Respuesta #10 on: agosto 27, 2009, 19:56:31 pm
Con las librerias estandar puedes hacer las operaciones básicas, para lo otro tienes que incluir math.h que es estádar ANSI de C.
Esta en el MPLAB y aqui lo incluyo para que la veas.
Potenciacion es esta funcion:
float pow (auto float x, auto float y);
Radicacion es esta funcion:
float sqrt (auto float x);
Arco seno:
float asin (auto float x);
Arco coseno
float acos (auto float x);
Arco tangente
float atan (auto float x);
Seno:
float sin (auto float x);
Coseno:
float cos (auto float x);
tangente:
float tan (auto float x);
tambien están las hiperbólicas:
float sinh (auto float x);
float cosh (auto float x);
float tanh (auto float x);
Y demas.

/* $Id: math.h,v 1.4 2006/05/09 22:30:05 nairnj Exp $ */
#ifndef __MATH_H
#define __MATH_H

typedef float float_t;
typedef float double_t;

#define HUGE_VAL 6.3e38
#define HUGE_VALL 6.3e38
#define HUGE_VALF 6.3e38

float fabs (auto float x);
float ldexp (auto float x, auto int n);
float exp (auto float f);
float sqrt (auto float x);
float asin (auto float x);
float acos (auto float x);
float atan2 (auto float y, auto float x);
float atan (auto float x);
float sin (auto float x);
float cos (auto float x);
float tan (auto float x);
float sinh (auto float x);
float cosh (auto float x);
float tanh (auto float x);
float frexp (auto float x, auto int *pexp);
float log10 (auto float x);
float log (auto float x);
float pow (auto float x, auto float y);
float ceil (auto float x);
float floor (auto float x);
float modf (auto float x, auto float *ipart);
float fmod (auto float x, auto float y);

float mchptoieee (auto unsigned long v);
unsigned long ieeetomchp (auto float v);

#endif


Lucho2007

  • Visitante
Respuesta #11 on: agosto 28, 2009, 23:52:57 pm
Gracias Hector por la informacion. Estoy haciendo una aplicacion con ADC y el LCD. Lo que he hecho es abrir el TP34 y chancarlo con mi programa que estoy haciendo, pero no se que cosa he hecho mal, que no me quiere compilar, me sale ERROR. Segun lo veo mi codigo esta bien y debe funcionar la primera parte .No se que cosa he hecho mal, siempre hacia asi y no tenia problemas. Queria por favor Hector, que me expliques cual es la manera correcta de hacer un nuevo proyecto, sin configurar todos esas opciones que se hicieron al inicio( me refiero a las opciones del MPLAB)  ; lo explicaste muy superficialmente en su momento pero la verdad que no lo entendi bien.

El mensaje que me sale es:
C:\DESARRO\curso\clase5\TEMPER1\tp34.c:136:Error: syntax error

Y si me explicas como abrir un proyecto nuevo ; ¿podre copiar mi codigo y pegarlo en el nuevo proyecto, colocando tambien todos los archivos fuente, archivos header? ; ya que mi codigo es algo largo.

Cordial saludo
LUIS


 abrazoo


hector27

  • Visitante
Respuesta #12 on: agosto 29, 2009, 14:13:45 pm
Para crear un nuevo proyecto no hay mas que seguir los pasos que expliqué en su oportunidad; y tambien comenté que el MPLAB es bastante perverso con la definicion de cuales son las carpetas de trabajo, por lo tanto sugerí siempre chequear que sean correctas.
El error que aparece es de sintaxis en la linea 136, pero el TP34.c que tengo yo tiene menos lineas que 134.
Si deseas que lo revise, sube el TP34 modificado que da error al  foro.
Saludos!
Héctor


Lucho2007

  • Visitante
Respuesta #13 on: agosto 29, 2009, 14:59:56 pm
Gracias, ya pude solucionar el problema, volvi a hacer el procedimiento que siempre hacia y ahora ya me compila.
Debi haber cometido un error la primera vez
Estoy tratando de mostrar por el LCD    °C , grados centigrados, pero como no figura con codigo ascci para el LCD el ° tuve que crearlo con caracter especial lo cual me salio, pero ahora al tratar de imprimir la C a su lado se me hace un problema ya que es un solo caracter no un String. He intentado de esta manera pero me imprime el " & "


#define STARTUP_MSG " INDICADOR"
#define STARTUP_MSG2 "DE TEMPERATURA"
#define LC "C"
const rom char letraC = LC;
const rom char StartupMsg[16] = STARTUP_MSG;
const rom char StartupMsg2[16] = STARTUP_MSG2;
const rom char CaracterEspecial[8] = { 0xEC,0xF2,0xF2,0xEC,0xE0,0xE0,0xE0,0xE0 };
void ponergC (void);



void main (void)
{

ponergC();


/=========================================
//Funcion pone °C
//=========================================

void ponergC (void)
{
SetCGRamAddr(0x00);
putrxXLCD(CaracterEspecial);
SetDDRamAddr(0x4E);  //cursor 2° linea, 14° caracter
WriteDataXLCD(0x00);  //imprimo el caracter especial
SetDDRamAddr(0x4F);
putsXLCD(letraC);  //imprimo C
return;
}


saludos


hector27

  • Visitante
Respuesta #14 on: agosto 29, 2009, 16:58:36 pm
El problema está en que despues del comando:
putrxXLCD(CaracterEspecial);
tienes que enviar el bitmap con el caracter especial, y asi, si lo creas por primera vez, será el caracter 0x00.
Luego imprimes el caracter 0x00 y listo.
En cuanto pueda haré ese ejercicio en el proximo TP.
Saludos!
Héctor


hector27

  • Visitante
Respuesta #15 on: agosto 29, 2009, 22:12:32 pm
Rectifico, lo que hicistes aparenta estar bien, revisare con mas detalle.
A priori encuentro que no cerrastes con una llave la funcion main.
Y tampoco inicializastes el display con:
OpenXLCD( FOUR_BIT&LINES_5X7 );
En el TP32 utilizamos un caracter especial.
Saludos!
Héctor


Lucho2007

  • Visitante
Respuesta #16 on: agosto 30, 2009, 20:39:03 pm
Gracias Hector por tu respuesta, si el codigo me parece que esta bien, y lo de las llaves y la inclusion de la inicializacion si la hice, creo que tengo un problema con mi quemador, les cuento. Ayer estuve tratando de hacer una parte de mi proyecto, lo que es la presentacion en el LCD de la indicacion de temperatura. Lo que hice fue hacer un contador desde 0.0 hasta 35.0 °C, con la presentacion del caracter especial °,la letra C, el punto decimal y los enteros y decimales, quise agarrar practica tambien con el manejo de LCD. Y bueno hice mi programa y notaba que luego de quemar el PIC con varios programas de prueba haciendo mejoras, a veces me funcionaba bien y a veces me salian codigos "basurita" en el display mezclado con algun caracter que si mande. Pense que era algun falso contacto en mi quemador, lo revise y no encontre nada anormal. Bueno hice una prueba con un codigo que programe, queme el PIC y no me funciono, volvi a quemar el PIC como tres veces e hiba probando, todos con el mismo hex, hasta que funciono tal como me esperaba, con cierto error que faltaba mejorar ya en el programa.

Parece que mi quemador tiene un problemita, yo uso un llamado ECLIPSE que lo encontre en la red, quisiera porfavor si alguien sabe de un quemador confiable por puerto USB y que funcione con WINDOWS VISTA para poder hacerlo.  En el foro vi uno que es el GTP-USB y mencionan un  link para descargarlo, pero parece que ya vencio su permanencia.

Aqui les dejo mi codigo para ver si se puede hacer alguna mejora

  #include "configuroPIC7.h"
#include "pwm_io.h"
#include <pwm.h>
//guardo las cadenas de texto en la ROM
#define STARTUP_MSG "  Temperatura  "
#define STARTUP_MSG2 "                "
#define LC "C       "
#define PUNTO_MSG "  .           "
const rom char punto[14] = PUNTO_MSG;
const rom char StartupMsg[16] = STARTUP_MSG;
const rom char StartupMsg2[16] = STARTUP_MSG2;
const rom char letraC[9]= LC;
const rom char CaracterEspecial[8] = { 0xEC,0xF2,0xF2,0xEC,0xE0,0xE0,0xE0,0xE0 };
void ponergC (void);
//funcion principal
void main(void)
{
int Dec, Ent  ;
//puntero para las cadenas de texto en RAM
char imp2[2]="  ";
char imp[1]=" ";
int i;
TRISB = 0x00;
TRISA = 0b00000111;
TRISC = 0b10000000;
CMCON = 0b00000111;
CVRCON= 0b00000000;
T0CON=0b00001000;
INTCON=   0b01100000;
RCON=RCON&0b01111111; //BCF          RCON, IPEN,A
TXSTA=TXSTA&0b10101011;
TXSTA=TXSTA|0b10100000;
SPBRG=17;//baud rate=9600
RCSTA=RCSTA&0b10111111;
RCSTA=RCSTA|0b10010000;
ADCON0= 0b00000100;  //RA1
ADCON1= 0b00001111;
T1CON=0b01000110;
T2CON=0b00000111;
INTCONbits.GIE=0;
//inicializo el display para 4 bits, y 5x7 pixels
OpenXLCD( FOUR_BIT&LINES_5X7 );
DelayMs(50);


//pongo el cursor en la segunda linea, primer caracter.
SetDDRamAddr(0x40);
//envio la cadena en ROM "DTForum" al display
putrxXLCD( StartupMsg2 );
//retardo para ver la presentacion



//pongo el cursor en la primer linea, primer caracter.
SetDDRamAddr(0x00);
//envio la cadena en ROM " TEMPERATURA " al display
putrxXLCD( StartupMsg );

Ent = 0;
Dec = 0;
SetDDRamAddr(0x42);
putrxXLCD(punto);

SetCGRamAddr(0x00);
putrxXLCD(CaracterEspecial);
SetDDRamAddr(0x46);  //cursor 2° linea
WriteDataXLCD(0x00);  //imprimo el caracter especial
SetDDRamAddr(0x47);
putrxXLCD(letraC);



while(Ent < 35)
{itoa(Ent,imp2);
if (Ent < 10)
{
imp2[1]=' ';
}
SetDDRamAddr(0x43);
putsXLCD(imp2);
while(Dec < 10)
{
itoa(Dec,imp);
SetDDRamAddr(0x45);
putsXLCD(imp);
DelayS();

Dec = Dec + 1;
}
Dec = 0;
Ent = Ent + 1;
}

}


cordiales saludos  abrazoo


Lucho2007

  • Visitante
Respuesta #17 on: agosto 30, 2009, 20:42:29 pm
En el programa hay algunos comentarios que no concuerdan ya que chanque un programa y se me olvido borrarlos

Luis


hector27

  • Visitante
Respuesta #18 on: agosto 30, 2009, 22:03:51 pm
Compilé tu programa y me dió tres advertencias (warnings) de tamaños mas grande que la definicion de 3  arrays en los mensajes, los corregí y anda bien.
Ví que los dos digitos estaban separados por un espacio y los junte.
adjunto el proyecto (hay archivos de mas, porque en un primer momento crei que usabas el adc y no el pwm).
Saludos!
Héctor


Lucho2007

  • Visitante
Respuesta #19 on: agosto 31, 2009, 12:11:31 pm
Los dos digitos los separe por un espacio para colocar en ese lugar el punto decimal.
Un favor Hector, podrias probar el pic con el programa, en el "entrenador" donde hacemos los TPs, para ver que funcione bien en el LCD y descartar definitivamente mi quemador.

Gracias


hector27

  • Visitante
Respuesta #20 on: agosto 31, 2009, 18:28:59 pm
Eso es lo que hice ayer !!!
Por favor, en mi mensaje anterior subí tu programa, con muy pocas modificaciones, el cual compilé y probé en la plaxa, con funcionamiento correcto.
Saludos!
Héctor


Lucho2007

  • Visitante
Respuesta #21 on: septiembre 01, 2009, 03:15:24 am
Gracias Hector ; al parecer  el problema de la basurilla que se metia al LCD, era que al compilar me salian varias adevertencias o Warning, pero como no me salia error y terminaba de compilar, probaba con el Hex generado. Arregle algunos programas que probe y ya funcionan bien. Al parecer el programador esta bueno. En todo caso esta en observacion.
Ahora tengo un problemita, como habran visto quiero representar en el display °C (grados centigrados) desde 0.0 hasta 35.0, el problema que tengo es que no puedo representar 0.0 sino me sale 0 .0, es decir me sale un espacio vacio despues del punto decimal y cuando llega a 10.0 recien se completa.
Alguien sabe como mejorar esa presentacion

Gracias


hector27

  • Visitante
Respuesta #22 on: septiembre 01, 2009, 07:58:52 am
Si no subes el programa que haz hecho, con las modificaciones, va a ser dificil!  Jejeje Jejeje Jejeje Jejeje Jejeje Jejeje

Saludos!
Héctor


Lucho2007

  • Visitante
Respuesta #23 on: septiembre 01, 2009, 19:47:45 pm
Alli va el codigo

#include "configuroPIC7.h"
#include "pwm_io.h"
#include <pwm.h>
//guardo las cadenas de texto en la ROM
#define STARTUP_MSG "  Temperatura  "
#define STARTUP_MSG2 "               "
#define LC "C       "
#define PUNTO_MSG "  .          "
const rom char punto[14] = PUNTO_MSG;
const rom char StartupMsg[16] = STARTUP_MSG;
const rom char StartupMsg2[16] = STARTUP_MSG2;
const rom char letraC[9]= LC;
const rom char CaracterEspecial[8] = { 0xEC,0xF2,0xF2,0xEC,0xE0,0xE0,0xE0,0xE0 };
void ponergC (void);
//funcion principal
void main(void)
{
int Dec, Ent  ;
//puntero para las cadenas de texto en RAM
char imp2[2]=" ";
char imp[1]="";
char CAR;
int i;
TRISB = 0x00;
TRISA = 0b00000111;
TRISC = 0b10000000;
CMCON = 0b00000111;
CVRCON= 0b00000000;
T0CON=0b00001000;
INTCON=   0b01100000;
RCON=RCON&0b01111111; //BCF          RCON, IPEN,A
TXSTA=TXSTA&0b10101011;
TXSTA=TXSTA|0b10100000;
SPBRG=17;//baud rate=9600
RCSTA=RCSTA&0b10111111;
RCSTA=RCSTA|0b10010000;
ADCON0= 0b00000100;  //RA1
ADCON1= 0b00001111;
T1CON=0b01000110;
T2CON=0b00000111;
INTCONbits.GIE=0;
//inicializo el display para 4 bits, y 5x7 pixels
OpenXLCD( FOUR_BIT&LINES_5X7 );
DelayMs(50);


//pongo el cursor en la segunda linea, primer caracter.
SetDDRamAddr(0x40);
//limpio pantalla
putrxXLCD( StartupMsg2 );
//retardo para ver la presentacion



//pongo el cursor en la primer linea, primer caracter.
SetDDRamAddr(0x00);
//envio la cadena en ROM " TEMPERATURA " al display
putrxXLCD( StartupMsg );
while(1)
{
Ent = 0;//inicializo los enteros a 0
Dec = 0;//inicializo los decimales a 0
SetDDRamAddr(0x42);
putrxXLCD(punto);//imprimo el punto

SetCGRamAddr(0x00);
putrxXLCD(CaracterEspecial);
SetDDRamAddr(0x46);  //cursor 2° linea, 14° caracter
WriteDataXLCD(0x00);  //imprimo el caracter especial
SetDDRamAddr(0x47);
putrxXLCD(letraC);//imprimo la letra C



while(Ent < 35)//Hace una cuenta ascendente 0.0 a 35.0
{
itoa(Ent,imp2);//convierto el entero a ASSCI y lo coloco en imp2
if (Ent < 10)//si el entero solo tiene un digito
{
CAR = imp2[1];       //Intercambio la posicion de los
imp2[1] = imp2[2];   //los caracteres-uno de ellos es vacio
imp2[2] = CAR;       //Usando CAR
SetDDRamAddr(0x42); 
putsXLCD(imp2);  //imprimo el caracter
}
if (Ent > 9)//si Entero tiene 2 digitos
{
SetDDRamAddr(0x42);//imprimirlo tal como es
putsXLCD(imp2);
}
while(Dec < 10)// haciendo la cuenta e imprimiendo los decimales
{
itoa(Dec,imp);//con lo cual no hay problema
SetDDRamAddr(0x45);
putsXLCD(imp);
DelayS();

Dec = Dec + 1;
}
Dec = 0;
Ent = Ent + 1;
}

}

}

 abrazoo


Que opinan?
gracias


hector27

  • Visitante
Respuesta #24 on: septiembre 01, 2009, 20:59:02 pm
La funcion itoa justifica el texto a la izquierda y no a la derecha, por lo cual siembre se vuelve un poco engorroso querer poner un campo fijo en el display, sumado a eso habias usado contadores separados para decimales y entero, que lo hace mas complejo.
Lo simplifique poniendo un solo contador hasta 350 (será 35.0) y la impresion de los caracteres lo hago uno por uno con la funcion putcXLCD('.');
Ademas para corregir la justificacion a la izquirda de itoa, separo los tres casos posibles (un digito, 2 digitos y tres digitos)
Lo probé y funciona.
Saludos!
Héctor


#include "configuroPIC7.h"
#include "pwm_io.h"
#include <pwm.h>
//guardo las cadenas de texto en la ROM
#define STARTUP_MSG "  Temperatura  "
#define STARTUP_MSG2 "               "
#define LC "C       "
#define PUNTO_MSG "  .          "
const rom char punto[14] = PUNTO_MSG;
const rom char StartupMsg[16] = STARTUP_MSG;
const rom char StartupMsg2[16] = STARTUP_MSG2;
const rom char letraC[9]= LC;
const rom char CaracterEspecial[8] = { 0xEC,0xF2,0xF2,0xEC,0xE0,0xE0,0xE0,0xE0 };
void ponergC (void);
//funcion principal
void main(void)
{
int Ent  ;
//puntero para las cadenas de texto en RAM
char imp2[4]="   ";
int i;
TRISB = 0x00;
TRISA = 0b00000111;
TRISC = 0b10000000;
CMCON = 0b00000111;
CVRCON= 0b00000000;
T0CON=0b00001000;
INTCON=   0b01100000;
RCON=RCON&0b01111111; //BCF          RCON, IPEN,A
TXSTA=TXSTA&0b10101011;
TXSTA=TXSTA|0b10100000;
SPBRG=17;//baud rate=9600
RCSTA=RCSTA&0b10111111;
RCSTA=RCSTA|0b10010000;
ADCON0= 0b00000100;  //RA1
ADCON1= 0b00001111;
T1CON=0b01000110;
T2CON=0b00000111;
INTCONbits.GIE=0;
//inicializo el display para 4 bits, y 5x7 pixels
OpenXLCD( FOUR_BIT&LINES_5X7 );
DelayMs(50);


//pongo el cursor en la segunda linea, primer caracter.
SetDDRamAddr(0x40);
//limpio pantalla
putrxXLCD( StartupMsg2 );
//retardo para ver la presentacion



//pongo el cursor en la primer linea, primer caracter.
SetDDRamAddr(0x00);
//envio la cadena en ROM " TEMPERATURA " al display
putrxXLCD( StartupMsg );

while(1)
{
Ent = 0;//inicializo los enteros a 0
//SetDDRamAddr(0x42);
//putrxXLCD(punto);//imprimo el punto

SetCGRamAddr(0x00);
putrxXLCD(CaracterEspecial);
SetDDRamAddr(0x46);  //cursor 2° linea, 14° caracter
WriteDataXLCD(0x00);  //imprimo el caracter especial
SetDDRamAddr(0x47);
putrxXLCD(letraC);//imprimo la letra C



while(Ent < 350)//Hace una cuenta ascendente 0.0 a 35.0
{
itoa(Ent,imp2);//convierto el entero a ASCII y lo coloco en imp2
SetDDRamAddr(0x42); 
if(Ent<10){
putcXLCD(' ');
putcXLCD('0');
putcXLCD('.');
putcXLCD(imp2[0]);
}
if(Ent>9){
if(Ent<100){
putcXLCD(' ');
putcXLCD(imp2[0]);
putcXLCD('.');
putcXLCD(imp2[1]);
}
}

if(Ent>99){
putcXLCD(imp2[0]);
putcXLCD(imp2[1]);
putcXLCD('.');
putcXLCD(imp2[2]);
}


DelayS4();
Ent = Ent + 1;
}
}
}


Lucho2007

  • Visitante
Respuesta #25 on: septiembre 02, 2009, 02:50:07 am
Gracias Hector, si lo probe y funciona ok.  En mis intentos por solucionar el problema pense en algo parecido, pero al momento de hacer mi codigo y mandaba imprimir por ejemplo : putsXLCD(imp2[1]) el compillador me mandaba error.
Ahora veo que era necesario usar otra funcion: putcXLCD,, una mas para el Libro
 graciassss

saludos
Luis


Desconectado josebiafore

  • Miembro PREMIUM
  • *
    • Mensajes: 210
    • ACTIVIDAD:
      0%
    • DT$ 111
  • Juntos todo lo podremos
Respuesta #26 on: septiembre 07, 2009, 19:22:05 pm
Colega: boticario-TUX

Me podrías informar si tenes pasado a pdf algunas clases mas, yo tengo la 1 y 2. Me interesan en ese formato para poderlas imprimir y encuadernar y poder leer en el bondi, ya que viajo 4 horas por dia para ir a mi trabajo y es mucho tiempo para desperdiciarlo.
En parte lo aproveche, gracias a ese tiempo me recibí de ingeniero en un año menos, ja ja ja.

José


José A.Biafore


hector27

  • Visitante
Respuesta #27 on: septiembre 07, 2009, 20:20:13 pm
Lamentablemente aún no, y no creo que los tenga hasta finalizar el curso.
Saludos!
Héctor


Tags:
 

Sitemap 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74