Unificar puertos A y C para matriz de led en PIC18F2550

Buenas. Pues como dice el título.
Hice una matriz de 8x8 donde los puertos B están conectados a las bases de los transistores y en los puertos A van 6 filas de leds y los 2 restantes con C0 y C1.

El problema es que a la hora de tabular para codificar, no puedo manejar hexadecimal ya que son puertos diferentes, a diferencia de los puertos B, que como el PIC trae perfectamente 8 de ellos, los puedo manejar como hexadecimal.

Mi pregunta es, ¿hay alguna forma de que me reconozca como puertos "A6" y "A7" a los puertos C0 y C1?
 
Última edición por un moderador:
Antes que nada, vamos a hablar de bits o de pines, ya que un puerto en la mayoría de los casos, es de 8 bits.

No mencionas en que lenguaje trabajas, pero es sencillo y un ejemplo en ensamblador sería de ésta forma:
Partamos de una variable de 8 bits.
PHP:
btfss    dato,0
bcf    PORTC,0
btfsc    dato,0
bsf    PORTC,0
btfss    dato,1
bcf    PORTC,1
btfsc    dato,1
bsf    PORTC,1
Lo que hace ese fragmento es muy sencillo.
Se comparan los bits de la variable "dato" y se coloca un 1 o un 0 en el bit del puerto que se requiera.

En otro lenguaje como Basic o C, eso obviamente es más sencillo de entender, pero esa es la idea.
 
Última edición:
yo pino que aunque tengas pines diferentes digamos

A0 A1 A2 A3 C0 C1 B0 B1 tenemos 8 pines diferentes de 3 puertos diferentes

¿que podemos hacer?

1.- mandar todo al diablo y usar un registro de corrimiento y mandar directamente un byte en hexadecimal

2.- mapear los pines para mandar un byte y ese byte se descomponga en bits.

para eso debemos enmascarar el puerto

digamos que todo va a ir a una variable que le llamare puertoX

unsigned char puertoX;
unsigned char aux;

luego al puerto A enviar el primer Nibble de byte de mi variable puertoX pero para eso usare una variable auxiliar

aux = puertoX & 0x0F; //cargamos aux con la mitad del byte usando una AND logica

output_a(aux); // al puerto A lo cargo con el nibble "4 bits"

para el puerto C0 y C1 podria ser asi:

aux = puertoX>>2 & 0x03; //cargamos aux con 2 bits del byte usando una AND logica y rotando 2 veces a la izquierda

output_c(aux); // al puerto C lo cargo con 2bits


y asi puedes usar bits directamente pero se va a complicar la cosa

no se si lo estoy haciendo bien pero si me equivoco regañenme
 
Hablar de números en decimal, hexadecimal, binario, etc. Para un microcontrolador es lo mismo.
Lo que cambia es la forma de escribirlos en el editor.

Y así como lo menciona TRYLO-BYTE es la forma más común de crear una matriz.
Trabajar con registros de desplazamiento que requieren pocos pines para controlar varias filas y columnas.
 
Pues haz una función que lea un valor de 8 bits y copie bit a bit al puerto que corresponda. En lugar de escribir en el puerto, llamas a esta función.
 
fijate una vez en el tianguis me encontre una matriz enorme de leds filas rojas y filas verdes

bueno el hardware era muy simple para las filaseran 8 bits brutos de entrada y para las columnas eran 74HC595 y 74HC164

la matriz en si tenia un conetor para 5v y GND otro para los 8 bits y otro para LATCH DATA CLOCK
muy simple la parte controladora era un Z80 cpu y no me metere en aquellos detalles.

algo muy parecido a esto:

MatrixCircuit-550x311.jpg


lo que se hace es en una matricita de caracteres envias una parte de tu arreglo a todos los registros de corrimiento en un tiempo 1

en el tiempo 2 haces un barrido y asi hasta acabar con todos las filas
 
Me imagino que los bits A6 y A7 tienen un oscilador externo. En este caso tienes solo 6 bits del puerto A y quieres utilizar los voy C0 y C1 para completar los 8 bits.
Esto se logra creando una variable unsigned int que corresponden a 8 bits (n = 255) y desplazar los 2 últimos bits del puerto A al puerto C. El corrimiento lo haces con "<<" o ">>", solo debes probar.

El resultado sería así:

Código:
unsigned int variable = 0;
void main() {
//declara los puertos A y C cómo saludas.
while(1) {
//declara valor de la variable.
PORTA = variable;
PORTC = variable >> 6; //desplaza los 2 bits más significativos al puerto C.
}
}
 
Última edición:
si es basicamente eso digamos que del mismo puerto C hay otras cosas ejemplo

led verde y led rojo en C2 y C3 hay que definirlos

como habia dicho en mi ejemplo raro:

unsigned char puertoX; // imaginemos un 10101111
unsigned char aux;

para el puerto C0 y C1 podria ser asi:

aux = puertoX>>2 & 0x03; //cargamos aux con 2 bits del byte usando una AND logica y rotando 2 veces a la izquierda es decir 00101011 rotados y enmascarados 00000011

output_c(led_rojo | led_verde | aux); // al puerto C con OR logica y nadie se vera afectado


eso si yo recomiendo para ahorrar patillaje usar no se un 4017 para hacer el barrido y varios regsitros como el 74HC595 para hacer el desplazamiento.

asi nos quedarian los siguientes pines:

1.- LATCH
2.- DATA
3.- CLOCK
4.-CLK para el 4017
5.-RESET para el 4017

solo 5 patitas del micro gastadas
 
Última edición:
Probé mi ejemplo con un PIC16F887 y funciona pero por una extraña razón (más bien no se como) con el PIC18F2550 el PIN RA4 siempre esta en estado bajo (0) y ya configure varios registros.
 
Atrás
Arriba