Numero mayor de 255 en dos byte

Hola buenas,tenía una duda en torno a este tema , a ver si alguien podría resolvermela,gracias de antemano.
La cuestión es la siguiente:
Me encuentro haciendo el proyecto de fin de carrera y para ello me han pasado un programa para un PIC(el 16f877 en concreto) ya hecho,la idea sería que lo analizara y comprobara su funcionamiento.
La cosa es que se necesitan transmitir numeros mayores a 255,para ello lo que hace es separarlo en dos byte(p.e.:un dato que viene de un encoder es 0x1ACD,por lo tanto lo guarda en ENCO1=0xCD y ENCO2=0x1A).Deespues claro necesito tratar ese numero entero y para ello hace una serie de rotaciones a ambos(supongo que será para eso)--> multiplica por 8 la parte baja y divide por 8 la alta.
He buscado información por miles de sitios y no se cómo va la mecanica de estas operaciones.
Concretando un poco sería ¿como es el tratamiento de estos numeros divididos en dos bytes para luego usarlos como era originalmente?
Espero haberme explicado con cierta claridad.
Muchas gracias por vuestra atención.


P.D.:no se si este post está bien colocado en esta sección,disculpadme si no es así.
 
Pope6 dijo:
La cosa es que se necesitan transmitir numeros mayores a 255,para ello lo que hace es separarlo en dos byte(p.e.:un dato que viene de un encoder es 0x1ACD,por lo tanto lo guarda en ENCO1=0xCD y ENCO2=0x1A).Deespues claro necesito tratar ese numero entero y para ello hace una serie de rotaciones a ambos(supongo que será para eso)--> multiplica por 8 la parte baja y divide por 8 la alta.
He buscado información por miles de sitios y no se cómo va la mecanica de estas operaciones.
Concretando un poco sería ¿como es el tratamiento de estos numeros divididos en dos bytes para luego usarlos como era originalmente?

Podés usar una unión, sería algo así:

Código:
typedef union{
	unsigned int Word; //estoy presuponiendo valores positivos (ya que es medida de ángulo)...
	unsigned char Byte[2];
}TWord;

TWord Enco;

Enco.Byte[1]= Recibir(); //se recibe el byte menos significativo
//supongo que hay una rutina recibir que es con la que lees de a 1 byte
Enco.Byte[0]= Recibir();// se recibe el byte más significativo

Después cuando quieras hacer un operación cualquiera con los 16 bits usás Enco.Word
En realidad me surge la duda si sería:

Enco.Byte[1]= Recibir();
Enco.Byte[0]= Recibir();

o

Enco.Byte[0]= Recibir();
Enco.Byte[1]= Recibir();

-----
Bueno, eso lo podés averiguar fácil con el simulador...

Por cierto, estoy presuponiendo que estás usando algún compilador C, para asm tendría que refrescar un poco, avisame si es en assembler.

Saludos
 
si ,estoy en assembler.Debería haberlo puesto en el post inicial,disculpa.Pego el trozo de código a lo que me refiero,son estas rotaciones que hace sobre cada parte y cada una en un sentido que no comprendo:
MOVF ENCO11,W ;|pasamos ENCO11 a PORTA
MOVWF PORTA ;|parte alta encoder 1
MOVWF SALIDAAU ;pasamos ENCO11 a SALIDAAU
RLF SALIDAAU,1 ;\
RLF SALIDAAU,1 ;|multiplicamos x8
RLF SALIDAAU,1 ;/
MOVLW 0X03 ;|
ANDWF SALIDAAU,W ;|forzamos '000000xx'
MOVWF PORTE ;guardamos el resultado en PORTE
MOVF ENCO12,W ;|
MOVWF SALIDAAU ;|pasamos ENCO12 a SALIDAAU
RRF SALIDAAU,1 ;\
RRF SALIDAAU,1 ;|dividimos x8
RRF SALIDAAU,1 ;/
MOVF SALIDAAU,W ;|
MOVWF PORTC ;|pasamos el valor al puerto C
RRF SALIDAAU,W ;dividimos /2
MOVWF PORTB ;pasamos el valor al puerto B

Entiendo que salidaau es una variable temporal sobre la que trabaja,los comentarios son míos ,espero que esté correcto.
Meta, muchas gracias por lo ejercicios aritméticos,aunque no encontré lo que buscaba resultan muy útiles para tenerlos en el futuro y sobre todo comprenderlos ya que viene muy bien explicado el proceso.
Gracias a todos
 
Código:
MOVF ENCO11,W ;|pasamos ENCO11 a PORTA
MOVWF PORTA ;|parte alta encoder 1
MOVWF SALIDAAU ;pasamos ENCO11 a SALIDAAU
RLF SALIDAAU,1 ;\
RLF SALIDAAU,1 ;|multiplicamos x8
RLF SALIDAAU,1 ;/
MOVLW 0X03 ;|
ANDWF SALIDAAU,W ;|forzamos '000000xx'
MOVWF PORTE ;guardamos el resultado en PORTE
En esta parte se copia el valor de ENCO11 a PORTA, y se copian los 2 bits más significativos de ENCO11 a PORTE (hay un 3 RLF porque el se rota a través del carry).
Código:
MOVF ENCO12,W ;|
MOVWF SALIDAAU ;|pasamos ENCO12 a SALIDAAU
RRF SALIDAAU,1 ;\
RRF SALIDAAU,1 ;|dividimos x8
RRF SALIDAAU,1 ;/
MOVF SALIDAAU,W ;|
MOVWF PORTC ;|pasamos el valor al puerto C
RRF SALIDAAU,W ;dividimos /2
MOVWF PORTB ;pasamos el valor al puerto B
Acá se escribe en portc los 5 bits más significativos, y el 6to más significativo al portB.

Lo que está haciendo acá es dar una salida en paralelo (ver imagen adjunta), creía que ibas a tener alguna rutina que leyera por puerto serie.
Las rotaciones están para llevar los bits de ENCO a los pines de salida que uno quiera.

Saludos
 

Adjuntos

  • salida_paralelo_533.gif
    salida_paralelo_533.gif
    7 KB · Visitas: 209
joder joder, no se por qué me habia emperrado con alguna divison...ok ok,o sea que se trata de ir sacandolos por donde le interesa.Ahora me toca descifrar el por qué le interesa hacerlo así jejeje.Joder pues muchas gracias voy a meterme con ello que andaba algo atascado con esta historia.Muchas gracias por la ayuda!

P.D.: seguro que aparezco por aquí con algún tema más,espero que no!
 
una pregunta: entonces que bits se envia al puerto B? entiendo que va asi:
bit enco salida
b7 enco12 rb3
b6 enco12 rb2
b5 enco12 rb1
b4 enco12 rb0
estos bits ya fueron enviados a portc,por qué tambien al portb? y ademas que pasa con b2,b1 y b0?
por lo que parece no se envian a ninguna parte ya que el programa continua asi:
BCF PORTC,5 ;b5 del puerto C a 0
BTFSC PORTC,2 ;test b2 de PORTC y salta si 0(¿?)
GOTO CUENTAS11 ;salto a CUENTAS11
MOVF PORTD,W ;|
MOVWF POSI1 ;|pasa PORTD a POSI1(valores a cargar en los timers?)
BTFSC MOTOR,0 ;test b0 de MOTOR y salta si 0(motor encendido?)
GOTO CUENTAS11 ;salto a CUENTAS11
BSF STATUS,RP0 ;banco 1
BSF SSPCON2,SEN ;activa start en SDA y SCL
BCF STATUS,RP0 ;banco 0
MOVLW 0X02 ;|
MOVWF REGISTRO ;|cargamos 2 a REGISTRO
MOVF POSI1,W ;|
MOVWF DATO
muchas gracias por vuestra atensión
 
Leí tu mensaje hace un tiempo y me olvidé de que había quedado algo pendiente.
Si, me olvidé en mi mensaje anterior de explicar las últimas dos líneas:

RRF SALIDAAU,W ;dividimos /2
MOVWF PORTB ;pasamos el valor al puerto B

Es como vos decís:

una pregunta: entonces que bits se envia al puerto B? entiendo que va asi:
bit enco salida
b7 enco12 rb3
b6 enco12 rb2
b5 enco12 rb1
b4 enco12 rb0

b2 b1 y b0 quedan perdidos (sin salida por ningún puerto)

BCF PORTC,5 ;b5 del puerto C a 0
BTFSC PORTC,2 ;test b2 de PORTC y salta si 0(¿?) -->> si RC2 = 1 ejecuta GOTO CUENTAS11, sino ejecuta MOVF PORTD,W

GOTO CUENTAS11 ;salto a CUENTAS11
MOVF PORTD,W ;|
MOVWF POSI1 ;|pasa PORTD a POSI1(valores a cargar en los timers?) -->> que timers??
BTFSC MOTOR,0 ;test b0 de MOTOR y salta si 0(motor encendido?)
GOTO CUENTAS11 ;salto a CUENTAS11
BSF STATUS,RP0 ;banco 1
BSF SSPCON2,SEN ;activa start en SDA y SCL
BCF STATUS,RP0 ;banco 0
MOVLW 0X02 ;|
MOVWF REGISTRO ;|cargamos 2 a REGISTRO
MOVF POSI1,W ;|
MOVWF DATO

En fin, la última parte está difícil de interpretar, hay que ver si se comentó algo (conocer la estructura, como se usa, para que se usa) al definir las variables MOTOR, REGISTRO, POSI1. Tampoco se puede adivinar que es lo que hace el segmento de código Cuentas11.
 
vale muchas gracias por tu respuesta, mas que nada el problema era por qué mandar los mimos bits a dos puertos y tb q ue algunos se queden sin mandar esa era mi duda mas importante aunque supongo que dependera de lo que este haciendo...Bueno pues nada seguiremos investigando,gracias de nuevo!
 
Atrás
Arriba