SoloCodigo
Programación Específica => Microcontroladores => Mensaje iniciado por: lacoz en Martes 13 de Julio de 2004, 04:47
-
Tengo que hacer 1/x donde x es un numero de 3 byte.
El problema es el siguiente:
Tengo que convertir el periodo a frecuencia (1/x), donde x es el periodo en segundos para que me de en herz. X es un entero de 3 bytes en microsegundos (ej: 200) pero tendria que ser uno de punto flotante (ej: 0.0002) para que la ecuancion 1/0.0002 uSeg = 5000 herz.
No se me ocurre como hacerlo en asm para el pic 16f870.
Desde ya agradesco cualquier ayuda.
-
La coma flotante en ensamblador es muy engorrosa de utilizar. Otra cosa es en lenguaje C.
En ensamblador yo sencillamente trabajo con enteros, realizando la operación 1000/Periodo y trabajo en kHz.
Por ejemplo para hallar la frecuencia correspondiente a 200 us, sería:
1000/200 = 5 kHz.
para valores muy grandes, divido por 1000 el período y trabajo en Hz. Por ejemplo para 200000 us (200 ms) sería 1000/200 = 5 Hz.
El programa se encarga de detectar los valores del Periodo para aplicar la fórmula correspondiente.
Setha.
-
puedes utilizar las "math Routines" de la pagina de microchip y copiar el codigo para realizar una division de un numero de 24 bits con uno de 16 bits (sin signo).
pero tendrias que convertir el numero de 3 bytes (200) a una palabra de 2 bytes almacenando el dato en hexadecimal. ej:
200 (3 bytes) -> 0x00C8 (HEX 2bytes)
generalmente el dato del periodo (T) se obtiene de algún contador (TMR0 u otro), para obtener el dato de la frecuencia, estos contadores son de 8 o 16 bits, lo que permite hacer el calculo de la frecuencia con la formula:
F = 1/T
siendo T es un valor entero que varia entre 0 y 65535 (0xFFFF) donde cada unidad representa microsegundos (asumiendo un XTAL de 4Mhz y un preescaler 1:1) se puede "convertir" el calculo de frecuencia f=1/T de la siguiente forma:
F = 1/ (1e-6 Seg)* TMR0 es lo mismo que decir
F = 10 /(1e-5 Seg) *TMR0 y es lo mismo que decir
F = 1000000/TMR0
con los valores de ejemplo:
5000 = 1/(0.0002 Seg) = 1000000 / 200uS
como 1 millon necesita al menos 20 bits para representarlo (0xF4240) se puede elegir alguna rutina de division de las "Math Routines" para colocar el numerador = 0xF4240 y el denominador = T (en microsegundos).
F= 0xF4240 / (T en uS)
Este metodo lo utilicé en un contador de Rpms y funciona bastante bien, yo elegi la rutina de division de 24bit/16bit sin signo, pero se puede elegir otra de acuerdo al mismo principio.