Hola! Iba en broma!No me fastidia para NADA!!
. Nadie nace sabiendo! Mejor asi y no que te quedes con las dudas.
Escrito originalmente por rnelson
Lo que entiendo de la tabla es que si W=1 se va a ejecutar retlw .0??? si W=3 se va a ejecutar retlw .2???, si W=4 se va a ejecutar retlw .4, y asi sucecivamente
Vamos a comenzar por el PC (Program Counter). Este registro contiene un numero: La posicion de memoria que se va a ejecutar actualmente.
Por ejemplo:
ORG 0x0000 ;este es el vector de la primera posicion de memoria de todo PIC. Cero. EL PIC cuando lo enciendes(por ej.) arranca con este valor. CERO.
NOP ;al compilar este codigo, esta instruccion se graba en la posicion cero del PIC.
NOP ;esta se graba en la posicion 1
GOTO INICIO ;esta se graba en la posicion 2
Entonces, sabemos que en la programacion, tal como la conocemos, el codigo se ejecuta de arriba hacia abajo siempre y cuando no haya una instruccion que genere un desvio (ejemplos: CALL GOTO RETURN RETLW RETFIE UNA INTERRUPCION etc)
Entonces el PC (PCL en este caso para la explicacion...La L es de Low, ya que la parte alta del PC se carga en el registro PCLATH...pero ese es otro rollo)
El PC se autoincrementa, es decir, luego de ejecutarse una instruccion, se suma a si mismo el valor 1.
Entonces, siguiendo con el ejemplo anterior:
ORG 0x0000 ;esto es SOLO un vector. lo unico que haces es indicarle al compilador, donde deseas que comiencen a ser posteriormente ubicadas las instrucciones que le siguen a esta linea. Esta linea NO se graba en el PIC.
NOP ;aqui el PC = 0
NOP ;luego de ejecutarse la NOP, el PC se autoincrementa, y vale 1, entonces ejecuta esta linea.
GOTO INICIO ; lo mismo aqui.se autoincrementa y pasa a valer 2.Cabe destacar que la instruccion GOTO interrumpe el normal incremento del PC. El GOTO es un salto incondicional, quiere decir que carga al PC con el valor de memoria en el cual se encuentre la instruccion inmediatamente debajo o a la derecha de la etiqueta INICIO.De esta manera se logra que el programa esquive lineas de codigos que no deseamos se ejecuten.
al inicio de tu tabla, el PC tiene un determinado valor, ok? eso depende de el codigo. Si deseas ver exactamente en que posicion de memoria esta una instruccion, no tienes mas que compilar el archivo ASM en el MPLAB, y luego ir al menu View--> Program Memory.
Entonces, te lo explico asi:
TABLA ADDWF PCL,1 ;aqui PC = X
RETLW .0 ;aqui PC = X+1
RETLW .1 ;aqui PC = X+2
RETLW .2 ;aqui PC = X+3
RETLW .4 ;aqui PC = X+4
RETLW .8 ;aqui PC = X+5
RETLW .16 ;aqui PC = X+6
RETLW .32 ;aqui PC = X+7
RETLW .64 ;aqui PC = X+8
RETLW .128 ;aqui PC = X+9
RETLW .X ;aqui PC = X+10
RETLW .X ;aqui PC = X+11
RETLW .X ;aqui PC = X+12
RETLW .X ;aqui PC = X+13
RETLW .X ;aqui PC = X+14
RETLW .X ;aqui PC = X+15
RETLW .X ;aqui PC = X+16
Si PORTA = 0, entonces al hacer MOVF PORTA,W W se carga con el valor cero. Cuando llamas a la tabla, al adicionarle cero al PC, el PC vale lo mismo que antes: X. Pero recuerda que mencione que el PC se autoincrementa(pues si no lo hiciese, pues no corriria nuestro codigo...) entonces en realidad si W vale cero, se ejecuta la linea siguiente al ADDWF PCL,1, que es RETLW .0
Si W = 1 entonces, en realidad,el PCL va a sumarse una posicion porque W vale 1, y otra mas porque el PC SIEMPRE se autoincrementa, en total va a sumarse 2, ejecutandose por lo tanto: RETLW .1
idem para los demas valores de W.
Entonces, resumiendo, en realidad, el PCL siempre se agregara uno mas que el valor de W, ok? ejemplo: si W= 0, PCL = X+1 si W= 1, PCL = X+2...etc...
En resumen: en este caso que sumas W al PCL:
PCL = PCL+W+1
Escrito originalmente por rnelson
ahora porque colocan valores 1,2,4,8,16,32,64, etc??? esto no lo entiendo...
Ok. el Puerto B es un registro de 8 bits, lo que quiere decir, que nos ofrece 256 valores distintos (del 0 al 255 en nuestro sistema decimal).
Cada Pin del Puerto B esta asignado a un bit del registro 0x06 (PORTB).
El PIN cero del puerto B esta asignado al bit cero del registro PORTB
El PIN uno del puerto B esta asignado al bit uno del registro PORTB
y asi los 6 restantes...
Suponte que colocas 8 leds en modo fuente(lo normalmente utilizado) en los 8 pines del puertoB del pic(un led por pin).
el valor .1 es en binario "00000001"
Un 1 en un bit indica que el led conectado al pin correspondiente, encendera.
Entonces si cargas al puertoB con el valor 1, entonces, enciende el led en RB0 y los demas permanecen apagados.
el valor .2 es en binario "00000010"
En este caso, el bit que se pone en uno es el bit 1, asignado al pin RB1, entonces enciende el led en RB1 y los 7 restantes permanecen apagados.
el valor .4 es en binario "00000100"
En este caso, el bit que se pone en uno es el bit 2, asignado al pin RB2, entonces enciende el led en RB2 y los 7 restantes permanecen apagados.
Idem para los demas valores( hace la conversion de decimal a binario y comprobalo)
Si por ejemplo cargas el valor .255 en el puertoB, en binario 255 = "11111111". Esto hara que enciendan los 8 leds conectados a los 8 pines del puertoB.
Espero haya quedado claro. Exitos. Bruno.