Professional Documents
Culture Documents
CAPTULO 1
1 MICROCONTROLADORES PROGRAMABLES
1.1
QU ES UN MICROCONTROLADOR?
1.2
ARQUITECTURA INTERNA
1.2.1
EL PROCESADOR
1.2.2
MEMORIA DE PROGRAMA
1.2.3
ASIGNACION DE PINES
1.2.4
RECURSOS AUXILIARES
1.3
PRIMER PROGRAMA
CAPITULO 3
3 EL MICROCONTROLADOR PIC16F84
3.1
Caractersticas principales
3.2
Descripcin de pines
3.3
Frecuencia de funcionamiento
3.3.1. Tipos de osciladores
3.4
Reset
3.5
Tercer programa
CAPTULO 4
4 PROCESADOR INTERNO
4.1
Arquitectura Interna
4.2
Memoria de programa
4.3
Memoria de Datos RAM
4.3.1. Direccionamiento de la memoria de datos
4.4
El Registro de Estado
4.5
Cuarto Programa
RECURSOS FUNDAMENTALES
5.1
Temporizador/Contador TMR0
5.1.1
El registro OPTION
5.2
Interrupcin del Timer0.
5.3
WatchDog (WDT)
5.4
Puertos de I/O
5.4.1
PORTA y Registros TRISA
5.4.2
PUERTO B Y REGISTROS TRISB
5.5
Palabra de configuracin
5.6
Memoria EEPROM de datos
5.7
Quinto programa
6.1
Causas de interrupcin
6.1.1
El registro de control de interrupciones INTCON
6.1.2
Interrupcin externa INT
6.1.3
Interrupcin del TMR0
6.1.4
Interrupcin del Puerto B
6.1.5
Interrupcin en la EEPROM de datos
6.2
Reset
6.3
Modo de bajo consumo
6.4
Sexto programa
SET DE INSTRUCCIONES
7.1
RISC
7.2
Tipos de formato
7.2.1
Manejo de registro de tamao byte
7.2.2
Manejo de bits
7.2.3
Manejo de valor inmediato
7.2.5
Salto condicional
7.3
Instrucciones especiales y de control
7.4
Sptimo programa
7.5
PROGRAMADOR
CAPTULO 1
1
MICROCONTROLADORES PROGRAMABLES
1.1
QU ES UN MICROCONTROLADOR?
1.2
ARQUITECTURA INTERNA
1.
Procesador
2.
Memoria no voltil para contener el programa
3.
Memoria de lectura y escritura para guardar los datos
4.
Lneas de I/O para los controladores de los
perifricos
a a) Comunicacin paralelo
b b) Comunicacin serie
5.
Recursos auxiliares
a a) Circuito de reloj
b b) Temporizadores
c c) Watchdog
d d) Convertidores A/D y D/A
e e) Comparadores analgicos
f f) Proteccin para fallos de alimentacin
g g) Estado de bajo consumo
1.2.1
EL PROCESADOR
1.2.2
MEMORIA DE PROGRAMA
Existen diferentes
microcontroladores:
- - ROM
- - EPROM
- EEPROM
FLASH
tipos
de
memoria
que
utilizan
los
OTP
1.2.3
ASIGNACION DE PINES
Figura 1.1
1.2.4
RECURSOS AUXILIARES
a)
b)
c)
d)
e)
f)
g)
con
los
que
cuenta
Circuito de reloj
Temporizadores
Watch Dog
Convertidores A/D y D/A
Comparadores analgicos
Sistema de proteccin ante fallas de alimentacin
Sistemas de bajo consumo de energa
1.3
Objetivo
PRIMER PROGRAMA
un
FIGURA A
PROGRAMA 1
***************************************************************************
;*Programa: luces.asm
;*Descripcion: Manda datos al puerto a y b como un contador binario, ;
;*despus inicia otra secuencia de luces*
;***************************************************************************
;********************************IGUALDADES*********************************
STATUS
estado
PORTB
TRISB
CONTADOR1
CONTADOR2
DATO
CICLO1
CICLO2
w
f
EQU 3
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
6
6
0Ch
0Dh
0Eh
0Fh
10h
0
1
;*************************PROGRAMA PRINCIPAL********************************
ORG 00h
;Inicio del ensamblado desde
00
GOTOINICIO
;Salto a la primera instruccin
ORG 05h
;Ensamblar de la localidad 05h
INICIO
BSF STATUS,5
;Selecciona la pagina 1 de
datos
CLRF TRISB
;Programa PORTB como
salida
CLRF TRISA
;Programa porta como salida
BCF STATUS,5
;Selecciona la pagina 0 de
datos
;**************************INICIO LUCES 1 ******************************************
INICIO2
MOVLW
01
;Veces que se repite luces1
MOVWF
CICLO1
;Carga las veces a ciclo1
CLRF
DATO
;El registro dato se pone en
ceros
OTRO
MOVF
DATO,w
;Carga dato en w
MOVWF
PORTB
;Manda de w a PORTB
MOVWF
PORTA
;Manda de w a PORTA
MOVLW
0B0h
;Carga w con B0 para el
retardo
CALL
RETARDO
;Llama a un retardo
INCFSZ
DATO,f
;Incrementa en uno a dato
GOTO
OTRO
;Incrementa al puerto en uno
DECFSZ
CICLO1,f
;Termino todo el sentido?
GOTO
OTRO
;No, continua
CAPITULO 2
2
2.1
2.2
SEGUNDO PROGRAMA
Objetivo
Manejar todo el conjunto de instrucciones, disear el hardware y
software para controlar un display de 7 segmentos desde un Dip
Switch.
Desarrollo
Se conecta al las entradas menos significativas del Puerto A el Dip
Switch por donde se introducir un numero binario comprendido del
0000 al 1111.
A las entradas del Puerto B se conectan los 7 segmentos de un
display de ctodo comn. Ver Figura B
FIGURA B
PROGRAMA 2
;***************************************************************************
;*Programa: Decoder.asm
;*Descripcion: Decodificador BCD a 7 segmentos
:***************************************************************************
;*******************************ETIQUETAS***********************************
STATUS
EQU 3
PORTA
EQU 5
PORTB
EQU 6
TRISB
EQU 6
TRISA
EQU 5
CONTADOR1
EQU 0Ch
CONTADOR2
EQU 0Dh
DATO
EQU 0Eh
CICLO1
EQU 0Fh
CICLO2
EQU 10h
DELAY
EQU 0XFF
w
EQU 0
f
EQU 1
;*************************PROGRAMA PRINCIPAL********************************
ORG
00h
ORG
05h
BSF
STATUS,5
CLRF
TRISB
MOVLW
0X0F
MOVWF
TRISA
BCF
STATUS,5
GOTO
INICIO
INICIO
MOVF
PORTA,w
MOVWF
DATO
GOTO
CODIF
;*************************VERIFICA DIP SWITCH*********************************
CODIF
MOVLW
0X00
;Mueve 00 a W
SUBWF
DATO,W
;Resta el valor de dato a w
BTFSC
STATUS,2 ;Verifica el resultado
GOTO
CERO
;Si son iguales manda a cero
MOVLW
0X01
;Mueve 01 a W
SUBWF
DATO,W
;Resta el valor de dato a w
BTFSC
STATUS,2 ;Verifica el resultado
GOTO
UNO
;Si son iguales manda a uno
MOVLW
0X02
;Mueve 02 a W
SUBWF
DATO,W
BTFSC
STATUS,2
GOTODOS
MOVLW
0X03
;Mueve 03 a W
SUBWF
DATO,W
BTFSC
STATUS,2
GOTO
TRES
MOVLW
0X04
;Mueve 04 a W
SUBWF
DATO,W
BTFSC
STATUS,2
GOTO
CUATRO
MOVLW
0X05
;Mueve 05 a W
SUBWF
DATO,W
BTFSC
STATUS,2
GOTO
CINCO
MOVLW
0X06
;Mueve 06 a W
SUBWF
DATO,W
BTFSC
STATUS,2
GOTO
SEIS
MOVLW
0X07
;Mueve 07 a W
SUBWF
DATO,W
BTFSC
STATUS,2
GOTO
SIETE
MOVLW
0X08
;Mueve 08 a W
SUBWF
DATO,W
BTFSC
STATUS,2
GOTO
OCHO
MOVLW
0X09
;Mueve 09 a W
SUBWF
DATO,W
BTFSC
STATUS,2
GOTO
NUEVE
GOTO
INICIO
;**************** BCD --- 7 SEGMENTOS **************************
CERO
MOVLW
0X3F
;Mueve valor 0 en 7 segment a
W
MOVWF
PORTB
;Mueve el valor de w al puerto
B
MOVLW
DELAY
;Mueve a w el valor del retardo
CALL
RETARDO ;Llama la subrutina de retardo
GOTO
INICIO
;Regresa a inicio
UNO
MOVLW
0X06
;Mueve valor 1 en 7 segment a
W
MOVWF
PORTB
MOVLW
DELAY
CALL
RETARDO
GOTO
INICIO
DOS
MOVLW
0X5B
;Mueve valor 2 en 7 segment a
W
MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
TRES
MOVLW
0X4F
;Mueve valor 3 en 7 segment a
W
MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
CUATRO
W
CINCO
W
SEIS
W
SIETE
W
OCHO
W
NUEVE
W
MOVLW
0X66
MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
MOVLW
0X6D
MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
MOVLW
0X7D
MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
MOVLW
0X07
MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
MOVLW
0X7F
MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
MOVLW
0X67
MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
;******************************SUBRUTINA DE RETARDO
******************************
RETARDO
MOVWF
CONTADOR1
LOOP2
MOVWF
CONTADOR2
LOOP1
DECFSZ
CONTADOR2,f
GOTOLOOP1
DECFSZ
CONTADOR1,f
GOTOLOOP2
RETURN
END
CAPITULO 3
EL MICROCONTROLADOR PIC16F84
3.1
Caractersticas principales
3.2
Descripcin de pines
3.3
Frecuencia de funcionamiento
Oscilador tipo RC
ste es un oscilador de bajo costo, formado por una
resistencia y un capacitor. ste no tiene una frecuencia muy estable
y su valor depende de los valores de los elementos de la red RC
(Figura 3.4)
3.4
Reset
3.5
Tercer programa
Objetivo
Conocer el comportamiento del TMR0, manejarlo y controlar 8
frecuencias diferentes. Visualizando la frecuencia por medio de un
diodo led.
Desarrollo
Realizar por medio de subrutinas diferentes tiempos, guardando el
contador del programa en la pila. Ver Figura C
La formula que indica el tiempo es:
FIGURA CPROGRAMA 3
;********************************************************************************
;*Programa: tiempo.asm
;*Descripcion: Generador de 8 frecuencias
;********************************************************************************
;*******************************ETIQUETAS***********************************
STATUS
EQU 3
TMR_OPT
EQU 1
INTCON
EQU 0Bh
PORTA
EQU 5
PORTB
EQU 6
TRISB
EQU 6
TRISA
EQU 5
SEG
EQU 0Ch
VAR
EQU 0Dh
DATO
EQU 0Eh
CICLO1
EQU 0Fh
CICLO2
EQU 10h
w
EQU 0
f
EQU 1
;*************************PROGRAMA PRINCIPAL***********************
ORG
00h
ORG
05h
BSF
STATUS,5
MOVLW
0X1F
MOVWF
TRISA
CLRF
TRISB
MOVLW
0XD7
MOVWF
TMR_OPT
BCF
STATUS,5
CLRF
PORTB
GOTO
INICIO
:************************** INICIO DEL PROGRAMA ****************************
INICIO
MOVF
PORTA,w ;Mueve el valor del puerto A en w
MOVWF
DATO
;Guarda el valor de w en dato
MOVLW
0X00
SUBWF
DATO,W
;Compara si el dip switch es igual a 0
BTFSC
STATUS,2 ;Si no es igual salta la instruccin
CALL
SEG1
;Si es igual llama a subrutina seg1
MOVLW
0X01
SUBWF
DATO,W
;Compara si el dip switch es igual a 1
BTFSC
STATUS,2
CALL
SEG2
MOVLW
0X02
SUBWF
DATO,W
;Compara si el dip switch es igual a 2
BTFSC
STATUS,2
CALL
SEG3
MOVLW
0X03
SUBWF
DATO,W
;Compara si el dip switch es igual a 3
BTFSC
STATUS,2
CALL
SEG4
MOVLW
0X04
SUBWF
DATO,W
BTFSC
STATUS,2 ;Compara si el dip switch es igual a 4
CALL
SEG5
MOVLW
0X05
SUBWF
DATO,W
BTFSC
STATUS,2 ;Compara si el dip switch es igual a 5
CALL
SEG6
MOVLW
0X06
SUBWF
DATO,W
BTFSC
STATUS,2 ;Compara si el dip switch es igual a 6
CALL
SEG7
MOVLW
0X07
SUBWF
DATO,W
BTFSC
STATUS,2 ;Compara si el dip switch es igual a 7
CALL
SEG8
;************************PARPADEO*********************************************
BSF
PORTB,0
;Fija a 1 el bit 0 del puerto B
CLRF
SEG
;Limpia la variable SEG
CALL
RETARDO ;Llama a subrutina de retardo
CLRF
SEG
BCF
PORTB,0
;Fija a 0 el bit 0 del puerto B
CALL
RETARDO
GOTO
INICIO
;Manda llamar a inicio
;***********************FRECUENCIAS*******************************************
SEG1
MOVLW
0X01
MOVWF
VAR
;Fija en var el retardo para la frec 1
RETURN
SEG2
MOVLW
0X02
MOVWF
VAR
;Fija en var el retardo para la frec 2
RETURN
SEG3
MOVLW
0X04
MOVWF
VAR
;Fija en var el retardo para la frec 3
RETURN
SEG4
MOVLW
0X08
MOVWF
VAR
;Fija en var el retardo para la frec 4
RETURN
SEG5
MOVLW
0X0F
MOVWF
VAR
;Fija en var el retardo para la frec 5
RETURN
SEG6
MOVLW
0X10
MOVWF
VAR
;Fija en var el retardo para la frec 6
RETURN
SEG7
SEG8
MOVLW
MOVWF
RETURN
MOVLW
MOVWF
0X20
VAR
0X40
VAR
RETURN
;*****************************RUTINA DE RETARDO***********************
RETARDO CLRF
TMR_OPT
INC
BTFSS
INTCON,2
GOTO
INC
BCF
INTCON,2
INCF
SEG
MOVF
VAR,w
SUBWF
SEG,w
BTFSS
STATUS,2
GOTO
RETARDO
RETURN
END
CAPTULO 4
4
4.1
PROCESADOR INTERNO
Arquitectura Interna
4.2
Memoria de programa
4.3
Direccionamiento Directo
El operando que utiliza la instruccin en curso se referencia
mediante su direccin, que viene incluida en el cdigo de operacin
de la misma en los 7 bits menos significativos. El banco a acceder
lo determinan los bits RP0 y RP1 del registro de estado. (Figura
4.5)
Direccionamiento Indirecto
Este modo de direccionamiento se usa cuando en una
instruccin se utiliza como operando el registro INDF, que ocupa la
direccin 0 de ambos bancos. El registro INDF no est
implementado fsicamente y cuando se le hace referencia, se
accede la direccin de un banco especificada, con los 7 bits menos
significativos del registro FSR. El bit MSB de FSR junto al bit IRP
del registro de estado se encarga de seleccionar el banco a
acceder, mientras que los 7 bits menos significativos apuntan a la
posicin. En este modo de direccionamiento el bit IRP = 0 siempre.
4.4
El Registro de Estado
bit 7-6
bit 5
bit 4
bit 3
bit 2
0
bit 1
bit 0
4.5
Cuarto Programa
Objetivo
Realizar una pantalla de matriz de 8x16 y desplegar diferentes
mensajes
Desarrollo
Realizar un programa que mediante la ayuda de multiplexores,
genere un barrido en las 16 columnas de la pantalla y en sincrona
con el puerto B mandar los datos a desplegar. El barrido se har a
una velocidad en la que el ojo humano perciba que estn
iluminadas todas las columnas. Ver figura D
FIGURA DPROGRAMA 4
;*****************************************************************************
;*Programa: Display 16 x 8
;:Autor: Carlos Alberto Lpez Gonzlez
;*Descripcion: Controlar por medio del puerto a y b una pantalla de 16 x 8
;*****************************************************************************
;*******************************ETIQUETAS*************************************
STATUS
EQU
3
PORTA
EQU
5
PORTB
EQU
6
TRISB
EQU
6
TRISA
EQU
5
COLUMNA
EQU
0Ch
TABLA
EQU
0Dh
CONTADOR1
EQU
0Eh
CONTADOR2
EQU
0Fh
CICLO
EQU
10h
DELAY
EQU
0XFF
ENABLE
EQU
0X08
PCL
EQU
02h
w
EQU
0
f
EQU
1
;*************************PROGRAMA PRINCIPAL********************************
ORG
00h
ORG
05h
BSF
STATUS,5
CLRF
TRISB
MOVLW
0X10
MOVWF
TRISA
BCF
STATUS,5
MOVLW
0X00
MOVWF
COLUMNA
GOTO
INICIO
INICIO
GOTO
BARRIDO
;******************************CONTROLA PANTALLA 1****************************
BARRIDO
BTFSC
PORTA,4
;Verifica push
GOTO
BARRIDO1
;Va a pantalla 2
MOVF
COLUMNA,w
;Mueve valor de colum a
W
MOVWF
PORTA
;Mueve valor de W al
Port A
INCF
COLUMNA,w
;Incrementa columna
MOVWF
COLUMNA
CALL
DATO
;Rutina de dato a
desplegar
MOVWF
TABLA
;Guarda dato en la
variable
MOVLW
0X0F
;Carga w con el retardo
CALL
RETARDO
;Llama retardo
MOVF
TABLA,w
MOVWF
PORTB
;Despliega dato al
W
puerto B
MOVLW
0X10
;Carga w con 10
SUBWF
COLUMNA,w
;Posicin de columna
BTFSC
STATUS,2
CALL
RESET
;Ultima regresa al origen
GOTO
BARRIDO
;Regresa a barrido
;*******************************CONTROLA PANTALLA 2****************************
BARRIDO1
BTFSC
PORTA,4
GOTO
BARRIDO2
MOVF
COLUMNA,w
MOVWF
PORTA
INCF
COLUMNA,w
MOVWF
COLUMNA
CALL
DATO1
MOVWF
TABLA
MOVLW
0X0F
CALL
RETARDO
MOVF
TABLA,w
MOVWF
PORTB
MOVLW
0X10
SUBWF
COLUMNA,w
BTFSC
STATUS,2
CALL
RESET
GOTO
BARRIDO1
;*******************************CONTROLA PANTALLA 3
***************************** BARRIDO2
BTFSC
PORTA,4
GOTO
BARRIDO3
MOVF
COLUMNA,w
MOVWF
PORTA
INCF
COLUMNA,w
MOVWF
COLUMNA
CALL
DATO2
MOVWF
TABLA
MOVLW
0X0F
CALL
RETARDO
MOVF
TABLA,w
MOVWF
PORTB
MOVLW
0X10
SUBWF
COLUMNA,w
BTFSC
STATUS,2
CALL
RESET
GOTO
BARRIDO2
RESET
MOVLW
0X00
;Carga w con 00
MOVWF
COLUMNA
;Descarga w en
columna
RETURN
ADDWF
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
PCL
0X00
0X00
0XFF
0X91
0X91
0X91
0XFF
0X00
0X00
0X10
0X18
0X14
0X12
0XFF
0X00
0x00
0X00
ENDCAPTULO
5.1
RECURSOS FUNDAMENTALES
Temporizador/Contador TMR0
5.1.1
El registro OPTION
bit 7
bit 7
bit 6
bit 5
TMR0
1 = Interrupcin habilitada
0 = Interrupcin deshabilitada
INTE: Habilitacin de interrupcin externa RB0/INT
1 = Interrupcin habilitada
0 = Interrupcin deshabilitada
RBIE: Habilitacin de interrupcin de cambio de puerto
bit 4
bit 3
RB
1= Interrupcin habilitada
0 = Interrupcin deshabilitada
T0IF: Bit bandera de interrupcin de desbordamiento
1 = El registro TMR0 se desbord
0 = El registro TMR0 no se ha desbordado
INTF: Bit bandera de interrupcin externa RB0/INT
1 = Ocurri una interrupcin externa
0 = Ningn pin del RB7:RB4 ha cambiado de estado
bit 2
bit1
5.3
WatchDog (WDT)
5.4
Puertos de I/O
5.4.1
Bit
bit0
bit1
bit2
bit3
bit4
Tipo de Buffer
TTL
TTL
TTL
TTL
ST
Funcin
Entrada/Salida
Entrada/Salida
Entrada/Salida
Entrada/Salida
Entrada/Salida o entrada de reloj
externo para TMR0
Nombre
PORTA
TRISA
Bit 7
-----
5.4.2
Bit 6
-----
Bit 5 Bit 4
Bit 3
Bit2
--RA4/TOCKI RA3
RA2
--TRISA4
TRISA3 TRISA2
Bit 1
Bit 0
RA1
RA0
TRISA1 TRISA0
Funciones Puerto B
Nombre
RB0/INT
Bit
bit 0
Tipo de Buffer
TTL/ST
RB1
RB2
RB3
RB4
bit 1
bit 2
bit 3
bit 4
TTL
TTL
TTL
TTL
RB5
bit 5
TTL
RB6
bit 6
TTL/ST
RB7
bit 7
TTL/ST
RB8
bit 8
TTL/ST
Funcin
Pin Entrada/salida o
interrupcin externa
Pin Entrada/salida
Pin Entrada/salida
Pin Entrada/salida
Pin Entrada/salida con
en cambio
Pin Entrada/salida con
en cambio
Pin Entrada/salida con
en cambio
Pin Entrada/salida con
en cambio
Pin Entrada/salida con
en cambio
entrada de
interrupcin
interrupcin
interrupcin
interrupcin
interrupcin
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
06h
PORTB RB7
86h
TRISB
81h
OPTIO
N
INTCO
N
0Bh,8Bh
5.5
RB0/IN
T
TRISB TRISB TRISB TRISB TRISB TRISB TRISB TRISB0
7
6
5
4
3
2
1
RBPU
GIE
RB6
RB5
RB4
TOIE
RB3
RB2
RB1
TOIF
Palabra de configuracin
5.6
EEDATA
EEADR
EECON1
EECON2
No implementados
EEIF: Bandera de interrupcin de operacin de escritura
1 = Operacin de escritura completa
0 = Operacin de escritura no se ha completado
WRERR: Bandera de error en escritura
1= Operacin de escritura termin antes de tiempo
0= Operacin de escritura completa
WREN: Bit de habilitacin de escritura
1= Permite la escritura de la EEPROM
bit 1
bit 0
STATUS,RP0
CONFIG_ADDR
EEADR
STATUS, RP0
EECON1, RD
STATUS, RP0
EEDATA, W
; Banco 0
; Direccin a leer
; Banco 1
; Lectura
; Banco 0
; W = EEDATA
5.7
Objetivo
STATUS,RP0
INTCON, GIE
EECON1, WREN
55h
EECON2
Aah
EECON2
EECON1, WR
INTCON, GIE
Quinto programa
; Banco 1
;Deshabilita INTs
; Habilita escritura
; Escribe 55h
; Escribe Aah
; Comienza escritura
; Habilita INTs.
FIGURA E
PROGRAMA 5
;**************************************************************************
;*Programa: Contador.asm
;Descripcion: Contador de 4 digitos.
;***************************************************************************
;********************************ETIQUETAS***********************************
indo
equ
00h
;registro de indireccion
pc
equ
02h
;contador de programa
status
fsr
ptoa
ptob
rota
display
trisa
trisb
dig1
dig2
dig3
dig4
loops
loops2
z
ram
memoria
c
w
reset
equ
equ
equ
equ
equ
03h
04h
05h
06h
0fh
;registro de estado
;registro de seleccion
;puerto a
;puerto b
;variable para desplazamiento de
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
85h
86h
10h
11h
12h
13h
1dh
1eh
02h
05h
;configuracion puerto a
;configuracion puerto b
;acumulador miles
;acumulador centenas
;acumulador decenas
;acumulador unidades
;variables usadas en retardos
;Bandera de cero
;bit de seleccion de pagina de
equ
00h
;bandera de acarreo
equ
00h
;bit de destino a variable de trabajo
org
00
goto
inicio
org
05h
;*******************************PROGRAMA PRINCIPAL****************************
inicio
bsf
status, ram ;selecciona el banco de memoria alto
movlw
10h
;configura el puerto a
movwf
trisa
;bit 4 entrada, demas bits salidas.
movlw
00h
;configura el puerto b
movwf
trisb
;como salidas
bcf
status, ram ;selecciona el banco de memoria
bajo
clrf
dig1
;inicializa acumuladores
clrf
dig2
clrf
dig3
clrf
dig4
movlw
00
movwf
ptoa
;todos los displays a 0
empe
btfss
ptoa, 4
;checa el push y salta si es 0
call
subir
;llama la rutina de incremento
movlw
08h
;iniciar un 1 en el registro de rotacion
movwf
rota
movlw
dig1
;con el registro selector (fsr) se
apunta
movwf
fsr
;al primer dato que se va a mostrar
disp
movlw
00h
;colocar en cero el dato del display
movwf
ptob
;para apagarlos
movf
rota, w
;pasa rotacion del 1 a la variable
work
movwf
ptoa
;enciende el transistor (display)
movf
indo, w
;lee dato del registro apuntado por
fsr
call
tabla
;genera el digito de 7 segmentos
movwf
ptob
;envia el digito al puerto b
movlw
03h
call
retardo
btfsc
rota, 0
;Checa si termino barrido
goto
empe
;si termino, vuelve desde el
comienzo
bcf
status, c
;carry en cero
rrf
rota
;desplaza barrido
incf
fsr
;incrementa el puntero.
goto
disp
;digito a mostrar
;*******************************RETARDO**************************************
retardo
movwf
loops
top2
movlw
d'110'
movwf
loops2
top
nop
decfsz
loops2
goto
top
decfsz
loops
goto
top2
retlw 0
;******************************RUTINA DE INCREMENTO X 1000
*******************
s1000
clrf
dig2
;pone a cero las centenas
incf
dig1
;incrementa el contador de miles
movf
dig1, w
;carga en w el conteo de los miles
xorlw
0ah
;si numero a, entonces quedara en
cero
btfsc
status, z ;si es cero, z queda en alto
clrf
dig1
;inicializa los miles
return
;*************************RUTINA DE INCREMENTO X 100 *************************
s100
clrf
dig3
;pone a cero las decenas
incf
dig2
;incrementa el contador de centenas
movf
dig2, w
;carga en w el conteo de las centenas
xorlw
0ah
;si w era 10, entonces quedara en
cero
btfsc
status, z ;si es cero, z queda alto
call
s1000
;incrementa los miles
return
xorlw
0ah
cero
btfsc
status, z ;si es cero, el flag z queda alto
call
s100
;incrementa las centenas
return
;***************************RUTINA DE INCREMENTO X 1
*****************************
subir
incf
dig4
;incrementa el contador de unidades
movf
dig4, w
;carga en w el conteo de las unidades
xorlw
0ah
;si w era 10, entonces quedara en
cero
btfsc
status, z ;si es cero, el flag z queda alto
call
s10
;incrementa las decenas
movlw
d'250'
call
retardo
return
;***************************GENERA LOS NUMEROS SOBRE EL
DISPLAY**********
tabla
addwf
pc
;agrega al cont. programa el valor de
w
retlw
3Fh
;genera el 0
retlw
18h
;genera el 1
retlw
76h
;genera el 2
retlw
7Ch
;genera el 3
retlw
59h
;genera el 4
retlw
6Dh
;genera el 5
retlw
6Fh
;genera el 6
retlw
38h
;genera el 7
retlw
7Fh
;genera el 8
retlw
7Dh
;genera el 9
end
CAPTULO 6
6
6.1
Causas de interrupcin
GIE
bit 7
bit 0
EEIE
TOIE
INTE
RBIE
TOIF
INTF
RBIF
bit 6
EEPROM
bit 5
bit 4
bit 3
en
bit 2
bit 1
bit 0
RB7:RB4
1= Habilita interrupcin
0= Deshabilita interrupcin
TOIF: Bandera de sobreflujo del TMR0
1= Sobreflujo en el TMR0
0= TMR0 no se ha tenido sobreflujo
INTF: Bandera de activacin del pin RB0/INT
1= Se activ RB0/INT
0= No se ha activado RB0/INT
RBIF: Bandera de cambio de estado en los pines
RB7:RB4
1= Cuando cambia de estado alguno de los 4 pines
0= No ha cambiado el estado
6.1.2
6.1.3
6.1.4
6.1.5
6.2
Reset
6.3
6.4
Sexto programa
Objetivo
Elaborar un control de velocidad y giro de un motor a pasos. Utilizar
el TMR0 para controlar la frecuencia de giro del motor.
Desarrollo
Conectar el motor a pasos en el puerto b y utilizar las instrucciones
RLF(Rotar a izquierda) y RRF(Rotar a derecha) para controlar el
giro. Conectar al Puerto A las entradas de direccin de giro e
incremento y decremento de velocidad. Mediante subrutinas de
incremento variable controlaremos la frecuencia de barrido en las
bobinas del motor a pasos. Ver Figura F
FIGURA FPROGRAMA 6
;**************************************************************************
;*Programa: pasos.asm
;*Descripcin: Control de Motor a pasos
;***************************************************************************
;*******************************ETIQUETAS***********************************
STATUS
EQU
3
TMR_OPT
EQU
1
INTCON
EQU
0Bh
PORTA
EQU
5
PORTB
EQU
6
TRISB
EQU
6
TRISA
EQU
5
SEG
EQU
0Ch
VAR
EQU
0Dh
;Variable de frecuencia
REG
EQU
0Eh
;Registro derecha
REG_IZQ
EQU
0Fh
;Registro Izquierda
MIN
EQU
10h
MAX
EQU
11h
w
EQU
0
f
EQU
1
ORG
ORG
BSF
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
BCF
CLRF
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
CLRF
GOTO
00h
05h
STATUS,5
0X07
TRISA
0XF0
TRISB
0XD7
TMR_OPT
STATUS,5
PORTB
0X08
REG
0X10
VAR
0X01
MIN
0XFF
MAX
SEG
INICIO
;Fija prescalador
;Determina velocidad
;Velocidad mxima
;Velocidad mnima
;*************************PROGRAMA PRINCIPAL********************************
INICIO
BTFSC
PORTA,2
;Verifica entrada pta2
GOTO
IZQ
;Gira izquierda
GOTO
DER
;Gira derecha
;*****************************RESET BARRIDO A LA
IZQUIERDA*******************
CAMBIO_IZQ
MOVLW
0X01
MOVWF
REG
RETURN
;**************************** INCREMENTA VELOCIDAD***************************
INCRE
MOVF
VAR,W
;Mueve velocidad a w
MOVWF
VAR
MOVF
VAR,w
SUBWF
MIN,w
;Compara si es vel max
BTFSS
STATUS,2
DECF
VAR
;Si no es max
decrementa
RETURN
;***************************** DECREMENTA
VELOCIDAD*****************************
DECRE
MOVF
VAR,W
;Mueve velocidad a w
MOVWF
VAR
MOVF
VAR,w
SUBWF
MAX,w
;Compara si es vel min
BTFSS
STATUS,2
INCF
VAR
;Si no es min
incrementa
RETURN
;*****************************RUTINA DE RETARDO***********************
RETARDO
CLRF
TMR_OPT
;Limpia el TMR0
INC
BTFSS
INTCON,2
;Verifica
desbordamiento
GOTO
INC
BCF
INTCON,2
;Limpia bandera TOIF
INCF
SEG
;Incrementa variable seg
MOVF
VAR,w
;Mueve el valor de var a
w
SUBWF
SEG,w
;Compara si es la
velocidad
BTFSS
STATUS,2
;Si es regresa a rutina
GOTO
RETARDO
RETURN
END
7.1
CAPTULO 7
SET DE INSTRUCCIONES
RISC
7.2
Tipos de formato
7.2.1
emnicos,
erandos
Descripcin
DWF f,d
DWF f,d
RF
f
RW
OMF f,d
CF
f,d
CFSZ f,d
CF
f,d
CFSZ f,d
RWF f,d
OVF f,d
OVWF f,d
OP
F
f,d
RF
f,d
BWF f,d
WAPF f,d
ORWF f,d
Suma W y f
Multiplica W con F
Borra f
Borra W
Complementa f (inv)
Decrementa f
Decrementa f salta si 0
Incrementa f
Incrementa f salta si 0
OR entre W y F
Mueve f
Mueve w a f
No opera
Rota f a la izquierda
Rota f a la derecha
Resta W a f
Intercambia nibbles
XOR de W con f
7.2.2
Ciclos
1
1
1
1
1
1
1(2)
1
1(2)
1
1
1
1
1
1
1
1
14-Bit Opcode
Sealizadores
MSb
00 0111
00 0101
00 0001
00 0001
00 1001
00 0011
00 1011
00 1010
00 1111
00 0100
00 1000
00 0000
00 0000
00 1101
00 1100
00 0010
00 1111
00 0110
LSb
dfff ffff
dfff ffff
1fff ffff
0xxx xxxx
dfff ffff
dfff ffff
dfff ffff
dfff ffff
dfff ffff
dfff ffff
dfff ffff
dfff ffff
0xx0 ffff
dfff ffff
dfff ffff
dfff ffff
dfff ffff
dfff ffff
C,DC,Z
Z
Z
Z
Z
Z
Z
Z
Z
C
C
C,DC,Z
Z
Manejo de bits
14-Bit Opcode
emnicos,
erandos
F
F
FSC
FSS
Descripcin
MSb
b,f
b,f
b,f
b,f
Limpia el bit f
Fija a 1 el bit f
Checa bit de f y brinca si es 0
Checa bit de f y brinca si es 1
7.2.3
1
1
1(2)
1
01
01
01
01
00bb
01bb
10bb
11bb
LSb
bfff
bfff
bfff
bfff
7.2.4
Operaciones incondicionales de control de
flujo de programa
7.2.5
Salto condicional
ffff
ffff
ffff
ffff
7.1
SIMBOLO
0xhh
F
D
K
X
()
<>
[]
Nomenclatura y smbolos
SIGNIFICADO
Se usa para referenciar 2 nmeros en hexadecimal hh
Representa la direccin de la memoria RAM de datos
Bit que indica el registro destino. Si d = 0 es W si d = 1
es f
Campo que contiene un valor inmediato. Operando (8
bits) o direccin para el PC (11 bits)
Valor indeterminado de un bit puede ser 1 o 0
Contenido
Campo de un bit de un registro
En el conjunto de Ejemplo: d [0,1].
Opciones
7.3
mnicos,
randos
DLW
DLW
L
RWDT
TO
LW
VLW
TFIE
TLW
TURN
EP
BLW
RLW
k
k|
k
k
k
k
k
k
k
k
k
Descripcin
Ciclos
1
1
2
1
2
1
1
2
2
2
1
1
1
14-Bit Opcode
MSb
11 111b
11 1001
11 0kkk
11 0000
10 1kkk
11 1000
11 00xx
00 0000
11 01xx
00 0000
00 0000
11 110x
11 1010
kkkk
kkkk
kkkk
kkkk
kkkk
kkkk
kkkk
0000
kkkk
0000
0110
kkkk
kkkk
LSb
kkkk
kkkk
kkkk
0100
kkkk
kkkk
kkkk
1001
kkkk
1000
0011
kkkk
kkkk
7.4
Sptimo programa
Objetivo
Controlar un modulo LCD para visualizar las teclas que se vayan
pulsando en un teclado de matriz de 4 x 4.
Desarrollo
Conectar las 8 terminales del teclado, cuatro para las filas y cuatro
para las columnas al puerto B (Ver Figura G). Hacer mediante
software un barrido en las filas de un nivel bajo lgico. Si existe
alguna tecla pulsada en la fila a la que se le introdujo el nivel bajo,
dicho nivel saldara por la columna correspondiente a la que haga
contacto. Al momento de leer las columnas (RB0-RB3) sabremos
que tecla a sido pulsada.
Inicializar la pantalla de LCD y desplegar la tecla que se haya
pulsado. (Ver LCD16x2.Pdf)
FIGURA G
PROGRAMA 7
;***************************************************************************
;*Programa: LCD.asm
;*Descripcion: Control de Pantalla de LCD
;***************************************************************************
;************************
ETIQUETAS **********************
pcl
equ
02h
;Contador del programa
resul
equ
0ch
tempo1
equ
0dh
temp1
equ
11h
temp2
equ
10h
delay1
equ
12h
delay2
equ
13h
barrido
equ
14h
columna
equ
15h
tecla_temp equ
16h
fin_reng
equ
17h
enter
equ
18h
resul_1
equ
19h
offset
equ
0eh
opcion
equ
81h
porta
equ
05h
;puerto a
portb
equ
06h
;puerto b
trisa
equ
85h
;configuracion puerto a
trisb
equ
86h
;configuracion puerto b
lcd_var
equ
0fh
status
equ
03h
;registro de estado
ram
equ
05h
;bit de seleccion de pagina de
memoria
w
equ
00h
;bit de destino a variable W
f
equ
01h
;bit de destino a variable F
z
equ
2
;zero
;***********************
PROGRAMA PRINCIPAL *********************
org
00h
goto
inicio
org
05h
inicio
call
up_lcd
bsf
status,ram
movlw
87h
movwf
opcion
bcf
status,ram
call
lcd_ini
;*************************
inicio_1
call
INICIALIZA LCD
borra_home
***********
call
bsf
movlw
call
clrf
call
clrf
clrf
teclado
call
movlw
xorwf
btfsc
goto
call
call
call
goto
;************************
lectura
bsf
movlw
movwf
bcf
bcf
movlw
movwf
movlw
movwf
lectura1
movf
movwf
movf
movwf
subwf
btfss
goto
bsf
rrf
decfsz
goto
goto
display_on_cur_off
porta,2
;ENABLE
80h
lcd_reg
offset
mens
enter
fin_reng
lectura
0x00
enter,w
status,z
borra_mensaje
convierte
ascii
despliega
teclado
L E C T U R A *******************************************
status,ram ;Entra a modo configuracion
0x0f
;PB0-PB3 Entradas
trisb
;PB4-PB7 Salidas
opcion,7
;Habilita Pull-Up en puerto B
status,ram ;Sale de modo configuracion
4
columna
;Numero de columnas a explorar
0x7f
;01111111
barrido
;Valor de barrido en renglon
barrido,w
portb
portb,w
tecla_temp ;primer valor de lectura de tecla
barrido,w
status,z
;verifica si esta presionada una tecla
lectura2
status,0
;pone carry
barrido,f
;Rota el barrido de la columna
columna,f ;Fin de barrido??
lectura1
;No ha terminado barrido
teclado
;Regresa a iniciar barrido
;************************
*******************
lectura2
movlw
movwf
lectura3
clrf
clrwdt
lectura4
decfsz
goto
decfsz
goto
return
delay2,f
lectura4
delay1,f
lectura3
;*************************
CONVIERTECODIGO DE
TECLADO********************
convierte clrf
columna
convierte1 call
tabla_tecla
;busca codigo de tecla
subwf
tecla_temp,w
;compara
btfsc
status,z
goto
convierte2
;si es igual
incf
columna
;no es igual, incrementa tabla
goto
convierte1
convierte2 movf
columna,w
movwf
barrido
return
tabla_tecla movf
columna,w
addwf
pcl,f
retlw
0xed ;0
retlw
0x7e ;1
retlw
0x7d ;2
retlw
0x7b ;3
retlw
0xbe ;4
retlw
0xbd ;5
retlw
0xbb ;6
retlw
0xde ;7
retlw
0xdd ;8
retlw
0xdb ;9
retlw
0xee ;clear
retlw
0xeb ;help
retlw
0xe7 ;enter
retlw
0xd7 ;2nd
retlw
0xb7 ;dwn
retlw
0x77 ;up
****************************
retlw '5'
retlw '6'
retlw '7'
retlw '8'
retlw '9'
retlw 'A'
retlw 'B'
retlw 'C'
retlw 'D'
retlw 'E'
retlw 'F'
;******************
DESPLIEGA EN PANTALLA
********************************
despliega bsf
status,ram
clrf
trisb
clrf
trisa
bcf
status,ram
incf
fin_reng
call
lcd_dato
movlw
0x20
subwf
fin_reng,w
btfsc
status,z
call
clear_lcd
movlw
0x10
subwf
fin_reng,w
btfsc
status,z
call
second_line
return
;*****************
BORRA MENSAJE PRINCIPAL
******************
borra
incf
enter
bsf
status,ram
clrf
trisb
clrf
trisa
bcf
status,ram
call
lcd_delay
call
lcd_delay
bcf
porta,1
bsf
porta,2
movlw
0x01
call
lcd_reg
goto
teclado
;******************
BORRA TODA LA PANTALLA
*****************
clear_lcd
bcf
porta,1
bsf
porta,2
movlw
0x01
call
lcd_reg
clrf
fin_reng
return
;******************
MENSAJE PRINCIPAL
******************
mens
clrf
resul
mens_1
movf
offset,w
addwf
resul,w
call
datos
iorlw
0
btfsc
status,2
return
call
lcd_dato
incf
resul,f
movlw
0x0A
movwf
tempo1
movlw
0x0E
subwf
resul,w
btfsc
status,2
call
second
goto
mens_1
second
bsf
porta,2
movlw
0xC0
call
lcd_reg
bsf
porta,0
return
borra_h
bsf porta,2
;ENABLE
movlw
01h
call lcd_reg
return
display_on_cur_off
bsf porta,2
;ENABLE
movlw
0Eh
call lcd_reg
return
up_lcd
bsf status,ram
clrf trisb
clrf trisa
bcf status,ram
return
lcd_ini
bcf
call
bsf
call
movlw
call
call
bsf
movlw
call
call
bsf
porta,0
lcd_delay
porta,2
lcd_delay
38h
lcd_reg
lcd_delay
porta,2
38h
lcd_reg
lcd_delay
porta,2
;OFF_COMANDO
;ENABLE
;ENABLE
;ENABLE
movlw
call
call
return
38h
lcd_reg
lcd_delay
;****************
MANDA DATO A LCD **********************************
lcd_dato
bsf
porta,0
;OFF_COMANDO
bsf
porta,2
movwf
portb
call
lcd_delay
call
lcd_e
return
;*****************
MANDA COMANDO A LCD ***********************
lcd_reg
bsf
status,ram
clrf
trisb
clrf
trisa
bcf
status,ram
bcf
porta,0
;OFF_COMANDO
movwf
portb
call
lcd_delay
call
lcd_e
return
lcd_e
bcf
porta,2
;DISABLE
return
;*****************
DATOS A DESPLEGAR EN PANTALLA *************
datos
addwfpcl,1
retlw 'U'
retlw 'N'
retlw 'I'
retlw 'V'
retlw 'E'
retlw 'R'
retlw 'S'
retlw 'I'
retlw 'D'
retlw 'A'
retlw 'D'
retlw ' '
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
'D'
'E'
'L'
'A'
''
'S'
'A'
'L'
'L'
'E'
''
'B'
'A'
'J'
'I'
'O'
0x00
7.5
PROGRAMADOR
***************************