PIC 16F627. Puerto A

Hola,

He realizado un diseño con el PIC 16F627, y ya no puedo cambiar de micro. Me encuentro con el problema que al querer usar el puerto A del micro, al ponerlo en pullup, este micro no me permite realizar tal acción(no estuve nada agil cuando decidí por este micro). Realizo las pruebas con una salida del puerto B y sin problema, porque lo que voy buscando es tener varios pulsadores conectados al micro (pulsadores conectados a masa) y dependiendo de cual pulse, el programa realizará diferentes acciones.
Gracias y un saludo
 
El 16f627 por defecto tiene encendido el modulo de comparadores... o sea que las entradas del puerto A son analogas... lo que tienes que hacer es asignar al registro CmCOn el valor de 7(111 binario) y se establecen las entradas como Digitales... puede ser ese tu problema...

seria bueno que anexaras diagrama y el codigo que estas empleando...
 
gracias por las contestaciones.
Lo que tengo la duda, es con que instrucción en C (CCS) cambio el registro CMCON para que el puerto A funcion como puerto digital de salida
 
Pusiste esta instruccion?...

setup_comparator(NC_NC_NC_NC);

seria el equivalente a definir el registro cmcon...

insisto... si pones el codigo que estas utilizando dejamos de estar adivinando y es mas rapido....
 
Hola Lubeck,
Este es el código que estoy realizando:

#include "Z:\Desarrollos\Señal Polivalente\software\polivalente\señal polivalente.h"

//#include <16F627.h>

//#fuses XT,NOWDT,NOPROTECT,PUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use fast_io(a) ///// Use función fast_io ()

//Definición salidas
#define PB_0 48 // Puerto B 0 salida
#define PB_1 49 // Puerto B 1 salida
#define PB_2 50 // Puerto B 2 salida
#define PB_3 51 // Puerto B 3 salida
#define PB_4 52 // Puerto B 4 salida
#define PB_5 53 // Puerto B 5 salida
#define PB_6 54 // Puerto B 6 salida
#define PB_7 55 // Puerto B 7 salida
#define PA_0 40 // Puerto A 4 entrada
#define PA_1 41 // Puerto A 4 entrada
#define PA_2 42 // Puerto A 4 entrada
#define PA_3 43 // Puerto A 4 entrada

void main()
{
output_low(PB_0); //apaga el led
output_low(PB_1); //apaga el led
output_low(PB_2); //apaga el led
output_low(PB_3); //apaga el led
output_low(PB_4); //apaga el led
output_low(PB_5); //apaga el led
output_low(PB_6); //apaga el led
output_low(PB_7); //apaga el led
int i=0;
// setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
CMCON = 0x1; --> aquí quiero configurar el registro del puerto A como entrada digital.
set_tris_b(0xC0);
//set_tris_a(0xFF);
port_b_pullups(true);
// TODO: USER CODE!!

do
{
if (!input(PB_7))
{
i++;
delay_ms(600);
}

if(i==0)
{
//apagar LED
output_low(PB_0);
output_low(PB_1);
output_low(PB_2);
output_low(PB_3);
output_low(PB_4);
output_low(PB_5);
output_low(PB_6);
output_low(PB_7);

//enciende el 60 + orla
output_high(PB_0); //enciende el común
output_high(PB_1); //enciende el 6
output_high(PB_3); //enciende el 0 + orla
port_b_pullups(true);
}

if(i==1)
{
//apagar LED
output_low(PB_0);
output_low(PB_1);
output_low(PB_2);
output_low(PB_3);
output_low(PB_4);
output_low(PB_5);
output_low(PB_6);
output_low(PB_7);

// enciende el 80 + orla
output_high(PB_0); //enciende el común
output_high(PB_2); //enciende el 8
output_high(PB_3); //enciende el 0 + orla
port_b_pullups(true);
}

if(i==2)
{
//apagar LED
output_low(PB_0);
output_low(PB_1);
output_low(PB_2);
output_low(PB_3),
output_low(PB_4);
output_low(PB_5);
output_low(PB_6);
output_low(PB_7);

// enciende obra y triangulo
output_high(PB_4); //enciende el muñeco
output_high(PB_5); //enciende el triángulo
port_b_pullups(true);
}

if(i==3)
{
//apagar LED
output_low(PB_0);
output_low(PB_1);
output_low(PB_2);
output_low(PB_3);
output_low(PB_4);
output_low(PB_5);
output_low(PB_6);
output_low(PB_7);

// enciende la señal de exclamación y triangulo
output_high(PB_6); //enciende exclamación
output_high(PB_5); //enciende el triángulo
port_b_pullups(true);
}

if(i==4)
{i=0;}
}while(1);
}
 
No revice todo pero ponlo asi para lo de los comparadores....
Código:
#include "Z:\Desarrollos\Señal Polivalente\software\polivalente\señal polivalente.h"

//#include <16F627.h>

//#fuses XT,NOWDT,NOPROTECT,PUT //ordenes para el programador 
#use delay (clock=4000000) //Fosc=4Mhz 
#use fast_io(a) ///// Use función fast_io () 

//Definición salidas
#define PB_0 48 // Puerto B 0 salida
#define PB_1 49 // Puerto B 1 salida
#define PB_2 50 // Puerto B 2 salida
#define PB_3 51 // Puerto B 3 salida
#define PB_4 52 // Puerto B 4 salida
#define PB_5 53 // Puerto B 5 salida
#define PB_6 54 // Puerto B 6 salida
#define PB_7 55 // Puerto B 7 salida
#define PA_0 40 // Puerto A 4 entrada
#define PA_1 41 // Puerto A 4 entrada
#define PA_2 42 // Puerto A 4 entrada
#define PA_3 43 // Puerto A 4 entrada

void main()
{
output_low(PB_0); //apaga el led 
output_low(PB_1); //apaga el led
output_low(PB_2); //apaga el led
output_low(PB_3); //apaga el led
output_low(PB_4); //apaga el led
output_low(PB_5); //apaga el led 
output_low(PB_6); //apaga el led 
output_low(PB_7); //apaga el led
int i=0;
// setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

[B]//Ponle esto ....
setup_comparator(nc_nc_nc_nc);[/B]

//CMCON = 0x1; --> aquí quiero configurar el registro del puerto A como entrada digital.
set_tris_b(0xC0); 
//set_tris_a(0xFF); 
port_b_pullups(true);
// TODO: USER CODE!!

do
{ 
if (!input(PB_7))
{
i++;
delay_ms(600);
}

if(i==0)
{
//apagar LED
output_low(PB_0);
output_low(PB_1);
output_low(PB_2);
output_low(PB_3);
output_low(PB_4);
output_low(PB_5);
output_low(PB_6);
output_low(PB_7);

//enciende el 60 + orla
output_high(PB_0); //enciende el común
output_high(PB_1); //enciende el 6
output_high(PB_3); //enciende el 0 + orla 
port_b_pullups(true); 
}

if(i==1)
{
//apagar LED
output_low(PB_0);
output_low(PB_1);
output_low(PB_2);
output_low(PB_3);
output_low(PB_4);
output_low(PB_5);
output_low(PB_6);
output_low(PB_7);

// enciende el 80 + orla
output_high(PB_0); //enciende el común
output_high(PB_2); //enciende el 8
output_high(PB_3); //enciende el 0 + orla
port_b_pullups(true); 
}

if(i==2)
{
//apagar LED
output_low(PB_0);
output_low(PB_1);
output_low(PB_2);
output_low(PB_3),
output_low(PB_4);
output_low(PB_5);
output_low(PB_6);
output_low(PB_7);

// enciende obra y triangulo
output_high(PB_4); //enciende el muñeco
output_high(PB_5); //enciende el triángulo
port_b_pullups(true); 
}

if(i==3)
{
//apagar LED
output_low(PB_0);
output_low(PB_1);
output_low(PB_2);
output_low(PB_3);
output_low(PB_4);
output_low(PB_5);
output_low(PB_6);
output_low(PB_7);

// enciende la señal de exclamación y triangulo
output_high(PB_6); //enciende exclamación
output_high(PB_5); //enciende el triángulo
port_b_pullups(true); 
}

if(i==4)
{i=0;}
}while(1);
}

si te fijas en la libreria 16f627 tiene esto

// Constants used in setup_comparator() are:
#define A0_A3_A1_A2 0xfff04
#define A0_A2_A1_A2 0x7ff03
#define NC_NC_A1_A2 0x6ff05
#define NC_NC_NC_NC 0x0ff07 esto es 7 o 111 en binario
#define A0_VR_A1_VR 0x3ff02
#define A3_VR_A2_VR 0xcff0A
#define A0_A2_A1_A2_OUT_ON_A3_A4 0x7e706
#define A3_A2_A1_A2 0xeff09
#define CP1_INVERT 0x00010
#define CP2_INVERT 0x00020
 
Última edición:
el pic c no tengo tampoco ni pajoleta.. pero cuando definiste CMCON = 0x1, no seria CMCON = 0...
asecas... aun asi si pones CMCON = 1 los pones en la configuracion, Tres entradas multiplexadas a dos comparadores. pero para desactivar completamente alas entradas analogicas tendras que desacticar algunas funciones especiales mas..

miento.. CMCON = 7 para apagar los comparadores o CMCON = %00000111 (porlomnos para picbasic al poner % introduces el alor en binario "es mas facil para mirarlo")

un saludo



y porcierto si aces el programa asi

output_low(PB_0);
output_low(PB_1);
output_low(PB_2);
output_low(PB_3);
output_low(PB_4);
output_low(PB_5);
output_low(PB_6);
output_low(PB_7);

lo que aces es ocupar con muchas instrucciones para poner simplemente el puerto b a 0.
usa mas comandos tris y port directamente para reducir el programa
 
Última edición:
Hola,

He realizado lo que me habeis indicado. Y cuando pongo a masa una de las entradas del puerto A, el programa no responde, creo que m falta alguna instrucción o algo en el software. Dado que lo realizo con el puerto B y funciona correctamente.

Os pongo el esquema y el software.
 

Adjuntos

  • software.txt
    3.4 KB · Visitas: 8
  • esquema electrónico.jpg
    esquema electrónico.jpg
    246.4 KB · Visitas: 17
yo puse este codigo...

Código:
// #include "Z:\Desarrollos\Señal Polivalente\software\polivalente\señal polivalente.h"
#include <16F627.h>

#fuses XT,NOWDT,NOPROTECT,PUT //ordenes para el programador 
#use delay (clock=4000000) //Fosc=4Mhz 
#use fast_io(a) ///// Use función fast_io () 

//Definición salidas
#define PB_0 48 // Puerto B 0 salida
#define PB_1 49 // Puerto B 1 salida
#define PB_2 50 // Puerto B 2 salida
#define PB_3 51 // Puerto B 3 salida
#define PB_4 52 // Puerto B 4 salida
#define PB_5 53 // Puerto B 5 salida
#define PB_6 54 // Puerto B 6 salida
#define PB_7 55 // Puerto B 7 salida
#define PA_0 40 // Puerto A 4 entrada
#define PA_1 41 // Puerto A 4 entrada
#define PA_2 42 // Puerto A 4 entrada
#define PA_3 43 // Puerto A 4 entrada

void main()
{
         output_low(PB_0); //apaga el led    
         output_low(PB_1); //apaga el led
         output_low(PB_2); //apaga el led
         output_low(PB_3); //apaga el led
         output_low(PB_4); //apaga el led
         output_low(PB_5); //apaga el led 
         output_low(PB_6); //apaga el led 
         output_low(PB_7); //apaga el led
//int i=0;
 //  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 
setup_comparator(nc_nc_nc_nc);
set_tris_b(0x00); 
set_tris_a(0xFF); 

   // TODO: USER CODE!!

while(true)
 {               
          if(!input(PA_0))
          {
          //apagar LED
            output_low(PB_0);
            output_low(PB_1);
            output_low(PB_2);
            output_low(PB_3);
            output_low(PB_4);
            output_low(PB_5);
            output_low(PB_6);
            output_low(PB_7);
            
          //enciende el 60 + orla
            output_high(PB_0); //enciende el común
            output_high(PB_1); //enciende el 6
            output_high(PB_3); //enciende el 0 + orla     
          }
          
          if(!input(PA_1))
          {
          //apagar LED
            output_low(PB_0);
            output_low(PB_1);
            output_low(PB_2);
            output_low(PB_3);
            output_low(PB_4);
            output_low(PB_5);
            output_low(PB_6);
            output_low(PB_7);
          
            // enciende el 80 + orla
            output_high(PB_0); //enciende el común
            output_high(PB_2); //enciende el 8
            output_high(PB_3); //enciende el 0 + orla
           }
         
          if(!input(PA_2))
           {
            //apagar LED
            output_low(PB_0);
            output_low(PB_1);
            output_low(PB_2);
            output_low(PB_3),
            output_low(PB_4);
            output_low(PB_5);
            output_low(PB_6);
            output_low(PB_7);
            
               // enciende obra y triangulo
            output_high(PB_4); //enciende el muñeco
            output_high(PB_5); //enciende el triángulo
         //   port_b_pullups(true); 
           }
            
           if(!input(PA_3))
           {
           //apagar LED
            output_low(PB_0);
            output_low(PB_1);
            output_low(PB_2);
            output_low(PB_3);
            output_low(PB_4);
            output_low(PB_5);
            output_low(PB_6);
            output_low(PB_7);
                        
            // enciende la señal de exclamación y triangulo
            output_high(PB_6); //enciende exclamación 
            output_high(PB_5); //enciende el triángulo
           }

 };
}

y funciona....

ten en cuenta que segun tu diseño y codigo tienes que tener una resistencia pullup para cada entrada del puerto A.... por si acaso... de 4k7 estaria bien...
 
mmm. se me olvidaba , también utiliza algún algoritmo de anti rebote para los pulsadores.... dale una buscada al tema...

:unsure: Para evitar un rebote en los pulsadores lo unico que se tiene que hacer es que, cuando en tu rutina se detecte que se presiono un boton mandar llamar a una subrutina que genere un retardo de unos 40000 ms u 600ms y al terminar regresar a donde se quedo el programa, esta subrutina se puede utilizar para todos los botones que tengas.:apreton:

Este el algoritmo al que se refiere lubeck bueno eso creo!!! jejeje Saludos
 
Hola

gracias por todas las aportaciones, pero no me funciona. He cmabiado el software para ir mirando los fallos y no encuentro la solución. Uso una resistencia de pull down en el puerto A y el software no realiza la función que indico.

#include "Z:\DPTO. TECNICO\Desarrollos\Señal Polivalente\software\polivalente\señal polivalente.h"

//#include <16F627.h>

//#fuses XT,NOWDT,NOPROTECT,PUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use fast_io(a) ///// Use función fast_io ()

//Definición salidas
#define PB_0 48 // Puerto B 0 salida
#define PB_1 49 // Puerto B 1 salida
#define PB_2 50 // Puerto B 2 salida
#define PB_3 51 // Puerto B 3 salida
#define PB_4 52 // Puerto B 4 salida
#define PB_5 53 // Puerto B 5 salida
#define PB_6 54 // Puerto B 6 salida
#define PB_7 55 // Puerto B 7 salida
#define PA_0 40 // Puerto A 0 entrada
#define PA_1 41 // Puerto A 1 entrada
#define PA_2 42 // Puerto A 2 entrada
#define PA_3 43 // Puerto A 3 entrada
#define PA_4 43 // Puerto A 4 entrada
#byte port_b=0x06 // direccion memoria puerto B
#byte port_a=0x05 // direccion memoria puerto A

void main()
{

setup_comparator(nc_nc_nc_nc); // se configura el puerto A como I/O digital.
set_tris_b(0x00); //puerto B se configura como salida
set_tris_a(0xFF); // puerto A se configura como entradas.
port_b=0; //inicializamos el puerto B a "0"
port_a=0; //inicializamos el puerto A a "0"

// TODO: USER CODE!!
//PA_4 tiene una resistencia de pull down con un LDR
do
{
if(input(PA_4))
{
//apagar LED
port_b=0; //inicializamos el puerto B a "0"
//enciende el 60 + orla
output_high(PB_0); //enciende el común
output_high(PB_1); //enciende el 6
output_high(PB_3); //enciende el 0 + orla
}
else port_b=0;

}while(1);
}
 
Bueno... de que funciona, funciona pero los programas no hacen milagros...

mira.... aqui cometiste un error

Código:
#define PA_2 42 // Puerto A 2 entrada
#define PA_3 43 // Puerto A 3 entrada
[B][COLOR="Red"]#define PA_4 43 // Puerto A 4 entrada[/COLOR][/B]
#byte port_b=0x06 // direccion memoria puerto B
#byte port_a=0x05 // direccion memoria puerto A

el valor debe ser 44, ahora no se como esta ahora tu esquema, quizas tengas otro error de diseño pero el puerto A de que esta trabajando de 10, lo esta....
 
Atrás
Arriba