Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: davidsena en 23 de Junio de 2017, 21:40:36
Título: como habilitar bits mas significativos
Publicado por: davidsena en 23 de Junio de 2017, 21:40:36
buenas noches , como estan, necesito un poco de ayuda , tengo una pregunta de un taller que estoy realizando de programación en ccs el cual no eh podido resolver consiste en que por el puerto A introduciré un dato si ese dato es igual a 5 pone el bits 0 del puerto B en 1 y muestra el dato en los bits rb7 hasta rb4 y si el dato no es 5 pone el bit 2 en 1 y debe mostrar el dato que se esta introduciendo. por favor quien me pueda ayudar se lo agradecería la verdad no se como hacer.
Código: CSS
[font=times new roman][/font]
Título: Re:como habilitar bits mas significativos
Publicado por: KILLERJC en 23 de Junio de 2017, 22:53:39
Voy a suponer que en el puerto A llega siempre los bits de 0 al 3. Para leerlos lo voy a hacer con
Código: C
numero = input_a();
Como esto me toma TODOS los bits, y yo quiero solamente los bits del 0 al 3, entonces voy a hacerlo pasar por una AND que me filtre solo los bits que yo quiero.
Código: C
numero = input_a()&0xF;
Genial ya tengo mi numero. Solo tengo que hacer 2 cosas, La priemra es determinar si numero es mayor o igual a 5.
Código: C
if(numero >=5)
{
//Aca lo es
}
else
{
//Aca no
}
Y luego debo poner esos bits en Rb4 a Rb7, lo que no debo hacer es cambiar los valores de Rb0 a Rb3 Pensemos como los podemos hacer... deberia mover los bits del 0-3 al 4-7, hay 2 formas, una es usar la instruccion SWAP que hace eso, y la otra es rotar el valor a la izquierda 4 veces.
Si hago :
Código: C
output_b((numero <<4));
Pero el puerto B cambiaria todo el valor incluso lo que antes hicimos, lo que podemos hacer es poner primero esto y luego lo otro
Código: C
while(1)
{
numero = input_a()&0xF;
output_b((numero <<4));
if(numero >=5)
{
//Aca lo es
}
else
{
//Aca no
}
}
Solo falta rellenar unas instrucciones mas. Nada mas
Título: Re:como habilitar bits mas significativos
Publicado por: davidsena en 24 de Junio de 2017, 16:07:23
super muchas gracias , me sirvió mucho , solo que ahora no se como hacer para que el led que activo con la OR no palpite tanto , lo hice así :
Título: Re:como habilitar bits mas significativos
Publicado por: KILLERJC en 24 de Junio de 2017, 16:10:51
Es por que el output_b cambia todo el puerto, entonces al poner primero el numero desplazado te pone los bits RB0 a Rb3 en 0, y luego si los activas, por eso se ve que se enciende y apaga continuamente. Lo podes hacer asi:
Código: C
#include <16f84a.h>
#fuses xt,nowdt
#use delay (clock=4000000)
#use standard_io(A)
#use standard_io(B)
int numero ;
void main(){
while(true)
{
numero = input_a()&0xF;
if(numero ==5)
{
output_b(numero <<4|0x01);
}
else
{
output_b(numero <<4|0x04);
}
}
}
Título: Re:como habilitar bits mas significativos
Publicado por: davidsena en 24 de Junio de 2017, 16:18:59
si ahora si funciono correcto, muchísimas gracias por ayudarme
Título: Re:como habilitar bits mas significativos
Publicado por: davidsena en 25 de Junio de 2017, 18:41:51
me pidieron realizar ese mismo ejercicio con una AND eso es posible ?
Título: Re:como habilitar bits mas significativos
Publicado por: KILLERJC en 25 de Junio de 2017, 19:43:58
Una sola AND para todo? o una AND para que parte?
Título: Re:como habilitar bits mas significativos
Publicado por: davidsena en 27 de Junio de 2017, 00:14:49
para todo
Título: Re:como habilitar bits mas significativos
Publicado por: KILLERJC en 27 de Junio de 2017, 13:38:40
Una AND sola para todo es imposible, me refiero a hacer todo eso con una sola operacion.
Si o si tenes que rotar debido a que los bits de entrada del PORTA son del 3 al 0, y vos debes ponerlo en el 7 al 4. Podes hacer 2 cosas, rotarla o utilizar la funcion swap ( que intercambia los nibbles en el byte ).
Ahora debemos asegurarnos que cuando es 5 active RB0 y sino RB2.
Supongamos por el momento que los valor del PORTA sigue en los bits del 3 al 0. Todas estas posibilidades tenemos:
Si utilizo una AND lo unico que hago es dejar pasar los 1, y deberia dejar pasar el 1 del RB0 o que corresponde al RB2, el problema esta que para RB0 hay 3 numeros que me darian un resultado positivo ( 5, 3 y 1 ) y para el 1 de RB2 serian 2 resultado positivos (5 y 4 ) Asi que no podria discriminar CUAL es con solo una AND.
En fin, es imposible con un sola AND, a no ser que falte algun dato mas que no se tiene en cuenta. Se imposibilita ya simplemente porque necesitas rotar o usar el swap, ya esto invalida lo de usar una sola AND.
Título: Re:como habilitar bits mas significativos
Publicado por: davidsena en 28 de Junio de 2017, 18:18:14
es correcto , eso que me explicaste el instructor nos estaba probando , pero yo no sabia así que le dije eso que tu me explicaste y me dijo que efectivamente era eso
Título: Re:como habilitar bits mas significativos
Publicado por: KILLERJC en 28 de Junio de 2017, 18:56:06
es correcto , eso que me explicaste el instructor nos estaba probando , pero yo no sabia así que le dije eso que tu me explicaste y me dijo que efectivamente era eso
Lo importante no es que lo repitas sin entenderlo, sino que entiendas como hacerlo y las cosas que podes hacer con las funciones, aprendiendo como es que las operaciones funcionan y un poco de imaginacion vas a encontrar la solucion a cualqueira de tus problemas.