# Hacer una división con ASM del PIC 16F84A



## Meta (Jul 10, 2008)

Hola:

Me imagino que hacer una división en ASM para el pic 16F84A es un poco engorroso ya que hay que hasta guardar el resto en una variable, y el resultado en otra.

15 / 3 = 5 (Resto es igual a 0).

¿Alguien sabe hacer o poner un ejemplo en ASM sobre una división con comas?

Ejemplo:

0.15 / 3 = 0.05

¿A qué ya es otra realidad?

Un cordial saludos.


----------



## CUSCO (Jul 10, 2008)

yo hace un par de meses hice una calculadora cientifica con un lcd 
y un teclado matricial pero con el c18 y creanme que lo mas dificil de 
toda la calculadora fue  programar la interfaz para que el usuario digite lo numeros 
y se le entregue los resultados y todo lo demas.

si no es necesario hacerlo en ensamblador yo lo haria en c.
por que operaciones matematicas con enteros y aun en ensamblador
son manejables incluso con numeros de 16 bits, pero en punto flotante 
es complicado pero seria una buena experiencia para aquel que lo haga 
ya que aprenderia mucho hasta pronto y suerte.


----------



## Chico3001 (Jul 10, 2008)

Meta dijo:
			
		

> Hola:
> 
> Me imagino que hacer una división en ASM para el pic 16F84A es un poco engorroso ya que hay que hasta guardar el resto en una variable, y el resultado en otra.
> 
> ...



En micros de 8 bits no me meto en broncas.. multiplico todo por 10, 100 o 1000 para eliminar las decimales y aplico una division estandar, posteriormente si lo muestro en un display solo enciendo el punto decimal adecuado... de otra manera tienes que meter calculos de punto flotante y es un broncon... especialmente con un pic

para divisiones de 16 y 32 bits en el pic, Microchip tiene por alli una nota de aplicacion de formulas matematicas en ensamblador.. solo busca la division de 32/32 (con o sin signo), pegala y listo..  toma en cuenta que va a tardar muuuucho tiempo.. segun recuerdo cuando la implemente tardaba algo asi como 1mS en realizarse.... 


AN526 Utility Math Routines
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011000


----------



## Meta (Jul 11, 2008)

CUSCO dijo:
			
		

> si no es necesario hacerlo en ensamblador yo lo haria en c.



_Ya decía yo con qué tranquilidad has dicho que lo has hecho._ Se que no es necesario hacerlo con ASM, pero lo digo *para aprender*. Cuanto más aprenda manejar estas cosas, mejor que mejor y irás suelto en el futuro con asm que muchas veces lo pide por todas partes.

Bueno, veo que muy fácil no es.
*
Chico3001*, gracias por el links.

Los demás pueden seguir opinando.


----------



## Javier Rambaldo (Jul 11, 2008)

En las Application Notes de Microchip encontrarás muchas rutinas en assembler para manejo matemático en punto flotante.
Chico3001 te dio una, pero hay muchas mas...

Ahora yo opino como Chico3001, multiplica x100 o x1000, dependiendo de la precisión que desees y aparte de ser mas fácil, las rutinas son mucho mas rápidas que el punto flotante.

El punto flotante usalo donde necesites hacer -por ejemplo- funciones trigonométricas. Aunque para esto también se pueden usar enteros.


----------



## Toño (Jul 11, 2008)

Hola amigos, aprovecho este hilo para hacer una pregunta sobre ASM en el pic16f84a;
lo que pasa es que cuando quiero llamar a una subrutina mediante una libreria de subrutinas y me mandan dos errores cuando lo ejecuto, los errores son los siguientes:

Error[113]   D:\PIC16F84\SUBRUTINAS_02.ASM 23 : Symbol not previously defined (BIN_a_BCD)
Error[105]   D:\PIC16F84\SUBRUTINAS_02.ASM 27 : Cannot open file (Include File "BIN_BCD.INC" not found)

me podrian decir cual es mi posible error

de antemano gracias


----------



## Chico3001 (Jul 11, 2008)

el compilador no encuentra el archivo llamado BIN_BCD.INC, lo mas seguro es que el directorio donde lo tienes no este declarado en los directorios de busqueda de compilacion o incluso no exista el archivo... 

Intenta añadiendo el archivo a la carpeta de proyecto o dentro de la carpeta includes del mplab (creo que asi se llama) para que lo compile

El primer error me imagino que esta ligado al segundo.. estoy suponiendo que tienes una funcion BIN_a_BCD dentro del archivo BINC_BCD.INC


----------



## Toño (Jul 11, 2008)

gracias chico3001...el problema era que yo creaba una subcarpeta dentro de la carpeta de trabajo, solo elimine esa carpeta y ya funciona...


----------



## Meta (Jul 11, 2008)

Mejor dicho, pon la subrutina dentro del mismo archivo.


----------



## asherar (Jul 13, 2008)

Hola. Esta es para los PIC-istas "Assembleros".

Les acerco una consulta por un tema de programación que me trae mal. 
Hace un tiempo tuve que trabajar excediendo los 2k de la memoria del 16F873/6/6A. 
Entonces creí que había superado el problema con el uso de "pagesel". Pero ahora he 
vuelto a tener el mismo problema, y no le encuentro la vuelta. 

Por un lado usando el MPLAB al ir debuggeando pasa por lugares de algunos archivos 
"inc" donde no hay instrucciones (!) o por donde sólo hay comentarios (!). 
Es como que el "debugger" se perdiera. 
¿ Puede ser problema de la memoria caché de windows ? (XP)

Pero lo peor es que cada tanto los "return" me mandan el PCL al vector de reset. 
El debugger desgraciado me pierde la página de memoria de programa. 
Y eso no es el debugger, porque al programar el micro también se "cuelga". 

A sugerencia de un amigo estoy pasando todo a C, que arregla eso de taquito (?), pero es 
un bajón. Son "kilometros" de código en ASM que, salvo por eso, probando cada parte por 
separado andaba lo más bien. 
Y por desgracia no puedo reducir el tamaño del programa. He tratado de convertir lo más 
posible "macros" a "rutina", pero por ejemplo los "banksel" son muchos e inevitables. 
Cuando pongo todo junto llego casi hasta 3k y pico. Eso sin cargar los bitmaps para el 
display gráfico. 

La pregunta es si alguien conoce alguna forma de resolver ese tema. 

La idea que pienso poner a prueba ahora es separar el código en "grueso" de modo que 
cuando ejecute una parte se limite a la región 0-2k y en otro tramo se limite a la región 
2k-4k, por ejemplo. Eso reduciría las instrucciones que cruzan la frontera entre bloques de 2k. 
El problema que veo con eso son las interrupciones, que ocurren con el PCL en cualquier lado 
y saltan al vector 0x04. 

Antes de ponerme a modificar todos los códigos de vuelta, cosa que 
seguro me llevará horas: ¿ les parece que resulte ? 

Un saludo !


----------



## Chico3001 (Jul 13, 2008)

Por eso odio el PIC... la paginacion en esos micros es la muerte, y fue la razon por la cual deje de usarlos y me cambie a los Atmel, Freescale y Texas.... 

Intenta revisar si estas colocando bien la direccion en el registro PCLATH, segun recuerdo una parte va en PC y la otra en PCLATH

Los return no creo que sean el problema por que todos los bits de PC son empujados al stack al hacer llamados de interrupciones o de subrutinas... 

La idea que dices de dividir el programa en 2 partes es correcta y recuerdo que tambien termine haciendola... pero sinceramente para programas largos mejor usa un ATMEL.. y esos tienen la ventaja de poderse programar bien en C

Saludos...


----------



## asherar (Jul 14, 2008)

Gracias Chico3001 ... 

Ese martillito rojo de tu avatar me está dando una idea !


----------



## Meta (Jul 14, 2008)

Chico3001 dijo:
			
		

> sinceramente para *programas largos mejor usa un ATMEL*.. y esos tienen la ventaja de poderse programar bien en C
> 
> Saludos...



¿Desde cuándo?

Otra cosa, ¿alguien ha completado la memoria de 1k completa del 16F84A de su propio código que ha hecho uno mismo en ASM?


----------



## Chico3001 (Jul 14, 2008)

Desde cuando los programo? tengo 2 años usandolos...


----------



## Meta (Jul 14, 2008)

Chico3001 dijo:
			
		

> Desde cuando los programo? tengo 2 años usandolos...



Se serio. Si fueran tan buenos y fácil como dices, los AVR de Atmel arrasaría a los PIC de Microchip en un plis plas, incluido documentación por todas partes. 

Tus palabras dicen una cosa, los hecho dicen otra. ¿Qué creer, las mil cosas que nos dicen o una cosa que se muestra?

Saludos.


----------



## asherar (Jul 14, 2008)

Che, esa discusión tiene ya un foro abierto y todavía no se han puesto de acuerdo. 

Yo aporto al tema original algo que estuve mascullando en estos días.
La división mediante operaciones elementales en assembler.
Parte de algo elemental pero apunta al problema planteado.

Sirvanse comentar plis!


----------



## eidtech (Jul 14, 2008)

Meta dijo:
			
		

> Chico3001 dijo:
> 
> 
> 
> ...




Como se ve que no te tocado batallar con los "infernal banks" de PIC... perdon "internal banks"


----------



## Meta (Jul 14, 2008)

Lo voy a analizar de arriba abajo y deja ver si lo saco en un ejemplo real para el 16F84A al menos yo, otros que lo hagan en ASM con AVR om uC que sea.

Muchas gracias.


...


----------



## Chico3001 (Jul 14, 2008)

Meta dijo:
			
		

> Chico3001 dijo:
> 
> 
> 
> ...



Haber... yo nunca he dicho que los AVR vendan mas que los Microchip... pero una cosa es cierta.. los Microchip se venden mas por el excelente trabajo que hace Microchip en las escuelas, va a todas las escuelas y regala kits de demostracion, entrena profesores, baja sus precios para estudiantes, etc etc etc..., que es lo que sucede? que cuando el alumno sale de la escuela lo que quiere usar es Microchip por que es lo que conocio toda su carrera de estudiante, pero NO POR QUE SEA LO MEJOR..... definitivamente Microchip tiene problemas y graves en sus micros... su emulacion es muy deficiente, la paginacion te afecta mucho en los programas largos, los micros consumen demasiada energia y dividen internamente los relojes, son lentos para arrancar y salir del sleep, etc etc... 

El cambio de mercados en los micros se esta dando y de manera muy fuerte con Atmel y Texas, solo que no es un cambio que se pueda lograr de la noche a la mañana, este cambio va a tardar unos 10 años y tal vez nosotros solo veamos el final. Pero por el momento si es definitivo que Microchip es el #1 en micros de 8 bits.. y eso aun esta debatido por que si incluyes en las estadisticas los mercados de micros automotrices de 8 bits los claros ganadores son Renesas y Freescale


----------



## Meta (Jul 14, 2008)

eidtech dijo:
			
		

> Meta dijo:
> 
> 
> 
> ...



Digamos que hay que saber aceptar lo que a uno le estreza. Todo es cuestión de prácticas y acostumbrarse al ambiente que le rodea. Aún así, con el tiempo aprenderé el C para PIC, si lo domino ya entraré a los AVR por curiosidad.


----------



## Meta (Jul 14, 2008)

Chico3001 dijo:
			
		

> Meta dijo:
> 
> 
> 
> ...



¿Te animas hacer una división en ASM con AVR?


----------



## asherar (Jul 14, 2008)

En realidad el algoritmo de la división que subí, estaba pensado en punto fijo. 
Pero para pasarlo a flotante yo pensaría en agregar un registro que maneje la posición del 
punto.   

Ya de por sí las operaciones de multiplicación, aún en P. Fijo, para que tenga cierto sentido 
deben usar dos registros.  En P. Flotante los tres dígitos decimales que permiten los 8 bits, 
en mi humilde opinión no alcanzan ni para empezar.    

Por lo tanto, hablando medio en el aire y sin buscar nada en la Wikipdia, como suelo hacer 
normalmente, yo lo pensaría como una operación producto/división con la mantisa, siempre menor que 1 (16 bits) usando mi algoritmo anterior y otra operación suma/resta con un 
registro para el exponente (8 bits) que me diría dónde va la coma. 
Es medio complicado, pero creo que es como trabajan las bibliotecas "compradas". 

("compradas" ... ? ! )


----------



## Meta (Jul 14, 2008)

Alejandro Sherar dijo:
			
		

> En realidad el algoritmo de la división que subí, estaba pensado en punto fijo.
> Pero para pasarlo a flotante yo pensaría en agregar un registro que maneje la posición del
> punto.
> 
> ...


----------



## asherar (Jul 14, 2008)

Meta dijo:
			
		

> ¿Y un PIC32 de 32 bits alcanzan algo?


Por supuéstrico ! 

Ya había pensado pasarme a 32 bits pero no por lo de la división. La velocidad del reloj (80MHz) me parece más interesante todavía. Para la etapa de captura y almacenamiento de datos analógicos. 

Lo que me frena un poco es que teniendo el trabajo avanzado en un 85% de repente surge una "característica del micro" que me paraliza todo el proyecto. 
A veces es por no tener claro uno el tema (eso se arregla estudiando), pero otras veces no se sabe ni dónde está el problema. Con las herramientas automatizadas, uno NO VE lo que hace realmente. En parte por eso prefiero Assembler a C (la otra razón es que ya tengo todo en assembler, Grrrrr!).

Ojo que no lo desmerezco: C simplifica el trabajo para programas largos o complejos. Pero me aleja del manejo interno, y no puedo seguir el proceso paso a paso para ver dónde está el error. Es el problema de que haya tantos pasos intermedios. C también genera su propio assembler, pero ... 
Uno dice que "sabe" C pero en realidad "cree" en C. 

Yo tengo una frase para distender en estas ocasiones:  _"Sólo sé ce, no sé más más"_.

----


> Complicado, pero no imposible.


No, no le tengo miedo a lo difícil. Si supieras las _rengas_ con las que he _bailado_. 
Y tampoco le temo a lo "imposible". No porque "me las tire de guacho pistola", sino porque la mayoría de las veces lo que se dice "imposible" es apenas un poquito más difícil de lo que se anima la mayoría. Primero te dicen loco, y que no vas a poder. 
Esa etapa es hermosa, porque vos sabés el futuro y "ellos" tienen miedo a que otro triunfe donde no se animaron. 
Eso permite aclarar los tantos:
Luego de tu éxito, los nobles te respetan y los miserables te odian. 
Lo mejor de todo es que _fracasando pasa lo mismo_. Je, Je!

Y me voy a seguir "peleando" con la página del pic.
También ayudaría si pudiera ampliar un poco el stack. 
Ahora voy a leerme la AN527 de Microchip. 

Un saludo !

----


----------



## Meta (Jul 14, 2008)

Interesante lo del http://ww1.microchip.com/downloads/en/AppNotes/00527d.pdf

La verdad en tu archivo la gente los mira, pero no comentan nada, creo que le da pereza aprender como se divide.


----------



## Chico3001 (Jul 14, 2008)

Mas bien me imagino que no todos tienen necesidad de hacer operaciones matematicas con micros.. estimaria que el 60 al 80% de los usos con los micros es llevar el control de tiempos y secuencias y el restante es aplicar operaciones matematicas

Ademas son rutinas de dominio publico... las notas de aplicacion de ese tipo las bajas de los sitios de los fabricantes, copias el codigo y lo usas.. (Aplicando unas pruebas antes para revisar que todo ande bien) asi que no mucha gente se preocupa por debatirlas

En lo personal me tope con esa nota hasta que tuve necesidad de usarla.... en mi vida de estudiante nunca me toco hacer divisiones de 32 bits con signo... y convertir los resultados en BCD para poder mostrarlos en displays y mucho menos me imagine que algun dia iria a aplicar mx+b para hacer correcciones en sensores...


----------



## Meta (Jul 14, 2008)

Chico3001 dijo:
			
		

> Ademas son rutinas de dominio publico... las notas de aplicacion de ese tipo las bajas de los sitios de los fabricantes, copias el codigo y lo usas.. (Aplicando unas pruebas antes para revisar que todo ande bien) asi que no mucha gente se preocupa por debatirlas



¿En qué parte los encuentras de los fabricantes precisamente ese el de divisiones y en asm?

Gracias.


----------



## Chico3001 (Jul 14, 2008)

Casi todos tienen una nota de aplicacion llamada rutinas matematicas... donde exponen sumas, restas, multiplicaciones, divisiones, conversion BCD a HEX y viceversa.... comienza a buscar en notas de aplicacion o en foros dedicados de programacion desafortunadamente las del fabricante casi siempre vienen en ingles... 

En Microchip entra a App Notes y Source Code, despues click en Algorithm y despues click en Math en la ventanita que aparece debajo, te va a aparecer una lista con todas las notas de aplicacion matematicas para el pic, incluso traen el codigo en assembler o C para que lo descomprimas y lo uses

En atmel es mas complejo.. entras a Microcontrollers > AVR 8 bit RISC > Application Notes > Application Example and Algotirhms

Casi todos son de la misma manera... o busca Math Routines en las busquedas locales de cada fabricante.. o Rutinas Matematicas pic en google.. .


----------



## Meta (Jul 14, 2008)

Parece que el AN526 y AN544 sólo ellos habla de  Math. Voy a ver como es.


http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1469


----------



## Chico3001 (Jul 14, 2008)

el AN660 cubre casi completamente el punto flotante.... tambien te da ejemplos de codigos para varias familias de pics....


----------



## fitocondria (Jul 17, 2008)

Para atmel te recomiendo entres con ensamblador, por que comprendes porque el C, da sorpresas, como dice Chico3001, uno cree en C.

Y me ha pasado lo mismo que Chico3001, luego por algo el proyecto se para cuando uno trabaja con C. Y la cantidad de memoria que debora y traga.

Sobre lo de punto flotante me acuerdo y agradezco al ingeniero que me dio clases. Nos pedía que todo lo hicieramos apegados a los estandares dados por la IEEE hay vienen como deben de hacerse las cosas jajajaja. Lastima que hay que ser miembros.

Y con pic, hay que ser ordenados para programas grandes. Y usar directivas. Por lo de sus paginas, no se porque microchip se decanto por esto.

Sobre lo de atmel, es un muy buen micro, pero todo sirve, por ejemplo extraño las interrupciones del puerto b, para manejar posibles eventos externos. Y mas fregon el freescale para manejar el micro como un procesador de señales algo así no me acuerdo del termino ahorita, ya que tiene 7 interrupciones externas.

Así que digo es bueno conocer de todo porque así sabes que micro mejor utilizar, todos tienes sus pros y sus contras.

Y el atmel ofrece cosas interesantillas.

Te recomendaría que te compraras un programador de atmel, ya que incluye toda la documentación sin necesidad de andar navegando por la red. Yo que estoy en el rancho y no tengo internet ahí me resulta genial. Y aunque es medio apabullante ver cerca de un ciento de instrucciones todas son muy digeribles y muy útiles y la pila "ulala" la manipulas a tu antojo no solo para guardar direcciones de las llamadas. No no no, prueba el atmel. Y te diría que probaras otros micros tambien, todos tienen lo suyo. Y sus aplicaciones.

Por ejemplo en mi lavadora estaba un microcontrolador pic16cxx.
En el clima un micro samsung no me acuerdo del número.
En mi tarjeta de sonido un micro atmel.
sobre todo en equipos de audio e encontrado atmel. aclaro equipos viejitos como del 2001 para atrás.
En equipo de aeronaves americanas de combate hay micros atmel, bueno eso dicen.

A lo que quiero llegar es que lo importante es tu aplicación, ya que ella te dice que necesita y si tienes un repertorio de conocimiento amplio de los micros podras elegir el mejor para tu aplicación no solo por la programación de esta sino por los recursos especificos de cada uno.

Si voy a guardar mi datos importantes, lo guardo en openbsd.
Si quiero programar para multiplataforma utilizo linux.
Si quiero jugar, utilizo mi gamecube, xbox o la compu con windows.
Si quiero tener una agenda utilizo la palm.

Y si te obligan a hacer la tesis en windows ni modo lo haces donde te digan, pero tienes con que responder, no hay trabas solo es cuestion de gustos en algunos casos y en otras lo que mejor conviene.


----------



## Meta (Jul 17, 2008)

¿Y por qué no usar Motorola?


----------



## Chico3001 (Jul 17, 2008)

En lo personal uso Freescale (antes Motorola) para cuando necesito usar 16 o 32 bits.. son micros muy buenos para aplicaciones muy grande sobretodo la nueva familia con el nucleo V1 (Flexis), los nucleos V2 y V3 ya son micros ARM bastante grandes pero aun asi faciles de manejar

La familia HC908 es algo compleja de entender al inicio, sobretodo a la hora de hacer la programacion, y la simulacion, pero una vez que le agarras el modo es bastante amigable, sobretodo con programas escritos en C, por que el Codewarrior ya trae muchas rutinas preestablecidas de uso comun (conocidas como Beans) que puedes arastrar y pegar a tu programa y olvidarte de como funciona el resto, asi que "en teoria" puedes hacer un programa con minimos conocimientos tanto del procesador como del lenguaje C


----------



## fitocondria (Jul 17, 2008)

Chico3001 ¿Dónde compras los freescale y los arm?


----------



## asherar (Jul 17, 2008)

Hola: 

Revisando libros medio viejos de Microchip (*) encontre la AN611. 
Tiene una aplicación completa para hacer un medidor de R y C desde la PC. 
El codigo asm tiene implementadas las rutinas básicas para 24 bts (+,-,*,/, complemento a 2) 
y adivinen qué ? las ubica con "org 0x0200", que para ese micro es la página 1 (Pic 16C622, 
con páginas de 512x14b). 
El servicio de interrupciones y el programa principal los ubica en el banco 0. 

Estoy recién empezando a verlo, pero el manejo de páginas puede servir de guía con los 
bancos de 2k. 
Como "regalito" trae el código de un programa en visual basic para recibir los datos.
Para los que nos gusta copiar (adaptarle el micro) y salir andando. 

Que cuál es la ventaja de tener el libro ? 
Que se puede caer el servidor de internet, que yo sigo trabajando tranquilo !   

Saludos !

 (*) Embedded Control Handbook - Vol. 1 - Microchip - Abril 1997.


----------



## Chico3001 (Jul 17, 2008)

fitocondria dijo:
			
		

> Chico3001 ¿Dónde compras los freescale y los arm?



En Mexico venden algunos modelos de Freescale en AG electronica, pero es mejor traerlos de USA por que alli manejan de todo...


----------

