Lenguaje ensamblador para PIC desde 0

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

A pesar que mucho le escapan a este lenguaje, hay otros que nos sentimos cómodos con el :).

--------------------------------------------------------------------------

Lo primero que hay que saber para este lenguaje, es que cada línea de código, es una instrucción que realiza el CP o un paso que realiza el CP. A diferencia de otros lenguajes, como por ejemplo el C, una línea de instrucción, puede llevar uno o mas pasos que el CP debe realizar. Más adelante entenderán el porqué.

A esto último dicho, nos explica 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.

Nota: Entendemos por el mismo código, al realizar un software para realizar una dicha tarea. Una tarea que debe realizar nuestro microcontrolador, puede ser escrito en diferentes lenguajes, y es el programa que se utilizó quien lo traduce a formato hex (1 y 0).

Ahora, ¿Qué es el CP?

El CP o PC es el Contador de Programa. Es el encargado de leer cada instrucción y realizar la acción solicitada por el software.

Para dar un ejemplo un poco más claro, digamos que el CP, es una persona. Esta persona se le da un papel que tiene diferentes tareas a realizar. Estas tareas, están una debajo de la otra y lee línea por línea y hace lo que le dice esa línea. Cada línea, posee una instrucción que se debe hacer. Cuando terminó de hacer esa instrucción, continua con la línea de abajo.

Supongamos que tenemos un papel que dice:

Levantar la mano izquierda.
Bajar la mano izquierda.
Saltar tres veces en el mismo lugar.
Levantar la mano derecha.
Saltar una vez en el mismo lugar.
Bajar la mano derecha.

El CP, hará esas tareas sin negarce y lo hará fielmente a lo que está escrito. Por lo que, si hace una tarea mal, es porque le pusimos una o más instrucciones mal.

Si bien, el CP hará lo que nosotros le pidamos, el CP nos pide que respetemos algunas cosas. Estas cosas, dependerán de cada microcontrolador y que debemos saber para poder programar en forma correcta al PIC.

PD: Tube que duplicar el nombre del tema, porque no me dejaba enviarlo (se ve que acepta un mínimo de caracteres)
 
Última edición por un moderador:
¿Cómo es la extructura del lenguaje ASM?

Es muy fácil, posee 4 columnas bien diferenciadas y que no es problema acordarce.

* La primer columna se llama ETIQUETA y sirve para darle el nombre a una pocición de la memoria del programa al que se necesita apuntar. Los que no se den cuenta, ya lo haran.

* La segunda columna, se llama INSTRUCCIÓN y lo que justamente hace, es una instrucción a realizar por el CP.

* La tercera columna, se llama OPERANDO y es el operando de una instrucción, o sea, de la segunda columna. Hay instrucciones que no tienen operando y las veremos más adelante.

* Y la cuarta columna, se llama OBSERVACIONES y sirve solo para el programador, o sea, el usuario que está programando el PIC. En otras palabras, a nosotros. Siempre comienza con ; (punto y coma)

Si no sirve para el PIC, ¿Para qué complicarla más? Todo lo contrario, es para alludar al programador de que no se olvide que intentó hacer.

Todos los lenguajes, desde los más básicos, hasta los más avanzados, tienen esta características ya que en el, pondremos que es lo que queremos hacer o explicar el programa.

Si bien, estas observaciones se utilizan en la cuarta columna, no es obligación colocarla en esta columna, si no que puede ir al margen de la planilla en dónde estamos programando. Y es aquí dónde explicaremos la porción de una rutina para entenderlo más adelante.

Bien, veremos a continuación, como se escriben las columnas:

ETIQUETAS INSTRUCCIÓN OPERANDO ;OBSERVACIONES

O, podemos verlo así:

;OBSERVACIONES
;OBSERVACIONES
;OBSERVACIONES (y la cantidad que necesitemos)

ETIQUETAS INSTRUCCIÓN OPERANDO ;OBSERVACIONES
 
Antes de empezar a ver las intrucciones, debemos concentrarnos en los registros.

¿Qué son los registros?

Los registros, son pociciones de memoria el cual se utilizan para ir configurando el pic mientras se corre el programa, cambiar de bancos para acceder a otras partes de memorias, son banderas que nos van diciendo que está pasando con distintas operaciones, son habilitaciones o desabilitaciones para módulos que trae el PIC. Por ejemplo, conversor Analógico/Digital, PWM.

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. El tamaño de los registro depende del tipo de microcontrolador.

Cada registro, posee un nombre, y cada bit o un grupo de bit, se puede utilizar para lo descripto anteriormente (habilitar/desabilitar, etc).

A continuación, ver el archivo adjunto. Es la pocición de la RAM y sus 4 bancos. Este, es del PIC16F877

Como notarán, en las cuatro columnas, hay nombres. Estos nombres son todos los registros que posee este PIC. Verán que hay registros que se repiten. No quiere decir que estan duplicados, triplicados o cuatriplicados, si no que se puede acceder a ellos no importa en que banco estemos trabajando. (Ya lo entenderán, no se preocupen).

Cada vez que se programe el PIC y se necesite trabajar con uno de estos registros, se debe acceder al banco que esté dicho nombre. Es por eso, que esta tabla es muy importante a la hora de trabajar.

Aprovechando que subí esta tabla del pic, cuando dea ejemplo de programación, será sobre este pic.

Microchip provee en forma gratuita estos datasheet. Y hay uno por cada PIC. Por lo que si no tienen este datasheet, descargenlo de la página de Microchip. Cuando empezemos a programar, lo necesitarán.
 

Adjuntos

  • banco_de_memoria_ram_del_16f877_116.jpg
    banco_de_memoria_ram_del_16f877_116.jpg
    86.2 KB · Visitas: 1,266
Uno de los registros muy utilizado, es el registro de trabajo W, el cual, se utiliza para mover un dato/valor de un registro a otro, cargar valores en un registro, y con la ayuda de la ALU puede hacer operaciones matemáticas.

Observen con atención el diagrama de bloque dónde se encuentra W que está adjuntado.

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

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.

Los microcontroladores PIC, poseen tres tipos de memorias.

* 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 100.000 de lectura y/o escrituras antes de estropearce y es del tipo FLASH (pero este es flaco :mrgreen: Es un chiste).

* Memoria de datos de uso general
Es la memoria RAM del PIC. Recordemos, que los registros están sobre la memoria RAM y la memoria de uso general, comienza después de los registros.

* Memoria de datos EEPROM
Es la memoria EEPROM que puede almacenar datos mas de 40 años sin energía y 1.000.000 de ciclos de escritura y lectura

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.192 instrucciones.

La RAM de uso general (mas los registros) trae 368 bytes con un ancho de 8 bit (B'11111111', o H'FF'). Esto quiere decir, que tenemos 368 pociciones para nuestro uso.

La EEPROM trae 256 bytes con un ancho de 8 bits. Tenemos 256 pociciones para nuestro uso.
 

Adjuntos

  • diagrama_de_bloque_16f877_877.jpg
    diagrama_de_bloque_16f877_877.jpg
    116.4 KB · Visitas: 696
Ahora, vamos a estudiar el registro STATUS y luego continuaremos con las instrucciones.


Registro STATUS

Si entendieron hasta acá, se acordará que los registros poseen un ancho de 8 bit. Cada bit, puede contener un 1 o 0.

Vemos ahora en detalle el registro STATUS (está adjuntado)

Este registro, tiene 3 Bit dedicado para las operaciones matemáticas, 3 bit dedicado al cambio de banco de memoria y 2 bit dedicado para saber que o quién produjo un Power Up (despertar del micro). Y se puede leer y escribrir en él (cambiar datos).

Los analizamos desde el más significativo (MSB) hasta el menos significativo (LSB).

BIT 7:

Se llama IRP y sirve para el direccionamiento indirecto para cambiar el banco de memoria.

1 = Banco 2 y 3
0 = Banco 0 y 1

BIT 6 y BIT 5

Se llaman RP1 y RP0 respectivamente. Sirve para el direccionamiento directo para cambiar de banco de memoria.

00 = Banco 0
01 = Banco 1
10 = Banco 2
11 = banco 3

BIT 4

Se llama TO (neg). Este bit se utiliza para saber quién despertó al PIC.

1 = Después que despierta (power up) o por las instrucciones CLRWDT o SLEEP, se pone a 1 este bit.
0 = Se pone a 0 cuando el wachtdog o en castellano perro guardían (WDT) despierta al PIC.

BIT 3

Se llama PD (neg). Este bit se utiliza para saber si el pic estaba durmiendo.

1 = Después de que despierta (power up) o por la instrucción CLRWDT, se pone a 1
0 = Se pone a 0 cuando se ejecuta la instrucción SLEEP

BIT 2

Se llama Z y al igual que los dos bytes anteriores, es una bandera. Nos indica el resultado de una operación aritmética y lógica.

1 = La operación aritmética o lógica dió como resultado 0
0 = La operación aritmética o lógica no dió como resultado 0

BIT 1

Se llama DC. Digit carry/borrow (dígito llevar/prestar). Es afectado por las instrucciones ADDWF; ADDLW; SUBLW; SUBWF (Para la resta, la polaridad es inversa).

1 = Hubo un acarreo del 4to bit menos significativo al 5to bit.
0 = No hubo un acarreo del 4to bit menos significativo al 5to bit.

BIT 0

Se llama C carry/borrow. Es afectado por las mismas instrucciones que afectan al bit DC.

1 = Hubo un accareo del bit más significativo (Bit 7) o sea cuando se exede de H'FF'
0 = No hubo accareo del bit más significativo
 

Adjuntos

  • registro_status_16f877_107.jpg
    registro_status_16f877_107.jpg
    101.2 KB · Visitas: 555
Breve instroducción de las INSTRUCCIONES

Cada instrucción tiene una ancho de 14 Bits, es por eso que la memoria de programa tiene el mismo ancho. Justamente para poder alojar cada instrucción.

Las instrucciones, están divididas en tres grupos. Los cuales son:


  • Byte-Oriented operation (Byte-Orientando a la operación)
    Bit-Oriented operation (Bit-Orientando a la operación)
    Literal and Control operation (Control y Literal de la operación)

Primer grupo Byte-Oriented operation

Cada instrucción de este grupo está compuesta por:


  • OPCODE (Código)
    DESTINATION (Destino)
    FILE REGISTER ADDRESS (Dirección del archivo de registro)

El OPCODE o código, es el código de cada instrucción y que es única para cada instrucción. Está formada por los bit del 13 al 8.

El DESTINATION o el destino, indica en dónde se va a guardar el dato.Por ejemplo, si hacemos una suma, tenemos dos opciones dónde guardarlo, una puede ser el registro W y la otra opción puede ser otro registro cualquiera o una pocición de la RAM. Está formada por el bit 7.

La constante que nos indica esto es la letra d. Si esta letra es 0, la operación se guardará en el registro W. EN cambio si vale 1, la operación se guardará en el registro o pocición de memoria que estemos trabajando al momento de usar una instrucción.

Hay instrucciones, como veremos más adelante, que no es necesario indicar dónde queremos guardar la operación, ya que se hace en forma automática. Y hay otras instrucciones que si no se indica el destino, nos puede dar un error al compilar o el compilador lo eligirá el y por ende, nos puede ejecutar mal el programa.

Y por último, tenemos el FILE REGISTER ADDRESS que se carga con la dirección del registro a ser guardado. Está formada por los bit 6 al 0. La constante que nos indica esto, es la letra f

Segundo grupo Bit-Oriented operation

Cada instrucción de este grupo está compuesta por:


  • OPCODE (Código)
    BIT ADDRESS (Bit de dirección)
    FILE REGISTER ADDRESS (Dirección del archivo de registro)

OPCODE es igual al primer grupo. Está formado por los bits 13 al 10.

El BIT ADDRESS, se utiliza para direccionar la operación. Está formado por los bits 9 al 7. Como pueden observar, se sacrificó bit del opcode para dárcelo al bit address. La constante que nos indica esto es la letra b

Y por último tenemos FILE REGISTER ADDRESS, que es igual al primer grupo. Está formado por los bit 6 al 0. Igual que en el primer grupo. la constante que nos indica esto es la letra f.

Tercer grupo Literal and Control

Cada instrucción de este grupo, está compuesta por:


  • OPCODE
    LITERAL

OPCODE es igual que en el primer grupo. Está compuesta por los bits 13 al 8. Exepto para las instrucciones CALL y GOTO que está compuesta por los bit 13 al 11 (prestar mucha atención a esto, cuando veamos estas dos instrucciones entenderán la importancia).

Y el LITERAL que puede ser un valor, por ejemplo para sumar, para restar, para cargar al registro W, en fin, un número decimal, binario o hexadecimal. O puede ser una valor de dirección a dónde apuntar para las instrucciones CALL y GOTO.

Está compuesta por los bits 7 al 0. Exepto para las instrucciones CALL y GOTO que está compuesta por los bit 10 al 0 (prestar mucha atención a esto, cuando veamos estas dos instrucciones entenderán la importancia).

Está adjuntado las 35 instrucciones agrupadas por los tres grupos

Si alcanzan a ver en la imagen, verán que algunas instrucciones afectan al registro STATUS y otras no.
 

Adjuntos

  • set_de_instrucciones_agrupadas_en_tres_grupos_132.jpg
    set_de_instrucciones_agrupadas_en_tres_grupos_132.jpg
    117.7 KB · Visitas: 526
Hola Leon_Elec:
Primeramente muchas gracias por lo que estas haciendo, ya que muestras muchos puntos que yo queria aclararme y que no podía encontrar en ningún lugar, me da mucho gusto que te tomes la molestia de crear este post

Mis dudas en cuanto microcontroladores son de lo más básico pero siento que no puedo seguir aprendiendo acerca de los micros si no entiendo como funciona el procesador.

Bueno espero que no te moleste resporderme algunas preguntas..

Estoy familiarizada con los PICs y más con el 16F887 asi que las preguntas que haga serán tomando en cuenta la arquitectura de los PICs

1.- Los PICs son de arquitectura Harvard, tienen la memoria de datos y la del programa por separado, mi pregunta es en qué lugar se tienen almacenadas las instrucciones ya que tengo entendido que los registros y variables están en la RAM porque su valor cambia durante la ejecución del programa, pero ¿de donde se sacan las instrucciones?. Sé que cuando ya acabas tu código todas las instrucciones utilizadas se guardan en la FLASH, pero ¿no hay un lugar en donde se tengan las 35 instrucciones almacenadas listas para extraerse? Serias tan amable de explicarme todo este proceso del ciclo Fetch? porque también he leido acerca de un Registro de Instrucción

2.- La memoria RAM del pic 16F887 es de 368 Bytes, está dividida en 4 bancos que deberían de ser de 92 bytes ¿correcto? pero si te fijas en las direcciones me dice que es de la 00h a la 1FFh lo cual serian 512 bytes ¿no? y todas las posiciones que son de 8 bits están ocupadas ya sea por registros o para almacenar variables que son los registros de propósito general... me podrias explicar eso?

3.- Otra que creo es muy tonta... Porque la frecuencia de trabajo 8MHz, 20MHz o cualquier valor se divide entre 4? Es que para los temporizadores cuando seleccionas un prescalador te indica que es la frecuencia de trabajo (Fosc/4) entre la seleccion de tu predivisor

Y por ultimo...
4.- Si se tiene una frecuencia de trabajo de 10MHz cada instrucción tarda 40ns en ejecutarse (a excepción de los saltos) entonces si en todo mi codigo tengo 8 instrucciones, el programa tardaría en ejecutarse 360ns? ¿Y esto no afecta al temporizador en caso de que se use? Me refiero que si se pierde tiempo por ejecutar otras interrupciones o si lo hace por su lado. Sé es super tonto preguntar eso pero necesito confirmarlooooooo¡¡¡¡

Muchas gracias de antemano¡ :))
 
Hola Leon_Elec:

Al final te animaste en publicarlo por aquí. Muchos estarán agradecido, que por su conocimiento y buen saber, nos aporta información a personas nóveles, en el cual se ha de agradecer por su tiempo y gran admirador de microcontroladores.

Muchas gracias Leon_Elec.

Administrador:
Bajo mi punto de vista, esta información debería ir en chincheta para que no se pierda en las profundidades del foro.


PD:Cuidado con las faltas de ortografía. En Word se puede corregir como 'Exepto' que en realidad es 'Excepto'.Alludar-ayudar, intrucciones-instrucciones,pociciones-posiciones, deshabilitar-desabilitar, desbiemos-desviemos, exede-excede,eligirá-elegirá etc, etc. Al menos en España es así. Si son fallos, hay que corregirlo con Word por si acaso, tampoco es muy fiable pero ayuda mucho.

EDITO:
He pasado este tutorial de Leon_Elec a PDF. Espero que os sirva de ayuda. Si lo quieren poner en sus Web, mejor pedirle permiso ya que él tiene sus derechos.
Leon_Elec:
Si deseas que modifique algo en la última página a tu estilo o agregar más información, etc, me lo dice y lo cambio. Otra cosa, muchos Webmaster no ponen estos artículos si no saben que el autor los autoriza por eso es bueno indicarlo al final de la página para que lo sepan.

Versión PDF v1.3
 

Adjuntos

  • asm_desde_cero_127.pdf
    707 KB · Visitas: 1,726
Para FantasticalTale:

1- Correcto, la arquitectura es Harvard, esto quiere decir, que posee un bus para la memoria de datos y otro bus para la memoria de programa y memoria de instrucciones

Lee de nuevo mi mensaje número 4 y verás que la memoria de programa guarda el software que escribimos y que fue pasado en formato binario (archivo .hex) para que lo entienda el PIC, de echo, es el único lenguaje que entiende nuestro PIC, es el programador que utiliza otros lenguajes, o sea, otra arquitectura y orden para escribir el software, pero que luego, se traducirá al binario.

La memoria de instrucción, lo utiliza el CP para poder ejecutar una instrucción del programa. El programador, no tiene acceso a ella.

Cada instrucción, tiene un código binario que lo vimos en el mensaje anterior. Vimos como está compuesta cada instucción y en el adjunto, está el valor binario de cada instrucción. Justamente, es el valor binario, que nuestro programa escrive en el archivo .hex por cada instrucción que lee en nuestro programa.

Me explico. Tenemos el siguiente programa:

Código:
MOVLW   B'11111111'
MOVWF   TRISB

Cuando el MPLAB, más precisamente el MPASIM, lea estas instrucciones, las remplaza por su código binario que sería:

Código:
1100xx11111111
00000010000101

La xx es indefinido, por ende, desconozco que puede ir.

Ahora bien, ¿Cuál es más fácil de entender?, pues las instrucciones con palabras. El PIC, no tiene ni idea que es MOVLW, es por eso, que el MPASIM se encarga de ello. Sería terrorífico escribir todo un programa en binario

2- La RAM, está dividida en 4 bancos en forma equitativa, pero la meroria RAM dispuesto para el usuario, no está dividida en forma equitativa.

La RAM posee una cierta cantidad de espacio de los cuales, una parte está reservada para el propio PIC, estén o no los registros. A continuación de estos registros, está la pocición para uso del usuario o del programador.

Hay bancos de memoria, que poseen más registros que otros, por ende, en los banco que tiene menos registros, tiene más memoria para uso del programador. A esto me refiero cuando digo que la memoria RAM para uso del usuario no está dividida en forma equitativa.

Si te fijas, en el banco 0, tenés disponible para vos desde la pocición 0x20 (20h) hasta 0x7f (7fh). Luego en el banco 1 tenés disponible desde la pocición 0xa0 hasta 0xbf y desde 0xf0 hasta 0xff. El espacio del medio, no lo podés usar.

En el banco 2 desde 0x170 hasta 0x17f y en el banco 3 desde 0x1f0 hasta 0x1ff.

Continua en el siguiente post.
 
3- Son dos preguntas en una.

El CP divide en 4 un ciclo de reloj, para poder hacer su trabajo. Esta división genera 4 relojes distintos, denominados Q1, Q2, Q3, Q4. En Q1, hace avanzar el CP una pocición más, Q2 y Q3 lee y decodifica la instrucción y Q4 Busca una instrucción anterior y guarda la nueva instrucción obtenida en Q2 y Q3. Así, en un ciclo de reloj del cristal, por ejemplo, Ejecuta una isntrucción anterior y lee la nueva instrucción.

Tenemos:

002 MOVLW B'00100010'
003 MOVWF PORTB
004 NOP

Cuando el CP se ubica en la línea 002, lee esta línea y ejecuta la línea 001, Q1 hace incrementar el CP a uno y pasa a la línea 003, acá lee esta instrucción, la decodifica, la pasa a la memoria de instrucción y ejecuta la ínstrucción almacenada correspondiente a la línea 002 y así sucesivamente y ciclicamente.

La otra pregunta de los temporizadores, es porque los TMR se incrementa junto con el CP, es por eso que se lo tiene que dividir por 4 la frecuencia de reloj.

4-Los TMR trabajan en forma independiente al CP, digamos que hay otra persona dedicada solo para el TMR0, otra para el TMR1 otra para el TMR2. SI tu programa tarda en ejecutarce 8ns y el TMR0 tiene que contar 1 seg, lo hará, no importa que el CP esté en un bucle infinito. Si son afectado los TMR por un sleep, es por eso que el TMR2 se lo puede seguir incrementando por medio de una pata externa, así cuando llega a su desbordamiento, despierta al PIC.
Los preescaler para cada TMR son para ajustar distintos tiempos.

Sé es super tonto preguntar eso pero necesito confirmarlooooooo¡¡¡¡

Yo diría se es super tonto no preguntar, y un descerebrado aquel que se rie de otro por la pregunta echa.
 
Para META.

Si tenía miedito :rolleyes: :rolleyes: No, jajaja. Me lleva mucho tiempo en escribir cada mensaje, y cuando termino, no tengo más ganas de seguir sentado frente al monitor. Tengo una hija, y tengo que cuidarla. Le presto más atención a ella que a esto y me atraso.

En cuanto a las faltas de ortografía, tengo muchísima, y por la misma razón anterior, no lo escribo en el word, o lo paso para corregirlo y luego volver a pegarlo.

No tengo drama que sea publicado en las web de cada uno, ni que sea pasado a PDF. Solo estaré encontra quien lucre por lo mío sin mi permiso. Si lo publican en internet deben mencionar el autor que obviamente, soy yo

Meta, yo esperaría para hacer el PDF o deberás actualizarlo seguido, porque el tutorial de ASM no terminó, recine empieza.
 
Hola:

Entendido. ME encargo de las faltas en Word y mi experiencia estudiantil. DE todas maneras eres humano y es fácil de entender. También tengo muchas.

Lo de tu hija, es más importante. El deber te llama.

Lo de PDF lo actualizaré con gusto cuando quieras. Por cierto, si quieres que alguien te haga sugerencia del manual porque muchos quieren comunicarse con el autor. Me dices que si pongo tu e-mail. Sólo falta eso.

Saludos.
 
Prefiero que lo hagan por acá, porque me va a llenar el correo de pregunta y no voy a tener tiempo para contestarla.

El día que arme mi propia WEB te lo diré para que actualizes el PDF.

Se acepta críticas, sugerencia.
 
Entendido.

Pondré el enlace de este tema aquí. Dentro un rato lo vuelvo a subir por si las moscas. Si quieres en otros foros acceder al tema donde presentas el tema, también lo pongo. Usted decide. Eso si, dejo bien claro de quién es el autor, por si acaso puedes decir cuantos nick usas para ser identificado.
 
FantasticalTale dijo:
Sé es super tonto preguntar eso pero necesito confirmarlooooooo¡¡¡¡

Preguntar no es de tontos

Las personas tontas carecen del entendimiento necesario para preguntar, por ende, es tontería creer que 'preguntar es de tontos'.

Está extendida la creencia que preguntar es una demostración de incultura, de falta de conocimientos, … de ignorancia. Como en otras tantas creencias, nada de certeza hay en ella.

La pregunta es una herramienta de aprendizaje también para quién responde, pues las personas podemos aprender de nosotras mismas simplemente escuchándonos. Al responder a una pregunta, hacemos conscientes conocimientos que teníamos pero desconocíamos su existencia.

Un momento adecuado para preguntar es cuando estamos presentes en un diálogo donde se trata un tema del cual tenemos escasos o ningún conocimiento. De esta manera mostramos interés por él, lo que no incomoda al resto de participantes, y ayuda a abrir el diálogo a otras personas que permanezcan en silencio.

Preguntar es un claro síntoma de querer saber más y las personas ignorantes no quieren aprender más porque ya creen saberlo todo, las tontas, en cambio, no podrían aprender aunque quisieran.

“Quien hace una pregunta, teme parecer ignorante durante cinco minutos. Quien no pregunta se mantiene ignorante toda la vida”
 
Muchas gracias Leon_Elec por tomarte el tiempo, tus respuestas no pudieron ser más claras, lo entendí perfectamente.

En cuanto al espacio de la RAM debí suponer que los 368 Bytes que viene en las especificaciones eran para los registros de propósito general (nuestras variables) y no todos los registros. :)

Todo lo que escribiste me quedo super claro :

Para Leon_Elec y Meta:

Muchas gracias por las respuestas tan motivadoras¡¡¡ me da mucho gusto que se tomen la molestia de leer mis mensajes y me compartan su conocimiento. Ya no tendré tanta pena en preguntar¡

Un abrazo
 
Las instrucciones

Les voy a arruinar el momento de alegría. Las instrucciones hay que estudiarlas de memoria. Si, leyeron bien, de memoria. Lo que tienen que saber sobre las instrucciones, es como se escriben, que hace cada instrucción y lo más importante que bit del REGISTRO afecta.

Vamos a ir viéndolo por orden alfabético. Y otra cosita más, como es de esperarce, están en INGLES o son abreviaturas pero en INGLES.

Recordemos que: .123 o D'123' es en decimal; 0x7B o 7Bh o H'7B' es en Hexadecimal; B'01111011' es en binario.

ADDLW

Suma un valor designado por el programador al registro W

Ejemplo

Código:
        ADDLW      .128

Si W tenía cargado un valor = .5, después de la instrucción W tiene cargado el valor .133

Para recordar, ADD es sumar, L es Literal y W es el registro W

Afecta a:


  • Z Se pone a 1 si la operación es 0
    DC Se pone a 1 si hubo un acarreo del bti 3 al 4
    C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'

ADDWF

Suma el valor del registro W con el valor de un registro cualquiera. El destino de esta suma, lo elige el programador.

Ejemplo:

Código:
          ADDWF      TEMP,W

Si W tenía guardado .133 y la pocición de la RAM llamada TEMP tenía el valor cargado con .2, W vale .135 y TEMP continúa valiendo .2

Ahora si hubiera puesto así:

Código:
         ADDWF       TEMP,F

TEMP valdría .135 y W valdría .133

Para recordar, F, es File Register Address.

NOTA: Para indicar la dirección de dónde se guarda, también se puede poner 0 o 1 en vez de W o F. 0, corresponder guardarlo en el registro W y 1 en el registro TEMP (para este caso).

Afecta a:


  • Z Se pone a 1 si la operación es 0
    DC Se pone a 1 si hubo un acarreo del bti 3 al 4
    C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'

ANDWF

Realiza la operación AND entre W y un registro designado por el programador. El destino de esta operación lo elije el programador.

Ejemplo:

Código:
            ANDWF       TEMP,F

Si antes de la instrucción W vale B'11100011' y TEMP vale B'00111010' Después de la instrucción TEMP vale B'00100010' y W vale B'11100011'

Afecta a:


  • Z Se pone a 1 si la operación es 0
 
Atrás
Arriba