Autor Tema: No puedo configurar el puerto B en el 18F2550  (Leído 3443 veces)

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

Desconectado Ernie-

  • PIC12
  • **
  • Mensajes: 56
No puedo configurar el puerto B en el 18F2550
« en: 08 de Julio de 2010, 14:30:48 »
Buenas, creo que es un poco tonta la pregunta pero no me doy cuenta de qué es lo que se me está pasando por alto (podría ser la configuración de los puertos).
El caso es que he puesto un pulsador en la patilla RC0 del 18F2550 de modo que cuando se pulsa, conecta un terminal que tiene libre a GND.

Al pulsarlo lo que se supone que debería hacer, es encender un LED que hay conectado en la patilla RB7 del PIC.

He probado a encender el LED sin más, directamente desde una instrucción: output_high(PIN_B7); lo cual funciona perfectamente... Así que significa que el problema es que no tengo ni idea de como usar las interrupciones para hacer que detecte cuando he usado el pulsador.

Pondré aquí parte del código a ver si alguien puede decirme en qué estoy fallando o explicarme cómo funcionan(Lo del internal clock no entiendo cómo funciona y cuándo decidir cuándo usarlo o cuándo no).

Código: C
  1. while(1){
  2.                         delay_ms(1000);
  3.  
  4.                         if(!input(PIN_C0) && var==0) // pulsamos el pulsador??
  5.                         {
  6.                                 output_high(PIN_B7); // encendemos el led
  7.                                 var=1;
  8.                         }
  9.                         if(!input(PIN_C0) && var==1)   //volvemos a pulsar??
  10.                         {
  11.                                 output_low(PIN_B7);           // apagamos el led
  12.                                 var=0;
  13.                         }
  14.                 }//end while
  15. }// main

Un saludo =)
« Última modificación: 10 de Julio de 2010, 12:51:39 por Ernie- »
La mitad del mundo tiene algo que decir, pero no puede; la otra mitad no tiene nada que decir, pero no calla. Robert Lee Frost.

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: No puedo configurar el puerto B en el 18F2550
« Respuesta #1 en: 08 de Julio de 2010, 16:35:36 »
te falta la configuración de los fuses (bytes de configuración) podes mirar el archivo de cabecera del micro (.h) que los enumera y estudiar cada uno del datasheet. Debido a que por ejemplo a tu código le falta el NOPBADEN, por defecto el portb se inicializa como analógico en este micro y demás verduras. A leer el datasheet como si fuera la biblia!  :D , también allí vas a encontrar el funcionamiento de los relojes internos. Después que comprendas el funcionamiento si recomendaría utilizar las funcioncitas de CCS para ahorrar tiempo.... y hasta ahí nomas... CCS tiene muy variadas librerías  :mrgreen:
LAS MALVINAS SON ARGENTINAS!

Desconectado Ernie-

  • PIC12
  • **
  • Mensajes: 56
Re: No puedo configurar el puerto B en el 18F2550
« Respuesta #2 en: 08 de Julio de 2010, 17:18:39 »
Ese es el problema, que tiene demasiadas librerías jajaja. En fín, me iré leyendo el datasheet. Ahora conseguí que atendiera al puerto, pero no funciona el pulsador (como si no existiese  :D)
Esto de migrar a Linux trae sus dolores de cabeza  :mrgreen:

Gracias y un saludo =)
« Última modificación: 10 de Julio de 2010, 12:52:16 por Ernie- »
La mitad del mundo tiene algo que decir, pero no puede; la otra mitad no tiene nada que decir, pero no calla. Robert Lee Frost.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: No puedo configurar el puerto B en el 18F2550
« Respuesta #3 en: 09 de Julio de 2010, 02:49:52 »
¿Ese programa te ha compilado sin errores?, veo que usas "var" y no está definida en ningún sitio.

Desconectado Ernie-

  • PIC12
  • **
  • Mensajes: 56
Re: No puedo configurar el puerto B en el 18F2550
« Respuesta #4 en: 09 de Julio de 2010, 10:40:28 »
Sí nocturno, compila sin errores, en realidad el código es más largo. Sólo he puesto la parte que me da problemas para no marear.

« Última modificación: 09 de Julio de 2010, 17:46:59 por Ernie- »
La mitad del mundo tiene algo que decir, pero no puede; la otra mitad no tiene nada que decir, pero no calla. Robert Lee Frost.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: No puedo configurar el puerto B en el 18F2550
« Respuesta #5 en: 09 de Julio de 2010, 12:23:41 »
Lo que te pasa es que cuando pulsas el botón se cumplen las dos condiciones:
- la primera, porque Var es 0 y está pulsado.
- la segunda, porque Var es 1 y sigue pulsado. Por muy rápido que quites el dedo, el PIC ya habrá llegado a esta instrucción

Y para colmo le pones un delay de 1s., con lo cual, siempre se dará la situación de que quites el dedo durante ese delay.

Te recomiendo que quites ese delay y que añadas esto a tu programa, justo detrás de cada cambio de estado del PIN_B7:
while (!input(PIN_C0));

Por cierto, ¿tienes una pullup en RC0?. Si no la tienes, la entrada no alternará entre 0 y 1 cuando liberes el pulsador, y por lo tanto no leerás ningún cambio de estado.

Desconectado Ernie-

  • PIC12
  • **
  • Mensajes: 56
Re: No puedo configurar el puerto B en el 18F2550
« Respuesta #6 en: 09 de Julio de 2010, 17:46:30 »
Gracias por contestar, sí que le he puesto una pullup. Más bien es que no sé cómo enfocar el código del programa. Nunca se me había ocurrido trabajar de esa forma con un PIC, siempre lo hacía todo de forma automática sin necesidad de atender a pulsadores.

El código me ha quedado así:

Código: C
  1. while(TRUE){
  2.        
  3.                 if( !bit_test(PORTC,0) && (encendido==0) ) // pulsamos el pulsador??
  4.                 {
  5.                         while (!input(PIN_C0));
  6.                         output_high(PIN_B7); // encendemos el led
  7.                         encendido=1;
  8.                 }
  9.                 else if( bit_test(PORTC,0) )   //volvemos a pulsar??
  10.                 {
  11.                         while (!input(PIN_C0));
  12.                         output_low(PIN_B7);           // apagamos el led
  13.                         encendido=0;
  14.                 }
  15.         }//end while
  16.  
  17. }// main

A ver si me podéis lanzar una ayudita para ver con claridad lo que tengo que hacer con el código este..

Un saludo.
« Última modificación: 10 de Julio de 2010, 12:50:03 por Ernie- »
La mitad del mundo tiene algo que decir, pero no puede; la otra mitad no tiene nada que decir, pero no calla. Robert Lee Frost.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: No puedo configurar el puerto B en el 18F2550
« Respuesta #7 en: 10 de Julio de 2010, 02:08:26 »
¿No has probado lo que te dije?.
Me refería a esto:

      
Código: C
  1. while(1){
  2.  
  3.                         if(!input(PIN_C0) && var==0) // pulsamos el pulsador??
  4.                         {
  5.                                 output_high(PIN_B7); // encendemos el led
  6.                                 while(!input(PIN_C0));
  7.                                 var=1;
  8.                         };
  9.                         if(!input(PIN_C0) && var==1)   //volvemos a pulsar??
  10.                         {
  11.                                 output_low(PIN_B7);           // apagamos el led
  12.                                 while(!input(PIN_C0));
  13.                                 var=0;
  14.                         }
  15.                 }//end while

Desconectado Ernie-

  • PIC12
  • **
  • Mensajes: 56
Re: No puedo configurar el puerto B en el 18F2550
« Respuesta #8 en: 10 de Julio de 2010, 12:31:16 »
Lo probé de otra forma y ahora con la forma que me has indicado. El LED se pone a parpadear y no hace caso cuando pulso el interruptor en ambos casos. De todas formas lo he conseguido solucionar. Lo pongo aquí tal como me ha quedado:

Código: C
  1. while(TRUE){
  2.                 if( !bit_test(PORTC,0) && (encendido==0) ) // pulsamos el pulsador??
  3.                 {
  4.                         while (!input(PIN_C0)){ encendido=1;
  5.                         output_high(PIN_B7);} // encendemos el led
  6.                 }
  7.                 if( bit_test(PORTC,0) && (encendido==1) )   //volvemos a pulsar??
  8.                 {
  9.                         while (!input(PIN_C0)){ encendido=0;
  10.                         output_low(PIN_B7);}           // apagamos el led
  11.                 }
  12.         }//end while

Gracias por las ayudas =)

Un saludo.
« Última modificación: 10 de Julio de 2010, 16:29:16 por Ernie- »
La mitad del mundo tiene algo que decir, pero no puede; la otra mitad no tiene nada que decir, pero no calla. Robert Lee Frost.


 

anything