Vous êtes sur la page 1sur 12

Las instrucciones sern explicadas como tipo diccionario, solo se dir el modo de uso.

BSF----->F,b
Activa un bit especifico de un registro, es decir introduce un 1. "F" es el registro el cual se le activar un
bit y "b" es el bit que ser activado como 1.
Ejemplo:
;Suponiendo que el puerto A est todo en 0.
BSF PORTA,3
;Contenido del puerto A = 00001000.

BCF----->F,b
Desactiva un bit especifico de un registro, es decir introduce un 0. "F" es el registro el cual se le
desactivar un bit y "b" es el bit que ser de desactivado como 0.
Ejemplo:
;Suponiendo que el puerto B esta todo en 1.
BCF PORTB,5
;Contenido del puerto B = 11011111.


BTFSS----->F,b
Hace una comparacin y verifica si un bit especifico se encuentra activado ("1"), s esta activado saltar la
siguiente instruccin(la instruccin debajo) y ejecutar la que sigue.
Ejemplo: Cuando el sexto bit(0,1,2,3,4,5,6,7) del puerto A este en "1" se saltar la instruccin "GOTO
NO" pero cuando el bit este en "0" seguir la instruccin "GOTO NO". NO HAY NINGN SALTO
;Suponiendo que el puerto A = 00100000.
BTFSS PORTA,5
GOTO NO
GOTO SI
;Se saltar la instruccin NO y ejecutar GOTO SI.

BTFSC----->F,b
Exactamente lo mismo pero esta vez verificar si un bit especifico esta en estado bajo ("0")
;Suponiendo que el puerto A = 00100000.
BTFSC PORTA,5
GOTO NO
GOTO SI
;Como el bit no se encuentra en 0, sino en 1, ejecuta GOTO NO.

INCFSZ----->F,d
Es una instruccin que permite hacer un incremento, de 1 en 1. Estos incrementos sern aadidos a un
registro. La instruccin se traduce como: incrementa al registro y si es 0, sltate la siguiente instruccin.
Esta instruccin se ejecuta y el resultado se puede guardar en el mismo registro o en W.
Ejemplo: Incrementar el puerto A y el resultado lo guardar en si mismo y s es 0 se saltar la
instruccin "GOTO NO". Nota: Llegar a 0 en la cuenta binaria 0-255, despus de aadirle otro bit se
convertir en 100000000, se activar el C(carry) y los bits del puerto A sern 0.
;Suponiendo que el puerto A = 00000000.
INCFSZ PORTA,1
GOTO NO
GOTO SI
;Despues de la primera ejecucin PORTA = 00000001 y seguir incrementando hasta llegar a 0 de
nuevo.


INCF----->F,b
Es una instruccin que permite hacer un incremento, de 1 en 1 en un registro especifico y podemos
guardar el resultado en ese mismo registro o en W.
Ejemplo: Incrementar el puerto A y el resultado lo guardar en si mismo.
;Suponiendo que el puerto A = 00010010.
INCF PORTA,1
;El valor del puerto A = 00010011


DECFSZ----->F,b
Es una instruccin que permite hacer un decremento, de 1 en 1. Estos decrementos sern restados a un
registro. La instruccin se traduce como: decrementa al registro y si es 0, sltate la siguiente instruccin.
Esta instruccin se ejecuta y el resultado se puede guardar en el mismo registro o en W.
Ejemplo: Decrementar el puerto A y el resultado lo guardar en si mismo y s es 0 se saltar la
instruccin "GOTO NO". Nota: Llegar a 0 en la cuenta binaria 255-0, despus de quitarle otro bit se
convertir en 255 negativo, se activar el C(carry), Z(cero) y los bits del puerto A sern 0.
;Suponiendo que el puerto A = 00010010.
DECFSZ PORTA,1
GOTO NO
GOTO SI
;El valor del puerto A = 00010010, ejecutar GOTO NO hasta ser 0.


DECF----->F,d
Es una instruccin que permite hacer un decremento, de 1 en 1 en un registro especifico y podemos
guardar el resultado en ese mismo registro o en W. Ejemplo: Decrementar el puerto A y el resultado lo
guardar en W.
;Suponiendo que el puerto A = 00010010.
DECF PORTA,0
;El valor del puerto A = 00010010, valor de W = 00010001


MOVF----->F
Esta instruccin permite extraer un dato de un puerto y guardarlo directamente en W. No funciona con un
registro interno, solo para leer los puertos, es decir extraer un dato.
Ejemplo: Leer el puerto B y lo guardar en W directamente. MOVF PORTB Esto no se puede hacer,
"MOVF REG", no se puede sacar un dato de una variable(registro interno).
;Suponiendo que el puerto B = 001000010.
MOVF PORTB
;El valor de W = PORT B, 001000010


MOVLW----->L
Esta instruccin asigna un valor a W en hexadecimal, decimal, octal y binario. Solo es para darle valor a
W.
Ejemplo: Se le asigna el valor de 7 en decimal a W.
;El valor que se introduce puede ser decimal, binario o hexadecimal
MOVLW D7
;El valor de W = 7


MOVWF----->F
Esta instruccin le asigna el valor de W a un registro interno, es decir el valor de W se lo d a el registro.
Ejemplo: El valor de W lo tendr la variable(registro interno) REG. Tambien sirve para sacar datos por
los puertos.
;El valor de W = 3.
MOVWF REG
MOVWF PORTA
;Salida para puerto A es igual al valor de W. El valor de REG = W. Entonces PORTA = 3 y REG =
3.


ADDWF----->F,d
Esta instruccin realiza una operacin de suma, suma W con el registro interno que le asignemos.
Ejemplo: El valor de W es sumado con el registro REG y el resultado es guardado en s mismo.
;El valor de W = 5 y REG = 2
ADDWF REG,1
;REG = W+REG, REG = 5+2, REG = 7.


ADDLW----->L
Esta instruccin realiza una operacin de suma, suma una literal(valor cualquiera) con W.
Ejemplo: Un valor cualquiera(5) se suma con W y por defecto se guarda en W.
;El valor de W = 6
ADDLW B00000010
;El valor a sumar es 2, W = 6+2, W = 8


SUBLW----->L
Esta instruccin realiza una operacin de resta, resta una literal(valor cualquiera) con W.
Ejemplo: Un valor cualquiera(8) se resta con W y por defecto se guarda en W.
;El valor de W = 13
SUBLW D8
;W = W-8, W = 13 8, W = 5


SUBWF----->F,d
Esta instruccin realiza una operacion de resta, resta W con el registro interno que le asignemos.
Ejemplo: Ejemplo: El valor de W es restado con el registro REG y el resultado es guardado en s mismo.
F-W
;El valor de W = 13
SUBLW D8
;W = W-8, W = 13 8, W = 5


CLRF----->F
Esta instruccin pone todo el contenido del registro en 0 totalmente en 0.
Ejemplo: El contenido del registro lo pone en 0.
;El valor REG = 24
CLRF REG
;REG = 0


RRF----->F,d
Esta instruccin hace un recorrido de bits hacia la derecha. Es decir, en binario sera de esta forma:
100-->010-->001-->000. Cuando se recorre y queda en 0, se enciende Z y C. Despues si se vuelve a
recorrer inicia en B7(10000000).
Ejemplo: Recorre el bit hacia la derecha y el nuevo numero lo guarda en W.
;El valor REG = 00001000
RRF REG,0
;REG = 00001000, W = 00000100


RLF----->F,d
Esta instruccin hace un recorrido de bits hacia la izquierda. Es decir, en binario sera de esta forma:
001-->010-->100-->000. Cuando se recorre y queda en 0, se enciende Z y C. Despus si se vuelve a
recorrer inicia en B0(00000001).
Ejemplo: Recorre el bit hacia la derecha y el nuevo numero lo guarda en W.
;El valor REG = 00001000
RLF REG,0
;REG = 00001000, W = 00010000


ANDLW----->L
Esta instruccin realiza una operacin AND de W con una literal(valor cualquiera).
Ejemplo: Realiza AND W con 10, es decir, W AND 10 y el resultado se guarda en W.
;El valor W = 01101001
ANDLW B00001010
;W = 00001000

ANDWF----->F,d
Esta instruccin realiza una operacion AND de W con un registro interno.
Ejemplo: Realiza AND W con REG, es decir W AND REG y el resultado se guarda en si mismo
;El valor REG = 10001100, W = 11001010
ANDWF REG,1
;REG = 10001000

RETLW----->L
Esta instruccin se utiliza para Tablas, antes de esto se debe poner ADDWF PCL,1 Obligatoriamente. Lo
que hace RETLW es asignar un valor a W, pero con base en el resultado de ADDWF PCL,1. Esto
significa que el resultado de la suma, es el numero de instrucciones que se saltar y ejecutar solo 1 de las
instrucciones RETLW.
Ejemplo: Es un decodificador de 3 entradas desplegando en decimal los nmeros en combinacin.
;El valor de PORTA = 5
MOVF PORTA
;El valor de PORTA se guarda en W
CALL TABLA
;Se hace una llamada a una subrutina
TABLA
ADDWF PCL,1
;Se hace la suma de W con PCL.
RETLW D'0'
RETLW D'1'
RETLW D'2'
RETLW D'3'
RETLW D'4'
RETLW D'5' ;Salta 5 instrucciones y se ejecuta sta.
RETLW D'6'
RETLW D'7'
RETURN
;Sale de la subrutina con el valor de 5 en W
MOVWF PORTB
;Se saca el resultado por el puerto B
;PORTB = 5

Otro Ejemplo:
;El valor de PORTA = 3
MOVF PORTA
;El valor de PORTA se guarda en W
CALL TABLA
;Se hace una llamada a una subrutina
TABLA
ADDWF PCL,1
;Se hace la suma de W con PCL.
RETLW D'0'
RETLW D'2'
RETLW D'4'
RETLW D'6' ;Salta 3 instrucciones y se ejecuta sta
RETLW D'8'
RETLW D'10'
RETLW D'12'
RETLW D'14'
RETURN
;Sale de la subrutina con el valor de 6 en W
MOVWF PORTB
;Se saca el resultado por el puerto B
;PORTB = 6.


CALL
Esta instruccin es para llamar a una subrutina o funcin y ejecuta esa funcin llamada, despus regresa y
continua con el programa principal.
Ejemplo: Llama a una tabla y regresa.
...Programa principal
MOVLW D9
CALL SUMA
MOVWF PORTB
END
SUMA
ADDLW D6 ;Se hace W =W+6, W =9+6, W =15
RETURN
;Regresa al programa principal
;PORTB = 15


GOTO
Esta instruccin es una salida falta, enva al programa a otra parte, es decir, se olvida de todo lo demas y
lo nico que hace es buscar la etiqueta a donde se enviar el programa.
Ejemplo: Es mandado a la etiqueta FIN
GOTO FIN ;Realiza un salto a la etiqueta FI N
MOVLW D4 ;Salta esta instruccion
ANDWF PORTB ;Salta esta instruccion
MOVWF PORTB ;Salta esta instruccion
RLF PORTB ;Salta esta instruccion
FIN ;Se posiciona en esta instruccion
END


EQU
Esta instruccin se ocupa para hacer una igualacin, normalmente se usa para declarar variables(registro
interno) al inicio del programa.
Ejemplo: Se declara la variable REG con un registro interno.
REG EQU 0x20


RETURN
Es la instruccion que permite regresar al programa principal, despues de haber sido llamado a una
subrutina.
Ejemplo: Regresa al programa principal.
...Programa principal
MOVLW D9
CALL SUMA
MOVWF PORTB
END
SUMA
ADDLW D6 ;Se hace W =W+6, W =9+6, W =15
RETURN
;Regresa al programa principal
;PORTB = 15


END
Esta instruccin define el termino del programa. Cierre total.
Ejemplo: PROGRAMA TERMINADO
...Programa principal
MOVLW D9
CALL SUMA
MOVWF PORTB
END


Clasificacin de instrucciones
Las instrucciones se clasificarn en instrucciones operacionales e instrucciones de accin. Instrucciones
operacionales: Son aquellas que al ejecutarse alteran y/o modifican el contenido de ese registro, y que nos
da la opcin de guardado, ya sea en W(0) o en s mismo(1). Instrucciones de accin: Son aquellas que
ejecutan una accin caracterstica, es decir, que cuando la ejecutamos necesitamos ordenarle exactamente
una ubicacin en el caso de los puertos podemos poner:(PORTA,0), (PORTA,1), (PORTA,2),
(PORTA,3), (PORTA,4), (PORTA,5), (PORTA,6) o (PORTA,7) Instrucciones simples: Son aquellas que
solo tienen una funcin, y no necesita hacer mas preguntas.Solo necesitamos saber si se aplica para un
registro o para una literal.

INSTRUCCIONES OPERACIONALES
RRF------------>F,d
RLF------------->F,d
ADDWF-------->F,d
INCFSZ--------->F,d
INCF------------->F,d
DECFSZ-------->F,d
DECF------------>F,d
SUBWF-------->F,d

INSTRUCCIONES DE ACCION
BSF------------->F,b
BCF------------->F,b
BTFSS---------->F,b
BTFSC---------->F,b

INSTRUCCIONES SIMPLES
MOVF---------->F
CLRF---------->F
MOVWF------->F
MOVLW------->L
ADDLW-------->L
SUBLW-------->L
ANDLW-------->L
RETLW--------->L


Videos de YouTube

Seleccione el video que desea ver haciendo click en las imagenes de abajo.


Configuracin de puertos

La configuracin de puertos es esencial para que un micro controlador trabaje, en esta parte, nosotros
definimos si queremos que trabaje como entrada o como salida. Antes que nada Recuerden que los
PORTS y los TRISA, TRISB estn en bancos diferentes(en algunos PIC); debemos acceder a los bancos
por medio de el registro STATUS,5. Al modificar STATUS,5 con un 0 o con 1, estamos indicando un
cambio de banco y por lo tanto modificar TRISA,TRISB y los PORTS. Tambien cabe recordar
desactivar(si se requiere) el comparador analogico "CMCON" "ADCON". Por medio de carga de datos,
es decir usar un MOVLW y dar el valor en binario, asi podemos definir si estamos usando como entrada o
salida un puerto. Recuerden que un puerto para ser configurado como entrada, debe ser asignado a TRISA
o TRISB dependiendo el puerto. Esto quiere decir que para configurar el puerto A como entrada en los
bits 0-4 como entrada y 5-7 como salida, debemos introducir los datos en binario a TRISA
correspondientes, en este caso sera este: b'00011111'.


Configuracin de bits (Palabra de configuracin)

La palabra de configuracin es aquella que nos permite activar, desactivar, y elegir las dems
configuraciones bsicas de nuestro microcontrolador. Esta palabra de configuracin es posible
modificarla o declararla de 2 formas; una es por medio del software MPLAB y la otra es declarando lo
que vamos a usar.
Configuracin por Software:
Para acceder al panel, debemos iniciar MPLAB, una vez iniciado el proyecto debemos ir la barra superior
y buscar "Configuracin", al desplegar el men seleccionamos "Configuracin de bits". Al hacer esto nos
abrir una ventana en la cual por defecto tendr una opcin en la parte superior marcada, nosotros
debemos desactivarla para poder modificar. Ahora bien podemos configurar; las opciones son:
FOSC
WDTE
PWRT
MCLRE
BODEN
LVP
CPD
CP

Cada opcin sirve para algo diferente y nos da una palabra diferente, la cual usaremos despus ahora
explicar para que sirve cada parte y sus opciones.

FOSC: Esta parte indica el tipo de oscilador que vas a usar.
-RC-Oscilador con resistencia y condensador(salida del clock).
-INTOSC-Oscilador interno que usamos por defecto(la opcion que dice I/O es la que se recomienda, ya
que de esa forma podemos seguir usando nuestro puerto, s usamos CLOUT significa que tendra una
salida de reloj).
-EC-Seal externa de entrada de reloj
-HS-Cristal de alta velocidad (8, 10, 20 MHz)
-XT-Cristal de cuarzo (100 KHz y 2, 4 MHz)
-LP-Cristal de baja frecuencia y bajo consumo de potencia (32, 200 KHz)

WDTE: Bit de habilitacin del Watch Dog Timer.
El WDT es otra caracterstica de seguridad en los microcontroladores cuyo objetivo es prevenir que el
microcontrolador se quede indefinidamente bloqueado debido a fallas en la logica de software y en
algunos caso debido a fallas de hardware causadas, entre otras cosas por el ruido electromagntico en
ambientes de alto riesgo.
Esta opcin solo tiene 2 opciones, activado o desactivado.

PWRT: Bit de habilitacin de temporizador al encender(Temporizador de encendido).
Permite retardar por cierto tiempo el encendido del microcontrolador como medida de proteccin hasta
que la fuente de alimentacin se estabilice,es decir que se esperar a que no haya variaciones en el
voltaje.
Esta opcin solo tiene 2 opciones, activado o desactivado.

MCLRE: Habilitacin de la terminal de reset.
Esta parte tiene 2 opciones, ambas inician asi: "RA5/MCLR VPP pin function is", pero la diferencia de la
continuacin es esta.
Cuando termina en "Ditigal input" quiere decir que el reset esta desactivado porque internamente esta
conectado a Vpp.
Cuando termina en "MCLR" quiere decir que el reset esta activado o bien puede ser activado con el
puerto RA5.

BODEN: Bit de reset por voltaje de alimentacin bajo(Temporizador de apagado).
Es una medida de seguridad para prevenir un funcionamiento errneo o errtico en el microcontrolador
debido a bajones breves en el voltaje(fuente de alimentacin).

LVP: Habilitacin por programacin de voltaje bajo.
Esta opcin es algo complicada, pero se recomienda apagar esta opcin cuando son principiantes.
Para saber que esta apagada debemos usar esta opcion: "RB4/PGM pin has digital I/O funtion".

CPD: Bit de proteccin para cdigo de datos.
Se recomienda apagar.

CP: Bits de proteccin de cdigo.
Los bits(13-10) encargados de proteger la memoria del programa.
Se recomienda usar el "code-protected".


Configuracin por declaracin:
El sacar la palabra de configuracin por declaraciones es de una forma mas avanzada por as decirlo, ya
que se declara todo lo que se usar. Tiene el mismo propsito que la palabra generada por configuracin
de panel, pero aqu se escribe el cdigo.

Osciladores FOSC:
_RC_OSC
_EXTRC_OSC
_EXTRC_OSC CLKOUT
_EXTRC_OSC_NOCLKOUT
_INTRC_OSC
_INTRC_OSC CLKOUT
_INTRC_OSC_NOCLKOUT
_LP_OSC
_XT_OSC
_HS_OSC

Temporizador WDT:
_WTD_ON
_WTD_OFF

Temporizador de Encendido(PWRT):
_PWRTE_ON
_PWRTE_OFF

Reinicio por Apagn(BODEN):
_BODEN_ON
_BODEN_OFF

Reinicio Maestro(MCLRE):
_MCLRE_ON
_MCLRE_OFF

Proteccin de Cdigo(CP):
_CP_ALL
_CP_ON
_CP_75
_CP_50
_CP_OFF

Proteccin de Memoria(LVP):
_DP_ON
_DP_OFF

Proteccin de Memoria de Configuracin(CPC):
_CPC_ON
_CPC_OFF


Retardos


Un retardo es una pequea pausa que se genera mediante bucles anidados en nuestro programa.
Para que un microcontrolador haga una pausa debemos hacer que "no haga nada" y tarde en hacerlo.
Recordemos que un microcontrolador dependiendo de su frecuencia de oscilacion tarda cierto tiempo en
ejecutar una instruccion, ahora si creamos bucles de tal forma que tarde en ejecutar los bucles, nosotros
veramos una pequea pausa.

Para generar un retardo usaremos las instruccines "DECFSZ" y "goto" y variables para generar nuestro
bucle.
Para hacer esto debemos saber el periodo del ciclo maquina, para saber el tiempo que tarda por
instruccin.
CODIGO:
Primero declaramos variables:
P EQU 0x21
M EQU 0x22
N EQU 0x23

Luego creamos una subrutina y comenzamos el codigo:
DELAY
MOVLW D'8'
MOVWF P
TRES
MOVLW D'80'
MOVWF M
DOS
MOVLW D'250'
MOVWF N
UNO
NOP
NOP
DECFSZ N,1
GOTO UNO
DECFSZ M,1
GOTO DOS
DECFSZ P,1
GOTO TRES

Por ultimo regresamos al programa principal:
RETURN
De esta forma tenemos un retardo. Pero recordemos que esto es un ejemplo con un microcontrolador a
una frecuencia de 4MHz.
Con este retardo solo tendremos que cambiar valores de "P" para obtener retardos en dcimas de
segundo.


Interrupciones


Las interrupciones son una forma de detener el codigo del programa principal sin tener que hacer alguna
operacion dentro del codigo principal. Estas pueden ser por diferentes formas, pero lo importante es que
requieren de 2 registros especiales: INCTON y OPTION_REG. Estos registros permiten configurar el
tipo de interrupcion que queremos realizar. Ahora explicare los bits de estos registros, pero tengan en
cuenta que varian dependiendo del microcontrolador que esten implementando, asi que es necesario
revizar el datasheet.

INCTON
B7-Este bit activa las interrupciones en general.
B6-Tipo de interrupcion por perifericos, cualquier pin del microcontrolador.
B5-Tipo de interrupcion por TMR0, contador interno o temporizador.
B4-Tipo de interrupcion por RB0.
B3-Tipo de interrupcion por RB7-RB4.
B2-Bandera del TMR0.
B1-Bandera de RB0.
B0-Bandera de RB7-RB4

OPTION_REG
B7-Resistencias internas por software, manejan logica inversa, deben estar deshabilitadas para usar
interrupciones.
B6-Selecciona el tipo de activacion de RB0, ya sea por estado alto o estado bajo.
B5-Define la fuente de reloj,interna(0) y externa(1).
B4-Define el incremento de TMR0, ya sea por estado alto o estado bajo(de la frecuencia de reloj).
B3-Selecciona entre TMR0(0) o WDT(1).
B2,B1,B0-Determinan la escala a del preescalador, por sus posiciones.

Escalas

TMR0
000-1:2
001-1:4
010-1:8
011-1:16
100-1:32
101-1:64
110-1:128
111-1:254

WDT
000-1:1
001-1:2
010-1:4
011-1:8
100-1:16
101-1:32
110-1:64
111-1:128

Calculo de tiempo en TMR0
Antes que nada debemos saber la frecuencia a la que trabajamos y tambien debemos saber que es un ciclo
maquina y un ciclo reloj.

Un ciclo reloj es como su nombre lo indica "un ciclo" pero de nuestra frecuencia. Y un ciclo maquina es
igual a 4 veces el ciclo reloj, por lo que para saber el tiempo que tarda nuestro microcontrolador en
ejecutar 1 instruccin debemos hacer el calculo: 1/(Frecuencia/4) ya que la inversa de la frecuencia es el
periodo(tiempo).

Ejemplo:

Frecuencia: 4MHz Ciclo maquina= 1/(4000000/4)= 0.000001segundos = 1 microsegundo
Ahora ya sabemos el tiempo que tarda en ejecutar una instruccion.
Recordemos que el TMR0 cuenta desde 0-256 y al seleccionar la escala modificamos el tiempo que
queremos que se ejecute la interrupcion. Para determinar la escala y el valor de TMR0 es necesario saber
el tiempo que queremos para ejecutar la interrupcion, para esto, debemos ir haciendo pruebas para saber
cual es el mas cercano y en base a esa escala hacer lo siguiente:

Tiempo=Escala*TMR0(valor 0-256)

Por ejemplo si queremos saber la escala y el valor del TMR0 para obtener la interrupcion en
10milisegundos, hacemos esto.

Multiplicamos 256(Valor del TRM0 sin afectar) por una escala, en este caso 1:8(es decir 8). Despus de
multiplicar obtendremos el valor en microsegundos, en este caso 256*8=2048, por lo tanto 10ms=
10000us, aun nos falta tiempo. Asi multiplicamos hasta lograr un valor mayor considerable. Para lograr el
mas cercano multiplicamos 256*64(escala 1:64)=16384, ya es cercano a 10000, asi que pasamos al
siguiente paso.
Dividimos nuestro tiempo deseado "10000" entre la escala que nos dio el resultado aprox.(64), y nos el
valor maximo que debe contar el TRM0, en este ejemplo el resultado es: 10000/64=156.25, pero
unicamente podemos poner numeros enteros, asi que el mas cercano es 156.
Ahora bien, 156 es el Max que debe contar TMR0, pero recuerden que para ejecutarse la interrupcion por
TMR0, debe desbordarse, asi que hacemos esto: 256(Valor del TRM0)-156(resultado)=100. Por lo tanto
nuestro TMR0 debe tener un valor inicial de 100, para tener una interrupcion de 10ms.
De esta forma se calcula, recuerden que la escala esta en base a la frecuencia y depende de ella.


Modulacin por Ancho de pulso



El mdulo CCP permite realizar tres funciones bsicas basadas en el uso de los timers, una de esas
funciones es el modulo PWM la cual permite generar una seal modulada en amplitud de pulso.
Bueno para poder usaro debemos tomar en cuenta los siguientes registros:

T2CON: Donde definiremos la preescala de nuestro TMR2.
CCP1CON: Registro de control del CCP.
PR2: Define el ancho de nuestro ciclo o tiempo.
CCPR1L: Tiempo o porcentaje en estado alto del ciclo(Ciclo de trabajo).

Ahora bien de estos registros debemos saber configurar:

Del registro CCP1CON:
Bit 7 y 6, siempre en 0.
Bit 5 y 4: Ciclo de trabajo del PWM.
Bit 3 al 0: Bits de seleccin del modo de trabajo, donde ser siempre "1100" para PWM.

El periodo de la seal de PWM se obtiene al configurar el TMR2 y el contenido del registro PR2, este
registro contiene los 8 bits mas significativos de una cuenta 10 bits. Para calcular el periodo de una seal
se utiliza la siguente ecuacin:

PWM(tiempo) = (PR2 + 1) * (Ciclo Maquina) * (Preescaler del TMR2)

El ciclo de trabajo se obtiene dependiendo de nuestra necesidad y el valor de PR2, es decir, si queremos
que nuestro ciclo de trabajo sea del 50% debemos tomar como referencia PR2, supongamos que PR2 es
igual a 100, el 50% de 100 es igual a 50, por lo tanto el ciclo de trabajo ser 50. En conclusin el ciclo de
trabajo depende del valor de PR2.

El ciclo de trabajo se carga en el registro CCPR1L, aqui tenemos una imagen que describe el
comportamiento de PR2 y CCPR1L.

Como se observa, PR2 y CCPR1L manejan el ciclo y por lo tanto la frecuencia. La formula para calcular
el valor de PR2 es la siguiente:

PR2 = (Frecuencia que queremos obtener) / [ (Ciclo Maquina) * (Preescaler del TMR2) ]

Recordemos que el TMR2 se da en el registro T2CON.
Para configurarlo hacemos esto:
Los bits 1 y 0 definen la escala:
00: Escala 1:1
01: Escala 1:4
1X: Escala 1:16
Los demas bits en 0.

SALIDA DE PWM
La salida de nuestra seal o nuestro pulso, es por el bit con nombre CCP, ya sea CCP1 o CCP2(en caso de
tener 2).
Recuerden verificar los bancos de cada registro, debido a que cada pic tiene configuraciones diferentes.

Vous aimerez peut-être aussi