MICROCONTROLADORES

M.Sc. César Augusto Peña C.
Profesor de planta – Ingeniería mecatrónica Universidad de Pamplona

INSTRUCCIÓN ADDLW k
W+k
Ejm:

W

W =1

0 0 0 0 0 0 0 1
ADDLW .7

W = 1 +7 = 8

0 0 0 0 1 0 0 0

INSTRUCCIÓN ADDWF f,d
W+f
Ejm:

d

W=1

0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
ADDWF REG1,1

REG1 = 5

REG1 = 1 + 5 = 6

0 0 0 0 0 1 1 0

INSTRUCCIÓN ANDLW k
W AND k
Ejm:

W

W =5

0 0 0 0 0 1 0 1
ANDLW b’00000111’

W = 5 AND 7 = 5

0 0 0 0 0 1 0 1

INSTRUCCIÓN ANDWF f,d
W AND f
Ejm:

d

W=3

0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1
ANDWF REG1,0

REG1 = 5

W = 3 AND 5 = 1

0 0 0 0 0 0 0 1

INSTRUCCIÓN CLRW
0
Ejm:

W

W =171

1 0 1 0 1 0 1 1
CLRW

W=0

0 0 0 0 0 0 0 0

INSTRUCCIÓN CLRF f
0
Ejm:

f

REG1 =170

1 0 1 0 1 0 1 0
CLRF REG1

REG1 = 0

0 0 0 0 0 0 0 0

INSTRUCCIÓN COMF f,d
com(f)
Ejm:

d

REG1 =240

1 1 1 1 0 0 0 0
COMF REG1,0

W = 15

0 0 0 0 1 1 1 1

INSTRUCCIÓN DECF f,d
f-1
Ejm:

d

REG1 =8

0 0 0 0 1 0 0 0
DECF REG1,1

REG1 = 7

0 0 0 0 0 1 1 1

INSTRUCCIÓN INCF f,d
f+1
Ejm:

d

REG1 =15

0 0 0 0 1 1 1 1
INCF REG1,1

REG1 = 16

0 0 0 1 0 0 0 0

INSTRUCCIÓN IORLW k
W OR k
Ejm:

W

W =9

0 0 0 0 1 0 0 1
IORLW b’00000111’

W = 9 OR 7 = 15

0 0 0 0 1 1 1 1

INSTRUCCIÓN IORWF f,d
W OR f
Ejm: REG1 =6 W =9

d

0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1
IORWF REG1,0

REG1 =6

0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1

W = 6 OR 9 = 15

INSTRUCCIÓN NOP

Ejm:

NOP

No hace nada Se utiliza para crear retarnos muy cortos

INSTRUCCIÓN RLF f,d
C REG1

0

0 1 0 0 1 1 1 1

RLF C

REG1,1 REG1

0

1 0 0 1 1 1 1 0

INSTRUCCIÓN RLF f,d
C REG1

0

1 0 0 1 1 1 1 0

RLF C

REG1,1 REG1

1

0 0 1 1 1 1 0 0

INSTRUCCIÓN RLF f,d
C REG1

1

0 0 1 1 1 1 0 0

RLF C

REG1,1 REG1

0

0 1 1 1 1 0 0 1

INSTRUCCIÓN RRF f,d
C REG1

1

0 0 1 1 1 1 0 0

RRF C

REG1,1 REG1

0

1 0 0 1 1 1 1 0

INSTRUCCIÓN SUBLW k
k-W
EJEMPLO 1:

W

W=5

0 0 0 0 0 1 0 1
SUBLW .7 C

W=7-5=2

0 0 0 0 0 0 1 0

1

POSITIVO

INSTRUCCIÓN SUBLW k
k-W
EJEMPLO 2:

W

W = 15

0 0 0 0 1 1 1 1
SUBLW .15 C

W = 15 - 15 = 0

0 0 0 0 0 0 0 0

1

CERO

INSTRUCCIÓN SUBLW k
k-W
EJEMPLO 3:

W

W=4

0 0 0 0 0 1 0 0
SUBLW .3 C

W = 3 - 4 = -1

1 1 1 1 1 1 1 1

0

NEGATIVO

INSTRUCCIÓN SUBWF f,d
f-W
EJEMPLO 1:

W

REG1 = 6 W=1

0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1
SUBWF REG1,1 C

REG1 = 6 - 1 = 5

0 0 0 0 0 1 0 1

1

POSITIVO

INSTRUCCIÓN SUBWF f,d
f-W
EJEMPLO 1:

W

REG1 = 7 W=7

0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1
SUBWF REG1,1 C

W=7-7=0

0 0 0 0 0 0 0 0

1

CERO

INSTRUCCIÓN SUBWF f,d
f-W
EJEMPLO 1:

W

REG1 = 10 W = 12

0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0
SUBWF REG1,1 C

REG1 = 10 - 12 = -2

1 1 1 1 1 1 1 0

0

NEGATIVO

INSTRUCCIÓN SWAPF f,d
f<3:0>
Ejm:

d<7:4> d<3:0>

f<7:4>

REG1

0 0 0 0 1 0 0 1
SWAPF REG1,0

W

1 0 0 1 0 0 0 0

INSTRUCCIÓN XORLW k
W XOR k
Ejm:

W

W =9

0 0 0 0 1 0 0 1
XORLW b’00000111’

W = 9 XOR 7 = 14

0 0 0 0 1 1 1 0

INSTRUCCIÓN XORWF f,d
W XOR f
Ejm:

d

REG1 = 15

0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 0
XORWF REG1,0

W=6

W = 15 XOR 6 = 9

0 0 0 0 1 0 0 1

RUTINAS USUALES
• Poner a CERO varios bits de W sin alterar el resto. Ejm: Se desea poner a cero los bits 3, 4 y 5 del registro W sin alterar los demás

W

1 0 1 0 1 0 0 1
ANDLW B’11000111’

W

1 0 0 0 0 0 0 1

RUTINAS USUALES
• Poner a UNO varios bits de W sin alterar el resto. Ejm: Se desea poner a uno los bits 1,2,3 y 4 del registro W sin alterar los demás

W

1 0 1 0 1 0 0 1
IORLW B’00011110’

W

1 0 1 1 1 1 1 1

RUTINAS USUALES
• Detectar si dos registros son iguales y en tal caso llama una subrutina Ejm: Si REG1 = REG2 llamar la subrutina IGUAL

MOVF REG1 = W REG2

REG1,0

;REG 1

W

10101001 10101001
REG2,0

XORWF REG2,0

;W = REG2 XOR W

BTFSC STATUS,2 ;SI Z = 0 BRINCA CALL IGUAL ;Z=1 Y LLAMA ;SUBRUTINA

XORWF Z

1

W

00000000

CONTINUA PROGRAMA …

RUTINAS USUALES
• Detectar si un registro es mayor que otro Ejm: Si REG2 >= REG1 llamar la subrutina MAYOR

MOVF REG1 = W REG2

REG1,0

;REG 1

W

00000001 00000111
REG2,0

SUBWF REG2,0

;W = REG2 – W(REG1)

BTFSS STATUS,0 ;SI C =1 BRINCA CALL CALL MENOR MAYOR ;C = 0 si REG2<REG1 ;C = 1 si REG2>=REG1

SUBWF C

1

W

00000110

CONTINUA PROGRAMA …

PROGRAMA DE VERIFICACIÓN
;AUTOR: CÉSAR AUGUSTO PEÑA C ;PIC: 16F84A ;FUNCION: PROGRAMA PARA CORROBORAR EL FUNCIONAMIENTO DE ALGUNAS SUBRUTINAS ;CARACTERISTICAS: ;OSCILLATOR: XT ;WATCHDOG TIMER: OFF ;POWER UP TIMER: ON ;CODE PROTECT: OFF INCLUDE "P16F84.Inc" ;**************************** DEFINICION DE REGISTROS *********************************** CBLOCK .12 REG1, REG2 endc ;**************************************************************************************** org 00 goto INICIO org 05 INICIO movlw .7 ;W = 7 movwf REG1 ;REG1 = W = 7 movlw .7 ;W = 7 movwf REG2 ;REG2 = W = 7

PROGRAMA DE VERIFICACIÓN
;Subrutina para comprobar igualdades VERIF_IGUAL movf REG1,0 xorwf REG2,0 btfsc STATUS,2 goto IGUAL ;W = REG1 ;W = REG1 XOR REG2 ;Salta si Z = 0 ;llama Subrutina

;subrutina para comprobar que REG2 es mayor que REG1 COM_REG movf REG1,0 ;W = REG1 subwf REG2,0 ;W = REG2 - REG1 btfss STATUS,0 ;Salta SI C =1 (REG2>=REG1) goto NO goto SI ;Subrutina en caso que REG2 >= REG1 SI movlw .2 ;W = 2 movwf REG2 ;REG2 = W = 2 goto COM_REG ;vuelve a comprobar que REG2>=REG1 ;Subrutina en caso que REG2 < REG1 NO goto INICIO ;Subrutina en caso que REG1 = REG2 IGUAL movlw .8 ;W = 8 movwf REG2 ;REG2 = W = 8 goto VERIF_IGUAL end

MOTOR PAP
Mientras que un motor convencional gira libremente al aplicarle una tensión, el motor paso a paso gira un determinado ángulo de forma incremental (transforma impulsos eléctricos en movimientos de giro controlados), lo que le permite realizar desplazamientos angulares fijos muy precisos (pueden variar desde 1,8º hasta unos 90º)

MOTOR PAP
Están constituidos esencialmente por dos partes: • Estator: parte fija construida a base de cavidades en las que van depositadas las bobinas. • Rotor: parte móvil construida mediante un imán permanente. Este conjunto va montado sobre un eje soportado por dos cojinetes que le permiten girar libremente.

MOTOR PAP
Al excitar el estator, se crearan los polos N-S, provocando la variación del campo magnético formado.

La respuesta del rotor será seguir el movimiento de dicho campo (tenderá a buscar la posición de equilibrio magnético), es decir, orientará sus polos NORTE-SUR hacia los polos SUR-NORTE del estator, respectivamente.

SECUENCIAS MOTOR PAP UNIPOLAR
Paso simple: Esta secuencia de pasos es la más simple de todas y consiste en activar cada bobina una a una y por separado, con esta secuencia de encendido de bobinas no se obtiene mucha fuerza ya que solo es una bobina cada vez la que arrastra y sujeta el rotor del eje del motor

SECUENCIAS MOTOR PAP UNIPOLAR
Paso doble: Con el paso doble activamos las bobinas de dos en dos con lo que hacemos un campo magnético más potente que atraerá con más fuerza y retendrá el rotor del motor en el sitio. Los pasos también serán algo más bruscos debidos a que la acción del campo magnético es más poderosa que en la secuencia anterior.

SECUENCIAS MOTOR PAP UNIPOLAR
Medio Paso: Combinando los dos tipos de secuencias anteriores podemos hacer mover al motor en pasos más pequeños y precisos y así pues tenemos el doble de pasos de movimiento para el recorrido total de 360º del motor.

INSTRUCCIÓN GOTO k
0000 H
VECTOR RESET

k

PC

ETIQUETA = 34h
0004 H
VECTOR INTERRUPCIÓN PC = 11 h

0011 H 0012 H

GOTO ETIQUETA (34H)

Goto 34h
ETIQUETA 0034 H
PC = 34 h CONTINUA PROGRAMA

03FF H

13

0

INSTRUCCIÓN CALL k Y RETURN
0000 H
VECTOR RESET

PC+1 k
VECTOR INTERRUPCIÓN

Pila PC

0004 H

0011 H 0012 H 0034 H

CALL SUBRUTINA CONTINUA PROGRAMA

PC = 34 h

0012 h
NIVEL 2 NIVEL 3

SUBRUTINA RETURN

. . .
NIVEL 8

03FF H

13

0

INSTRUCCIÓN RETLW k
0000 H
VECTOR RESET

Nivel 1 (pila) k
0004 H
VECTOR INTERRUPCIÓN

PC W

0011 H 0012 H 0034 H

CALL SUBRUTINA CONTINUA PROGRAMA

Funciona igual que el comando RETURN con la diferencia que carga el valor del literal “k” en W

SUBRUTINA

W = 00000111
RETLW d’7’

03FF H

13

0

PROG. MPAP USANDO TABLAS
;AUTOR: CÉSAR AUGUSTO PEÑA c ;PIC: 16F84A ;FUNCION: Hace girar un motor PAP utilizando tablas (el Mpap se conecta a PORTB) ;CARACTERISTICAS: ;OSCILLATOR: ;WATCHDOG TIMER: ;POWER UP TIMER: ;CODE PROTECT:

XT OFF ON OFF

INCLUDE "P16F84A.Inc" ;*******DEFINICION DE REGISTROS********************************** CBLOCK .12 REG1, REG2, REG3, MOTOR ENDC ;*******DEFINICION DE DATOS************************************** VALOR1 EQU .10 VALOR2 EQU .40 VALOR3 EQU .40

;*******PROGRAMA************************************************* ORG 00 GOTO INICIO ORG 05 INICIO bsf STATUS,RP0 ;PASA AL BANCO 1 clrf TRISA ;CONFIGURA PUERTOS COMO SALIDAS clrf TRISB bcf STATUS,RP0 ;PASA AL BANCO 0 clrf PORTA clrf PORTB

PROG. MPAP USANDO TABLAS
CARGAR movlw movwf GIRAR movf call movwf call decfsz goto goto d'4' MOTOR MOTOR,0 TABLA PORTB RETARDO MOTOR GIRAR CARGAR ;W = 4 ;W = MOTOR ;PORTB = W ;MOTOR = MOTOR -1 ;SI MOTOR = 0 LO RECARGA (4)

;*******TABLA DE LA SECUENCIA DEL MOTOR PAP***************** TABLA addwf nop retlw retlw retlw retlw PCL,F B'00000001' B'00000010' B'00000100' B'00001000' ; PCL = PCL + W

PROG. MPAP USANDO TABLAS
;*******SUBRUTINA DE RETARDOS*********************************** RETARDO TRES DOS UNO movlw movwf movlw movwf movlw movwf decfsz goto decfsz goto decfsz goto return END VALOR1 REG1 VALOR2 REG2 VALOR3 REG3 REG3,F UNO REG2,F DOS REG1,F TRES

INSTRUCCIÓN SLEEP
•La instrucción SLEEP introduce al procesador en un modo de funcionamiento que se llama de reposo o de bajo consumo. •Detiene al oscilador y el procesador queda congelado, no ejecutando instrucciones y manteniendo el mismo valor en los puertos. •Pone los bits PD# = 0 y TO# = 1. •Borra el perro guardián y al divisor de frecuencia

INTERRUPCIONES
0000 H
VECTOR RESET

0004 H

VECTOR INTERRUPCIÓN TRATAMIENTO INTERRUPCIÓN RETFIE

0012 H 0034 H

INICIO

PROGRAMA

03FF H

13

0

CAUSAS DE INTERRUPCIONES
• Activación de la patita RB0/INT • Cambio de estado de uno de los pines RB<4:7> del puerto B • Desbordamiento del temporizador TMR0 • Finalización de la escritura en la EEPROM de datos

REGISTRO DE CONTROL DE INTERRUPCIONES INTCON
GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
GIE: Permiso global de interrupciones 1 – Permite la ejecución de todas las interrupciones, cuyos bits de permiso individuales también las permitan. 0 – Prohíbe todas las interrupciones. EEIE: Permiso de interrupción por fin de la escritura de la EEPROM de datos 1 – Permite la Interrupción cuando finaliza la escritura de la EEPROM 0 – No permite esta interrupción. T0IE: Permiso de interrupción por sobrepasamiento del TMR0 1 – Permite interrupción al sobrepasarse el TMR0 0 – No permite esta interrupción. INTE: Permiso de interrupción por activación de la patita RB0/INT 1 – Permite interrupción al activarse RB0/INT 0 – No permite esta interrupción.

REGISTRO DE CONTROL DE INTERRUPCIONES INTCON
GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
T0IF: Señalizador de sobrepasamiento del TMR0 1 – Se pone en 1 cuando ha ocurrido sobrepasamiento 0 – El TMR0 no se ha sobrepasado INTF: Señalizador de activación de la patita RB0/INT 1 – Se pone en 1 al activarse RB0/INT 0 – Indica que RB0/INT aún no se ha activado RBIF: Señalizador de cambio de estado en las patitas RB<7:4> 1 – Se pone en 1 cuando cambia de estado alguno de estos pines 0 – No han cambiado de estados ninguno de los pine RB<7:4>

INTERRUPCIÓN EXTERNA INT
Se utiliza para realizar subrutinas que necesiten ejecutarse inmediatamente. Para llamar esta subrutina de interrupción es necesario activar el pin RB0/INT por medio de un flanco ascendente o descendente. Si se desea trabajar con un flanco ascendente es necesario poner en 1 el bit INTDEG del registro OPTION y en caso contrario se pone un 0. Para que esta interrupción pueda activarse es necesario poner en 1 los bit GIE e INTE del registro INTCON

1
GIE

x
EEIE

x
T0IE

1
INTE

x
RBIE

0
T0IF

0
INTF

0
RBIF

PROG. INTERRUPCIÓN RB0/INT
;AUTOR: CÉSAR AUGUSTO PEÑA C ;PIC: 16F84A ;FUNCION: USA INTERRUPCIONES (RB0), SI OCURRE UN FLANCO DE BAJADA EN EL PIN RB0 ;APAGA UN LED PUESTO EN RA0 DURANTE UN SEGUNDO Y VUELVE A DEJARLO PRENDIDO ;CARACTERISTICAS: ;OSCILADOR: ;WATCHDOG TIMER: ;POWER UP TIMER: ;CODE PROTECT:

XT OFF ON OFF

INCLUDE

"P16F84A.Inc"

;**************************** DEFINICION DE REGISTROS *********************************** CBLOCK .12 reg1,reg2,reg3 endc ;**************************** DEFINICION DE DATOS **************************** valor1 equ d'8' ;DATOS PARA REATRDO DE 1 SEGUNDO valor2 equ d'195' valor3 equ d'212' LED equ 0 ;pin de entrada del interruptor

PROG. INTERRUPCIÓN RB0/INT
org 00 goto inicio ;********************** TRATAMIENTO DE INTERRUPCIONES************************************ ORG 04 ;ZONA DE TRATAMIENTO DE INTERRUPCIONES btfss INTCON,INTF goto NADA bcf PORTA,LED call RETARDO bsf PORTA,LED NADA bcf INTCON,INTF retfie ;_________________________________________________________________________________ inicio bsf movlw movwf movlw movwf bcf bcf bcf clrf clrf STATUS,RP0 ;PASA A BANCO 1 b'00000000' ;CONFIGURA LOS PUERTOS TRISA b'00000001' TRISB OPTION_REG,NOT_RBPU ;RESISTENCIAS PULL-UP ACTIVAS OPTION_REG,INTEDG ;FLANCO DE BAJADA DE RB0 STATUS,RP0 ;VUELVE A BANCO 0 PORTA PORTB

PROG. INTERRUPCIÓN RB0/INT
bsf bsf bcf ciclo INTCON,INTE INTCON,GIE INTCON,INTF bsf sleep goto ;ACTIVA INTERRUPCION POR RP0 ;ACTIVA INTERRUPCIONES GLOBALES ;PONE EN BAJO LA BANDERA DE INTERRUPCIONES POR RP0

PORTA,LED ciclo

;***********************subrutina para retardos*************** RETARDO movlw movwf tres movlw movwf dos movlw movwf uno decfsz goto decfsz goto decfsz goto return end valor1 reg1 valor2 reg2 valor3 reg3 reg3,f uno reg2,f dos reg1,f tres ;retardo de bit y medio

PROG. INTERRUPCIÓN RB<7:4>
;AUTOR: CÉSAR AUGUSTO PEÑA C ;PIC:16F84A ;FUNCION: USA INTERRUPCIONES (RB<7:4>), SI OCURRE UN CAMBIO EN ALGUN PIN RB<7:4> ;APAGA UN LED PUESTO EN RA0 DURANTE UN SEGUNDO Y VUELVE A DEJARLO PRENDIDO ;CARACTERISTICAS: ;OSCILADOR: ;WATCHDOG TIMER: ;POWER UP TIMER: ;CODE PROTECT:

XT OFF ON OFF

INCLUDE "P16F84A.Inc" ;**************************** DEFINICION DE REGISTROS *********************************** CBLOCK .12 reg1,reg2,reg3 endc ;**************************** DEFINICION DE DATOS **************************** valor1 equ d'8' ;DATOS PARA REATRDO DE 1 SEGUNDO valor2 equ d'195' valor3 equ d'212' LED equ 0 ;pin de entrada del interruptor

PROG. INTERRUPCIÓN RB<7:4>
org 00 goto inicio ;********************** TRATAMIENTO DE INTERRUPCIONES************************************ ORG 04 ;ZONA DE TRATAMIENTO DE INTERRUPCIONES btfss INTCON,RBIF goto NADA bcf PORTA,LED call RETARDO bsf PORTA,LED NADA bcf INTCON,RBIF retfie ;_________________________________________________________________________________________ inicio bsf movlw movwf movlw movwf bcf bcf clrf clrf STATUS,RP0 b'00000000' TRISA b'11110000' TRISB OPTION_REG,NOT_RBPU STATUS,RP0 PORTA PORTB ;PASA A BANCO 1 ;CONFIGURA LOS PUERTOS

;RESISTENCIAS PULL-UP ACTIVAS ;VUELVE A BANCO 0

PROG. INTERRUPCIÓN RB<7:4>
bsf bsf bcf INTCON,RBIE ;ACTIVA INTERRUPCION POR CAMBIO EN EL PORTB INTCON,GIE ;ACTIVA INTERRUPCIONES GLOBALES INTCON,RBIF ;PONE EN BAJO LA BANDERA DE INTERRUPCIONES POR ;CAMBIO EN PORTB

ciclo

bsf PORTA,LED movf PORTB,W ;TENER COMO BASE PARA COMPARAR EL CAMBIO EN SUS PINES sleep goto ciclo ;***********************subrutina para retardos*************** RETARDO movlw valor1 ;retardo de bit y medio movwf reg1 tres movlw valor2 movwf reg2 dos movlw valor3 movwf reg3 uno decfsz reg3,f goto uno decfsz reg2,f goto dos decfsz reg1,f goto tres return end