Como puedo segmentar el puerto de un microcontrolador

Hola, quisiera segmentar el puerto del microcontrolador (877a o cualquier otro) de la siguiente manera, los tres primeros bits menos significativos como enteros de 0 a 7, los tres siguientes de igual manera del 0 al 7 (pero para otro propósito) y los dos restantes como bits individuales. En otras palabras me gustaría tener dos puertos de 3 bits c/u en el puerto C. Como podría hacerlo?
Solo he encontrado la forma de usar el puerto individualmente output_high(pin_c3)o en su totalidad output_c(i)y si en la misma sentencia quiero usar otra parte del puerto C no logro hacerlo.
 

D@rkbytes

Moderador
No entiendo bien lo que intentas hacer y sería mejor que explicaras eso.
Por lo que entiendo, puedes usar enmascaramiento de bits.
 
Hay vaias maneras de hacerlo pero creo que lo que buscas es algo asi...
PORTC= 0; // Set all pins l
y puedes usar variables y corrimientos >> u operadores.
 
No veo ninguna pega, pero ninguna.
Lo programas así y ya está.
Variable A, mueves sus tres bits a sus tres pines
Variable B lo mismo
Variable C lo mismo

Si no sabes mover bits eso es lo que tienes que aprender.
Bit a bit, por máscaras, máscaras y desplazamientos... Todo eso que parece que no conoces o que no has relacionado que ese es su uso.
 
Usá estructuras.

Código:
struct {int8 c0:3 ,
             c1:3 ,
             c2:1 ,
             c3:1 ; } port;
#byte port = getenv("SFR:PORTC")
.............................
.............................

void main(void){
.............................
.............................
    port.c0 = 5  ;
    port.c1 = 4  ;
    port.c2 = 1  ;
    port.c3 = FALSE  ;
.............................
.............................
}
 
Última edición:
Agradezco sus respuestas. Lo de las máscaras y desplazamientos no lo he comprendido.
He utilizado la respuesta de Eduardo y me ha funcionado para lo que intentaba hacer con algunas modificaciones.
Con la activación de la entrada RC3 realizo un barrido de 0 a 7 (RC0, RC1, RC2); con la entrada RC7 activo un barrido de 0 a 4 (RC4, RC5);
Quiero que mi salida RC6 cambie de estado cada vez que realice el for, esa parte no me funcionó, tal vez estoy usando mal el output_toggle(port.c3);
C:
#include <main02.h>

struct {int8 c0:3 ,
             c1:1 ,
             c2:2 ,
             c3:1 ,
             c4:1 ; } port;
#byte port = getenv("SFR:pORTC")

int i;
int x;
int j;
int y;

void main()
{
set_tris_c(0b10001000);

   while(TRUE)
   {
   x = input(pin_c3);   
   y = input(pin_c7);

      if (x==1)
      {
       for (i = 0; i <=7;i++)
            {
            port.c0 = i  ;
            delay_ms(500);                           
            }     
         }

     if (y==1)
     {
      for (j = 0; j <=4; j++)
         {
         port.c2 = j  ;
         delay_ms(500);       
         output_toggle(port.c3);
         }
      }
   }
}
 

Adjuntos

  • manejo de puerto.png
    manejo de puerto.png
    46.9 KB · Visitas: 4
....
Con la activación de la entrada RC3 realizo un barrido de 0 a 7 (RC0, RC1, RC2);

OK

con la entrada RC7 activo un barrido de 0 a 4 (RC4, RC5);
Con 2 bits solo podés contar de 0 a 3

Quiero que mi salida RC6 cambie de estado cada vez que realice el for, esa parte no me funcionó, tal vez estoy usando mal el output_toggle(port.c3);

output_toggle(pin) : pin es una constante definida en el .h correspondiente al micro.

Hacé: output_toggle(PIN_C6) ;

También puede ser: port.c3= !port.c3 ;
 
Una máscara con un or enciende esos bits
Una máscara con una and apaga el resto de bits
Una máscara con una xor invierte esos bits

Rotar rota, desplaza los bits, equivale a multiplicas por dos o dividir por dos ya que el binario está en base dos.

Lo que te queda es hacer unos programita y experimentar con eso.

Si quieres que los tres bits más bajos pasen a ser los tres más altos haces:
Número and 00000111
Rota resultado <<<<< cinco veces

El resultado es que si metes el byte xxxxxabc sale abc00000

Y así...
 
Arriba