Autor Tema: leer varios pines de un puerto y hacer una determinada cosa.  (Leído 11385 veces)

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

Desconectado josegranada

  • PIC10
  • *
  • Mensajes: 16
leer varios pines de un puerto y hacer una determinada cosa.
« en: 16 de Octubre de 2009, 08:16:44 »
hola compañeros necesito leer en el puerto b, los 3 primero pines y segun se cumplan unas condiciones o otras se activaran unas salidas o otras:

les dejo el codigo que yo he hecho para ver si alguien me ayuda a resolver mi problema:

#include "16f877a.h" // este include es para definir el tipo de PIC que vamos a utilizar en nuestro caso es el PIC16F877
#byte pa=5 // definimos el puerto A en el bit 5
#byte pb=6 // definimos el puerto B en el bit 6
#byte pc=7 // definimos el puerto C en el bit 7
#byte pd=8 // definimos el puerto D en el bit 8
#use delay(clock=4m)  // aqui declaramos que use el reloj que sera de 4 Mhz.
#include "stdio.h" // incluimos esta libreria para poder usar mas adelante la funcion printf asi como otras tambien.

int lectura_ldr,lectura_rb0,lectura_rb1;

void ldr_motor() // hacemos una funcion para subir la persiana dependiendo de los finales de carrera y de la LDR.
{
   lectura_ldr=pin_b3;// hacemos que la variable lectura de la LDR sea igual al pin A5 del pic.
   lectura_rb0=pin_b1;// hacemos que la variable lectura del pin rb0 sea igual al pin B0 del pic.
   lectura_rb1=pin_b2;// hacemos que la variable lectura del pin rb1 sea igual al pin B1 del pic.
   // hacemos un while 1 para que se repita lo que tenemos dentro de los corchetes.
   
      if (lectura_ldr==1 && lectura_rb0==1 && lectura_rb1==0)// hacemos un if que si se cumplen lo que ponemos dentro de los parentesis, se haga lo que
      {                                                      // hay dentro de los corchetes que una vez sera subir o bajar o no hacer nada.
       output_high(pin_c7); // hacemos que la salida del pin c7 sea igual a 1 porque queremos que suba la persiana.
          output_low(pin_c6); // hacemos que el pin c6 sea igual a 0 porque el motor necesita un 0 en un pin en 1 y otro a 0 para que suba o baje.
      }
      if (lectura_ldr==1 && lectura_rb0==0 && lectura_rb1==1)// en este if lo que hacemos es que si se cumplen las condiciones en los parentesis
      {                                                      // se haga lo que tenemos en los corchetes.
        output_low(pin_c7); // hacemos que el pin c7 sea 0 porque en esta ocasion no queremos que se suba o se baje la persiana.
         output_low(pin_c6); // hacemos que el pin c6 sea 0 para que ni suba ni baje.
      }
      if (lectura_ldr==0 && lectura_rb0==0 && lectura_rb1==1)// en el if ponemos unas condiciones que si se cumplen se hace lo que tenemos
      {                                                      // en los corchetes.   
         output_low(pin_c7); // ponemos a 0 el pin c7.
         output_high(pin_c6);// ponemos el pin c6 a 1.
      }
      if (lectura_ldr==0 && lectura_rb0==1 && lectura_rb1==0)// en el if ponemos las condiciones que si son ciertas se hace lo de los corchetes.
      {
         output_low(pin_c6);// ponemos a 0 el pin c6.
         output_low(pin_c7);// ponemos a 0 el pin c7 porque en este caso no se movera la persiana.
      }
   
}

void main()

   set_tris_d(0); // declaramos que el puerto D sea de salida, porque aqui es donde vamos a conectar la LCD.
   set_tris_b(0b11111111); // declaramos que el puerto B sea de entrada, porque es donde conectaremos los pulsadores y los finales de carrera.
   set_tris_c(0x00); // declaramos el puerto C como salida, puesto que aqui vamos a conectar el motor y las difentes fases de luz.
   set_tris_a(0xff);// declaramos que el puerto A sea como entrada puesto que aqui vamos a conectar los dos termometros.
   pc=(0);
   pd=(0);
   pa=(0);
   pb=(0);
   ldr_motor();
}

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #1 en: 16 de Octubre de 2009, 11:24:46 »
Hola.

Porque no usas mejor la funcion input_state();:

Citar
value = input_state(pin)

Parameters:
 pin to read.  Pins are defined in the devices .h file.  The actual value is a bit address.  For example, port a (byte 5) bit 3 would have a value of 5*8+3 or 43.  This is       defined as follows:  #define PIN_A3 43.

Returns:
 Bit specifying whether pin is high or low.  A 1 indicates the pin is high and a 0 indicates it is low.
 
Function:
 This function reads the level of a pin without changing the direction of the pin as INPUT() does.
 
Availability:
 All devices.
 
Requires:
 Nothing

 
Examples:
 level = input_state(pin_A3);
 printf("level: %d",level);

El papel lo aguanta todo

Desconectado nico

  • PIC16
  • ***
  • Mensajes: 180
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #2 en: 16 de Octubre de 2009, 19:46:49 »
Puedes leer pin por pin con la instruccion input_pinxx, o bien leer el puerto completo(input_byte), una vez tienes el resultado de este ultimo haces una and con (0b00000111) y ahi tendras la variable con el estado de unicamente los tres bits que necesitabas leer.

Saludos.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #3 en: 17 de Octubre de 2009, 00:29:38 »
Creo que josegranada usa CCS  ;-)
El papel lo aguanta todo

Desconectado nico

  • PIC16
  • ***
  • Mensajes: 180
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #4 en: 17 de Octubre de 2009, 16:04:18 »
Con CCS tambien puede hacerlo, es lo que hago cuando tengo que leer varios pins de un port, leo el byte completo y luego le hago una and con, en este caso 7(0x00000111). Lo puse en binario para que entienda los pines que estara tratando :lol:

saludos.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #5 en: 17 de Octubre de 2009, 18:08:28 »
Ah, es que esa función (input_pinxx) no es del CCS, por eso supuse que era otro compilador.

Saludos
El papel lo aguanta todo

Desconectado nico

  • PIC16
  • ***
  • Mensajes: 180
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #6 en: 17 de Octubre de 2009, 21:27:17 »
Si amigo MLO_, la funcion input_pinxx que mencionaba es de CCS y es esta, del manual de CCS

Examples:while ( !input(PIN_B1) ); // waits for B1 to go high

if( input(PIN_A0) )
printf("A0 is now high\r\n");

y la otra instruccion para leer el byte completo es
INPUT_x( )
Syntax:
value = input_a()
value = input_b()
value = input_c()
value = input_d()
.
.
.
En este te queda almacenado en una variable el valor del port completo, en el anterior verifica unicamente el puerto indicado entre los parentesis de la funcion

Saludos...

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #7 en: 18 de Octubre de 2009, 00:08:39 »
 :D :D :D

ya, jeje..

input_pinxx != input(pin_xx)

Algo que si hay que tener en cuenta es que la funcioninput(pin_xx); cuando lee el estado, cambia la dirección del pin leído si no se deja el STANDARD_IO.

Saludos
El papel lo aguanta todo

Desconectado josegranada

  • PIC10
  • *
  • Mensajes: 16
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #8 en: 18 de Octubre de 2009, 06:56:13 »
gracias ya resolvi mi duda, pero seguire preguntando otras mas

ya me queda poco para terminar el proyecto de domotica, pero me falta terminar dos termometro con comunicacion ADC el cual de momento le cuesta salir, pero espero que me ayuden.


gracias a todos

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #9 en: 18 de Octubre de 2009, 13:35:59 »
Hola.

Le cuesta salir de donde?  :mrgreen:

Tienes algo de código?

Saludos
El papel lo aguanta todo

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #10 en: 19 de Octubre de 2009, 00:15:12 »
con comunicacion ADC
:shock:
el cual de momento le cuesta salir
:z)

Aquí intento explicar como funciona el módulo A/D y algunos ejemplos  ;-)

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado josegranada

  • PIC10
  • *
  • Mensajes: 16
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #11 en: 19 de Octubre de 2009, 15:51:47 »
#include "16F877a.h"
#fuses XT, NOWDT, NOPUT, NOLVP, NOBROWNOUT, NOWRT, NOPROTECT
#use delay (clock = 4000000)
#include "mipant4bit.c"
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#byte pa=5
#byte pb=6
#byte pc=7
#byte pd=8
int adc_temperatura2,adc_temperatura,grados_temperatura,grados_temperatura2;
void toma_adc_y_transmite(void){

   // Lectura del canal 0 -> AN0 LM35a
   set_adc_channel(0);
   delay_ms(1);
   adc_temperatura2=read_adc();
   delay_ms(1);
    grados_temperatura = (int) ((adc_temperatura * 391) / 1000);
 
  // Lectura del canal 1 -> AN1 LM35a
   set_adc_channel(1);
   delay_ms(1);
   adc_temperatura=read_adc();
   delay_ms(1);

   grados_temperatura2 = (int) ((adc_temperatura2 * 391) / 1000);

   printf(" T exterior = %u \n T interior = %u (adc= %u)(adc= %u) ",adc_temperatura,grados_temperatura,adc_temperatura2,grados_temperatura2 );
}

void main(){
set_tris_a(0xff);
set_tris_d(0x00);
pd=0x00;
setup_adc(adc_clock_internal);
setup_adc_ports(AN0);
set_adc_channel(0);
lcd_init();
toma_adc_y_transmite();
}


este es el codigo que tengo hecho, es con dos lm35 uno para exterior y otro interior.

si me pudieran decir como tengo que configurar las tensiones de refencia se lo agradeceria.
de momento no me muestra datos en la lcd.

Desconectado nico

  • PIC16
  • ***
  • Mensajes: 180
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #12 en: 19 de Octubre de 2009, 19:32:07 »
Hola josegranada, de momento tienes varios errores en este codigo.

En primer lugar debes hacerle por lo menos un while a la rutina toma_adc_y_transmite(); ya que sino solamente la ejecutara una sola vez y ya no modificara los valores por mas que las entradas analogicas se modifiquen.
Por otro lado si estas usando CCS que es lo que veo, la funcion setup_adc_ports lleva dentro de los parentesis la indicacion de que puertos los debe tomar el compilador como analogos, lee la ayuda para configurarlo, pero en gral es distinto a lo que tienes colocado, seria algo asi:    setup_adc_ports(RA0_RA1_RA3_ANALOG); asi lo probe y funciona.
La rutina de envio al lcd no las has colocado, utilizando la estandar de ccs el codigo que debes usar es:
printf(lcd_putc,"Aqui estaria lo que quieres mostrar:%u", aqui las variables);

Probe el resto del codigo y haciendo las modificaciones funciona.

Saludos.

Desconectado josegranada

  • PIC10
  • *
  • Mensajes: 16
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #13 en: 20 de Octubre de 2009, 03:29:36 »
ya si me salen las temperaturas, pero ahora lo que me fala es sacar el valor que realmente tiene el termometro.

porque yo en proteus pongo que corra la simulacion, y el termometro tiene 20 grados y me sale 18.

tengo ke cambiar las tensiones de referencia pero no se como las puedo ajustar.

gracias

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: leer varios pines de un puerto y hacer una determinada cosa.
« Respuesta #14 en: 20 de Octubre de 2009, 15:22:44 »
aqui en el foro hay muchas explicaciones que incluyen al LM35, para entender el concepto de conversion A/D mira aqui y aqui tambien se explico algo
saludos
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA