PIC 16F627. Puerto A

#1
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
 
#2
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...
 
#4
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
 
#5
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....
 
#6
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);
}
 
#7
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:
#8
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:
#9
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

#10
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...
 
#12
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
 
#13
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);
}
 
#14
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....
 

Temas similares

Arriba