Autor Tema: ¿como dividir los pines de un puerto en dos?  (Leído 10361 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pachopic

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 209
¿como dividir los pines de un puerto en dos?
« 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!!!!

Desconectado pendexgabo

  • PIC16
  • ***
  • Mensajes: 222
    • www.SosaGabriel.com.ar
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #1 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

Desconectado neocommandos

  • PIC10
  • *
  • Mensajes: 25
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #2 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.

Conectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #3 en: 08 de Octubre de 2004, 00:31:00 »

Puerto = PORTB;      

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

me gusta mas así .        

Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #4 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.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #5 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...

Conectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #6 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 .

Desconectado pachopic

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 209
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #7 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..

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #8 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...

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #9 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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #10 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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #11 en: 09 de Octubre de 2004, 10:56:00 »
Po zi, po do minuto, je, je.

Desconectado pachopic

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 209
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #12 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!!!



Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #13 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.

Desconectado oshow

  • PIC18
  • ****
  • Mensajes: 321
RE: ¿como dividir los pines de un puerto en dos?
« Respuesta #14 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


 

anything