Post on 27-Jun-2015
Microcontroladores
Instrucciones Aritméticas
(add Literal to W). Suma el contenido del registro W con el literal o constante k. Almacena el resultado en W. Si se produce acarreo el flag C se pone a 1.
Ejemplo 1:Antes instrucción:Después instrucción:
addlw 0x4F (W) = 0xA3 C = ¿? (W) = 0xF2 C = 0
addlw k
Ejemplo 2:Antes instrucción:Después instrucción:
Instrucciones de Suma
addlw 0x38 (W) = 0xD1 C = ¿? (W) = 0x09 C = 1
(add W and f). Suma el contenido del registro W al contenido del registro f. Almacena el resultado en W si d = 0 y en el registro f si d = 1. Si se produce acarreo el flag C se pone a 1.
Ejemplo 1:Antes instrucción:Después instrucción:
addwf PORTA,W (W) = 0x17 (PORTA) = 0xC2 y C = ¿? (W) = 0xD9 (PORTA) = 0xC2 y C = 0
addwf f,d
Instrucciones de Suma
Ejemplo 2:Antes instrucción:Después instrucción:
addwf contador,f (W) = 0xD1 (contador) = 0x38 y C = ¿? (W) = 0xD1 (contador) = 0x09 y C = 1
La resta se realiza sumando, en binario puro sin signo, el registro f (o el literal k) mas el complemento de dos del contenido del registro W. Al realizar la resta en 8 bits con signo el resultado no puede exceder de (+127) ni de (-128). El flag de Carry indica si el resultado es positivo (C se pone a 1) o es negativo (C se pone a 0). Pueden ocurrir 3 resultados.
Instrucciones de Resta
(Subtract W from Literal). Resta en complemento a 2 el contenido de la constante k menos el contenido del registro W y almacena el resultado en W.
Ejemplo 1:Antes instrucción:Después instrucción:
sublw 0x03 (W) = 0x01 C = ¿? y Z = ¿? (W) = 0x02 C = 1 y Z = 0
sublw k
Instrucciones de Resta
(Subtract W from Literal). Resta en complemento a 2 el contenido de la constante k menos el contenido del registro W y almacena el resultado en W.
Ejemplo 2:Antes instrucción:Después instrucción:
sublw 0x02 (W) = 0x02 C = ¿? y Z = ¿? (W) = 0x00 C = 1 y Z = 1
sublw k
Instrucciones de Resta
(Subtract W from Literal). Resta en complemento a 2 el contenido de la constante k menos el contenido del registro W y almacena el resultado en W.
Ejemplo 3:Antes instrucción:Después instrucción:
sublw 0x02 (W) = 0x03 C = ¿? y Z = ¿? (W) = 0xFF C = 0 y Z = 0
sublw k
Instrucciones de Resta
(Subtract W to f). Resta en complemento a 2 el contenido del registro f menos el contenido del registro W . Almacena el resultado en W si d = 0 y en el registro f si d = 1.
Ejemplo 1:Antes instrucción:Después instrucción:
subwf Reg1,F Reg1 = 0x03 (W) = 0x02 C = ¿? y Z = ¿?Reg1 = 0x01 (W) = 0x02 C = 1 y Z = 0
subwf f,d
Instrucciones de Resta
(Subtract W to f). Resta en complemento a 2 el contenido del registro f menos el contenido del registro W . Almacena el resultado en W si d = 0 y en el registro f si d = 1.
Ejemplo 2:Antes instrucción:Después instrucción:
subwf Reg1,F Reg1 = 0x02 (W) = 0x02 C = ¿? y Z = ¿?Reg1 = 0x00 (W) = 0x02 C = 1 y Z = 1
subwf f,d
Instrucciones de Resta
(Subtract W to f). Resta en complemento a 2 el contenido del registro f menos el contenido del registro W . Almacena el resultado en W si d = 0 y en el registro f si d = 1.
Ejemplo 3:Antes instrucción:Después instrucción:
subwf Reg1,F Reg1 = 0x01 (W) = 0x02 C = ¿? y Z = ¿?Reg1 = 0xFF (W) = 0x02 C = 0 y Z = 0
subwf f,d
Instrucciones de Resta
(Decrement f). El contenido del registro f se decrementa en 1 unidad . Almacena el resultado en W si d = 0 (en cuyo caso f no varia) y en el registro f si d = 1. El flag Z se activa a 1 si el resultado de la operación es 0.
Ejemplo 1:Antes instrucción:Después instrucción:
decf contador,F (contador) = 0x01 y Z = ¿?(contador) = 0x00 y Z = 1
decf f,d
Incrementar y Decrementar
Ejemplo 2:Antes instrucción:Después instrucción:
decf contador,W (contador) = 0x04 (W) = ¿? y Z = ¿?(contador) = 0x04 (W) = 0x03 y Z = 0
(Increment f). El contenido del registro f se incrementa en 1 unidad. Almacena el resultado en W si d = 0 (en cuyo caso f no varia) y en el registro f si d = 1. El flag Z se activa a 1 si el resultado de la operación es 0, es decir, si hay desbordamiento.
Ejemplo 1:Antes instrucción:Después instrucción:
incf contador,F (contador) = 0xFF y Z = ¿?(contador) = 0x00 y Z = 1
incf f,d
Incrementar y Decrementar
Ejemplo 2:Antes instrucción:Después instrucción:
incf contador,W (contador) = 0x01 (W) = ¿? y Z = ¿?(contador) = 0x01 (W) = 0x02 y Z = 0
Instrucciones Lógicas
(And Literal with W). Efectúa la operación AND lógica entre el contenido del registro W y la constante k. Almacena el resultado en W. El flag Z se activa a 1 si el resultado de la operación es cero.
Ejemplo 2:Antes instrucción:Después instrucción:
andlw b’01011111’ (W) = b’10100011’ y Z = ¿? (W) = b’00000011’ y Z = 0
andlw k
Instrucciones Lógicas
(And W with f). Efectúa la operación AND lógica entre el contenido del registro W y el contenido del registro f. Almacena el resultado en W si d = 0 y en el registro f si d = 1. El flag Z se activa a 1 si el resultado de la operación es cero.
Ejemplo 1:Antes instrucción:Después instrucción:
andwf FSR,F (W) = b’0010111’ FSR = b’11000010 y Z = ¿? (W) = b’0010111’ FSR = b’00000010 y Z = 0
andwf f,d
Ejemplo 2:Antes instrucción:Después instrucción:
andwf FSR,W (W) = b’0010111’ FSR = b’11000010 y Z = ¿? (W) = b’0000010’ FSR = b’11000010 y Z = 0
Instrucciones Lógicas
(Complement f). Realiza un complemento del contenido del registro f bit a bit, invirtiendo su valor, es decir, cambia los unos por ceros y los ceros por uno. Almacena el resultado en W si d = 0 y en el registro f si d = 1. El flag Z se activa a 1 si el resultado de la operación es cero.
Ejemplo 1:Antes instrucción:Después instrucción:
comf Reg1,F (Reg1) = b’00010011’ y Z = ¿? (Reg1) = b’11101100’ y Z = 0
comf f,d
Ejemplo 2:Antes instrucción:Después instrucción:
comf Reg1,W (Reg1) = b’00010011’ (W) = ¿? y Z = ¿? (Reg1) = b’00010011’ (W) = b’11101100’ y Z = 0
Instrucciones Lógicas
(Inclusive OR Literal with W). Efectúa la operación OR lógica entre el contenido del registro W y la constante k. Almacena el resultado en W. El flag Z se activa a 1 si el resultado de la operación es cero.
Ejemplo 1:Antes instrucción:Después instrucción:
iorlw b’00110101’ (W) = b’00010011’ y Z = ¿? (W) = b’10111111’ y Z = 0
iorlw k
Instrucciones Lógicas
(Inclusive OR W with f). Efectúa la operación OR lógica entre el contenido del registro W y el contenido del registro f. Almacena el resultado en W si d = 0 y en registro f si d = 1. El flag Z se activa a 1 si el resultado de la operación es cero.
Ejemplo 1:Antes instrucción:
Después instrucción:
iorwf Resultado,W (Resultado) = b’00010011’ (W) = b’10010001’ y Z = ¿?
(Resultado) = b’00010011’ (W) = b’10010011’ y Z = 0
iorwf f,d
Instrucciones Lógicas
(Rotate Left f through Carry). Rotación de un bit a la izquierda del registro f, pasando por el bit de acarreo C. El desplazamiento es cerrado, formando un anillo con el bit C (Carry) del registro de estado o STATUS. Si d = 1 el resultado se almacena en f, si d = 0 el resultado se almacena en W. El contenido del Carry pasa a la posición del bit de menor peso y el bit de mayor peso pasa al Carry
rlf f,d
Instrucciones Lógicas
C
Registro f
(Rotate Right f through Carryf). Rotación de un bit a la derecha del registro f, pasando por el bit de acarreo C. El desplazamiento es cerrado, formando un anillo con el bit C (Carry) del registro de estado o STATUS. Si d = 1 el resultado se almacena en f, si d = 0 el resultado se almacena en W. El contenido del Carry pasa a la posición del bit de menor peso y el bit de mayor peso pasa al Carry
rrf f,d
Instrucciones Lógicas
C
Registro f
(Swapf Nibbles in f). Los cuatro bits de mas peso del registro f se intercambian con los cuatro bits de menos peso del mismo registro f. Almacena el resultado en W si d = 0 y en registro f si d = 1.
Ejemplo 1:Antes instrucción:
Después instrucción:
swapf Reg1,W (Reg1) = 0xA5 y (W) = ¿?
(Reg1) = 0xA5 y (W) = 0x5A
swapf f,d
Instrucciones Lógicas
(Exclusive OR Literal with W). Realiza la función OR-Exclusiva entre el contenido del registro W y la constante k de 8 bits. El resultado se almacena en W. El flag Z se activa a 1 si el resultado de la operación es 0.
Ejemplo 1:Antes instrucción:
Después instrucción:
xorlw b’10101111’ (W) = b’10110101’ y Z = ¿?
(W) = b’00011010’ y Z = 0
xorlw k
Instrucciones Lógicas
(Exclusive OR W with f). Realiza la función OR-Exclusiva entre el contenido del registro W y el contenido del registro f. El resultado se almacena en W si d=0 o en el registro f si d=1. El flag Z se activa a 1 si el resultado de la operación es 0.
Ejemplo 1:Antes instrucción:
Después instrucción:
xorwf Reg,f
(Reg) = b’10101111’ (W) = b’10110101 y Z = ¿?
(Reg) = b’00011010’ (W) = b’10110101 y Z = 0
xorwf f,d
Instrucciones Lógicas
Para ahorrar energía los microcontroladores PIC disponen de la Sleep que les pasa al estado de reposo o de bajo consumo, en el cual los requerimientos de potencia son mínimos. En dicho estado se detiene el reloj principal y se congelan sus circuitos asociados.-.
Instrucciones Sleep
Modo de ahorro de energía
El oscilador del sistema deja de funcionar
El consumo baja a unos pocos uA
El TMR0 deja de funcionar
Saltos Condicionales
Producen un salto en función de que se cumpla o no una función. Estas instrucciones son el único medio para realizar bifurcaciones condicionales en un programa.
Saltos Condicionales
El repertorio de instrucciones del PIC16F84A incluye cuatro instrucciones de salto condicional clasificadas en dos grupos:
Aquellas que pueden producir un salto en función del estado de un bit. Son btfsc y btfss.
Aquellas que pueden producir un salto en función del contenido de un registro. Son decfsz y incfsz.
Saltos en función de un Bit
(Bit Test f, Skip if Clear). Esta instrucción puede actuar de dos formas:
btfsc f,b
Si el bit numero b del registro f es 1 la instrucción que sigue a esta se ejecuta normalmente.
Si el bit numero b del registro f es 0 la instrucción que sigue a esta se ignora y se salta.
Saltos en función de un Bit
(Bit Test f, Skip if Set). Esta instrucción puede actuar de dos formas:
btfss f,b
Si el bit numero b del registro f es 0 la instrucción que sigue a esta se ejecuta normalmente.
Si el bit numero b del registro f es 1 la instrucción que sigue a esta se ignora y se salta.
Saltos en función de un Registro
(Decrement f, Skip if 0). Decrementa en una unidad el contenido del registro f. Almacena el resultado en W si d = 0 y en el registro f si d = 1. Después de decrementar puede ocurrir dos casos:
decsz f,d
Si el resultado es distinto de 0 la instrucción que sigue a esta se ejecuta normalmente.
Si el resultado es 0 la instrucción que sigue a esta se ignora y se salta.
Saltos en función de un Registro
(Increment f, Skip if 0). Incrementa en una unidad el contenido del registro f. Almacena el resultado en W si d = 0 y en el registro f si d = 1. Después de Incrementar puede ocurrir dos casos:
incsz f,d
Si el resultado es distinto de 0 la instrucción que sigue a esta se ejecuta normalmente.
Si el resultado es 0 la instrucción que sigue a esta se ignora y se salta.
Directivas Importantes
(Define a Block of Constants), (End Constant Block). Asigna direcciones (generalmente de memoria RAM de datos) a muchas etiquetas. La lista queda enmarcada entre las directivas CBLOCK y ENDC.
CBLOCK y ENDC
CBLOCK 0x0C ;Las variables se posicionan a partir de 0x0C A ;La variable A ocupa la posición 0x0C B ;La variable B ocupa la posición 0x0D
C ;La variable C ocupa la posición 0x0E ENDC
Si la directiva no define ningún comienzo los valores asignados comenzaran el la posición 0, que corresponde a la zona SFR.
Directivas Importantes
(Define a Text Substitution Label). Esta directiva define una cadena de sustitución de texto. Donde quera que <name> se encuentre, en el ensamblador se sustituirá por [<string>]
#DEFINE
#DEFINE <name> [<string>]
#DEFINE LED PORTB,4
bsf LED
Ejemplos:
Directivas Importantes
#DEFINE#DEFINE <name> [<string>]
#DEFINE Banco0 bcf STATUS,5#DEFINE Banco1 bsf STATUS,5
InicioBanco1clrf TRISAmovlw b´11111111´movwf TRISBBanco0
Subrutinas
Conjunto de instrucciones al que se tiene acceso desde cualquier punto del programa principal. Es decir, es un subprograma que se ejecuta cada vez que el programa principal lo necesita.
PROCESO X
PROCESO X
PROCESO X
PROCESO X
PROCESO X
PROCESO X
PROCESO X:
RETURN
Subrutinas Anidadas
Programa Principal
CALL PROCESO 1
X1
Subrutina 1
PROCESO 1
CALL PROCESO 2
X2
RETURN
Subrutina 2
PROCESO 2
RETURN
PILA
X1
PILA
X2
X1
PILA
LA PILA
Zona de memoria que se encuentra separada tanto de la memoria de programa como de la de datos dentro del microcontrolador.
Su estructura es del tipo LIFO.
Manejo de Tablas
Instrucción “ retlw ”
Funciona de forma similar a return, produce el retorno de una subrutina pero con un valor en el registro W.
Formato Instrucción:
retlw k
Manejo de Tablas
Directiva DT
Para simplificar el uso de la instrucciones retlw el ensamblador MPASM facilita la directiva DT, que sustituye el empleo respectivo de muchas instrucciones retlw. Su sintaxis es:
Ejemplo:
DT “Hola”
retlw “H”retlw “o”retlw “l”retlw “a”
Manejo de un Display 7 seg
Manejo de un Display 7 seg
Subrutinas de Retardo
Ciclo de MaquinaEl tiempo que tarda en ejecutarse un programa depende de la frecuencia del oscilador y del numero de ciclos de maquina ejecutados. Un ciclo de maquina es la unidad básica de tiempo que utiliza el microcontrolador.Para el microcontrolador PIC16F84A el ciclo de maquina equivale a 4 ciclos de reloj, por lo tanto el tiempo que tarda en producirse un ciclo de maquina es igual a 4 veces el periodo del oscilador.
Las instrucciones del microcontrolador PIC16F84A necesitan 1 ciclo de maquina para ejecutarse, excepto las de salto (goto, call, btfss, btfsc, return, etc., que necesitan de 2 ciclos de maquina.
Subrutinas de Retardo
El tiempo que tarda microcontrolador en ejecutar una tarea viene fijado por la siguiente formula:
Tiempo = 41
fcm
Calcular la duración de 1 ciclo de maquina para el PIC16F84A
Tiempo = 41
4MHz
1 = 1us
Subrutinas de Retardo
En un sistema con Microcontrolador PIC16F84A y cristal de cuarzo de 4MHz se desea generar un retardo de 1.5 ms. Calcular el numero de ciclos de maquina necesarios.
Tiempo = 41
fcm
Solución:
Tiempo = 41
fcm Tiempo=
4fcm
1500us=4
4MHzcm = 1500
Operación NOP
No realiza ninguna operación.
Para una frecuencia de trabajo de 4MHz produce una temporización de 1 useg.
Retardos mediante lazo simple
Retardo_1ms ; La llamada call aporta 2 ciclos de maquina. movlw d'249‘ ; Aporta 1 ciclos máquina. Este es el valor de "K". movwf R_ContA ; Aporta 1 ciclos máquina.
R1ms_Bucle nop ; Aporta Kx1 ciclos máquina. decfsz R_ContA,F ; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar). goto R1ms_Bucle ; Aporta (K-1)x2 ciclos máquina. return ; El salto de retorno aporta 2 ciclos máquina.;;En total estas subrutinas tardan:;2 + 1 + 1 + Kx1 + (K-1)x1 + 2 + (K-1)x2 + 2 = 5 + 4K = 1001 Ciclos de maquina
(para K = 249)
Retardos mediante lazos anidados
Retardo_200ms movlw d'200‘ movwf R_ContB
Retardo_1ms movlw d'249‘ movwf R_ContA
R1ms_Bucle nop decfsz R_ContA,F goto R1ms_Bucle
decfsz R_ContB,F goto Retardo_1ms
return
Retardo_100ms movlw d‘100‘ movwf R_ContB
Retardo_1ms movlw d'249‘ movwf R_ContA
R1ms_Bucle nop decfsz R_ContA,F goto R1ms_Bucle
decfsz R_ContB,F goto Retardo_1ms
return
TIMER 0 (TMR0)
El PIC16F84A dispone de un timer, el cual es un contador ascendente de 8 bits. El TMR0 se inicializa con un valor, que se incrementa con cada impulso de entrada hasta su valor máximo, después de lo cual se produce su desborde el cual es anunciado por el flag TOIF del registro INTCON.
Contador Ascendente
Carga Inicial del Contador
Impulsos de Entrada
Fin de Contaje
TIMER 0 (TMR0)
Los impulsos aplicados al TMR0 pueden provenir de los pulsos aplicados al pin TOCKI o de la señal de reloj interna (Fosc/4), lo que le permite actuar de dos formas diferentes:
Como contador de impulsos por el pin RA4/TOCKI
Como temporizador de tiempos
TIMER 0 (TMR0)
TOCS = 1 el TMR0 actúa como contador
TOCS = 0 el TMR= actúa como temporizador
El actuar de una o de otra forma depende del bit TOCS del registro OPTION
TIMER 0 como Contador
TOSE = 1 el flanco activo es descendente
El tipo de flanco activo se elige mediante el bit TOSE del registro OPTION
TOSE = 0 el flanco activo es Ascendente
TIMER 0 como Temporizador
Cuenta los impulsos de Fosc/4. Se usa para determinar intervalos de tiempos concretos. Estos tiempos tienen una duración conocida de un ciclo de maquina (4 veces el periodo de la señal de reloj).
Como se trata de un contador ascendente el TMR0 debe ser cargado con el valor de los impulsos que se desean contar restados 256 que es el valor de desbordamiento.
TIMER 0 registro del SFR
El TMR0 es un registro de propósito general ubicado en laposición 1 del área SFR de la RAM de datos. Puede ser leído y escrito.
Divisor de Frecuencia (Preescaler)
A veces es necesario controlar tiempos largos y aumentar la duración de los impulsos que incrementan el TMR0 . Para cubrir esta necesidad se dispone de un circuito programable llamado Divisor de Frecuencia o Preescaler que divide la frecuencia utilizada por diversos rangos.
En realidad el PIC16F84A dispone de dos temporizadores:
El TMR0, que actúa como temporizador principal
El Washdog, el cual vigila que el programa no se cuelgue
Divisor de Frecuencia (Preescaler)
El Preescaler puede aplicarse a uno de estos dos temporizadores. Cuando se asigna al TMR0 los impulsos pasan primero por el divisor de frecuencia y una vez aumentada su duración se aplican al TMR0.
El TMR0, que actúa como temporizador principalEl TMR0, que actúa como temporizador principal
El Washdog, el cual vigila que el programa no se cuelgueEl Washdog, el cual vigila que el programa no se cuelgue
Registro Relacionados con el TMR0
Registro OPTION
Registro INTCON
Registro Relacionados con el TMR0
Registro INTCON
1
0
TMR0 Overflow Interrupt Flag bit
Registro Relacionados con el TMR0
Registro OPTION
Selecciona la fuente de señal del TMR0
1
0Pulsos de reloj interno Fosc/4
TMR0 como Temporizador
Pulsos de reloj externo RA4/TOCKITMR0 como Contador
Registro Relacionados con el TMR0
Registro OPTION
Flanco ascendente a RA4/TOCKI
Selecciona flanco de la señal de entrada del TMR0
Flanco descendente a RA4/TOCKI1
0
Registro Relacionados con el TMR0
Registro OPTION
Asignación del Divisor de Frecuencia
1
0El divisor de frecuencia se
asigna al TMR0
El divisor de frecuencia se asigna al Watchdog
Registro Relacionados con el TMR0
Registro OPTION
Bits para seleccionar los valores del Preescaler o rango con el que actúa el divisor de frecuencia.
PS2 PS1 PS0 Divisor del TMR0 Divisor del WDT0 0 0 1:2 1:10 0 1 1:4 1:20 1 0 1:8 1:40 1 1 1:16 1:81 0 0 1:32 1:161 0 1 1:64 1:321 1 0 1:128 1:641 1 1 1:256 1:128
Ejemplo del TMR0 como contador
0 0 1 1 1 0 0 0
Otros Recursos
El WATCHDOG TIMER
Para que esta labor de vigilancia se lleve a cabo el WDT da un paseo por la CPU cada cierto tiempo, asegurándose que el programa funcione normalmente, de lo contrario el WDT ladra y provoca un reset.
El Perro Guardián
Vigila que el programa no se cuelgue y así dejen de ejecutarse las instrucciones.
Ciclo Infinito Espera de un acontecimiento que no se produce
El WATCHDOG TIMER
Consiste en la puesta a cero del WDT para comenzar nuevamente la cuenta, evitando así su desbordamiento y el reset que esto provoca. Esta puesta a cero se debe realizar por software mediante la instrucción clrwdt.
Refrezco del Perro Guardián
Habilitación del Watchdog Timer
Resistencias de Pull-Up
Permiten en entradas no utilizadas evitar el ingreso de señales falsas (ruido) que puedan provocar un mal funcionamiento del uC. En las salidas permiten asegurar de que no se supere la máxima corriente de alimentación que puede manejar el uC.
El PIC16F84A permite configurar una resistencia interna en cada una de las líneas del Puerto B, ahorrando estas necesarias resistencias externas cuando se utilizan pulsadores u otros dispositivos externos de lectura.
Resistencias de Pull-Up
Ground
Resistencias de Pull-Up
Resistor Port B Pull-Up Enable Bit
0
1
Habilita las resistencias de Pull-Updel Puerto B.
Deshabilita las resistencias de Pull-Updel Puerto B.
INTERRUPCIONES
INTERRUPCIONES
Una interrupción consiste en un mecanismo por el cual un evento interno o externo puede interrumpir la ejecución de un programa en cualquier momento. A partir de entonces se produce automáticamente un salto a una subrutina de interrupción, esta atiende inmediatamente el evento y retorna luego la ejecución del programa exactamente donde estaba en el momento de ser interrumpido.
Subrutina de Interrupción
Programa Principal
X1
004hProceso X(Subrutina de atención a la interrupción)retfie
Subrutina de Interrupción
El PIC16F84A dispone de 4 posibles fuentes de interrupción:
Interrupción INT. Por activación del pin RB0/INT.
Interrupción RBI. Por cambio de estado en una o varias de las 4 lineas de más peso RB7:RB4 del Puerto B.
Interrupción TOI. Por desbordamiento del Timer 0.
Interrupción EEI. Por la finalización de la escritura en la EEPROM de datos.
Interrupción INT. Por activación del pin RB0/INT.
Interrupción RBI. Por cambio de estado en una o varias de las 4 lineas de más peso RB7:RB4 del Puerto B.
Funcionamiento de una InterrupciónCuando se produce cualquiera de los sucesos indicados anteriormente se origina una petición de interrupción que si se acepta, origina el siguiente mecanismo hardware:
1º Salva el valor actual del contador de programa PC guardando su contenido en la pila.
El bit GIE del registro INTCON es puesto a cero lo cual prohibe cualquier otra interrupción.
2º
El PC se varga con al valor 004h, que es la posición del vector de interrupción.
Comienza a ejecutarse el programa de atención a la interrupción que se encuentra a partir de la dirección 004h.
3º
4º
Funcionamiento de una Interrupción
Los bits de control localizados en el registro INTCON habilitan y configuran las interrupciones. Cada causa de interrupción actúa con dos flags.
FLAG DE SEÑALIZACIÓN
Indica si se ha producido o no la interrupción.
TOIF INTF RBIF EEIF
FLAG DE PERMISO
Indica si se ha producido o no la interrupción.
TOIE INTE RBIE EEIE
Funcionamiento de una Interrupción
GIE
Habilitación General
Vector de Interrupciones
POSICIÓN 004h
Sea cual sea la interrupción el contador de programa se carga con la dirección 004h.
Registro INTCON
REGISTRO DE CONTROL DE INTERRUPCIONES
Global Interruption Enable (Habilitación General de las Interrupciones)
Se inhabilita automáticamente cuando se reconoce un la interrupción para evitar que ninguna otra se produzca mientras se esta atendiendo a la primera. Al retornar de la interrupción con una instrucción retfie, el bit GIE se vuelve a activar a 1.
GIE = 0No autoriza interrupción de ningún tipo
GIE = 1Autoriza cualquier tipo de interrupción
Registro INTCON
REGISTRO DE CONTROL DE INTERRUPCIONES
EEPROM Write Complete Interrupt Enable (Habilitación de la Interrupción EEI)
Habilita la interrupción por escritura completada en la EEPROM de datos. Su flag se encuentra ubicado en el registro EECON1.
EEIE = 0Interrupción EEI deshabilitada
EEIE = 1Interrupción EEI habilitada
Registro INTCON
REGISTRO DE CONTROL DE INTERRUPCIONES
TMR0 Interrupt Enable bit (Habilitación de la Interrupción TOI)
Habilita la interrupción por desbordamiento del TMR0.
TOIE = 0Interrupción TOI deshabilitada
TOIE = 1Interrupción TOI habilitada
Registro INTCON
REGISTRO DE CONTROL DE INTERRUPCIONES
External INT Enable bit (Habilitación de la Interrupción externa INT)
Habilita la interrupción externa por el pin RB0/INT
INTE = 0Interrupción INT deshabilitada
INTE = 1Interrupción INT habilitada
Registro INTCON
REGISTRO DE CONTROL DE INTERRUPCIONES
RB Port Change Interrupt Enable (Habilitación de la Interrupción externa RBI)
Habilita la interrupción por cambio de estado de las líneas RB7:RB4 del puerto B.
RBIE = 0Interrupción RBI deshabilitada
RBIE = 1Interrupción RBI habilitada
Registro INTCON
REGISTRO DE CONTROL DE INTERRUPCIONES
TMR0 Overflow Interrupt Flag bit (indicación de la Interrupción por TMR0)
Indica que se ha producido una interrupción por desbordamiento del Timer 0.
TOIF = 0El TMR0 no se ha desbordado
TOIF = 1El TMR0 se ha desbordado
Registro INTCON
REGISTRO DE CONTROL DE INTERRUPCIONES
External Interrupt Flag bit(Indicación de la Interrupción externa INT)
Indica que se ha producido una interrupción externa por el pin RB0/INT
INTF = 0No hay interrupción externa
INTF = 1Hay interrupción externa
Registro INTCON
REGISTRO DE CONTROL DE INTERRUPCIONES
RB port change Interrump Flag (Indica la Interrupción externa RB7:RB4)
Indica que se ha producido una interrupción por cambio de estado de las líneas RB7/RB4
RBIF = 0No hay cambio de estado
RBIF = 1Hay cambio de estado
Registro OPTION
Interrupt Edge Select bit (Selector de flanco de la interrupción INT)
INTEDG = 0Interrupción por flanco descendente
INTEDG = 1Interrupción por flanco ascendente
RB0/INT RB0/INT
Instrucción retfie
Utilizada al final de una subrutina de interrupción es idéntica a un retorno de subrutina return. Ademas coloca automaticamente a 1 el bib GIE, volviendo a habilitar las interrupciones.
retfie idéntica return
Interrupción Externa INT
LIST P=16F84AINCLUDE <P16F84A.INC>
ORG 0goto InicioORG 4
goto ServicioInterrupcionInicio
bsf STATUS,RP0movlw b'00000001'movwf TRISBbcf OPTION_REG,INTEDGbcf STATUS,RP0movlw b'10010000'movwf INTCONclrf PORTB
Flanco de bajada
Se habilita INT y GIE
Interrupción Externa INT
Principalsleepgoto Principal
ServicioInterrupcionmovlw b'11111110'movwf PORTBcall Retardo_2smovlw b'00000000'movwf PORTBgoto FinInterrupcion
FinInterrupcionbcf INTCON,INTFretfieINCLUDE <RETARDOS.INC>END
Se baja el Flag
Registros Alterados
Durante la interrupción el único registro que se salvaguarda en la pila es el PC. La subrutina de atención a la interrupción puede
alterar el contenido de los registros del microcontrolador.
El contenido de los registros W y STATUS deben guardarse prinero.
Al iniciarla conviene guardar su valor y restaurarlos antes de la instrucción retfie.
Salvar Registros
CBLOCK 0x0CGuarda_WGuarda_STATUSGuarda_RegistroAGuarda_RegistroBENDC----------------------
movwf Guarda_Wmovf STATUS,Wmovwf Guarda_STATUSmovf RegistroA,Wmovwf Guarda_RegistroAmovf RegistroB,Wmovwf Guarda_RegistroB
movf Guarda_RegistroB,W movwf RegistroBmovf Guarda_RegistroA,Wmovwf RegistroAmovf Guarda_STATUS,Wmovwf STATUSmovf Guarda_W,Wbcf INTCON,INTF
Mover el registro W a otro registro corrompe el flag Z
Salvar Registros
movwf Guarda_Wswapf STATUS,Wmovwf Guarda_STATUSmovf RegistroA,Wmovwf Guarda_RegistroAmovf RegistroB,Wmovwf Guarda_RegistroBbcf STATUS,RP0
movf Guarda_RegistroB,W movwf RegistroBmovf Guarda_RegistroA,Wmovwf RegistroAswapf Guarda_STATUS,Wmovwf STATUS swapf Guarda_W,Fswapf Guarda_W,Wbcf INTCON,INTFretfie
Microchip recomienda
Manejo de LCDManejo de LCD
Visualizador LCD
Liquid Crystal Display
LM016L
Consumo Reducido, del orden de los 7,5 mW. Desplazamiento de caracteres derecha - izquierda
Memoria de 40 caracteres por línea de pantalla.
Movimiento del cursos y cambio de aspecto
Puede ser gobernado de dos formas:• Conexión con bus de 4 bits• Conexión con bus de 8 bits
LM016L
Alimentación de 5V
Regulación de contraste se realiza mediante el voltaje obtenido al dividir los 5V con una resistencia ajustable de 10k y aplicárselo al pin VEE. Este mismo pin a masa fija el máximo contraste.
Configuración de Conexionado
Función de los pines
DDRAM
Data Display RAM
Tiene una capacidad de 80 bytes, 40 por cada línea, de los cuales solo 32 se pueden visualizar
Línea 1Línea 2
TABLA CGROM
TABLA CGROM
TABLA CGROM
TABLA CGROM
TABLA CGROM
TABLA CGROM
0011
TABLA CGROM
0011
TABLA CGROM
0011
TABLA CGROM
0011
TABLA CGROM
00110011
TABLA CGROM
0011 0010
Bus de datos
CGROM
Memoria no volátil donde se almacena una tabla con los 192 caracteres que pueden ser visualizados.
Modos de Funcionamiento
El LM016L tiene 3 modos de funcionamiento
Modo Comando
Recibe instrucciones por el bus de datos.
Para trabajar en modo comando:
RS
R/W
Borrar Display Mover Cursor Desplazar Izquierda
= 0
= 0
Modos de Funcionamiento
El LM016L tiene 3 modos de funcionamiento
Modo Carácter o Dato
Recibe un carácter a escribir en la memoria DDRAMPara trabajar en modo comando:
RS
R/W
= 1
= 0
Modos de Funcionamiento
El LM016L tiene 3 modos de funcionamiento
Modo Lectura “Busy Flag” o LCD ocupada
En el bit 7 del bus de datos el LCD indica que esta ocupada.
Para ello se lee el bus de datos:
RS
R/W
= 0
= 1
Se debe esperar que Busy Flag (bit7) valga 0.
Configuración de Conexionado
Comandos de Control LCD
Comandos de Control LCD
Los comandos se envían a través del bus de datos. Para que el LCD los reconozca hay que poner la señal RS a nivel bajo.
Clear Display (00000001)
Borra la pantalla y devuelve el cursor a la posición inicial (posición 0 de la DDRAM)
Return Home (0000001x)
Cursor a la dirección de origen. Devuelve el cursor a la posición de origen de la DDRAM (dirección 00h) quedando intacto su contenido.
Comandos de Control LCD
Entry Mode Set (000001 I/D S)
Modo de entrada. Establece las caracteristicas de escritura de los datos Shift e Increment/Decrement:
S = 0
S = 1
La información visualizada no se desplaza al escribir un carácter.
La información visualizada se desplaza al escribir un carácter. La pantalla se desplaza en el sentido indicado por el bit I/D cuando el cursor llega al filo de la pantalla.
I/D = 1
I/D = 0
Comandos de Control LCD
Entry Mode Set (000001 I/D S)
Modo de entrada. Establece las caracteristicas de escritura de los datos Shift e Increment/Decrement:
Incremento automático de la posición del cursor. La posición de la DDRAM se incrementa automáticamente tras cada lectura o escritura a la misma.
Decremento de la posición del cursor. Se decrementa el puntero del a DDRAM.
B = 1B = 0
Comandos de Control LCD
Display Control (00001 D C B)
Control de la pantalla.
No hay efecto en el parpadeo del cursor.
Efecto de parpadeo con un cursor rectangular.
C = 1C = 0 El cursor no se visualiza.
El cursor es visualizado.
D = 1D = 0 El display se apaga.
El display se enciende.
R/L = 0
R/L = 1
Comandos de Control LCD
Cursor and Display Shift (0001 S/C R/L xx)
Control de desplazamiento del cursor y de la pantalla:
A la izquierda.
El efecto de desplazamiento se aplica solo sobre el cursor sin alterar el contenido de la DDRAM
A la derecha.
S/C = 0
S/C = 1 El efecto de desplazamiento se aplica sobre todo el display.
F = 1F = 0
Comandos de Control LCD
Display Control (00001 D C B)
Control de la pantalla.
Caracteres de 5x7 puntos. (Font)
Caracteres de 5x10 puntos. (Font)
N = 1N = 0 Pantalla de linea 1. (Number Line)
Pantalla de linea 2. (Number Line)
DL = 1DL = 0 Comunicación con 4 bits
Comunicación con 8 bits.
Librería de Subrutinas
LCD_Inicializa
Configura funciones, produce un reset, borra la memoria de la DDRAM y enciende la pantalla.
LCD_Caracter
Visualiza en la posición actual del cursor el codigo ASCII del dato contenido en el registro W.
LCD_Borra
Borra toda la pantalla y coloca el cursor al principio de la línea 1.
Librería de Subrutinas
LCD_Linea1
Envia el cursor al principio de la línea 1.
LCD_Linea2
Envia el cursor al principio de la línea 2.
LCD_PosicionLinea1
Envía el cursor a la posición de la línea 1 indicada por W.
LCD_PosicionLinea2
Envía el cursor a la posición de la línea 2 indicada por W.
Librería de Subrutinas
LCD_LineaBlanco
Visualiza una línea en blanco.
LCD_DosEspaciosBlancos
Visualiza dos espacios en blanco.
Visualización de Caracteres
Conexión de LCD mediante 8 bits
Visualización de mensajes fijos
Librería LCD_MENS.INC
Subrutina “LCD_Mensaje”Visualiza mensajes fijos
Subrutina “LCD_Movimiento”Visualiza mensajes en movimiento
Visualización de mensajes fijos
Visualización de mensajes en movimiento
Comandos de Control LCD
Comandos de Control LCD
Los comandos se envían a través del bus de datos. Para que el LCD los reconozca hay que poner la señal RS a nivel bajo.
Clear Display (00000001)
Borra la pantalla y devuelve el cursor a la posición inicial (posición 0 de la DDRAM)
Return Home (0000001x)
Cursor a la dirección de origen. Devuelve el cursor a la posición de origen de la DDRAM (dirección 00h) quedando intacto su contenido.
Comandos de Control LCD
Entry Mode Set (000001 I/D S)
Modo de entrada. Establece las caracteristicas de escritura de los datos Shift e Increment/Decrement:
S = 0
S = 1
La información visualizada no se desplaza al escribir un carácter.
La información visualizada se desplaza al escribir un carácter. La pantalla se desplaza en el sentido indicado por el bit I/D cuando el cursor llega al filo de la pantalla.
I/D = 1
I/D = 0
Comandos de Control LCD
Entry Mode Set (000001 I/D S)
Modo de entrada. Establece las caracteristicas de escritura de los datos Shift e Increment/Decrement:
Incremento automatico de la posición del cursor. La posición de la DDRAM se incrementa automaticamente tras cada lectura o escritura a la misma.
Decremento de la posición del cursor. Se decrementa el puntero del a DDRAM.
B = 1B = 0
Comandos de Control LCD
Display Control (00001 D C B)
Control de la pantalla.
No hay efecto en el parpadeo del cursor.
Efecto de parpadeo con un cursor rectangular.
C = 1C = 0 El cursor no se visualiza.
El cursor es visualizado.
D = 1D = 0 El display se apaga.
El display se enciende.
R/L = 0
R/L = 1
Comandos de Control LCD
Cursor and Display Shift (0001 S/C R/L xx)
Control de desplazamiento del cursor y de la pantalla:
A la izquierda.
El efecto de desplazamiento se aplica solo sobre el cursor sin alterar el contenido de la DDRAM
A la derecha.
S/C = 0
S/C = 1 El efecto de desplazamiento se aplica sobre todo el display.
F = 1F = 0
Comandos de Control LCD
Display Control (00001 D C B)
Control de la pantalla.
Caracteres de 5x7 puntos. (Font)
Caracteres de 5x10 puntos. (Font)
N = 1N = 0 Pantalla de linea 1. (Number Line)
Pantalla de linea 2. (Number Line)
DL = 1DL = 0 Comunicación con 4 bits
Comunicación con 8 bits.
Comandos de Control LCD
Set CGRAM address
Se va a escribir sobre la dirección CGRAM señalada.
Set DDRAM address (1ddddddd)
Esta instrucción se utiliza para modificar el puntero a la DDRAM
Read Busy Flag
Lee el BF indicando si hay una operación interna en curso y lee, además, el contenido de la dirección DDRAM apuntada.
Librería de Subrutinas
LCD_Inicializa
Configura funciones, produce un reset, borra la memoria de la DDRAM y enciende la pantalla.
LCD_Caracter
Visualiza en la posición actual del cursor el codigo ASCII del dato contenido en el registro W.
LCD_Borra
Borra toda la pantalla y coloca el cursor al principio de la línea 1.
Librería de Subrutinas
LCD_Linea1
Envia el cursor al principio de la línea 1.
LCD_Linea2
Envia el cursor al principio de la línea 2.
LCD_PosicinLinea1
Envía el cursor a la posición de la línea 1 indicada por W.
LCD_PosicinLinea2
Envía el cursor a la posición de la línea 2 indicada por W.
Librería de Subrutinas
LCD_Linea1
Envia el cursor al principio de la línea 1.
LCD_Linea2
Envia el cursor al principio de la línea 2.
LCD_LineaBlanco
Visualiza una linea en blanco.
LCD_DosEspaciosBlancos
Visualiza dos espacios en blanco.
TECLADO MATRICIAL
Teclado Hexadecimal
A B C
D
E
F
TECLADO MATRICIAL
Teclado Hexadecimal
A B C
D
E
FUn teclado matricial esta constituido por una matriz de pulsadores dispuestos en filas y columnas. Su intención es reducir el numero de líneas necesarias para su conexionado.
TECLADO MATRICIAL
CONEXIÓN CON PIC16F84A
CONEXIÓN CON PIC16F84A
Las filas del teclado se conectan a las líneas de la parte baja del Puerto B, configurado como salida.
Las columnas del teclado se conectan a las líneas de la parte alta del Puerto B, configurado como entradas.
PRESIONANDO TECLAS
0
1
0
1
1
1
1
1
Averiguar la causa de Interrupción
btfsc INTCON,INTFcall Interrupcion_INTbtfsc INTCON,RBIFcall Interrupcion_RBIbtfsc INTCON,TOIFcall Interrupcion_TOI
ALGORITMO DE PROGRAMACIÓN
ALGORITMO DE PROGRAMACIÓN
0
1
1
1
0
1
1
1
TESTEO DE COLUMNAS
TESTEO DE COLUMNAS
0
1
1
1
TESTEO DE COLUMNAS
0
1
1
1
TESTEO DE COLUMNAS
0
1
1
1
1
0
1
1
TESTEO DE COLUMNAS
TESTEO DE COLUMNAS
1
0
1
1
TESTEO DE COLUMNAS
1
0
1
1
TESTEO DE COLUMNAS
1
0
1
1
ALGORITMO DE PROGRAMACIÓN
1
1
1
0
TESTEO DE COLUMNAS
1
1
1
0
TESTEO DE COLUMNAS
1
1
1
0
TESTEO DE COLUMNAS
1
1
1
0
ALGORITMO DE PROGRAMACIÓN
1
1
0
1
TESTEO DE COLUMNAS
1
1
0
1
TESTEO DE COLUMNAS
1
1
0
1
TESTEO DE COLUMNAS
1
1
0
1
TECLA PULSADA
1
1
0
1
0
W = 15
TECLA PULSADA
TECLA PULSADA
LIBRERÍA DE SUBRUTINAS
TECLADOS.INC
Teclado_Inicializa
Configura las líneas del Puerto B según la conexión del teclado realizada y comprueba que no hay pulsada tecla alguna al principio.
Teclado_EsperaDejePulsar
Permanece en esta subrutina mientras siga pulsada la tecla. Se utiliza para que no repita la misma lectura varias veces.
LIBRERÍA DE SUBRUTINAS
TECLADOS.INC
Teclado_LeeOrdenTecla
Lee el teclado obteniendo en el registro W el orden de la tecl pulsda. Además, posiciona el flag Carry para indicar si ha presionado alguna tecla.
Teclado_LeeHex
Lee un teclado Hexadecimal. En el registro de trabajo W aparece el valor hexadecimal de la tecla pulsada. Además posiciona el flag Carry para indicar si se ha presionado alguna tecla.
LIST P=16F84AINCLUDE <P16F84A.INC>
CBLOCK 0x0CENDC
ORG 0goto InicioORG 4goto ServicioInterrupcion
Iniciocall LCD_Inicializacall Teclado_Inicializamovlw b'10001000‘movwf INTCON
;Configura las líneas del teclado.
;Habilita la interrupción RBI y la general.
Programa Aplicación
Principalsleepgoto Principal
ServicioInterrupcioncall Teclado_LeeHexcall LCD_Nibblecall Teclado_EsperaDejePulsarbcf INTCON,RBIFretfie
INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>END
; Espera en modo bajo consumo que pulse teclado.
; Obtiene el valor hexadecimal de la tecla pulsada.
; Visualiza el valor en pantalla.
; Para que no se repita el mismo carácter .
; mientras permanece pulsado, limpia flag.
; Subrutinas de control del teclado.
CONEXIONES
CERRADURA ELECTRÓNICA
Microcontroladores y Microprocesadores
MOTOR PASO A PASO
El PAP mas comercializado es el de 7,5º por paso o 48 pasos por revolución. El principal problema que presentan los motores PAP es su limitada potencia.
Los incrementos de rotación o pasos se miden en grados y es el parámetro fundamental de un motor PAP. Los PAP se comercializan dentro de una gran variedad de grados de rotación por paso, desde 0,72º a 22,5º, correspondiente a 500 y 16 pasos por revolución, respectivamente .
L1
I
PRINCIPIOS DE FUNCIONAMIENTO
L2
I
Núcleo de Hierro
Bobina Estator
Rotor
Reposo
L1
I
PRINCIPIOS DE FUNCIONAMIENTO
L2
I
PASO 1
L1
I
PRINCIPIOS DE FUNCIONAMIENTO
L2
I
Energizado
PASO 2
PRINCIPIOS DE FUNCIONAMIENTO
L2
I
L1
IInvertir Polaridad L1
L2
I
L1
I
PRINCIPIOS DE FUNCIONAMIENTO
PASO 3
Invertir Polaridad L2
L2
I
L1
I
PRINCIPIOS DE FUNCIONAMIENTO
PASO 4
Invertir Polaridad L1
MOTORES PAP BIPOLARES
El modelo de motor paso a paso que hemos analizado, recibe el nombre de BIPOLAR.
En este tipo de motores las bobinas del estator se conectan formando dos grupos.
Secuencias de Movimientos
En el modo Full Step el rotor del motor PAP avanza un paso por cada pulso de excitación.
Secuencias de Movimientos
En el modo Half Step el rotor del motor PAP avanza medio paso por cada pulso de excitación.
MOTORES PAP UNIPOLARES
Tras el inconveniente que implica la necesidad de dos polaridades de corriente para generar la secuencia del motor se puede disponer de una toma media entre las bobinas. De esta forma se obtiene un Motor PAP Unipolar de cuatro fases, donde las corriente circula por las bobinas en un único sentido.
Secuencias de Movimientos
En el modo Full Step el rotor del motor PAP avanza un paso por cada pulso de excitación.
Secuencias de Movimientos
En el modo Half Step el rotor del motor PAP avanza medio paso por cada pulso de excitación.