TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Halcon_de_Fuego en 26 de Diciembre de 2010, 14:39:03

Título: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 26 de Diciembre de 2010, 14:39:03
tengo este codigo pero no veo la configuracion de los pines
Código: [Seleccionar]
#include <16f628.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay (clock=4000000)
#include <lcd.c>
#use standard_io(a)

int counter=0;
float rpm;

#int_timer1
void timer1_isr(void)
{
   counter=get_timer0();
   
   if(input(PIN_A2))    /*para motores de 8 cilindros*/
   {
   rpm=counter*4;       /*rpm=counter*2.0*120;*/
   }
 
   
   if(input(PIN_A3))    /*para motores de 6 cilindros*/
   {
   rpm=counter*3;       /*rpm=counter*2.0*120;*/
   }
   
   
   if(input(PIN_A4))  /*para motores de 4 cilindros*/
   {
   rpm=counter*2;     /*rpm=counter*2.0*120;*/
   }

y cuando quiero que la señal entre por A2 o A3 no lo hace pero en A4 si ! no entiendo bien porque

saludos !
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: bigluis en 26 de Diciembre de 2010, 14:50:20
El compilador CCS utiliza las funciones input() y output() para configurar los pines o los puertos como entradas y salidas respectivamente sin la necesidad de configurar los registros TRISx, en muchas ocasiones esto se vuelve una ventaja, pero en otras se vuelve un problema.

Si deseas realizar la configuracion de manera manual debes utilizar la funcion set_tris_x() donde x es el nombre del puerto.

Busca en la ayuda de ccs, ahí encontraras mas informacion.
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: ppyote en 26 de Diciembre de 2010, 14:56:00
se me adelantaron jejejjee
tambien no olvides que debes de configurar el pic para que las entradas del puerto A sean entradas digitales, ya que como bien ha dicho bigluis el pic cambiara la configuracion trisa dependiendo del uso de los pines pero no dira el tipo de señal que debe recibir...
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 26 de Diciembre de 2010, 15:20:04
gracias no entiendo un pomo ! alguien tiene un ejemplo para poder adaptar ?

muchas gracias por sus respuestas anteriores !
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 26 de Diciembre de 2010, 15:36:52
creo que lo configure manualmente pero como ago para preguntar si un pin esta resiviendo señal ??
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: ppyote en 26 de Diciembre de 2010, 16:54:43
a ver el puerto a puede detectar valores analógicos ,osea valores desde 0voltios asta 5.6 voltios tú lo que pretendes es leer es una pulsacion a un botón ,no? Pues tienes que configurar el pic para que detecte estados lógicos 1 y 0 usa el buscador ya que es un tema muy tocado así sabrás como hacerlo
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 26 de Diciembre de 2010, 17:03:12
tengo todo andando solo quiero configurar los pines para tomar 3 señales una en cada momento tal cual esta el codigo , lo que no entiendo es xq no anda o los if estan mal xq por lo que me dicen los configuro mal .

el unico que anda con ese codigo es el a4
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: ppyote en 26 de Diciembre de 2010, 17:13:53
te lo vuelvo a decir, tus pines leen, el problema es que leen señales analogicas, configura el puerto A con setup_comparator(NC_NC_NC_NC)
asi deshabilitas las entradas analogicas y habilitas las digitales... asi tu sistema de if() te funcionara...
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 26 de Diciembre de 2010, 18:37:43
hay otra cosa rara acá porque no funciona eso
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: jhozate en 26 de Diciembre de 2010, 18:49:45
el codigo de arriba es todo el codigo????...ahi le falta
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: ppyote en 26 de Diciembre de 2010, 19:16:56
el codigo de arriba es todo el codigo????...ahi le falta
No creo jejeje
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: bigluis en 26 de Diciembre de 2010, 19:50:45
debes hacer algo así

Código: [Seleccionar]
void main(){
   ...
   setup_adc(NO_ANALOG);
   setup_comparator(NC_NC);
   ...
}
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: bmb en 26 de Diciembre de 2010, 21:02:46
Hola Halcon_de_Fuego, al parecer el problema está justamente en la parte de código que no has mostrado.  Si subes el código completo te podemos ayudar entre todos a encontrar el problema más rapidamente.

Saludos!
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 28 de Diciembre de 2010, 19:21:35
Hola amigos denmen unos minutos y lo subo
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 28 de Diciembre de 2010, 19:26:15
Bueno este es el codigo amigos

Código: [Seleccionar]
#include <16f628.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay (clock=4000000)
#include <lcd.c>
#use standard_io(a)

int counter=0;
float rpm;

#int_timer1
void timer1_isr(void)
{//set_tris_A(11111111);
setup_comparator(NC_NC_NC_NC);


   counter=get_timer0();
   
   if(input(PIN_A2))    /*para motores de 8 cilindros*/
   {
   rpm=counter*4;       /*rpm=counter*2.0*120;*/
   }
 
   
   if(input(PIN_A3))    /*para motores de 6 cilindros*/
   {
   rpm=counter*3;       /*rpm=counter*2.0*120;*/
   }
   
   
   if(input(PIN_A4))  /*para motores de 4 cilindros*/
   {
   rpm=counter*2;     /*rpm=counter*2.0*120;*/
   }
   
   lcd_putc("\f       RPM\n");
   lcd_gotoxy(5,2);   
   
   if(input(PIN_A0))
      printf(lcd_putc,"izq %5.0f",rpm);
   
   if(input(PIN_A1))
      printf(lcd_putc,"der %5.0f",rpm);
   
   if(!input(PIN_A0)&!input(PIN_A1))
      printf(lcd_putc,"\fCONECTAR ENTRADA\n     DE GIRO");

   delay_ms(250);
   set_timer0(0);
   set_timer1(3036);
}

void inicio(void)
{
   int i,j;
   lcd_putc("\f    Tacometro\n     Pirata");
   delay_ms(3000);
   lcd_putc("\f   Laboratorio");
   lcd_gotoxy(1,2);
   lcd_putc("  Electronica A");
   delay_ms(1500);lcd_putc("\f");
   for(j=0;j<4;j++)
   {
      lcd_gotoxy(5,1);
      lcd_putc("CARGANDO");
      for(i=5;i<13;i++)
      {
      lcd_gotoxy(i,2);
      lcd_putc("-");delay_ms(75);
   }
   lcd_putc("\f");
   }
   lcd_putc("\f");
}

void main(void)
{
lcd_init();
inicio();
setup_timer_0(rtcc_ext_l_to_h|rtcc_div_2);
setup_timer_1(t1_internal|t1_div_by_8);
set_timer0(0);
set_timer1(3036);
enable_interrupts(int_timer1);
enable_interrupts(global);
while(true);
}
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: bmb en 28 de Diciembre de 2010, 20:00:38
Hola Halcon_de_Fuego, intenta de esta manera (que es como te indicaban los colegas) aunque veo, por los mensajes de advertencia del CCS, que tienes problemas con el uso de algunas instrucciones dentro de las interrupciones como llamados a mostrar algo en el LCD y delays:

Código: C
  1. #include <16f628.h>
  2.  
  3. #fuses XT,NOWDT,NOPROTECT,NOLVP
  4.  
  5. #use delay (clock=4000000)
  6.  
  7. #include <lcd.c>
  8. #use standard_io(a)
  9.  
  10.    INT counter=0;
  11.  
  12. float rpm;
  13.  
  14. #INT_timer1
  15.  
  16. void timer1_isr(VOID)
  17. {
  18.    //set_tris_A(11111111);
  19.  
  20.    counter = get_timer0 () ;
  21.    
  22.    IF (input (PIN_A2)) /* para motores de 8 cilindros*/
  23.    {
  24.       rpm = counter * 4;  /*rpm = counter * 2.0 * 120; */
  25.    }
  26.  
  27.    
  28.    
  29.    IF (input (PIN_A3)) /* para motores de 6 cilindros*/
  30.    {
  31.       rpm = counter * 3;  /*rpm = counter * 2.0 * 120; */
  32.    }
  33.  
  34.    
  35.    
  36.    IF (input (PIN_A4)) /*para motores de 4 cilindros*/
  37.    {
  38.       rpm = counter * 2; /*rpm=counter * 2.0 * 120; */
  39.    }
  40.  
  41.    
  42.    lcd_putc ("\f RPM\n");
  43.    lcd_gotoxy (5, 2);
  44.    
  45.    IF (input (PIN_A0) )
  46.       printf (lcd_putc, "izq %5.0f", rpm);
  47.    
  48.    IF (input (PIN_A1) )
  49.       printf (lcd_putc, "der %5.0f", rpm);
  50.    
  51.    IF ( ! input (PIN_A0)& ! input (PIN_A1) )
  52.       printf (lcd_putc, "\fCONECTAR ENTRADA\n DE GIRO");
  53.    
  54.    delay_ms (250) ;
  55.    set_timer0 (0) ;
  56.    set_timer1 (3036) ;
  57. }
  58.  
  59. void inicio(VOID)
  60. {
  61.    INT i, j;
  62.    lcd_putc ("\f Tacometro\n Pirata");
  63.    delay_ms (3000) ;
  64.    lcd_putc ("\f Laboratorio");
  65.    lcd_gotoxy (1, 2) ;
  66.    lcd_putc (" Electronica A");
  67.    delay_ms (1500); lcd_putc ("\f") ;
  68.    FOR (j = 0; j < 4; j++)
  69.    {
  70.       lcd_gotoxy (5, 1) ;
  71.       lcd_putc ("CARGANDO") ;
  72.       FOR (i = 5; i < 13; i++)
  73.       {
  74.          lcd_gotoxy (i, 2) ;
  75.          lcd_putc (" - "); delay_ms (75) ;
  76.       }
  77.  
  78.       lcd_putc ("\f") ;
  79.    }
  80.  
  81.    lcd_putc ("\f") ;
  82. }
  83.  
  84. void main(VOID)
  85. {
  86.    setup_timer_0(rtcc_ext_l_to_h|rtcc_div_2);
  87.    setup_timer_1(t1_internal|t1_div_by_8);
  88.    setup_ccp1(CCP_OFF);
  89.    setup_comparator(NC_NC_NC_NC);  
  90.    enable_interrupts(INT_timer1);
  91.    enable_interrupts(global);
  92.    set_timer0(0);
  93.    set_timer1(3036);
  94.  
  95.    lcd_init();
  96.    inicio();
  97.    
  98.    WHILE(true);
  99. }

Por cual entrada lees los pulsos del tacómetro?  Para que son los demás?

Saludos!

EDITO: veo que tienes configurado el timer0 para leer pulsos externos, entonces puedes estar teniendo un conflicto con los pines.  Como tienes conectados los pines?
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 28 de Diciembre de 2010, 20:30:34
quiero leer por la pata una dos y tres de acuerdo a que clase de motor es las demas patas van a un display , las entradas las selecciono con una llave , no me anda el codigo
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: ppyote en 28 de Diciembre de 2010, 21:17:50
pero entrada del pulsos del tacometro solo tendras una, cierto? cual es?
dependiendo de la posicion del switchs te dara un resultado o otro, cierto?
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: bmb en 28 de Diciembre de 2010, 21:25:13
Según la configuración de Timer0 la entrada de pulsos sería por RA4.  Las demás dificilmente te las va a leer porque solo las ve en el momento de la interrupción de Timer1.  Que tipo de pulsos te envian los motores?  Cuantos por vuelta?  Creo que te va mejor si usas el módulo CCP y con DIP switches configuras el tipo de motor.

Saludos!
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: ppyote en 28 de Diciembre de 2010, 21:54:26
Código: [Seleccionar]

  IF (input (PIN_A4)) /*para motores de 4 cilindros*/
  {
     rpm = counter * 2; /*rpm=counter * 2.0 * 120; */
  }

asi es normal que no lea los pulsos ... si tiene el timer0 como contador por la pata de tocki(PINA4)... no puede utilizarla para otra cosa mas(switches)... por lo menos en su ejemplo
en fuses pon NOMCLR, cambia el switch del pinA4 y ponlo en el PINA5 con una resistencia PULL-UP, y la entrada de los pulsos del tacometro se lo metes por el PIN_A4

si pusieras tu cirucuito mejor que mejor asi veriamos mejor como lo tienes distribuidos los pines
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 28 de Diciembre de 2010, 22:51:23
hola no entendi bien pero lo que quiero es poder seleccionar segun el motor si es de 8 , 6 o 4 cilindros si es de 8 cilindros supongamos que entre segun el switch en la pata 2 si el motor es de 6 cilindros supongamos que entra segun el switch en la pata 3 , si el motor es de 4 cilindros supongamos que entra segun el switch en la pata 4 ! que tengo que hacer segun los ultimos 3 consejos ?
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 28 de Diciembre de 2010, 22:53:42
cuando digo switch me refiero a una llave selectora manualmente para elegir por que pata tomo la señal , perdon !
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: bmb en 28 de Diciembre de 2010, 23:25:10
Bueno, no he visto a fondo tu código, pero es que tiene cosas a primera vista que no me cuadran para un tacómetro; tal vez si, como te sugiere ppyote subes tu circuito podamos entender un poco mejor lo que quieres hacer.  Mi consejo personal sería que replantearas tu diseño utilizando el módulo CCP del PIC.  Solo una entrada para los pulsos del tacómetro y con la llave selectora escoges que tipo de motor tienes conectado a la entrada.  Por el momento si no has trabajado con ese módulo, te recomendaría que te estudies el ejemplo del CCS: EX_CCPMP.C
Por ahí te puedes encaminar para hacer un tacómetro facilmente.

Saludos!
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 28 de Diciembre de 2010, 23:29:45
este es el circuito que pretendo
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: bmb en 28 de Diciembre de 2010, 23:35:40
Es el código original? o le has cambiado algo.  Te lo digo, porque solo podría leer pulsos continuos por RA4 y por los otros pines me parece que no se puede(o al menos como veo que está escrito). Por la entrada externa del timer0 seguramente que si si se puede hacer un tacómetro, pero me sigue pareciendo más fácil usar el módulo CCP.

Del circuito me refiero al diagrama de conexiones...
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 28 de Diciembre de 2010, 23:40:44
perdon este es el circuito y no se que es un codigo ccp ?!
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: bmb en 28 de Diciembre de 2010, 23:56:59
Acabo de ver el circuito, y sigue en pie mi recomendación.  No es un código CCP sino que se trata de un módulo que traen los PICs (CAPTURE/COMPARE/PWM(CCP) MODULE).  Si miras el ejemplo que te menciono en un post anterior, te vas a dar cuenta que es el módulo apropiado para lo que necesitas.  Con este puedes medir la duración entre un pulso y otro y así calcular las rpm con facilidad.  Yo alguna vez hice un tacómetro usando ese módulo, pero como la idea es que aprendas, puedes empezar desde cero (con ese ejemplo) y aquí con la ayuda de todos, lo vamos armando.

Saludos!
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 29 de Diciembre de 2010, 00:00:30
gracias por tu recomendacion pero no creo que entre todos lo armemos , casi nunca puedo terminar algo ni con un codigo de terceros y el unico lugar que conozco para preguntar es acá ! disculpa por hacerte perder el tiempo amigo !

saludos !.
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: AngelGris en 29 de Diciembre de 2010, 10:14:42
  Yo también creo que lo más fácil y funcional sería utilizar el modulo CCP. Pero de todas maneras se puede hacer utilizando RA4 como entrada para el timer0, yo lo hice así para un tacómetro (en assembler) para aeromodelismo y podía medir hasta unas 20000 RPM.

  Como ya te comentaron los colegas, la única entrada para medir las RPM debería ser RA4 (utilizada en modo de entrada externa para el timer0). Luego deberías colocar los switch selectores en otros pines, y según el estado de esos pines hacés los cálculos correspondientes para los distintos tipos de motores.
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: bmb en 29 de Diciembre de 2010, 14:50:37
Hola Halcon_de_Fuego, no hay por que desanimarse!  Solo que a mi parecer es más preciso con la opción del CCP.  Como te ha reiterado AngelGris, también es posible el tacómetro con el Timer0.  He reformado un poco tu código para hacerlo funcionar con las sugerencias que te hemos hecho:

A4: entrada para pulsos del motor
A2 y A3 DIP swuitch asi:
A2 abierto, A3 abierto: motor de 4 ciclindros
A2 cerrado, A3 cerrado: motor de 4 ciclindros (esta podría ser una opción para otro tipo de motor)
A2 cerrado, A3 abierto: motor de 6 ciclindros
A2 abierto, A3 cerrado: motor de 8 ciclindros

Como podrás ver le he puesto al circuito unas resistencias pullup en A2 y A3 (lo mismo deberías hacer con A1 y A2), sin ellas en Proteus no te muestra problemas pero en 'la vida real' todos los que quieras.

Me parece que tendrías que cambiar la configuración en Timer0 ya que veo que a altas rpms, la lectura en counter se pasa de 255 (8 bits) con sus obvias consecuencias.   Bueno, nos comentas si tienes alguna duda.

Saludos!
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: Halcon_de_Fuego en 29 de Diciembre de 2010, 23:21:58
Hola gracias por ayudarme !! tengo un ejemplo en la carpeta de de pcw que tal ves funcione , el ejemplo es EX_FREQC.C alguien tiene algun circuito con el que pueda probar ?

PD: voy a ver el ejemplo EX_CCPMP.C !

gracias y saludos a todos !
Título: Re: como configurar pines de entrada en pic16f628a ?
Publicado por: ppyote en 29 de Diciembre de 2010, 23:30:07
a ver a lo mejor esto te ilumine un poco en lo que deseas hacer.... esto es un circuitito que tenia pensado para poner un frontal controlador de los ventiladores del pc