¿Cómo leer el estado de un puerto del PIC que es salida?

Hola a todos, mi consulta es la siguiente el puerto B del pic16f818 lo tengo configurado como SALIDA, como puedo leer el puerto entero para ver los pines que están en 1 y los que estan en 0. Utilizo el programa CCS. Ejemplo: si el puerto B esta así 01011001 leer justamente eso porque quiero guardarlo en la EEPROM ese valor.
 
A ver no entiendo, como para que quieres hacer eso ?? si elpuerto B lo tienes configurado como salida y envias o "sacas" un dato como 01011001 pues ya sabes de que dato se trata, solo guardalo, procesalo o haz lo que quieras con el, ahora si es un dato que viene del exterior capturado por otro puerto y solo lo trasladas al puerto B, pues es igual de sencillo solo guardalo, procesalo etc. No entiendo tu requerimiento.
 
Por defecto el CCS establece el TRIS de cada puerto cada vez que se accede a ellos. Así cuando se escribe algo al puerto lo establece como salida y si se lee el puerto lo establece como entrada.

Para evitar que establecezca entrada o salida a cada rato se puede usar #use fast_io(b) por ejemplo...

Ahora un puerto es un registro (porción de memoria) más y todo lo que se escriba se mantiene, de ese modo se puede recuperar todo lo escrito siempre y cuando se establezca #use fast_io()...

Pero igual que aguevara, no se entiene el motido XD... ya que si escribes es por que ya lo tienes en alguna variable o algo, así que solo bastaria con usar el valor puesta en dicha variable...

Saludos.
 
yo puse un ejemplo de 01011001, pero la realidad es asi, estan todos en 0 al principio tengo un puerto A la entrada analogica con 8 switches. Entonces uno preciona el switch 1 y pones el RB0 a 1 y los demas quedan en 0 en otro momento tocas el switch 3 y pones el RB2 a 1 y si tocas de nuevo el Switch 3 pasa a 0 el RB2. entonces lo que quiero es guardar todo el dato del estado del puerto B en una variable, me explico? Cada switch me pone en 1 o 0 cada pata del Puerto B, yo quiero guardar todo el estado de ese puerto en una variable.
 
la funcion: input_test(pin_xx); con esa funcion puedes leer el estado de la salida de cada pin deseado, luego ya con eso te las tendras que apañar, no conozco una para leer el puerto entero, solo esa para leer pin a pin.
Un saludo
 
Bien en el transcurso del dia voy a probarlo. y comunico. como nose como esta el puerto porque uno lo va habilitando en forma aleatoria segun el switch que uno toca por eso queria leer el estado del mismo



Bueno funciona! El metodo tuyo Limako funciona por ejemplo con un STANDARD_IO(B) lees el pin el estado sin variar lastima que no tenga una funcion cuando es asi el CCS, y el metodo de ByAxel con un FAST_IO(B) y luego el set_tris_B(0x00) osea todo salida, podes utilizar un INPUT_B() y lees todo el puerto. Muchas Gracias Muchachos.
 
Última edición:
Que bueno que te funciono pero... ¿Y por qué no mejor lees el puerto A y guardas el dato?
No andes con cosas de leer una salida que desde antes ya sabes que existe en un puerto de entrada.
Saludos.
 
Última edición por un moderador:
Buenas compañeros estoy comenzando con la pogramacion pic con pic c, tengo una duda como podría leer el estado de un pin del puerto b y luego procesarlo se que lo puedo hacer con la funcion: input_test(pin_xx), pero he googleado bastante y no consigo la forma, de verdad disculpen mi ignorancia en este tema, gracias de ante mano
 

D@rkbytes

Moderador
Usa la función input_state(pin_name)
Por ejemplo, para determinar si el pin RA0 se encuentra en estado lógico 1:
if (input_state(PIN_A0 == 1)
{
// Código
}
O para determinar si se encuentra en estado lógico 0:
if (input_state(PIN_A0 == 0)
{
// Código
}
Cuando se trata de determinar el 1 lógico se puede usar simplemente así:
if (input_state (PIN_A0))
{
// Código
}
Y para determinar si el pin está en 0 se puede usar un operador lógico:
if (!input_state (PIN_A0))
{
// Código
}
También se puede asignar el valor a una variable:
estado = input_state (PIN_A0);

El uso de esta función no altera la predisposición del pin, es decir, si el pin fue declarado como salida, no lo convierte en entrada como lo haría la instrucción input(pin_name)
La instrucción input(pin_name) usa los registro TRISX, por eso no es conveniente su uso en pines declarados como salidas.
Sé que lo puedo hacer con la función: input_test(pin_xx)
Esa función no existe en PIC C Compiler de CCS.
 
D@rkbytes Muchas gracias, ya lo hice y me funcionó perfecto.
D@rkbytes ahora me da este error: expression must evaluate to a constant

Código:
C:
#include <16F628.h>
#FUSES NOWDT                    // No para el Watch Dog Timer
#FUSES INTRC_IO                 // Reloj interno RC Osc, no CLKOUT
#FUSES NOPUT                    // No para el Power Up Timer
#FUSES NOPROTECT                // No para protección de lectura del código
#FUSES NOBROWNOUT               // No para el brownout reset
#FUSES MCLR                     // MCLR habilitado para Reset por botón
#FUSES NOLVP                    // No para programado por bajo voltaje. El Pin se usa como I/O
#FUSES NOCPD                    // No para proteción de lectura de EEprom
#use   delay(clock=4000000)     // Se informa la frecuencia del reloj
#byte  CMCON = 0x1F             // Dirección de memoria de la variable, se saca de la Datasheet
#byte  VRCON = 0x9F             // Dirección de memoria de la variable, se saca de la Datasheet
#bit   INDICADOR2 = 0x1F.7      // Salida del comparador 2 POR RB7
#bit   INDICADOR1 = 0x1F.6      // Salida del comparador 1 POR RB6
#bit   voltaje_alto = 0x06.7           //
#bit   voltaje_bajo = 0x06.6           //
#bit   PRUEBA = 0x06.1         //
#define led_voltaje_alto PIN_B3
#define led_voltaje_bajo PIN_B2
#define led_voltaje_normal PIN_B4
#define estado_voltaje_alto input_state(voltaje_alto)
#define estado_voltaje_bajo input_state(voltaje_bajo)

void main()
{
SET_TRIS_A(0b11111111);      // Todos Input (1 = entrada)
SET_TRIS_B(0b00000000);      // Todos Output (0 = salída)
output_low(pin_B0);
output_low(pin_B1);
output_low(pin_B2);
output_low(pin_B3);

//        76543210
CMCON = 0b00110011;
         // CMCON7   0 C2OUT Comparator Output 2 (Siempre 0, No se programan, se leen).
         // CMCON6   0 C1OUT Comparator Output 1 (Siempre 0, No se programan, se leen).
         // CMCON5   1 C2INV Salida directa Comparador 2, 1 salida directa, 0 salida invertida.
         // CMCON4   1 C1INV Salida directa Comparador 1, 1 salida directa, 0 salida invertida.
         // CMCON3   0 Comparador Input Switch no se usa en este caso de modo 011.
         // CMCON2 ) 0 Ver detalles en Datasheet figura 10-1.
         // CMCON1 ) 1 Modo 011 para 2 comparadores con una sola Vref.
         // CMCON0 ) 1
         // Ver Data Sheet Sección 10                               

//        76543210
VRCON = 0b11101100; 
         // 7 1 VREN Voltaje de Referencia habilitada (1 = SI; 0 = NO)
         // 6 1 VRON salida VREF habilitada (1 = Conecta la salida a RA2)
         // 5 1 VRR Selecciona rango del voltaje de referencia (1 = "Low Range"; 0 = "High Range")
         // 4 0 No se usa (0)
         // 3 1 VR3)
         // 2 1 VR2) Conjunto para voltaje de referencia
         // 1 0 VR1) 1100 para 2.5 Volt en "Low Range"
         // 0 0 VR0)
         // Ver Data Sheet Sección 11                               

while (TRUE)
   {
delay_ms( 500 );      // Retardo de un segundo
   voltaje_alto = INDICADOR2; // Si la salida del comparador2 es 1, se prende el led
   voltaje_bajo = INDICADOR1; // Si la salida del comparador1 es 1, se prende el led
    PRUEBA = voltaje_bajo;
   //if(estado_motor1 == 1 && estado_motor2 == 0)
if(input_state(PRUEBA) == 1 )  //  Si el estado de PRUEBA e igual a 1
{
output_high(led_voltaje_alto);  // Enciende el led alto voltaje
     // Código
}
  }
}
 

D@rkbytes

Moderador
Al definir los registros de la forma en que lo estás haciendo tendrás que modificar varias cosas en tu programa, porque PIC C Compiler no podrá reconocerlos al esperar constantes preestablecidas como parámetro.

Por ejemplo:
#define PRUEBA PIN_B1
Y entonces ya se podrá usar así:
if(input_state(PRUEBA)) // Si el estado de PRUEBA es igual a 1
{
// Código
}
Como este compilador tiene instrucciones y constantes propias tendrás que acostumbrarte a usarlas.
Por ejemplo; tú declaras el registro CMCON, pero en este compilador lo puedes usar con: setup_comparator(mode)
Y las constantes que se pueden usar para el comparador en el PIC16F628A las puedes encontrar en el archivo 16F628A.h
Y son las siguientes:
C:
#define A0_A3_A1_A2  0xfff04
#define A0_A2_A1_A2  0x7ff03
#define NC_NC_A1_A2  0x6ff05
#define NC_NC_NC_NC  0x0ff07
#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

#bit C1OUT = 0x1f.6
#bit C2OUT = 0x1f.7
Este y todos los archivos incluidos en el programa deberán aparecer en el árbol de archivos del proyecto tras una compilación exitosa.
Así que puedes empezar por compilar el programa base para que tengas acceso desde el entorno y no tengas que buscarlo en su carpeta de instalación.

Un programa base sería así:
C:
#include <16F628A.h>
#use delay (INTERNAL = 4 MHz)

void main (void)
{
    
    while (TRUE)
    {
    
    }
}
Obviamente esto compilará sin errores y automáticamente aparecerá el archivo 16F628A.h dentro del árbol de archivos del proyecto.
De esta forma podrás tener acceso directo desde el editor a este archivo para conocerlo.
 
Arriba