Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

03/11/2013 #1

Avatar de juanma2468

Como obtener un unico numero a partir de dos registros
Hola, estoy trabajando con el PIC 16F628 en el programa CCS, y configure el timer1 que es de 16 bits, y quiero obtener un unico numero a partir de los registros TRM1H y TRM1L, o sea el numero que yo quiero no es la suma de los registros, sino el numero que representa ambos registros como si fuera un unico numero de 16 bits, he intentado aplicar el operado OR binario pero no resulto, alguien tiene idea de como obtener dicho numero?, desde ya muchas gracias.
03/11/2013 #2

Avatar de ByAxel

Hola. una simple...
Rotas o desplazas 8 veces el registro H en una variable de 16 bits (parte alta) y luego con AND o suma, agregas el registro L a la misma variable de 16bits (parte baja).

Saludos
03/11/2013 #3

Avatar de Gudino Roberto duberlin

Hola Amigo, bueno agrego un ejemplo, a la correcta opinion del compañero ByAxel, seria algo asi:

declaras variables
long cuenta=0;
declaras TMR1H y TMR1L
luego
cuenta=TMR1H; // Registro alto de TMR1
cuenta=(cuenta<<8)+TMR1L; // Registro bajo de TMR1

Ahora cuenta sera igual a TMR1.
04/11/2013 #4

Avatar de juanma2468

Bien, gracias por responder. Yo habia pensado eso, pero pense que quisas habia ya alguna forma mas directa o sencilla de realizar dicha operacion, tal ves con algun tipo de funcion preestablecida.
Bueno teniendo en cuenta lo que me han dicho hice lo siguien:
Primero declaro las posiciones de los registros
#byte T1CON = 0x10
#byte TMR1L = 0x0E
#byte TMR1H = 0x0F
Luego indico como va a trabajar el timer1 y declaro las variables para armar el numero de 16 bits
T1CON = t1_internal;
int16 Alto;
int16 Bajo;
int i;
Por ultimo realizo un ciclo for infinito y dentro de el hago otro ciclo for para rotar 8 veces el registro TMR1H para luego sumarlo al TMR1L y mostrarlo en un LCD.
for(;; )
{
Alto=TMR1H;
for (i=0;i<8;i++)
{
rotate_left(&Alto,1);
}
printf(lcd_putc, "\fTIMER %Lu",Alto+Bajo);
delay_ms(100);
}

Pues no he podido lograr lo que yo queria, aun me sigue mostrando en pantalla un numero entre 0 y 255, cuando tendria que ser entre 0 y 65535. Se que lo que me va a mostrar en el LCD no son numeros consecutivos porque el timer1 corre mucho mas rapido de lo que yo lo estoy mostrando, pero en algun momento tendria que poder ver un numero mayor que 255, y no lo he podido visualizar, espero sugerencias o si ven algun error en el codigo, gracias.
04/11/2013 #5

Avatar de ByAxel

Hola
No es por nada pero el CCS mal acostumbra a los programadores...
- El método que propuse no requiere bucles por que el resultado lo hace en una sola línea de código. Como dijo Gudino, basta con Resultado = (TMR1H << 8) && TMR1L; es lo máximo y genera poco código.

Sucede que el CCS no lo acepta tal cual (almenos la versión que tengo) y si quiero que sea en una línea se necesita poner:

Código:
Resulta = ((unsigned int16)(TMR1H) << 8) + (unsigned int16)TMR1L;
para que lo considere de 16bits. es decir que necesita que los tipos sean iguales.

Código:
#byte TMR1H = getenv("SFR:TMR1H")
#byte TMR1L = getenv("SFR:TMR1L")

unsigned int16 Resulta; 

void main()
{
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);      //104 ms overflow
   lcd_init();

   while(TRUE)
   {
      lcd_putc("\f");
      Resulta = ((unsigned int16)(TMR1H) << 8) + (unsigned int16)TMR1L; 
      printf(lcd_putc, "Resulta = %Lu", Resulta);
      delay_ms(200);
   }
}
- Ahora recurriendo al CCS hay una función llamada "get_timer1()" que al parecer básicamente hace lo mismo...

Saludos.
04/11/2013 #6

Avatar de LaElectronicaMeOdia

hay una funcion BBB (buena, bonita y barata) en ccs

Código:
long x;
int hi,lo;
x = make16(hi,lo);
a partir de dos variables de 8bits con make16 se obtiene una de 16bits(long)

creo que tambien hay un make32 para 32bits (no recuerdo)
04/11/2013 #7

Avatar de juanma2468

Escelentes respuestas amigos, ambas muy utiles, probare ambas para ver cual me genera menor codigo, saludos.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.