MICROCONTROLADORES M.Sc. César Augusto Peña C. Profesor Profesor de planta planta – Ingenierí Ingenieríaa mecatrónic mecatrónicaa Universidad de Pamplona
INSTRUCCIÓN ADDLW k W+k
W
Ejm:
W =1
0 0 0 0 0 0 0 1 ADDLW
W = 1 +7 = 8
.7
0 0 0 0 1 0 0 0
INSTRUCCIÓN ADDWF f,d W+f
d
Ejm: W=1
0 0 0 0 0 0 0 1
REG1 = 5
0 0 0 0 0 1 0 1 ADDWF
REG1 = 1 + 5 = 6
REG1,1
0 0 0 0 0 1 1 0
INSTRUCCIÓN ANDLW k W AND k
W
Ejm:
W =5
0 0 0 0 0 1 0 1 ANDLW
W = 5 AND 7 = 5
b’00000111’
0 0 0 0 0 1 0 1
INSTRUCCIÓN ANDWF f,d W AND f
d
Ejm:
W=3
0 0 0 0 0 0 1 1
REG1 = 5
0 0 0 0 0 1 0 1 ANDWF
W = 3 AND 5 = 1
REG1,0
0 0 0 0 0 0 0 1
INSTRUCCIÓN CLRW 0
Ejm:
W =171
W
1 0 1 0 1 0 1 1 CLRW
W=0
0 0 0 0 0 0 0 0
INSTRUCCIÓN CLRF f Ejm:
REG1 =170
0
f
1 0 1 0 1 0 1 0 CLRF
REG1 = 0
REG1
0 0 0 0 0 0 0 0
INSTRUCCIÓN COMF f,d com(f)
Ejm:
REG1 =240
d
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 Ejm:
REG1 =8
f-1
0 0 0 0 1 0 0 0 DECF
REG1 = 7
d
REG1,1
0 0 0 0 0 1 1 1
INSTRUCCIÓN INCF f,d Ejm:
REG1 =15
f+1
0 0 0 0 1 1 1 1 INCF
REG1 = 16
d
REG1,1
0 0 0 1 0 0 0 0
INSTRUCCIÓN IORLW k W OR k
W
Ejm:
W =9
0 0 0 0 1 0 0 1 IORLW
W = 9 OR 7 = 15
b’00000111’
0 0 0 0 1 1 1 1
INSTRUCCIÓN IORWF f,d W OR f
d
Ejm: REG1 =6
0 0 0 0 0 1 1 0
W =9
0 0 0 0 1 0 0 1 IORWF
REG1,0
REG1 =6
0 0 0 0 0 1 1 0
W = 6 OR 9 = 15
0 0 0 0 1 1 1 1
INSTRUCCIÓN NOP Ejm: NOP
No hace nada Se utiliza para crear retarnos muy cortos
INSTRUCCIÓN RLF f,d C
0
REG1
0 1 0 0 1 1 1 1
RLF C
0
REG1,1 REG1
1 0 0 1 1 1 1 0
INSTRUCCIÓN RLF f,d C
0
REG1
1 0 0 1 1 1 1 0
RLF C
1
REG1,1 REG1
0 0 1 1 1 1 0 0
INSTRUCCIÓN RLF f,d C
1
REG1
0 0 1 1 1 1 0 0
RLF C
0
REG1,1 REG1
0 1 1 1 1 0 0 1
INSTRUCCIÓN RRF f,d C
1
REG1
0 0 1 1 1 1 0 0
RRF C
0
REG1,1 REG1
1 0 0 1 1 1 1 0
INSTRUCCIÓN SUBLW k k-W
W
EJEMPLO 1:
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
W
EJEMPLO 2:
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
W
EJEMPLO 3:
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
W
EJEMPLO 1: REG1 = 6
0 0 0 0 0 1 1 0
W=1
0 0 0 0 0 0 0 1 SUBW SU BWF F RE REG G1,1 1,1 C
REG1 RE G1 = 6 - 1 = 5
0 0 0 0 0 1 0 1
1
POSITIVO
INSTRUCCIÓN SUBWF f,d f-W
W
EJEMPLO 1: REG1 = 7
0 0 0 0 0 1 1 1
W=7
0 0 0 0 0 1 1 1 SUBW SU BWF F RE REG G1,1 1,1 C
W=7-7=0
0 0 0 0 0 0 0 0
1
CERO
INSTRUCCIÓN SUBWF f,d f-W
W
EJEMPLO 1: REG1 = 10 W = 12
0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 SUBW SU BWF F RE REG G1,1 1,1 C
REG1 RE G1 = 10 10 - 12 = -2
1 1 1 1 1 1 1 0
0
NEGATIVO
INSTRUCCIÓN SWAPF f,d Ejm:
REG1
f<3:0>
d<7:4>
f<7:4>
d<3:0>
0 0 0 0 1 0 0 1 SWAPF
W
REG1,0
1 0 0 1 0 0 0 0
INSTRUCCIÓN XORLW k W XOR k
W
Ejm:
W =9
0 0 0 0 1 0 0 1 XORLW
W = 9 XOR 7 = 14
b’00000111’
0 0 0 0 1 1 1 0
INSTRUCCIÓN XORWF f,d W XOR f
d
Ejm: REG1 = 15
0 0 0 0 1 1 1 1
W=6
0 0 0 0 0 1 1 0 XORWF
W = 15 XOR 6 = 9
REG1,0
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
W
B’11000111’
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
W
B’00011110’
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 REG1 = REG2 llamar la subrutina IGUAL
REG1 = W
10101001
REG2
10101001
XORWF Z
1
W
REG2,0
00000000
MOVF
REG1,0
XORWF REG2,0
;REG 1
W
;W = REG2 XOR W
BTFSC STATUS,2 ;SI Z = 0 BRINCA CA L L
IGUAL
;Z=1 Y LLA ;Z=1 LLAM MA ;SUBRUTINA
CONTINUA PROGRAMA …
RUTINAS USUALES • Detectar si un registro es mayor que otro Ejm: Si REG2 REG2 >= REG1 llamar la subrutina MAYOR
REG1 = W
00000001
REG2
00000111
SUBWF C
1
W
REG2,0
00000110
MOVF
REG1,0
SUBWF REG2,0
;REG 1
W
;W = REG2 REG2 – W( W(RE REG1 G1))
BTFSS STATUS,0 ;SI C =1 BRINCA CA L L
MENOR
;C = 0 si REG2
CA L L
MAYOR
;C = 1 si REG2>=REG1
CONTINUA PROGRAMA …
PROGRAMA DE VERIFICACIÓN ;AUTOR: CÉSAR AUGUSTO PEÑA C ; P I C: 16F84A ;FUNCION: ;FUNC ION: PROG PROGRAMA RAMA PARA PARA CORRO CORROBORAR BORAR EL FUNCION FUNCIONAMIENT AMIENTO O DE ALGUN ALGUNAS AS SUBRUTIN SUBRUTINAS AS ;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 SI C =1 (R (REG2>=REG1) goto NO goto SI ;Subrutina en caso que REG2 >= REG1 SI movlw .2 ;W = 2 movwf REG2 ;REG2 = W = 2 goto goto COM_ COM_R REG ;vu ;vuelv elve a comp compro robbar que que RE REG G2>=R 2>=REG EG11 ;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 desplazamientos realizar 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
0004 H
VECTOR INTERRUPCIÓN
0011 H 0012 H
CALL SUBRUTINA
PC+1 k PC = 34 h
CONTINUA PROGRAMA
0012 h NIVEL 2
0034 H
NIVEL 3
SUBRUTINA
. . .
RETURN
03FF H
Pila PC
NIVEL 8
13
0
INSTRUCCIÓN RETLW k 0000 H
VECTOR RESET
0004 H
VECTOR INTERRUPCIÓN
0011 H 0012 H
Nivel 1 (pila) k
CALL SUBRUTINA CONTINUA PROGRAMA
Funciona igual que el comando RETURN con la diferencia que carga el valor del literal “k” en W
0034 H SUBRUTINA
W = 00000111
RETLW d’7’
03FF H
13
0
PC W
PROG. MPAP USANDO TABLAS ;AUTOR: CÉSAR AUGUSTO PEÑA c ;PIC ;PIC:: 16F8 16F84A 4A ;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 CBL OCK .12 .12 REG1, REG2, REG3, MOTOR ENDC ;*******DEFINICION ;*******DEFINICION DE DATOS****************** 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 -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 g o to 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
INICIO
0034 H PROGRAMA
03FF H
13
0
CAUSAS DE INTERRUPCIONES • Acti Activa vaci ción ón de la pati patita ta RB RB0/ 0/IINT • Camb Cambiio de de est estad adoo de de uno uno de los los pi pines nes RB<4:7> del puerto B • Desb Desbor orda dami mien ento to del del tem tempo poririza zado dorr TMR TMR00 • Fina Finaliliza zaci ción ón de la escr escrititur uraa en en la la E EEP EPRO ROM M de datos
REGISTRO DE CONTROL DE INTERRUPCIONES INTCON GIE EEIE T0IE INTE RBIE T0IF INTF RBIF GIE: Permiso global de interrupciones 1 – Per Permit mitee la ejecuc ejecución ión de de todas todas las inte interru rrupci pcione ones, s, cuyos cuyos bits bits de per permis misoo individuales también las permitan. 0 – Proh Prohíbe íbe todas todas las interr interrupcion upciones. es. 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 permite esta interr interrupció upción. n. T0IE: Permiso de interrupción por sobrepasamiento del TMR0 1 – Permi Permite te interrupció interrupciónn al sobrepasarse sobrepasarse el TMR0 TMR0 0 – No permite permite esta interr interrupció upción. n. INTE: Permiso de interrupción por activación de la patita RB0/INT 1 – Permi Permite te interrupci interrupción ón al activarse activarse RB0/INT RB0/INT 0 – No permite permite esta interr interrupció upción. n.
REGISTRO DE CONTROL DE INTERRUPCIONES INTCON GIE EEIE T0IE INTE RBIE T0IF INTF RBIF T0IF: Señaliza Señalizador dor de sobrepas sobrepasamient amientoo del TMR0 1 – Se pone en 1 cuando cuando ha ocurrido ocurrido sobrepa sobrepasamien samiento to 0 – El TMR0 TMR0 no se se ha sobrep sobrepasa asado do INTF: Señaliza Señalizador dor de activación activación de la patita patita RB0/INT RB0/INT 1 – Se pone pone en 1 al al activa activarse rse RB0/ RB0/INT INT 0 – Indica que RB0/INT RB0/INT aún aún no se ha activado activado RBIF: Señalizad Señalizador or de cambio cambio de estado estado en las patitas patitas RB<7:4> RB<7:4> 1 – Se pone en en 1 cuando cambia cambia de estado estado alguno alguno de estos estos pines pines 0 – No han cambiado cambiado de estados estados ninguno ninguno de los los pine RB<7:4> 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 desea trabajar trabajar con un flanco flanco ascendente ascendente es necesario necesario poner en 1 el bit INTDEG del registro OPTION y en caso contrario se pone un 0. Para que que esta interrupción interrupción pueda pueda activars activarsee es necesario necesario poner poner en 1 los bit GIE e INTE del registro INTCON
1
x
x
1
x
0
GIE
EEIE
T0IE
INTE
RBIE
T0IF
0 INTF
0 RBIF
PROG. INTERRUPCIÓN RB0/INT ;AUTOR: CÉSAR AUGUSTO PEÑA C ;PIC: 16F84A ;FUNCION: USA INTERRUPCIONES 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: INCLUDE
XT O FF ON O FF "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' L ED
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 b cf PORTA,LED call RETARDO b sf PORTA,LED NADA b cf INTCON,INTF retfie ;_________________________________________________________________________________ inicio
b sf movlw movwf movlw movwf b cf b cf b cf clrf clrf
STATUS,RP0 ;PASA A BANCO 1 b ' 0000 0000 ' ;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 b sf b sf b cf ciclo
INTCON,INTE INTCON,GIE INTCON,INTF b sf 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 mo movlw movwf tres movlw movwf do s movlw movwf un o decfsz goto decfsz goto decfsz goto return end
valor1 reg1 valor2 reg2 valor3 reg3 reg3,f uno reg2,f d os reg1,f tres
;retardo de bit y medio
PROG. INTERRUPCIÓN RB<7:4> ;AUTOR: CÉSAR AUGUSTO PEÑA C ;PIC:16F84A ;FUNCION: ;FUNCION: USA INTERRU INTERRUPCION PCIONES ES (RB<7:4>) (RB<7:4>),, SI OCURRE OCURRE UN UN CAMBIO CAMBIO EN ALGUN PIN RB<7:4> RB<7:4> ;APAGA UN LED PUESTO EN RA0 DURANTE UN SEGUNDO S EGUNDO Y VUELVE A DEJARLO PRENDIDO ;CARACTERISTICAS: ;OSCILADOR: ;WATCHDOG TIMER: ;POWER UP TIMER: ;CODE PROTECT:
XT O FF 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' L ED equ 0 ;pin de entrada del interruptor
PROG. INTERRUPCIÓN RB<7:4> org 00 goto inicio ;********************** TRATAMIENTO DE INTERRUPCIONES**************** 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 ciclo
INTCON,RBIE ;ACTIVA INTERRUPCION POR CAMBIO EN EL PORTB INTCON,GIE ;A ; ACTIVA INTERRUPCIONES GLOBALES INTCON,RBIF ;PONE EN BAJO LA BANDERA DE INTERRUPCIONES POR ;CAMBIO EN PORTB
b sf 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 d os movlw valor3 movwf reg3 uno decfsz reg3,f goto uno decfsz reg2,f goto d os decfsz reg1,f goto tres return end