He comenzado a realiza un tutorial de AMS y lo voy a poner aquí también.
Una cosilla.... cuando hablas de "bytes", no deberias decir "bits"?
para los que programan en otro lenguaje al assembler, es bueno saberlo para mejorar y optimizar el programa escrito.
Un byte debe ser considerado como una secuencia de bits contiguos
Bit es el acrónimo de Binary digit. (dígito binario). Un bit es un dígito del sistema de numeración binario.
Antes de la instrucción TEMP vale B'11111011'. Después de la instrucción TEMP vale B'11111111'
disculpa pero creo que en el ejemplo de BCF hay un error:CitarAntes 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
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.
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.
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.
* 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 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.
Hola LeonpicMe 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.
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.
Muchas gracias por la aclaración. Tenía mal el concepto.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.
Actualizando entónces.* 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.
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. :)
Pues la verdad no lo entiendo. Si la instruccion es: decremeta una unidad de F y salta si Z es 1,
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
EjemploCó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
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
EjemploCó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.
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
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.
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?
Las instruccionesEjemploCódigo: [Seleccionar]ADDLW .128
Si W tenía cargado un valor = .5, después de la instrucción W tiene cargado el valor .133
Citarel 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?