TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: darck_khronos en 17 de Mayo de 2009, 23:36:57

Título: comparando puertos y enviando a rs232
Publicado por: darck_khronos en 17 de Mayo de 2009, 23:36:57
Tengo un problema, intento enviar datos por el puerto rs232 pero como podria hacer las comparaciones de los puertos y que estos mandaran datos al pic que tiene la lcd

este es mi diagrama

(http://img200.imageshack.us/img200/1314/proyecto2.png)

no doy como podria hacer la siguiente comparacion

Rb0 = 1  Envia Esta en 0 %
Rb0 = Rb1 = 1 Envia Esta en 10%
Rb0 = Rb1 = Rb2 = 1 Envia Esta en 20%
Rb0 = Rb1 = Rb2 = Rb3 = 1 Envia Esta en 30%
Asi hasta llegar a
rb0=rb1=rb2=rb3=rb4=rb5=rb6=rb7=ra0=ra1=ra2= Esta en 100%

Como podria generar ese codigo
Título: Re: comparando puertos y enviando a rs232
Publicado por: migsantiago en 18 de Mayo de 2009, 12:54:01
Pues es un selector de casos lo que necesitas:

Código: [Seleccionar]
switch(input_b())
{
 case 0b00000001:
  printf(); //llénalo con lo que necesitas
  break;
 case 0b00000011:
  printf
  break;

...

 case 0b11111111:
 printf()
 break;
}
Título: Re: comparando puertos y enviando a rs232
Publicado por: darck_khronos en 21 de Mayo de 2009, 14:00:33
aun aplicando el caso de arriba no comprendo por que me sale solo esto en la pantalla

cual puede ser el error

(http://img196.imageshack.us/img196/7885/sshot7.png)

este es el codigo de mi pic de envio

Código: [Seleccionar]
#include <18f2550.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use fast_io(b)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

void main(){
   do {
   switch(input_b())
      {
         case 0b00000001:
         printf("\r\n\10 lleno\r\n");
         break;
         case 0b00000011:
         printf("\r\n\20 lleno\r\n");
         break;
         case 0b00000111:
         printf("\r\n\30 lleno\r\n");
         break;
         case 0b00001111:
         printf("\r\n\40 lleno\r\n");
         break;
         case 0b00011111:
         printf("\r\n\50 lleno\r\n");
         break;
         case 0b00111111:
         printf("\r\n\60 lleno\r\n");;
         break;

      }
   
   } while (TRUE);


Título: Re: comparando puertos y enviando a rs232
Publicado por: migsantiago en 21 de Mayo de 2009, 14:28:59
Al usar #fast_io es tu responsabilidad configurar el tris del puerto b.

Al hacer input_b() puede que esté sacando datos de forma errónea y la lcd los malinterprete. Además, ni siquiera incluyes lcd.c en tu programa, de ahí que se complica más la cosa.
Título: Re: comparando puertos y enviando a rs232
Publicado por: MLO__ en 21 de Mayo de 2009, 16:37:39
Hola.

Porque no posteas el codigo del micro que presenta el problema???? El programa del micro emisor no te va a afectar la LCD  :D
Título: Re: comparando puertos y enviando a rs232
Publicado por: migsantiago en 21 de Mayo de 2009, 17:22:24
Sí es cierto no me fijé en que el programa no era el de la lcd  :D

Khronos, publica bien tus programas  :D
Título: Re: comparando puertos y enviando a rs232
Publicado por: darck_khronos en 21 de Mayo de 2009, 18:56:58
Ok ya tengo un avanze xD ya cambie el codigo aqui los pongo

Programa Para Leer Datos y Visualizar en la LCD

Código: [Seleccionar]
#include <18f2550.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#include <LCD.C>
#BYTE TRISA=0X85
#BYTE PORTA=0X05

int valor;

#int_RDA
RDA_isr()
{
 valor=GETC();
}

void main() {

  bit_clear(TRISA,0);
  lcd_init();
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

for (;;) {
     lcd_gotoxy(1,1);
     printf(lcd_putc,"Lenado De Tanque");
     lcd_gotoxy(1,2);
     printf(lcd_putc,"  %D Porciento",valor);
   }
}

Aqui esta el que me manda la informacion

Código: [Seleccionar]
#include <16f88.h>
#FUSES NOWDT
#fuses NOMCLR,INTRC_IO
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_b5, rcv=pin_b2)
void main() {

   int valor;
   
while(true){
   for (valor=10;valor<=100;) {
      PUTC(valor);
         valor=valor+10;
          delay_ms(500);
         }
    }
}

(http://img35.imageshack.us/img35/6619/sshot8.png)

mi pregunta es la siguiente:

Como podria evitar que al terminar el conteo de 100 me agrege una o de mas como se ve en la figura

y en la parte donde esta el pic 16f88 como podria mandar una lectura por el ADC para que me mandara la lectura de 0 a 100 con un potenciometro de 100k
Título: Re: comparando puertos y enviando a rs232
Publicado por: MLO__ en 21 de Mayo de 2009, 22:28:40
Hola.

La primera pregunta no te la entendi  :-)

La segunda: debes conectar el potenciometro a uno de los pines del ADC del 16f88 y configurar el ADC con la funcion setup_adc();, luego para obtener el valor de conversion usas read_adc(); y ese valor lo envias por el serial.

Saludos
Título: Re: comparando puertos y enviando a rs232
Publicado por: darck_khronos en 21 de Mayo de 2009, 23:18:53
Hola.

La primera pregunta no te la entendi  :-)

La segunda: debes conectar el potenciometro a uno de los pines del ADC del 16f88 y configurar el ADC con la funcion setup_adc();, luego para obtener el valor de conversion usas read_adc(); y ese valor lo envias por el serial.

Saludos

es que en la imagen me imprime
(http://img268.imageshack.us/img268/1674/sshot9.png)

Llenado de tanque
 100 porciento
y despues del 100 me dice
Llenado de tanque
 10 porcientoo

y ok estare hacien pruebas por que es la pimera vez que usare el Adc
Título: Re: comparando puertos y enviando a rs232
Publicado por: migsantiago en 21 de Mayo de 2009, 23:25:35
Limpiar LCD con \f ...  :mrgreen:

Código: [Seleccionar]
printf(lcd_putc, "\fLlenado de tanque\n%u \%",valor);
Título: Re: comparando puertos y enviando a rs232
Publicado por: Suky en 21 de Mayo de 2009, 23:26:05
Es que debes borrar el display, sino esta sobre escribiendo lo anterior.

Uyy! Me gano migsantiago  :mrgreen:
Título: Re: comparando puertos y enviando a rs232
Publicado por: MLO__ en 22 de Mayo de 2009, 00:09:29
Ah!!!! en la segunda imagen si se ve la 'o' de mas ..... limpia la lcd como dice mig o puedes colocar espacios despues asi:

Código: [Seleccionar]
printf(lcd_putc, "\fLlenado de tanque\n%u porciento      ",valor);
De esta manera te evitas el parpadeo del limpiado del LCD
Título: Re: comparando puertos y enviando a rs232
Publicado por: darck_khronos en 22 de Mayo de 2009, 11:05:06
Ya me encuentro en la parte del ADC mas que al compilar el siguiente codigo me marca este error

Código: [Seleccionar]
#include <16f88.h>
#device adc=10
#FUSES NOWDT
#fuses NOMCLR,INTRC_IO
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_b5, rcv=pin_b2)

void main() {
   int16 q;
   float p;

   setup_adc_ports(AN0);             
   setup_adc(ADC_CLOCK_INTERNAL);

   for (;;) {
      set_adc_channel(0);           
      delay_us(20);
      q = read_adc();                 
      p = 5.0 * q / 1024.0;         

      PUTC( "\fADC = %4ld", q);
      delay_ms(100);
      }
}
(http://img194.imageshack.us/img194/5356/sshot10.png)
Título: Re: comparando puertos y enviando a rs232
Publicado por: MLO__ en 22 de Mayo de 2009, 11:24:25
hola.

Debes usar el printf para sacar las variables .... y debes tener en cuenta el formato, q es %lu
Título: Re: comparando puertos y enviando a rs232
Publicado por: darck_khronos en 22 de Mayo de 2009, 11:41:44
hola.

Debes usar el printf para sacar las variables .... y debes tener en cuenta el formato, q es %lu

Por la parte de la inprecion no hay problema pero por que no me detecta el pin ra0 como Adc por que me muestra que es indefinido
?
Título: Re: comparando puertos y enviando a rs232
Publicado por: MLO__ en 22 de Mayo de 2009, 11:55:34
Ok.

La impresion ok.

Con respecto a lo de la entrada analogica, es por que no es asi la configuracion, segun el archivo 16F88.h, se debe colocar:

Código: [Seleccionar]
setup_adc_ports(sAN0);
Siempre es bueno revisar el .h del micro correspondiente.
Título: Re: comparando puertos y enviando a rs232
Publicado por: darck_khronos en 22 de Mayo de 2009, 12:00:07
Me ganaste MLO__

ya tengo el codigo del Adc ya funciona ahora el detalle es el mas fundamental como puedo hacer que me de una escala de 0 a 100

aqui dejo el codigo de los dos pics ya que esta modificado en algunas lineas

Pic LCD

Código: [Seleccionar]
#include <18f2550.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#include <LCD.C>
#BYTE TRISA=0X85
#BYTE PORTA=0X05

float p;

#int_RDA
RDA_isr()
{
 p=GETC();
}

void main() {

  bit_clear(TRISA,0);
  lcd_init();
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

for (;;) {
     lcd_gotoxy(1,1);
     printf(lcd_putc,"Lenado De Tanque");
     lcd_gotoxy(1,2);
     printf(lcd_putc,"  adc=%1.2f",p);
   }
}

Codigo de envio

Código: [Seleccionar]
#include <16f88.h>
#device adc=10
#FUSES NOWDT
#fuses NOMCLR,INTRC_IO
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_b5, rcv=pin_b2)

/*void main() {

   int valor;
  
while(true){
   for (valor=10;valor<=100;) {
      PUTC(valor);
         valor=valor+10;
          delay_ms(500);
         }
    }
}*/
void main() {
   int16 q;
   float p;

  
   setup_port_a( ALL_ANALOG );              //Canal 0 analógico
   setup_adc(ADC_CLOCK_INTERNAL);    //Fuente de reloj RC

   for (;;) {
      set_adc_channel(0);           //Habilitación canal0
      delay_us(20);
      q = read_adc();                  //Lectura canal0
      p = 5.0 * q / 1024.0;           //Conversión a tensión

      PUTC(q);
      delay_ms(100);
      }
}
y aqui otra imagen de la simulacion
(http://img41.imageshack.us/img41/3162/sshot11.png)
Título: Re: comparando puertos y enviando a rs232
Publicado por: migsantiago en 22 de Mayo de 2009, 12:59:17
Para la escala de 0 a 100% deberás usar una regla de 3.

5V -> 255 binario
0V -> 0 binario

Relaciona el 255 con el 100% y el 0 con el 0%. Implementa una variable flotante para lograrlo.

Edito: Veo que usas 10bits de ADC, solo cambia el 255 por 1023.
Título: Re: comparando puertos y enviando a rs232
Publicado por: darck_khronos en 23 de Mayo de 2009, 16:59:51
ya realice la convercion pero en la terminal virtual solo me imprime a lo maximo solamente 5 datos diferente

#include <16f88.h>
#device adc=10
#include <math.h>                //Necesaria para los cálculos matemáticos
#FUSES NOWDT
#fuses NOMCLR,INTRC_IO
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_b5, rcv=pin_b2)

void main() {
   float medicion;                 //Variables de ecuación
   int16 valor;
   
   setup_port_a( ALL_ANALOG );
   setup_adc( ADC_CLOCK_INTERNAL );
   set_adc_channel( 0 );
   delay_us(10);
   do {
      valor = Read_ADC();
      medicion = valor * 1024.0 / 100 ;
      putc(medicion);
   } while (TRUE);
}

puse un potenciometro de 1M aqui dejo adjunta la simulacion

Título: Re: comparando puertos y enviando a rs232
Publicado por: migsantiago en 23 de Mayo de 2009, 17:08:12
La conversión la haces mal. Debes hacer casting de float o expresar el 100 como flotante en esta línea, si no, el resultado se calcula como int16.

Código: [Seleccionar]
medicion = valor * 1024.0 / 100.0 ;
Título: Re: comparando puertos y enviando a rs232
Publicado por: darck_khronos en 24 de Mayo de 2009, 21:14:49
La conversión la haces mal. Debes hacer casting de float o expresar el 100 como flotante en esta línea, si no, el resultado se calcula como int16.

Código: [Seleccionar]
medicion = valor * 1024.0 / 100.0 ;

no se si soy yo el pic o la programacion ya intente eso y mas cosas con mas operaciones y me sigue dando solo 6 resultados nadamas no hace mas variaciones
Título: Re: comparando puertos y enviando a rs232
Publicado por: MLO__ en 24 de Mayo de 2009, 21:32:14
En el link lo hago con ADC a 8 bits .... y no da problema ...

7 Segmentos con Timer0 (http://www.todopic.com.ar/foros/index.php?topic=21738.0)
Título: Re: comparando puertos y enviando a rs232
Publicado por: migsantiago en 25 de Mayo de 2009, 12:31:47
no se si soy yo el pic o la programacion ya intente eso y mas cosas con mas operaciones y me sigue dando solo 6 resultados nadamas no hace mas variaciones

¿Cuáles son los 6 resultados que te da?

Es que nos diste mal el cálculo de la regla de 3. Ponlo así:

Código: [Seleccionar]
medicion = valor * 100.0 / 1024.0 ;