TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pachopic en 06 de Octubre de 2004, 20:10:00

Título: ¿como dividir los pines de un puerto en dos?
Publicado por: pachopic en 06 de Octubre de 2004, 20:10:00
HOLA A TODOS:

como podria dividir el puerto en dos grupos de pines, por ej el puertob, los primeros RB0-RB3 como entrada para una variable A y el resto RB4-RB7, como entrada para otra variable B, o dividirlo para que tome los 4bits mas significativos y los 4bits menos significativos independientemente?

GRACIAS!!!!
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: pendexgabo en 06 de Octubre de 2004, 21:17:00
proba con esto!!

#byte PORTB = 6


struct bits {
unsigned char A:4;
unsigned char B:4;
};

union a {
struct bits b;
unsgined char puerto;
} ;

main () {

union a datos;

datos.puerto= PORTB; //copio el contenido del puerto b


// datos.b.A  es la parte baja del puerto
//datos.b.B es la parte alta del puerto


}

creo que es asi en todo caso que alguien me corrija
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: neocommandos en 07 de Octubre de 2004, 21:26:00
   Hola,
mi pregunta es, no podria hacerse lo mismo haciendo esto:


#byte PORTB = 6

char parte_alta;
char parte_baja;


parte_alta=PORTB & 0xF0;
parte_baja=PORTB & 0x0F;


Corregidme si me equivoco.
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: Sispic en 08 de Octubre de 2004, 00:31:00

Puerto = PORTB;      

parte_baja=Puerto & 0x0F;  
parte_alta=(Puerto >> 4) & 0x0F;    

me gusta mas así .        
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: gfp en 08 de Octubre de 2004, 13:40:00
Considero que la idea es buscar el codigo mas eficiente y tener en cuenta el espacio en memoria, recuerden que el peor aliado en la programacion en C para microcontroladores es la memoria ROM.
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: Nocturno en 08 de Octubre de 2004, 16:40:00
Escrito originalmente por Sispic

Puerto = PORTB;      

parte_baja=Puerto & 0x0F;  
parte_alta=(Puerto >> 4) & 0x0F;    

me gusta mas así .        

¿Porqué te gusta más así Sisco?, seguro que tiene una explicación pero no lo pillo...
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: Sispic en 09 de Octubre de 2004, 00:37:00
Codigo:

Puerto = 0x93;
parte_baja=Puerto & 0x0F;         /*resultado parte_baja  0x03  */
parte_alta=(Puerto >> 4) & 0x0F;  /*resultado parte_alta  0x09  */


y si los unimos otra vez

Puerto = ((parte_alta << 4) & 0xF0) | parte_baja;  /*resultado 0x93  */



Tambien se podria probar lo que comenta pendexgabo .
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: pachopic en 09 de Octubre de 2004, 08:28:00
HOLA A TODOS:

he realizado un pequeño programa pero no realiza ninguna accion, ¿Alguien podria decirme que estoy haciendo mal?:

Codigo:

#include <16F84A.h>              
#fuses HS,NOWDT,NOPROTECT      
#use  delay(clock=4000000)           // XTAL OSCILADOR EXTERNO
#byte porta=5                                // DIRECION DE  DE PORTA
#byte portb=6                                // DIRECION DE  DE PORTB

char a,b,c;

void main(void)
  {
  port_b_pullups(false);        
  set_tris_b(0b11111111);     // puertob como entradas
  set_tris_a(0b00000000);     // puertoa como salidas
   
///////////////////REALIZA LA RESTA DE a Y b////////////////////
  while (true)
  {
       a=portb & 0xF0;
       b=portb & 0x0F;
       c=a-b;
       porta=c;
   }
  }



GRACIAS A TODOS..

EXITOS..
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: Nocturno en 09 de Octubre de 2004, 10:13:00
¿Qué circuito tienes conectado?. Deduzco que en PORTA tienes leds para poder ver el resultado pero, ¿qué tienes en PORTB?.
Igualmente deduzco que resistencias combinadas con interruptores a masa y/o +5V para generar los correspondientes 0 y 1.

De todas formas, son hipótesis sin cuya confirmación va a ser complicado ayudarte.

Por otra parte, aunque obvio, si en PORTB todo son 0, la salida del programa será 0. Y no es que no haga nada, es que la respuesta es 0...
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: pocher en 09 de Octubre de 2004, 10:13:00
El programa está bien, lo único que el PIC no es el apropiado para visualizar el resultado ya que este tiene 8 bits y no podrás verlo en el PORTA.

Si quieres verlo funcionar correctamente usa un 16F876 y usa por ejemplo, el PORTB como entradas y el PORTC como salidas.

Un saludo
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: Nocturno en 09 de Octubre de 2004, 10:15:00
Más cosas: acabo de darme cuenta que es un 16F84.
¿Sabes que ese PORTA sólo tiene 5 bits y que el quinto (RA4) es de colector abierto?

Editado: jejeje, te me has adelantadado Pocher
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: pocher en 09 de Octubre de 2004, 10:56:00
Po zi, po do minuto, je, je.
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: pachopic en 10 de Octubre de 2004, 08:20:00
HOLA A TODOS:

muchachos tienen razon...lo realice con un 16f877 y con las resistencias pull-up de portb activadas,...mostrando el resultado el portc..y funciona pero el resultado de la resta no es binario.....
en realidad, lo que quiero es restar en un formato de 4 bits dos numeros de una cifra y que la resta de el  resultado en un formato de 4 bits ya sea en bcd  o en base 8 (octal)..ya sea para visualizar el numero en 4  leds o un display de 7 segmentos.....

¿como podria hacer que el resultado de la resta sea de  3 bits y uno para el signo si el resultado es negativo? ..
¿o transformar el resultado a codigo bcd?

he aqui el codigo:

Codigo:
#include <16F877A.h>              // DISPOSITIVO A PROGRAMAR

/////////////////declaracion de variables y configuracion///////////////////////

#fuses HS,NOWDT,NOPROTECT        // FUSIBLES DE CONFIGURACION
#use  delay(clock=4000000)        // XTAL OSCILADOR EXTERNO 4MHZ
#byte portc=7                    // DIRECION DE  DE PORTA
#byte portb=6                    // DIRECION DE  DE PORTB

 signed char a,b,c;
/////////////////////////////// PROGRAMA PRINCIPAL//////////////////////////////
void main(void)
  {
  port_b_pullups(true);      // HABILITAMOS RESISTENCIAS PULL-UP                           //
  set_tris_b(0b11111111);     // puertob como entradas
  set_tris_c(0b00000000);     // puertoa como salidas
 
///////////////////REALIZA LA RESTA DE a Y b////////////////////
  while (true)
  {
       a=portb & 0b11110000;  //parte alta de portb es el numero a de 4bits
       b=portb & 0b00001111;  // parte baja de portb es el numero b de 4bits
       c=a-b;                 // resto parte alta y parte baja de portb
       portc=c;               // muestro el resultado en portc
     
   }
  }


GRACIAS A TODOS POR SU AYUDA

EXITOS!!!


Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: Nocturno en 10 de Octubre de 2004, 10:35:00
Tal y como lo tienes montado, si el número a es mayor o igual al número b, el resultado c siempre te cabrá en 4 bits.
Estas tres variables tendrán un valor entre 0 y 15 siempre positivo.

El problema puede venir cuando quieras representar algún número negativo, de manera que puedas restar a-b siendo b mayor que a.

No se me ocurre cómo ayudarte, pero creo que si sólo quieres utilizar 4 bits, tu rango de números iría de -8 a +7. Con este rango de números habrá operaciones que no se pueden representar, como 15-1=14 o 1-15=-14.

No sé si alguien más habituado al ASM puede comentar aquí alguna idea para resolverlo porque no se me ocurre nada más.
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: oshow en 10 de Octubre de 2004, 10:41:00
Hola, no se si es porque hoy estoy espesito o que... pero no se me ocurre como podrías expresar el resultado de una resta de dos numeros de 4 bits en tres bits, seguro que se puede hacer? yo creo que no.... o sino en tu caso, imagina que en la parte alta tienes 0 y en la parte baja tienes 15 e intenta restarlo, si consigues expresar ese resultado en tres bits y uno para el signo dime como lo haces..... en todo caso lo que seguro se puede hacer seria expresar el resultado en 4 bits y en todo caso un quinto bit o bit de carry para expresar el signo.

Pero si lo que quieres es hacer una conversión de binario a bcd, olvidate de bits y rollos, que estás en c, por ejemplo para saber si el numero es menor de cero, pones un if....


if (resultado < 0 )
   

Con esto identificas si el resultado es menor de cero, para poner el signo en el display.

Luego hallas el valor absoluto del numero con la funcion abs() (sale documentada en la ayuda), y  luego ya le harás la conversión de bcd a binario al resultado que devuelve la funcion abs(c) para sacarlo por los dos displays.

Creo que si buscas por el foro encontrarás alguna rutina para pasar de binario a bcd, yo ahora mismo no dispongo de ninguna.

Un saludo.

PD: No se si me pillas, si normalmente me cuesta explicarme y hacerme entender, imaginate cuando estoy de resaca.... jejejej
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: pachopic en 11 de Octubre de 2004, 00:39:00
HOLA A TODOS :

la resta es entre dos numeros de 4 bits, pero debo visualizar el resultado negativo tambien, intente lo que dices con abs() y no funcionó:
Codigo:

#include <16F877A.h>     // DISPOSITIVO A PROGRAMAR
#include <stdlib.h>

/////////////////declaracion de variables y configuracion///////////////////////

#fuses HS,NOWDT,NOPROTECT        // FUSIBLES DE CONFIGURACION
#use  delay(clock=4000000)        // XTAL OSCILADOR EXTERNO 4MHZ              // DIRECION DE  DE PORTC
#byte portb=6
#byte portc=7
#byte portd=8
                 
signed int a,b,c;
/////////////////////////////// PROGRAMA PRINCIPAL//////////////////////////////
 void main(void)
  {
   port_b_pullups(true);      // HABILITAMOS RESISTENCIAS PULL-UP                           //
   set_tris_b(0b00001111);     // 4pines de portb como entradas
   set_tris_c(0b00000000);     // portc todo salidas
   set_tris_d(0b00001111);     // 4pines de portd como entradas
///////////////////REALIZA LA RESTA DE a Y b////////////////////
  while (true)
  {
       a=portb;                //   a= valor de portb
       b=portd;                //   b=valor de portd
       c=a-b;                  //   c= a la resta de ay b
       if (c<0)                //    si c es negativo
       portc=abs(c);           //   obtenga su val abs
       else
       portc=c;                //   si no es negativo muestre el num
       
       
   }
  }



deberia visualizarse el numero negativo como positivo ,en 4leds pero no lo hace....

GRACIAS

EXITOS...
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: oshow en 11 de Octubre de 2004, 03:23:00
Hola, mira, he estado simulando tu programa en el proteus y funciona perfectamente....no entiendo si es esto lo que tu realmente quieres.... si no es así, hazlo saber ....

Ahora mismo tu programa está bien, solo tienes que hacer unos pequeños cambios....

Codigo:

#include <16F877A.h>     // DISPOSITIVO A PROGRAMAR
#include <stdlib.h>

/////////////////declaracion de variables y configuracion///////////////////////

#fuses HS,NOWDT,NOPROTECT        // FUSIBLES DE CONFIGURACION
#use  delay(clock=4000000)        // XTAL OSCILADOR EXTERNO 4MHZ              // DIRECION DE  DE PORTC
#byte portb=6
#byte portc=7
#byte portd=8
                 
signed int a,b,c;
/////////////////////////////// PROGRAMA PRINCIPAL//////////////////////////////
 void main(void)
  {
   //port_b_pullups(true);      // HABILITAMOS RESISTENCIAS PULL-UP                           //
   set_tris_b(0b00001111);     // 4pines de portb como entradas
   set_tris_c(0b00000000);     // portc todo salidas
   set_tris_d(0b00001111);     // 4pines de portd como entradas
///////////////////REALIZA LA RESTA DE a Y b////////////////////
  while (true)
  {
       a=portb & 0x0F;                //   a= valor de portb
       b=portd & 0x0F;                //   b=valor de portd
       c=a-b;                  //   c= a la resta de ay b
       if (c<0)                //    si c es negativo
         portc=abs(c);
//aqui podrias poner una asignacion a un pin libre
//para marcar el signo...
       else
         portc=c;                //   si no es negativo muestre el num
       
       
   }
  }




Ahora mismo este codigo hace una resta de la parte baja del puerto B con la parte baja del puerto d y lo representa en la parte baja del puerto C, lo único que te queda es hacer una asignación a un bit cualquiera de los que te sobren, para representar el signo.
Porque ahora mismo tanto si restas 9-6 ó 6-9 te representará el numero 3 (por poner un ejemplo de resta cualquiera).

Ayer lo lei mal y te pido disculpas por ello, yo pense que ibas a restar un numero del uno al 15 pero veo que solo quieres restar una cifra de un digito....se me fue la pelota.... pero mejor,así es más fácil...

Usas el proteus?, si quieres te envío la simulación..... para que lo compruebes..... (yo tengo la version 6.5)

Repito, si no es esto lo que quieres, o ves que todavia no te convence el programa, nos lo dices, a ver si podemos hacer algo...

Un saludo.
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: Nocturno en 11 de Octubre de 2004, 04:06:00
Aún así, si quieres representar el 9 vas a necesitar más de 3 bits, porque con tres bits se puede llegar hasta el 7...
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: oshow en 11 de Octubre de 2004, 04:41:00
Efectivamente Nocturno, representar el 9 con tres bits, es harto dificil, pero según tiene el programa, usa 4 bits, siempre usa los 4 bits mas bajos de los puertos.... entonces no tendra problemas para representar el 9, pero ahora tiene el problema del signo, como lo va a representar....eso depnde de él, desde luego si solo va a usar los pines que tiene ahora (le sobran unos cuantos...), lo tiene bastante fácil..., pero como mínimo necesitará un bit más para representarlo....

Un saludo.
Título: RE: ¿como dividir los pines de un puerto en dos?
Publicado por: oshow en 11 de Octubre de 2004, 05:10:00
Eso es lo que intentaba dar a entender, pero quizas ha sido culpa mia el decir "harto dificil", en lugar de decir tajantamente que no se podia, pero bueno como ya l había comentado en algún mensaje mas arriba la impsoibilidad de hacerlo pos no le dí importancia....

Para que quede claro, el programa ahora mismo representa de 0 a 9 (4 bits, los bits de menor peso del portc) y le falta representar el signo (quinto bit) que tendrá que decidir en que pin lo va a señalizar.

Saludos.
Título: Re: ¿como dividir los pines de un puerto en dos?
Publicado por: vasconinicolas en 02 de Diciembre de 2008, 09:53:37
Hola todos!. Mi consulta es parecida a la primera del hilo pero la diferencia es que yo pretendo dividir el puerto como salidas.
Quiero hacer:

output_b(parte_alta)
o
output_b(parte_baja)

y que sólamente se modifiquen los 4 bits correspondientes.
Alguna idea? Gracias
Título: Re: ¿como dividir los pines de un puerto en dos?
Publicado por: vasconinicolas en 02 de Diciembre de 2008, 11:36:41
Me respondo.
Lo resolvi asi

char motor_1, motor_2

         motor_1=el valor deseado;
         motor_2=el valor deseado;
         output_b(motor_1 | (motor_2 << 4));

Vamos a ver como se comporta..
salduos!