# Numero mayor de 255 en dos byte



## Pope6 (Nov 25, 2008)

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í.


----------



## Meta (Nov 25, 2008)

Mira aquí.

http://www.pic16f84a.org/index.php?...itmetica-digital&catid=40:proyectos&Itemid=61

saludo-


----------



## Ardogan (Nov 25, 2008)

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í:


```
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


----------



## Pope6 (Nov 26, 2008)

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


----------



## Ardogan (Nov 26, 2008)

```
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).

```
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


----------



## Pope6 (Nov 28, 2008)

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!


----------



## Pope6 (Dic 5, 2008)

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


----------



## Pope6 (Dic 16, 2008)

alguien puede decirme algo de este tema?


----------



## Ardogan (Dic 16, 2008)

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
> ...



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
> ...



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.


----------



## Pope6 (Dic 16, 2008)

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!


----------

