TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: xabc2007 en 07 de Mayo de 2011, 03:40:55

Título: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: xabc2007 en 07 de Mayo de 2011, 03:40:55
Hola, quiero montar un voltimetro que haga dos lecturas (RA0, RA1) y  dos pulsadores. Cuando pulso un pulsador (RA2) que me salga un mensaje en pantalla, con el otro pulsador (RA3) que me encienda un led (RA4). El mensaje con el pulsador (RA2) sale pero el led no se enciende (RA4). Y no veo lo que hago mal para que se encienda el led.

Agradedezco toda la ayuda.

Un saludo a todo el foro.


Adjunto el programa.



#include <16F876.h>
#device adc=10

#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)

#define use_portb_lcd TRUE

#include <LCD.C>
#include <math.h>

#BYTE TRISA = 0x85
#BYTE PORTA = 0x05



/////////////////////////////////////////////////////////////////
//                   DECLARAMOS LAS VARIABLES
/////////////////////////////////////////////////////////////////


   float v;          // variable para calcular el voltage del ADC   
   int8 lectura_adc;
   
   
//////////////////////////////////////////////////////////////////


void main()

 { 
  bit_set (TRISA , 2);  // A2 como entrada, para el pulsador
  bit_set (TRISA , 3);  // A3 como entrada, para el pulsador
   
  bit_clear(TRISA , 4); // A4 como salida, para el led

 
  setup_adc_ports(RA0_RA1_RA3_ANALOG);
  setup_adc(ADC_CLOCK_INTERNAL);       //Fuente de reloj RC

   lcd_init();
 
   /////////////////////////////////////////////////////////////////////
   
   
while (1) //bucle infinito
{

// CONSULTAMOS EL VALOR DEL ADC
   
      set_adc_channel(0);          //Habilitación canal0
      delay_us(20);                //Retardo
      lectura_adc = read_adc();    //Lectura canal0
   
   
// CALCULAMOS EL VOLTAJE A PARTIR DEL ADC

      v=5.0*lectura_adc/1024.0; // leemos el voltage del ADC.


// VISUALIZAMOS EN PANTALLA

   printf(lcd_putc, "\f" );//BORRAMOS LA PANTALLA
      lcd_gotoxy(5,1);
      printf(lcd_putc, "voltios");   
      lcd_gotoxy(3,2);
      printf(lcd_putc, "\ %4ld V", v);
     
      if (BIT_TEST(PORTA,2)==1)  printf(lcd_putc, "\ftecla 1");


// ENCENDEMOS O APAGAMOS EL LED

      if (BIT_TEST(PORTA,3)==1)  bit_set  ( PORTA, 4 );// encendemos el led     
      if (BIT_TEST(PORTA,3)==0)  bit_clear( PORTA, 4 );// apagamos el led


      delay_ms(100);// velocidad del programa
   
   
      }
}
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: Miquel_S en 07 de Mayo de 2011, 05:03:18
Hola xabc2007, tienes en cuenta que debes poner una resistencia en la salida de RA4 por ser de colector abierto.

Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: xabc2007 en 07 de Mayo de 2011, 05:23:27
Si, la resistencia esta puesta en los dos pulsadores
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: Miquel_S en 07 de Mayo de 2011, 07:53:49
Te estoy hablando de la resistencia que debes poner en RA4

En algunos micros (serie 16F) el pin RA4, cuando se utiliza como salida, debe ser conectado a Vdd a través de una resistencia pullup, ya que es de colector abierto.

Miquel_S
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: xabc2007 en 07 de Mayo de 2011, 09:31:10
Hola Miquel_S, en la patilla RA4 tengo puesto un led conectado a masa a traves de una resistencia, voy a probar lo que me dices de poner el led a Vcc.

Gracias
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: Miquel_S en 07 de Mayo de 2011, 10:02:46
Hola xabc2007, confundes la resistencia limitadora del led con la resitencia que debes poner al pin RA4 para que dicho pin no sea colector abierto.

                                       RA4-------------->Resistencia Limitadora----------------->Led
                                                                 |
                                                                 |
                                                                 |
                                                                 |------------->Resistencia que estamos hablando------------->VDD

Miquel_S
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: bmb en 07 de Mayo de 2011, 10:20:45
Hola xabc2007, por aquí:

Código: C
  1. bit_set (TRISA , 2);  // A2 como entrada, para el pulsador
  2.   bit_set (TRISA , 3);  // A3 como entrada, para el pulsador
  3.    
  4.   bit_clear(TRISA , 4); // A4 como salida, para el led

... estás declarando a RA3 como entrada digital, pero más adelante por aquí:

Código: C
  1. setup_adc_ports(RA0_RA1_RA3_ANALOG);

.. la declaras como entrada análoga.  Tal vez debas seleccionar otro pin para reemplazar a RA3.

Saludos!
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: xabc2007 en 07 de Mayo de 2011, 14:42:57
hola
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: xabc2007 en 07 de Mayo de 2011, 14:52:13
Hola, primero disculpas porque publique sin mensaje.

Miquel_S he puesto la resistencia y no funciona y bmb he puesto la siguiente linea:

setup_adc_ports(RA0_RA1_ANALOG);  y me sale el siguiente error

*** Error 12 "PA_2 analo_2 digit.c" Line 61(19,33): Undefined identifier   RA0_RA1_ANALOG
      1 Errors,  0 Warnings.

¿Cómo puedo hacer para configurar el puerto RA utilizado dos entradas digitales y tres analogicas?

Gracias.



Adjunto el codigo y el esquema.


#include <16F876.h>
#device adc=10

#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)

#define use_portb_lcd TRUE

#include <LCD.C>
#include <math.h>

#BYTE TRISA = 0x85
#BYTE PORTA = 0x05


/////////////////////////////////////////////////////////////////
//                   DECLARAMOS LAS VARIABLES
/////////////////////////////////////////////////////////////////


   float v;          // variable para calcular el voltage del ADC  
   int8 lectura_adc;
    
  
//////////////////////////////////////////////////////////////////


void main()

 {  
  bit_set (TRISA , 2);  // A2 como entrada, para el pulsador
  bit_set (TRISA , 3);  // A3 como entrada, para el pulsador
  
  bit_clear(TRISA , 4); // A4 como salida, para el led

 
  setup_adc_ports(RA0_RA1_ANALOG);
  setup_adc(ADC_CLOCK_INTERNAL);       //Fuente de reloj RC

   lcd_init();
 
   /////////////////////////////////////////////////////////////////////
    
  
while (1) //bucle infinito
{

// CONSULTAMOS EL VALOR DEL ADC
  
      set_adc_channel(0);          //Habilitación canal0
      delay_us(20);                //Retardo
      lectura_adc = read_adc();    //Lectura canal0
  
  
// CALCULAMOS EL VOLTAJE A PARTIR DEL ADC

      v=5.0*lectura_adc/1024.0; // leemos el voltage del ADC.


// VISUALIZAMOS EN PANTALLA

   printf(lcd_putc, "\f" );//BORRAMOS LA PANTALLA
      lcd_gotoxy(5,1);
      printf(lcd_putc, "voltios");  
      lcd_gotoxy(3,2);
      printf(lcd_putc, "\ %4ld V", v);
    
      if (BIT_TEST(PORTA,2)==1)  printf(lcd_putc, "/ftecla 1");


// ENCENDEMOS O APAGAMOS EL LED

      if (BIT_TEST(PORTA,3)==1)  bit_set  ( PORTA, 5 );// encendemos el led      
      if (BIT_TEST(PORTA,3)==0)  bit_clear( PORTA, 5 );// apagamos el led


      delay_ms(100);// velocidad del programa
  
  
      }
}
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: bmb en 07 de Mayo de 2011, 21:26:52
Hola, primero disculpas porque publique sin mensaje.

Miquel_S he puesto la resistencia y no funciona y bmb he puesto la siguiente linea:

setup_adc_ports(RA0_RA1_ANALOG);  y me sale el siguiente error

*** Error 12 "PA_2 analo_2 digit.c" Line 61(19,33): Undefined identifier   RA0_RA1_ANALOG
      1 Errors,  0 Warnings.

¿Cómo puedo hacer para configurar el puerto RA utilizado dos entradas digitales y tres analogicas?

Gracias.

Hola xabc2007, respecto a lo de la resistencia en RA4, creo que una de 10K (muy alta) como la que muestras en el diagrama no te va a funcionar.  Recuerda que según lo que te ha explicado Miguel_S el pin del PIC es a colector abierto, por lo que el LED encenderá a través de las dos resistencias en serie cuando le envíes un 1 al pin RA4.  Otra forma de utilizar ese pin, es invertir la conexión del LED conectándolo a +V e invertir la lógica del programa para que te encienda cuando el pin RA4 recibe un 0.

En el código que acabaste de subir, estás usando a RB5 para el LED pero no lo has configurado como salida.  De todos modos como no estás utilizando #use fast_io(a) CCS lo direcciona automaticamente.

Tal vez quisiste decir configurar dos entradas análogas y tres digitales. Si es así, configurar dos entradas análogas, con referencia +V, no es posible con ese PIC.  Creo que se puede configurar a RA0 y RA1 como análogas, pero tendrías que usar otros pines del puerto A como referencia.  Dale una mirada a la hoja de datos del PIC, o al archivo 16F876.h y allí verás las combinaciones posibles.

Saludos!
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: xabc2007 en 08 de Mayo de 2011, 04:25:20
Hola bmb, el manual que utilizo es: "Manual de usuario del compilador PCW 
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: Miquel_S en 08 de Mayo de 2011, 04:31:03
A lo que se refiere bmb al decir hoja de datos es al datasheet del micro.
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: xabc2007 en 08 de Mayo de 2011, 04:40:00
Hola bmb, el manual que utilizo es: "Manual de usuario del compilador PCW  de CCS y ahí no

encuentro la configuracion para poner en el PORTA dos entradas analogicas y tres digitales.

Tambien utilizo el libro: "Compilador C CCS y simulador PROTEUS para microcontroladores PIC"

y ahí tampoco veo la configuracion. He puesto el el programa las lineas de código:

setup_adc_ports(AN0);
  setup_adc_ports(AN1);

pero tampoco es correcto. He referenciado a Vcc el led y cambiado la programacion:

if (BIT_TEST(PORTA,3)==0)  bit_set  ( PORTA, 5 );// encendemos el led      
      if (BIT_TEST(PORTA,3)==1)  bit_clear( PORTA, 5 );// apagamos el led.



Adjunto el esquema con el led referenciado a Vcc.

Me gustaria saber una web donde se puedan configurar las entradas del PORTA como analogicas y digitales a la vez.

Gracias





/////////////////////////////////////////////////////////////
//
//      PA-Programa de Aplicación
//  
// Funciones:    leer dos entradas analogicas RA0, RA1. Para voltimetro
//       leer dos entradas digitales  RA2, RA3. Para pulsadores
//      leer una salida digital      RA4.      Para encender Led.
//
//
// El programa leera las dos entradas analogicas para leer los voltajes (RA0,RA1)
// al pulsar RA2 mostraremos en pantalla el mensaje "tecla 1"
// al pulsar RA3 encenderemos el led RA4
//
// asunto: PORTA.16F876a. dos entradas analogicas, tres digitales
//
/////////////////////////////////////////////////////////////////////////////////


#include <16F876.h>
#device adc=10

#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)

#define use_portb_lcd TRUE

#include <LCD.C>
#include <math.h>

#BYTE TRISA = 0x85 //estos valores son exclusivos del puerto A
#BYTE PORTA = 0x05 //estos valores son exclusivos del puerto A

//#BYTE TRISB = 0X86 //estos valores son exclusivos del puerto B
//#BYTE PORTB = 0X06 //estos valores son exclusivos del puerto B

//#BYTE TRISC = 0X87 //estos valores son exclusivos del puerto C
//#BYTE PORTC = 0X07 //estos valores son exclusivos del puerto C

/////////////////////////////////////////////////////////////////
//                   DECLARAMOS LAS VARIABLES
/////////////////////////////////////////////////////////////////


   float v;          // variable para calcular el voltage del ADC  
   int8 lectura_adc;
    
  
//////////////////////////////////////////////////////////////////


void main()

 {  
  bit_set (TRISA , 2);  // A2 como entrada, para el pulsador
  bit_set (TRISA , 3);  // A3 como entrada, para el pulsador
  
  bit_clear(TRISA , 4); // A4 como salida, para el led

 
  //setup_adc_ports(RA0_RA1_ANALOG);
  
  setup_adc_ports(AN0);
  setup_adc_ports(AN1);
  
  setup_adc(ADC_CLOCK_INTERNAL);       //Fuente de reloj RC

   lcd_init();
 
   /////////////////////////////////////////////////////////////////////
    
  
while (1) //bucle infinito
{

// CONSULTAMOS EL VALOR DEL ADC
  
      set_adc_channel(0);          //Habilitación canal0
      delay_us(20);                //Retardo
      lectura_adc = read_adc();    //Lectura canal0
  
  
// CALCULAMOS EL VOLTAJE A PARTIR DEL ADC

      v=5.0*lectura_adc/1024.0; // leemos el voltage del ADC.


// VISUALIZAMOS EN PANTALLA

   printf(lcd_putc, "\f" );//BORRAMOS LA PANTALLA
      lcd_gotoxy(5,1);
      printf(lcd_putc, "voltios");  
      lcd_gotoxy(3,2);
      printf(lcd_putc, "\ %4ld V", v);
    
      if (BIT_TEST(PORTA,2)==1)  printf(lcd_putc, "/ftecla 1");


// ENCENDEMOS O APAGAMOS EL LED

      if (BIT_TEST(PORTA,3)==0)  bit_set  ( PORTA, 5 );// encendemos el led      
      if (BIT_TEST(PORTA,3)==1)  bit_clear( PORTA, 5 );// apagamos el led


      delay_ms(100);// velocidad del programa
  
  
      }
}
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: xabc2007 en 08 de Mayo de 2011, 04:43:49
Hola Miquel_S, voy a mirar en el datasheep del PIC16f876

Muchas gracias
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: Miquel_S en 08 de Mayo de 2011, 04:49:27
Hola Miquel_S, voy a mirar en el datasheep del PIC16f876

Muchas gracias
Es el mejor manual.
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: xabc2007 en 08 de Mayo de 2011, 06:44:34
Hola Miquel_S, con el manual no consigo poner dos entradas analogicas y 3 digitales.

Gracias.

Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: bmb en 08 de Mayo de 2011, 10:26:58
Hola xabc2007, en el manual de CCS no vas a encontrar cuales pines puedes configurar como análogos, porque eso es propio de cada PIC.  Por eso debes fijarte en el archivo 16F876.h que lo encuentras por lo general en carpeta: C:\Archivos de programa\PICC\Devices\ o en la hoja de datos del PIC16F876 (http://ww1.microchip.com/downloads/en/DeviceDoc/30292c.pdf) en la página 112.
Como te había comentado, para este PIC en particular no es posible configurar solo 2 entradas análogas con referencia +V.  Debes buscar la configuración que más te convenga.

Saludos!
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: xabc2007 en 08 de Mayo de 2011, 10:55:11
hola bmb, no entiendo que significa " para este PIC en particular no es posible configurar solo 2 entradas análogas con referencia +V. " pero intentare solucionarlo.

Muchas gracias.



Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: bmb en 08 de Mayo de 2011, 11:12:03
hola bmb, no entiendo que significa " para este PIC en particular no es posible configurar solo 2 entradas análogas con referencia +V. " pero intentare solucionarlo.

Muchas gracias.

Hola xabc2007, eso significa que el hardware de los PIC no necesariamente se configura igual de un modelo de PIC a otro.  Por ejemplo hay PICs que si te permiten configurar las entradas digitales como quieres, como por ejemplo el PIC16F88.  En el post anterior te deje un enlace a la hoja de datos del PIC que estás utilizando y la página donde encuentras la forma de resolver tu duda.  Es muy importante que consultes siempre la hoja de datos para cada PIC.

Saludos!
Título: Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
Publicado por: xabc2007 en 08 de Mayo de 2011, 12:56:12
Hola bmb, no consigo entender la explicaciones que he leído, lo que si he conseguido es hacerlo en el PORTC.

Gracias de todos modos.

Saludos.