Autor Tema: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876  (Leído 15293 veces)

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

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« 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
   
   
      }
}

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #1 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.

Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #2 en: 07 de Mayo de 2011, 05:23:27 »
Si, la resistencia esta puesta en los dos pulsadores

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #3 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
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #4 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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #5 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
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #6 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!

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #7 en: 07 de Mayo de 2011, 14:42:57 »
hola

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #8 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
  
  
      }
}

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #9 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!

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #10 en: 08 de Mayo de 2011, 04:25:20 »
Hola bmb, el manual que utilizo es: "Manual de usuario del compilador PCW 

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #11 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.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #12 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
  
  
      }
}

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #13 en: 08 de Mayo de 2011, 04:43:49 »
Hola Miquel_S, voy a mirar en el datasheep del PIC16f876

Muchas gracias

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: 2 entradas analogicas, 3 entradas digitales. RA, PIC16F876
« Respuesta #14 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.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.


 

anything