Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

05/05/2016 #1


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?
05/05/2016 #2
Moderador

Avatar de D@rkbytes

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.
Código PHP:
btfss    dato,0
bcf    PORTC
,0
btfsc    dato
,0
bsf    PORTC
,0
btfss    dato
,1
bcf    PORTC
,1
btfsc    dato
,1
bsf    PORTC
,
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.
05/05/2016 #3

Avatar de TRILO-BYTE

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
05/05/2016 #4


:s
ahh disculpen, utilizo CCS

de momento utilizo hexadecimal para los puertos A y binario para el puerto C,
05/05/2016 #5
Moderador

Avatar de D@rkbytes

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.
05/05/2016 #6

Avatar de Scooter

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.
05/05/2016 #7

Avatar de TRILO-BYTE

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:



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
05/05/2016 #8

Avatar de ruben90

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.
}
}
05/05/2016 #9

Avatar de TRILO-BYTE

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
06/05/2016 #10

Avatar de ruben90

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.
06/05/2016 #11

Avatar de TRILO-BYTE

recuerda que RA4 es a colector abierto.

si no pones una resistencia puede que no funcione como uno quiere
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.