TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: micro_cadaver en 31 de Octubre de 2008, 19:28:28

Título: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: micro_cadaver en 31 de Octubre de 2008, 19:28:28
hola León, te felicito por la iniciativa, no sabes cuanto bien me hubiera hecho encontrar hilos como este, cuantos dolores de cabeza me hubiera ahorrado  :-) , pero bueno estoy seguro que tu aporte ayudara a muchos picmaniacos que se inician en los micros.

solo una observacion:

He comenzado a realiza un tutorial de AMS y lo voy a poner aquí también.

no sera ASM?  :mrgreen:
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 31 de Octubre de 2008, 19:36:26
Gracias micro.

Si, tienes razón y gracias. Ya lo corregí  :-/
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: soy-puma en 31 de Octubre de 2008, 22:33:57
Hola Leon : muy buena la iniciativa y me anoto para seguirte por los caminos del assembler, si bien no he posteado mucho hace bastante que doy vueltas por el foro viendo sus trabajos y me sorprenden cada día, así que estoy seguro de que es la manera de avanzar en esto que es apasionante.
Continua con tu esfuerzo que siembras bondades , y seguro te seran retribuidas con creces.
Un saludo.
                                                                 ;-)
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Marttyn en 02 de Noviembre de 2008, 03:07:04
Muy interesante Leo!
La verdad nunca me habia interesado por ASM, ya que C me resulta mucho mas sencillo, pero me estoy dando cuenta que para entender "a fondo" los pics y su programacion es necesario tener algunas nociones sobre este lenguaje. Asi que seguire de cerca este interesante tutorial  :mrgreen:
Una cosilla.... cuando hablas de "bytes", no deberias decir "bits"?
Salu2 y a seguir trabajando duro  :-/
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 02 de Noviembre de 2008, 12:19:41
Gracias Marttyn. Mas que nada, para los que programan en otro lenguaje al assembler, es bueno saberlo para mejorar y optimizar el programa escrito.

La forma de hacer esto, una vez que allas escrito el programa y generado el hex, es bueno utilizar un programita que te lo pasa en asm y ver como fue creado. he leido muchas veces que con solo cambiar algunas instrucciones por otros, el programa queda mejor y mas corto.

Una cosilla.... cuando hablas de "bytes", no deberias decir "bits"?

Para ser cincero, no tengo ni idea. He vito en varios lados que escriben bytes y no bits. Si debe ir con bits, pues, lo cambio. ¿Me lo puede confirmar?
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Marttyn en 02 de Noviembre de 2008, 17:15:18
Citar
para los que programan en otro lenguaje al assembler, es bueno saberlo para mejorar y optimizar el programa escrito.

Exacto! Me doy cuenta que el codigo en C se puede optimizar hasta un punto... a partir de ahi, si no sabes ASM no puedes seguir. Y aunque no siempre es necesario optimizar el codigo, hay veces que es muy util medir hasta la ultima instruccion  :mrgreen:



Con respecto a Bytes y Bits, segun la wikipedia:

Citar
Un byte debe ser considerado como una secuencia de bits contiguos

Citar
Bit es el acrónimo de Binary digit. (dígito binario). Un bit es un dígito del sistema de numeración binario.

Por ejemplo el registro STATUS es un Byte, que consta de 8 bits. El Byte es el conjunto de bits, y el bit es cada digito de ese Byte

Salu2 y gracias por el cursillo de ASM  :-/
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 02 de Noviembre de 2008, 17:29:36
Gracias marttyn. Entónces estoy usando mal la palabra.

Ya lo cambio.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: WillyP en 06 de Noviembre de 2008, 14:33:41
Hola Leon, felicitaciones por el tutorial, coincido con vos yo también me siento muy cómodo con el Asm. Debe ser porque comencé con este lenguaje y los Pic en el siglo pasado por el 96/97, recuerdo que me compré el Pic Start Plus y venía con el 16C84, el primer Pic de la gama Flash de Microchip antecesor del 16F84, una reliquia  :). Los tiempos cambian y ahora también uso el C18, pero abandonar el Asm Jamás. Manejar el código a nivel instrucción es fantástico. Cuando se comienza a comprender es extremadamente sencillo y nos permite conocer mejor la arquitectura interna de los Pic.

Nuevamente felicitaciones.

Willy.-
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: jim_17 en 06 de Noviembre de 2008, 18:27:48
Leon Pic, estás haciendo un gran trabajo, la presentación i la explicación del código ASM te está quedando de lujo, yo personalmente no conozco demasiado este lenguaje, y con los pasos que estas siguiendo (empezar por lo más bàsico, e ir progresando poco a poco) haces que poco a poco las personas que no sepan nada sobre este lenguaje empiezen a comprenderlo y a utilizarlo.

Mis mas sinceras felicitaciones.

saludos.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 06 de Noviembre de 2008, 19:18:02
Muchas gracias jim_17. Hoy lamentablemente, no me puse con eso, porque me ocupo todo el día un LCD que recién ahora, logré hacer andar (y ya hace tres días que me venía rompiendo el coco y hoy quise hacerlo andar si o si, o tirarlo a la basura)

Mañana posteo un nuevo mensaje explicando las instrucciones.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: BrunoF en 07 de Noviembre de 2008, 17:17:50
Le pongo chincheta. Gracias Leon
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 07 de Noviembre de 2008, 17:24:44
Gracias a ti  :-/
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Marttyn en 08 de Noviembre de 2008, 01:39:08
Enhorabuena por la chincheta Leon!
Hacia falta un tutorial de ASM en este subforo, con su chincheta correspondiente!   :-/
Eso si, ahora que tienes chincheta estas "obligado" a continuar el curso hasta el final  :D
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 08 de Noviembre de 2008, 12:07:01
Gracias Marttyn. Me siento obligado ahora  :D :D :D :D

Mañana continuo con las instrucciones.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: pablomanieri en 09 de Noviembre de 2008, 20:03:47
disculpa pero creo que en el ejemplo de BCF hay un error:
Citar
Antes de la instrucción TEMP vale B'11111011'. Después de la instrucción TEMP vale B'11111111'

el bit 2 de TEMP debe quedar en 0

Te felicito por el aporte que nos estás dando a todos. Gracias
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 09 de Noviembre de 2008, 21:47:42
disculpa pero creo que en el ejemplo de BCF hay un error:
Citar
Antes de la instrucción TEMP vale B'11111011'. Después de la instrucción TEMP vale B'11111111'

el bit 2 de TEMP debe quedar en 0

 :mrgreen:, Tienes razón. Ya lo cambio. Gracias por el aviso.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Marttyn en 09 de Noviembre de 2008, 22:23:32
No entiendo muy bien lo del registro Z ¿? Dices que el BCF pone a 0 un bit, y si la operacion es 0, Z se pone a 1....
Que quiere decir que la operacion es 0? Hay varias instrucciones que afectan Z y no lo comprendo del todo.
Gracias y salu2!
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: RALF2 en 09 de Noviembre de 2008, 22:35:51
Que tal amigos!
El flag Z (flag de cero) indica si la ultima operacion logica o aritmetica fue cero.
Z = 0, la ultima operacion a sido diferente de cero
Z = 1, la ultima operacion a sido cero.

La instruccion BCF, no afecta el flag Z, ojo con eso   :shock:

ejemplo:
var1 = 10, z = 0
clrf var1 en este caso var1 = 0 y Z = 1

Saludos
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 10 de Noviembre de 2008, 09:49:16
Tube que hacer un ejercicio en el MPLAB para convencerme, ya que si estaba esta posibilidad TEMP = B'10000000' y hacemos BCF TEMP,7 luego de la instrucción TEMP vale 0x00

Y resultó que es como dice RALF, la instrucción BCF no afecta el bit 0

Muchas gracias RALF, ya modifico el error.  :-/
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: BrunoF en 10 de Noviembre de 2008, 13:35:18
Hola León. En el instruction set summary dice los flags que cada instrucción afecta. Saludos
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 10 de Noviembre de 2008, 13:51:12
Gracias Bruno  :-/.  Lo estoy haciendo desde ahí, pero por deducir cometí ese error. En resumen, por no fijarme bien.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: BrunoF en 10 de Noviembre de 2008, 13:55:10
Te hago una recomendación, León:

Para no embarrar tanto este tema y que quede como una verdadera guia(o lo que sea que anheles realizar) para el que se inicia, creá otro tema para discutir errores, opiniones y felicitaciones.  Poné un link al mísmo en el primer post de este tema así saben que deben postear en el otro. De esta manera no se ensucia éste.

Saludos
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 10 de Noviembre de 2008, 14:12:52
Muy buena idea Bruno

Bruno, u otro administrador, ¿podría crear el nuevo tema desde la respuesta número 24? Así sacamos bastante post y queda un poco más limpito  :mrgreen:
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: RALF2 en 10 de Noviembre de 2008, 17:36:01
De nada leon pic!
Estamos para ayudar  :mrgreen:

Saludos
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Javicho en 22 de Noviembre de 2008, 19:14:32
Hola Leon Pic:

Vaya todo el trabajo que te das para hacer este tutorial, todos reconocemos tu esfuerzo y ojalá que sigas asi y es comprensible por ello que de tanta escritura por ahi se te pase uno que otro detalle como por ejemplo el uC de 8K posee 4 páginas, claro que tambien posee 4 bancos en el sector de memoria de datos (SFR+GPR) pero según a lo que te refieres me paree que es mas bien a las páginas de 2K c/u en la memoria de programa.


Por ejemplo, en un uC de 8kWords hay 4 bancos. 1 banco cada 2048 words. Si se está en un banco y se quiere ir a otro es necesario precargar antes dichos bits del PCLATH para poder hacerlo.


Saludos.

Javicho.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 22 de Noviembre de 2008, 21:17:17
Hola Javicho. Muchas gracias por el comentario. Trato de hacer el tutorial lo mejor que puedo y como verás tengo ayuda de muchas personas, por lo que se puede decir que este tutorial, no lo armo yo solo, si no la gran camadería que hay aquí.

Me gusta recibir comentarios, aún cuando sean correcciones, porque eso indica que al menos alguien las lee y quiere aprender. Para esto, se a creado el hilo comentarios sobre este tutorial (http://www.todopic.com.ar/foros/index.php?topic=23747.0). Como favor te pido que creas este mismo post tuyo ahí, y luego le pido a un moderador, que borre estos dos post  :-).

Para adelantarte, no logro ver el error que me marcas, debe ser porque hace más de 24hs que no duermo, por mi trabajo y porque ahora estoy de cumpleaños con amigos de secundaria :P :-/ ;-) :wink:

1K = 1024 bytes

2K = 2048 bytes

Cada instrucción ocupa 1 Bytes en la memoria de programa y si esta tiene 8 K, en ella entran 8.192 instrucciones. ¿Podrías reformular el error que no lo veo?
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: BrunoF en 22 de Noviembre de 2008, 22:08:53
León. En los 16F cada instrucción ocupa una posición de memoria FLASH, pero de una longitud de 14bits. No un byte.

2kWords no es lo mísmo que 2kBytes. La primera son 2048 Bytes y la otra 2048 Words.

Saludos.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 23 de Noviembre de 2008, 11:51:34
No sabía que se podía mover uno o mas post y anexarlo a otro hilo. Mejor así.  :-/ :-/

Ya había cometido un error anterior con confundir un bit con bytes  :oops: :oops: y aún sigo acarreando el mismo error  :( :( :( :(

Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Javicho en 23 de Noviembre de 2008, 12:19:48
Hola Leon Pic:

La corrección a la que me referia es en el penultimo post del tutorial aproximadamente está al llegar a las 3/4 partes del mismo post.

Según comentas estas de cumpleaños entonces Feliz Cunpleaños Leon Pic! provecho con el trago.

Javicho.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Javicho en 23 de Noviembre de 2008, 12:36:28
Me olvidaba ... el error es porque dentro de 8K de M.P. hay 4 páginas y no 4 bancos, eso puede confundirse con los 4 bancos que posee el mismo pic pero en su memoria de datos que es un sector diferente y es otra cosa, y esto puede indicir a confusiones para el lector del tutorial.

Javicho.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: migsantiago en 23 de Noviembre de 2008, 13:14:00
Hola Leonpic

Felicidades por el tutorial  :-/ . Hay unos detalles que quisiera comentarte...  :mrgreen:

Estos registros, tienen una ancho de bit de acuerdo al PIC, que hay de 8 bit, 16 bit y 32 bit. Excepto la palabra configuración y que la veremos mas adelante.

Los PIC16 siempre tienen registros de memoria de 8 bits. Los que tienen registros de 16 y 32 bits son pics de otras familias como la pic24 y pic32.

Ahora bien, si W es un registro, ¿dónde está ubicado, ya que en el mapa de memoria no lo encuentro?

Está en la pocición 00h y dice indirect addr. Esto es, porque el registro W, no es una pocición de memoria física. Hay otros registros que están igual. Pero no nos desbiemos, el registro W, es muy usado y recuerden, se utiliza para mover datos, o cargar datos en distintas pociociones de la RAM y EEPROM.

El registro W no está implementado en la memoria ram en la posición 0x00 ni en otra posición. W es un registro independiente que tiene un bus directo con la ALU (un camino privado). La ALU es la única entidad que puede leer o escribir este registro de trabajo.

El direccionamiento indirecto hace uso de los registros FSR e INDF. INDF es completamente ajeno a W. Un direccionamiento indirecto usa el registro FSR como apuntador al contenido de otros registros. Cualquier instrucción que hace uso de INDF (0x00) como dirección invoca un direccionamiento indirecto.

* Memoria de Programa
               Es la ubicación física dónde se guarda el firmware que hemos creado, o sea, nuestro programa. Y tiene un ciclo de 1.000 de lectura y/o escrituras antes de estropearce y es del tipo FLASH (pero este es flaco  :mrgreen: Es un chiste).

El PIC16F877A tiene una capacidad de escritura de FLASH de 100,000 veces. No todos los PIC16 tienen memoria flash, hay que recordar a los viejitos PIC16C que tenían memoria EEPROM borrable con luz ultravioleta  :D o a los PICs que tienen memoria OTP (One time programmable) y solo se graban una vez.

El PIC 16F877, tiene una memoria de programa de 8Kb por un ancho de 14 Bits, o sea que cada pocición de memoria tiene 14 bit (B'11111111111111', o H'3FFF') Cada línea de instrucción ocupa una pocición en la memoria de programa, asi que, podemos poner hasta 8.000 instrucciones.

1k equivale en el ámbito de la computacion a 2^10 = 1024, por lo que 8k equivalen a 8192 instrucciones.

Seguiré leyendo con atención tu documento Leon.  :)
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 23 de Noviembre de 2008, 13:24:00
Ahora si te entendí  :-/ :-/. Efectivamente, son páginas no bancos. Ya lo cambio.


Me ganaste de mano Santiago.

Hola Leonpic

Felicidades por el tutorial  :-/ . Hay unos detalles que quisiera comentarte...  :mrgreen:

Estos registros, tienen una ancho de bit de acuerdo al PIC, que hay de 8 bit, 16 bit y 32 bit. Excepto la palabra configuración y que la veremos mas adelante.

Los PIC16 siempre tienen registros de memoria de 8 bits. Los que tienen registros de 16 y 32 bits son pics de otras familias como la pic24 y pic32.
Me expresé mal. Lo que intenté decir, es que hay distintos tipos de PIC que algunos trabajan de 8, otros de 16 y otrs de 32. Otro detalle a corregir.

Citar
Ahora bien, si W es un registro, ¿dónde está ubicado, ya que en el mapa de memoria no lo encuentro?

Está en la pocición 00h y dice indirect addr. Esto es, porque el registro W, no es una pocición de memoria física. Hay otros registros que están igual. Pero no nos desbiemos, el registro W, es muy usado y recuerden, se utiliza para mover datos, o cargar datos en distintas pociociones de la RAM y EEPROM.

El registro W no está implementado en la memoria ram en la posición 0x00 ni en otra posición. W es un registro independiente que tiene un bus directo con la ALU (un camino privado). La ALU es la única entidad que puede leer o escribir este registro de trabajo.

El direccionamiento indirecto hace uso de los registros FSR e INDF. INDF es completamente ajeno a W. Un direccionamiento indirecto usa el registro FSR como apuntador al contenido de otros registros. Cualquier instrucción que hace uso de INDF (0x00) como dirección invoca un direccionamiento indirecto.
Muchas gracias por la aclaración. Tenía mal el concepto.

Citar
* Memoria de Programa
               Es la ubicación física dónde se guarda el firmware que hemos creado, o sea, nuestro programa. Y tiene un ciclo de 1.000 de lectura y/o escrituras antes de estropearce y es del tipo FLASH (pero este es flaco  :mrgreen: Es un chiste).

El PIC16F877A tiene una capacidad de escritura de FLASH de 100,000 veces. No todos los PIC16 tienen memoria flash, hay que recordar a los viejitos PIC16C que tenían memoria EEPROM borrable con luz ultravioleta  :D o a los PICs que tienen memoria PROM y solo se graban una vez.
Actualizando entónces.

Citar
El PIC 16F877, tiene una memoria de programa de 8Kb por un ancho de 14 Bits, o sea que cada pocición de memoria tiene 14 bit (B'11111111111111', o H'3FFF') Cada línea de instrucción ocupa una pocición en la memoria de programa, asi que, podemos poner hasta 8.000 instrucciones.

1k equivale en el ámbito de la computacion a 2^10 = 1024, por lo que 8k equivalen a 8192 instrucciones.

Seguiré leyendo con atención tu documento Leon.  :)

Si, perdón. Es 8.192. Lo corregí en otros foros y aquí me olvidé. Perdón  :mrgreen:
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: migsantiago en 23 de Noviembre de 2008, 15:27:36
Veo que copiaste y pegaste mi explicación sobre W, eso está bien, pero ya no era necesario que copiaras lo del direccionamiento indirecto  :D esa parte no tiene lugar en la explicación de W (http://www.todopic.com.ar/foros/Themes/babylon/images/post/thumbup.gif)

Talvez la deberías dejar para cuando expliques los 3 direccionamientos que manejan los PIC16  :P
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 23 de Noviembre de 2008, 16:26:47
 :-) :-) :-) Pero me pareció buena explicación y una pequeña introducción para el direccionamiento indirecto. Si quieres lo saco. No tengo problema en hacerlo. Normalmente pido permiso antes de copiar y pegar una explicación, pero como Ariel está haciendo un backup de su foro y además lo está pasando a formato wiki, quise  arreglarlo lo más rápido posible, y poner con mis palabras las tuyas, hiba a quedar igual practicamente. No había mucho que cambiar. Cuando una idea está bien explicada, no hay nada que resumir y/o agregar  :)
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: migsantiago en 23 de Noviembre de 2008, 19:04:17
Entonces no hay problema, puede quedar así.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: tapi8 en 04 de Diciembre de 2008, 17:29:46
Hola Leon.
Primero felicitarte por el tutorial y por el movimiento que le estas dando al ".almacen del asembler"
Creo que en la instruccion DECFSZ si afecta al flag Z de STATUS, de hecho hace el salto porque este flag se pone a 1.

saludos tapi8
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 04 de Diciembre de 2008, 18:59:20
Buena observación pero esta vez no me equivoqué, je (el curso tiene 2 páginas y el tema de fe de errata tiene 5 páginas  :D :D :D)

El que afecta al bit Z del status es la instrucción DECF según en el datasheet del 16F877 de microchips. De todas maneras lo voy a probar en el MPLAB y si es así, lo modifico, no es de estrañar que halla errores en los datasheet.


EDITO: Confirmado, no afecta el bit Z.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: tapi8 en 07 de Diciembre de 2008, 08:53:34
Pues la verdad no lo entiendo. Si la instruccion es: decremeta una unidad de F y salta si Z es 1, no entiendo como no le afecta a dicho flag. Este flag es el que hace que se produzca dicho salto. A lo mejor afecta dicho flag a la instruccion, y no al contrario?

salu2 tapi8
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: BrunoF en 07 de Diciembre de 2008, 09:31:18
Hola tapi. Es que eso es lo que "te venden".
Recuerda que el uC internamente pues es algo mucho más complejo de lo que nosotros vemos o usamos. Yo no conozco el circuito interno del uC en su totalidad ni en toda su profundidad, pero tal vez el circuito electrónico interno que detecta cuando el resultado de una operacion da cero no este necesariamente implementado fisicamente en la parte del bit Z. Es decir que internamente puede que el circuito que detecte el "Zero" no necesariamente sea el bit Z en si, pero puede que sí lo comande y decida si debe afectarlo o no(al bit Z). O bien puede que utilice dos circuitos identicos, solo que uno afecta al Z y el otro no. Quién sabe? :D

Saludos!
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: migsantiago en 07 de Diciembre de 2008, 11:57:49
Cierto, el hecho de que la instrucción diga INCFSZ no implica que la Z sea el bit 2 de status.

Si la operación incremento resulta en un 0x00 entonces la ALU ordena a la entidad EEPROM que en vez de entregar la siguiente instrucción, entregue un NOP, pero nunca afecta al bit Z de status.

Las instrucciones INCFSZ, DECFSZ, BTFSC y BTFSS ejecutan el 2do ciclo de instrucción como NOP cuando se debe hacer el salto.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Javicho en 07 de Diciembre de 2008, 15:11:57
Pues la verdad no lo entiendo. Si la instruccion es: decremeta una unidad de F y salta si Z es 1,

Es que se dice asi ... decrementa una unidad del registro Fuente y salta si el resultado es ZERO.

Javicho.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 07 de Diciembre de 2008, 20:27:42
Efectivamente. Fíjensen que cuando traduje la instrucción, no puse Z como el bit Z del registro Status, lo traduje como la palabra en ingles ZERO  que en castellano es CERO.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: tapi8 en 08 de Diciembre de 2008, 08:02:26
Bueno despues de estos comentarios me queda algo mas claro . Yo ese Z siempre lo traduje como el Z del STATUS, pero posiblemente fuera un error mio, gracias a todos por las aclaraciones.

saludos tapi8
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: migsantiago en 21 de Diciembre de 2008, 13:10:24
RLF

Rota hacia la izquierda los bit de un registro seleccionado por el programador. El destino de la operación se puede elegir. Cada rotación equivale a multiplicar por 2

Ejemplo:

Código: [Seleccionar]
              RLF         PORTC,F
Si antes de la instrucción PORTC vale B'00001000', después de la instrucción vale B'00010000'. Si se hubiera elegido como destino W, PORTC después de la instrucción continua valiendo B'00001000' y W vale B'00010000'

Para recordar Rotate es rotar Left es izquierda File es el registro.

Afecta a:

  • C se pone a 1 si hubo acarreo

RRF

Rota hacia la derecha los bits de un registro seleccionado por el programador. El destino de la operación se puede elegir. Cada rotación equivale a dividir por 2

Ejemplo

Código: [Seleccionar]
             RRF         PORTB,F
Si antes de la instrucción PORTB vale B'10000000' después de la instrucción PORTB vale B'0100000'. Si se hubiera elegido como destino W, PORTB después de la instrucción continua valiendo B'10000000' y W vale B'01000000'

Para recordar Rotate es rotar Right es derecha File es el registro.

Afecta a:

  • C se pone a 1 si hubo acarreo

RLF y RRF no se hacen como mencionas ni son multiplicación por 2 en el caso de los pics.

Caso RLF

Se rotan los 8 bits del byte original a la izquierda. El bit 0 del nuevo byte será el valor que había en la bandera C. El nuevo valor de la bandera C será el valor que había en el bit 7 del byte original.

Caso RRF

Se rotan los 8 bits del byte original a la derecha. El bit 7 del nuevo byte será el valor que había en la bandera C. El nuevo valor de la bandera C será el valor que había en el bit 0 del byte original.

Debes leer mejor las especificaciones del pic, checa la sección Instruction Set del Mid-Range Manual.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Cryn en 21 de Diciembre de 2008, 13:32:40
muy bueno el tutorial que estas haciendo leon :-/ :-/ muchas gracias

si es que se puede podes colocar algunas funciones de los 18F? después claro
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 21 de Diciembre de 2008, 16:00:58
RLF

Rota hacia la izquierda los bit de un registro seleccionado por el programador. El destino de la operación se puede elegir. Cada rotación equivale a multiplicar por 2

Ejemplo:

Código: [Seleccionar]
              RLF         PORTC,F
Si antes de la instrucción PORTC vale B'00001000', después de la instrucción vale B'00010000'. Si se hubiera elegido como destino W, PORTC después de la instrucción continua valiendo B'00001000' y W vale B'00010000'

Para recordar Rotate es rotar Left es izquierda File es el registro.

Afecta a:

  • C se pone a 1 si hubo acarreo

RRF

Rota hacia la derecha los bits de un registro seleccionado por el programador. El destino de la operación se puede elegir. Cada rotación equivale a dividir por 2

Ejemplo

Código: [Seleccionar]
             RRF         PORTB,F
Si antes de la instrucción PORTB vale B'10000000' después de la instrucción PORTB vale B'0100000'. Si se hubiera elegido como destino W, PORTB después de la instrucción continua valiendo B'10000000' y W vale B'01000000'

Para recordar Rotate es rotar Right es derecha File es el registro.

Afecta a:

  • C se pone a 1 si hubo acarreo

RLF y RRF no se hacen como mencionas ni son multiplicación por 2 en el caso de los pics.

Caso RLF

Se rotan los 8 bits del byte original a la izquierda. El bit 0 del nuevo byte será el valor que había en la bandera C. El nuevo valor de la bandera C será el valor que había en el bit 7 del byte original.

Caso RRF

Se rotan los 8 bits del byte original a la derecha. El bit 7 del nuevo byte será el valor que había en la bandera C. El nuevo valor de la bandera C será el valor que había en el bit 0 del byte original.

Debes leer mejor las especificaciones del pic, checa la sección Instruction Set del Mid-Range Manual.

Santiago, lamento tener que corregirte, pero es como lo digo. Si hacemos una rotación, corresponde a multiplicar o dividir, pero hay que tener cuidado con su uso, porque si yo roto un bit, supongamos a la izquierda, multiplicamos por 2 y lo guardamos en el registro. Si volvemos a rotarlo a la izquierda, volvemos a multiplicarlo por dos con respecto al registro, pero si lo tomamos desde el valor inicial, será por 4, luego por 8, luego por 16.

El bit C, indica si hay acarreo, por ejemplo:

B'10000000' RLF B'0000000' Lo que pasa aquí, el 1 del bit 7, pasa al carry.

Si hacemos:

B'00000001' RRF B'0000000' Aquí pasa exactamente lo mismo que lo anterior, el bit carry acusa el acarreo.

Si quiero multiplicar con estas instrucciones, lo que tengo que hacer, es trabajar con dos registros. O sea, dos multiplicaciones de 8 bit, dan como resultado otro de 16 bit. Por lo tanto, roto a la izquierda el registro, luego chequeo el bit C del registro STATUS, si hubo acarreo, le pongo a 1 al segundo registro que nos dará el resultado que corresponda al mas significativo.

Supongamos que, tenemos estos registros declarados RESAL (resultado más significativo), RESBA (resultado menos significativo)
Arrancamos con los dos registros en cero, luego cargamos B'10000000' a RESBA y ejecutamos la instrucción RLF. RESBA pasará con el valor B'00000000' pero aquí, hubo acarreo y entónces tenemos que poner a 1 el bit menos significativo del registro RESAL.

Si bien el bit del registro STATUS es legible y escribible, cuando se ejecuta la instrucción RRF o RLF este bit se actualiza según corresponda ya que estos dos instrucciones, afectan al dicho bit. En lo que si tienes razón y algo que me olvidé de comentar, es que según como setee al bit C, afectará al resultado, ya que, si en el registro RES tenemos B'00000001' si ajusto al bit C en 1 y ejecuto la instrucción RRF RES vale B'10000000', pero si ajustamos al bit C en 0 y ejecutamos la instrucción RRF RES vale B'00000000' e inmediatamente el bit C se pone a 1 automáticamente.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: sander en 21 de Diciembre de 2008, 18:01:36
Leon  lo que dice mig santiago es verdad, en el caso de los PICs las intrucciones RLF y RRF, rotan , no desplazan , y realizan la rotacion  con el valor que hay en C, por ejemplo si tu tienes el registro Var = B'00000010'C = 1 entonces al aplicar RRF   Var,F el resultado sera Var = B'10000001' y C = 0, y como ves  RRF no tiene el efecto de dividir entre dos por si solo, para que puedas dividir o multiplicar debes garantizar que C = 0 antes de realizar cualquiera de las rotaciones.

Saludos
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: migsantiago en 21 de Diciembre de 2008, 18:13:47
Estoy de acuerdo con ustedes, para realizar una multiplicación o una división se debe asegurar que C=0.

Leonpic, tu explicación en el tutorial es ambigua. Debes hacer énfasis al uso de la rotación a través del bit C. Cualquier usuario sin experiencia asumirá que el bit que se agrega en la rotación será un cero. Se debe especificar que pasa con el bit C antes y después de la rotación.

El acarreo que mencionas es diferente en la división. Cuando se rota a la derecha un número y el número es impar, entonces C valdrá 1. Si el número es par, C valdrá 0. Yo no llamaría acarreo al bit desplazado, lo llamaría residuo.

RRF y RLF también pueden servir para transmitir una palabra en forma serial, a través del bit C.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 21 de Diciembre de 2008, 18:40:39
Ahora entiendo a que te refieres. Lamento el mal entendido. Bueno, actualizando.

Gracias. :-/ :-/ :-/ :-/ :-/ :-/
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: jacrmr en 22 de Diciembre de 2008, 04:10:33
Los comentarios que te han hecho son adecuados. La rotación siempre pasa por el bit C, pero no a manera de "acarreo" como lo mencionas. Esta ambiguedad se elimina con la gráfica que aparece en la hoja de datos donde puede observarse la operación de rotación siempre a través del bit C. Incluso las multiplicaciones y divisiones por y entre 2 que te refieres son correctas siempre y cuando se tenga en claro éste efecto del bit C. Además no es ni necesario checar el bit C para ver si hubo "acarreo" cuando intentas multiplicar o dividir por o entre 2 cuando usas dos registros para hacer operaciones de 16 bits. Puesto que las rotaciones siempre pasan por el bit C, sólo es necesario hacer las operaciones en forma secuencial. Por ejemplo:

bcf STATUS,C
rlf REGISTRO_LO,F
rlf REGISTRO_HI,F

Los nuevos PICs de la arquitectura mejorada PIC16F1XXX que están próximos a salir comenzando el 2009 incluyen operaciones que sí desplazan, en forma normal y también aritméticamente para aumentar esta funcionalidad.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: taipan en 14 de Enero de 2009, 21:07:48
Hola a todas/os

Mi mas sicera FELICITACION a LEON PIC por el tutorial que esta montando.

Los que nos iniciamos en esto del ASM estamos infinitamente agradecidos.
Si es posible me sumo a la peticion de que se continue con el 18F.
Es mas me ofrezco para ayudar en lo que consideren oportuno.

PD LEON PIC disculpa  :cry: en el ultimo privado no me he despedido.

SALU2
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 14 de Enero de 2009, 21:57:56
Gracias taipan.

Siguiendo la actualización de mis errores y distraidas  :mrgreen: :oops: :oops: actualizé la instrucción INCFSZ que mencionaba en tres partes que decrementaba. Esto me pasó, por que copié y pegué la explicación de DECFSZ y al agregarle un comentario, me olvidé de actualizarlo.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: luisp en 04 de Febrero de 2009, 01:52:48
Saludos, te felicito leon por lo que haces y mas porque aceptas detalles de las cosas para crear un Super Tutorial,
mi pequeño aporte (es un comentario de un amigo que esta leyendo el tutorial )

Respuesta #3 : 31 de Octubre de 2008, 03:57:59 pm
El registro W no está implementado en la memoria ram en la posición 0x00 ni en otra posición

creo que va es asi

El registro W no está implementado en la memoria ram, ni en la posición 0x00 ni en otra posición

Gracias por el tiempo que les das a los demas sobre tu conocimiento.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 04 de Febrero de 2009, 21:54:55
Tienes razón. Tengo un pequeño error gramatical. Modificando entónces  :mrgreen:
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: canival35 en 23 de Marzo de 2009, 05:51:24
Muy buen trabajo leon felicidades, es una excelente ayuda para los que vamos empezando con esto de los pics, esta mejor explicado que algunos de los libros mas polulares de cominezo que hay para pics, seria de gran ayuda que explicaras la forma en que configuras al pic desde el ICPROG, saludos  :mrgreen:
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Juancar en 26 de Marzo de 2009, 11:46:46
Tengo una duda bastante tonta, pero que no entiendo el funcionamiento de EQU:

Citar
Es muy fácil y con la instrucción "EQU"

PUERTO_A   EQU  H'05'

Si al Bit RA6 lo quero llamar LED6 lo hacemos así:

LED6  EQU  6

El primer caso lo entiendo, igualas la etiqueta "PUERTO_A" con la posición de memoria 05 (supongo que la H es de 'hexadecimal)
Lo que no entiendo es el segundo caso, en el que igualas LED6 a 6, refiriéndote al bit 6 del puerto A. No sería necesario especificar esto de alguna manera?? algo como "LED6 EQU PUERTO_A,6

Un saludo, y gracias por este excelente trabajo.

Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: tapi8 en 26 de Marzo de 2009, 12:31:53
Yo la primera que vi esto de asignarles nombres a los bits fue recientemente en el "curso de suky", por cierto excelente curso suky, gracias por el tiempo y talento dedicados al foro.
Pero creo que esta bien asi, porque le asignas la posicion del bit dentro del registro, cuando lo usas en el progama le tienes que decir en que registro esta.
por ejemplo le dices: LED  equ   5. Y esta el PORTA,5 cuando lo uses le diras BSF   PORTA,LED siempre le diras el nombre del reg. y en vez del numero el nombre que tu le has puesto. No se si me he explicado bien espero que si. Es muy util cuando en un programa tienes que usar muchos bits individualmente porque no tienes que estar pendiente de donde estan colocados, les pones un nombre que haga referencia a lo que hacen y despues los designas con esos nombres.

saludos tapi8.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Suky en 26 de Marzo de 2009, 12:48:45
MPLAB lo que hace al encontrar LED6 lo reemplaza por su valor numérico, ósea 6. Siendo este de cualquier registro especificado, por ejemplo:
Código: ASM
  1. bsf     TRISA,LED6 ; Setea el bit 6 del registro TRISA.
  2. bsf     PORTA,LED6 ; Setea el bit 6 del puerto A.
Otra forma de definir mas especificamente seria usando DEFINE:
#DEFINE es empleado para crear sustituciones dentro del texto del programa que lo simplifiquen. La forma correcta es #DEFINE NOMBRE TEXTO, con lo que, cada vez que el compilador encuentre la orden NOMBRE, la sustituirá por el texto. El problema que se nos plantea es que, si bien es más flexible que la directiva EQU, puesto que esta sólo nos permitía asignar un valor, sólo se nos permite con #DEFINE una línea de texto, y esta debe ser fija.

Código: ASM
  1. #DEFINE LED6    PORTA,6

Entonces en el programa se usa:

Código: ASM
  1. bsf     LED6
  2. bcf     LED6

Citar
Yo la primera que vi esto de asignarles nombres a los bits fue recientemente en el "curso de suky", por cierto excelente curso suky, gracias por el tiempo y talento dedicados al foro.

De nada, y gracias por el reconocimiento. :-)

Saludos!
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: jhozate en 26 de Marzo de 2009, 18:39:30
hola a todos,,felicitaciones por este tutorial...
leí en un documento sobre una instruccion llamada setf q es para poner en 1 todo un byte..alguien sabe de esta instruccion? es verdad o mentira?

saludos
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: sander en 26 de Marzo de 2009, 18:48:32
Esa instruccion es una instruccion para los PIC18.

Saludos
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: migsantiago en 26 de Marzo de 2009, 18:49:25
leí en un documento sobre una instruccion llamada setf q es para poner en 1 todo un byte..alguien sabe de esta instruccion? es verdad o mentira?

setf no existe en los pic16

Existe en los pic18 por ejemplo.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Juancar en 26 de Marzo de 2009, 22:15:12
Gracias a tapi8 y suky  :-/

Un saludo.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Alejandro Oteiza en 24 de Abril de 2009, 20:07:13
Hola¡ Soy nuevo en esto de los pic, anteriormente había leido libros para enterarme del funcionamiento de los mismos y todo en "assembler" y la verdad que no me había enterado casi de nada, pero leyendo este tutorial veo que me voy a enterame, lo leeré varias veces para que se me quede bien claro todo lo expuesto. Yo lo poco que sé, es de manera autodidacta y haciendo muchas practicas con los pic, pero sin tener verdadero conocimiento de su funcionamiento. Hoy es la primera vez que lo tengo más claro. Por favor no dejéis de
seguir con este tutorial. Muchas gracias a tod@s. Alejandro.
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Goodfrey en 10 de Octubre de 2009, 19:10:18
Buenas tarde como estan, soy principante en esto de programacion del pic estoy aprendiendo un poco lo referente a los retardos para las rutinas pero tengo un problema, me mandaron a hacer un retardo de medio segundo.... pero solo lo se hacer a pie hasta un retardo doble y eso solo me da hasta 200ms aproximadamente... y intente buscar en el buscador y lo que me aparece mas que todo es el programa que calcula los retardos.

Pero sinceramente necesito aprende a hacer un retardo treple o superior pero por mi mismo asi calculando.... me gustaria que alguien me lo explicara para un princiante totalmente nuevo...  se lo agradeceria en el alma...
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Suky en 10 de Octubre de 2009, 23:19:21
Revisa aquí (http://www.todopic.com.ar/foros/index.php?topic=24720.msg201398#msg201398), explico como se obtiene una demora con lazo simple y anidado doble, entendiendo eso ya puedes armar y calcular la tuya de 3 ciclos  ;-)


Saludos!
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: JoseLuis2801 en 07 de Octubre de 2011, 18:25:21
Borrado, es que ya he dado con ello.

Un saludo
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: donpablio en 25 de Marzo de 2013, 16:32:29
Las instrucciones
Ejemplo

Código: [Seleccionar]
        ADDLW      .128
Si W tenía cargado un valor = .5, después de la instrucción W tiene cargado el valor .133


una pequeña duda no deberia ser .628 o como se suma en ensamblador hay algunas reglas para esto?, perdon la pregunta pero soy nuevo y me confundi con esto
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: Leon Pic en 26 de Marzo de 2013, 10:19:08
El . indica que es decimal (los números que nosotros usamos). Por lo tanto, 128 + 5 = 133
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: donpablio en 26 de Marzo de 2013, 15:14:51
ya entendi, yo lo habia tomado como .128 de la unidad mas .5 de la unidad jeje, gracias por tu ayuda
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: PEJEAHGO en 05 de Abril de 2013, 20:52:58
Ya veo que estan  hablando de assembler ...soy nuevo en esto prodrian ayudarme con informacion o libros  para progrmar En assembler?(16f877) agradeceria cualquier informacion Gracias
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: carlomax360 en 24 de Mayo de 2013, 23:15:00
Excelenteeeee!! muy buen tutorial. Se agradece mucho tu tiempo compadre!!
Una solicitud: Podrias resubir las fotos del tutorial por favor?? Muchas gracias
Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: milnac en 11 de Julio de 2015, 12:02:13
Cita de Leon Pic :
Citar
Citar
el porqué de un programa escrito en ASM (assembler) lleva menos línea de instrucción que el mismo programa realizado en otro lenguaje. Esto se traduce que, cuanto menos líneas de código, menor consumo de la memoria de programa.

Yo veo que cuando se programa en C se utiliza muchisimo menos lineas de codigo que en ASM. Entonces por qué Leon Pic dice que con ASM se hace menos lineas de codigo?

Título: Re: Comentarios sobre el tutorial 'ASM desde 0'
Publicado por: KILLERJC en 11 de Julio de 2015, 16:40:46
Citar
Yo veo que cuando se programa en C se utiliza muchisimo menos lineas de codigo que en ASM. Entonces por qué Leon Pic dice que con ASM se hace menos lineas de codigo?

Estas en lo correcto, para el usuario son muchas menos lineas de codigo. Y eso es lo que lo hace atractivo
Pero cuando ves el ASM generado de una funcion de C te das cuenta que por algo simple que te llevaria unos 20 lineas en ASM, terminas con 50 lineas o muchisimas mas en C. Y hay peores casos.
En el foro se presento una vez la necesidad de hacer una formula para un servomotor, el autor dijo que lo pensaba hacer en ASM, el cual se le ayudo y la ecuacion en cuestion fue esta:

Posicion_Servo = 31 + ((int16)(ValorADC * 124) / 256);

terminamos con un codigo en ASM de 10 lineas para un ADC de 10bits o 8bits. Y utilizando unicamente 2 posiciones de memoria ( 1 para el resultado y otro temporal que puede usarse en cualquier otro lado del programa ).
Mientras que para hacer una comparativa con C esa formula que ves ahi tardaba 654 ciclos en realizarse, luego hice varias formulas en C para ver cual era la mejor, las simule para contar la cantidad de ciclos que necesitaba, algunos se acercaron BASTANTE a lo que habiamos realizado, pero otros no incluso eran mas ciclos que la ecuacion "original".

http://www.todopic.com.ar/foros/index.php?topic=44247.20

La diferencia radica en que las funciones de C estan realizadas para todo tipo de valores, mientras que en ASM haces el codigo especifico para eso, pero tenes que volver a comenzar si deseas cambiarlo