Pic 16F84
Pic 16F84
Pic 16F84
0 - INTRODUCCIÓN.
Listado de instrucciones:
1 – SUBRUTINAS DE RETARDO.
Es decir que para un reloj de 4 MHz, cada instrucción simple tardará 1 useg, y
para las instrucciones de salto tardará 2useg.
1.1 Práctica: Montar el siguiente circuito y grabar el pic con el ejercicio
anterior.
Podemos realizar mas retardos con bucles anidados, es decir uno dentro del otro
para conseguir retardos de milisegundos y de segundos dependiendo del valor que
podamos cargar a los contadores.
Veamos un ejemplo.
;------------------------------------------------------------
;-- Subrutinas retardo mediante bucles
;-- leemos port A y realizamos un menu
;-- con los valores leidos de la siguiente forma:
;-- Si porta=0 retardo 200ms
;-- si porta=1 retardo 1 seg
;-- si porta=2 retardo 5 seg
;-- si porta=3 retardo 10 seg
;------------------------------------------------------------
list p=16f84
contador1 equ h'10' ;Variable contador
contador2 equ h'11'
contador3 equ h'12'
portb equ h'06'
porta equ h'05'
status equ h'03'
pcl equ h'02' ;Contador programa
org 0
;----------------Configuracion ports --------------------
bsf status,5 ;bank1
clrf portb ;portb salidas
movlw b'00011111'
movwf porta ;porta entradas
bcf status,5 ;bank0
;--------------------------------------------------------
;-- Programa principal --
;--------------------------------------------------------
prog movf porta,0
andlw b'00000011' ;Solo 3 ultimos bits
addwf pcl,1
goto prog0 ;Si porta=0 ->prog0
goto prog1 ;Si porta=1 ->prog1
goto prog2 ;Si porta=2 ->prog2
goto prog3 ;Si porta=3 ->prog3
goto prog ;Bucle principal
;------------------- Subprogramas retardos ---------------
prog0 ;-- Subprograma 0 (200ms)
movlw b'00000001' ;enviamos un 1
movwf portb ;al puerto b
movlw d'200' ;cargamos contador1 con 200
call miliseg ;llamamos subrutina milisegundos (tiempo
en on)
clrf portb ;enviamos un 0 al portB
movlw d'200' ;cargamos contador1 con 200
call miliseg ;volvemos a llamar subrutina (tiempo en off)
goto prog
prog1 ;-- Subprograma 1 1 seg
movlw b'00000001'
movwf portb
movlw d'10' ;cargamos contador3 con 10
call segundo ;llamada subrutina segundo (tiempo en on)
clrf portb
movlw d'10' ;cargamos contador3 con 10
call segundo ;llamada subrutina segundo (tiempo en off)
goto prog
prog2 ;-- Subprograma 2 (5 seg)
movlw b'00000001'
movwf portb
movlw d'50'
call segundo
clrf portb
movlw d'50'
call segundo
goto prog
prog3 ;-- Subprograma 3 (10 seg)
movlw b'00000001'
movwf portb
movlw d'100'
call segundo
clrf portb
movlw d'100'
call segundo
goto prog
;------------------- Subrutinas de retardo con bucles anidados --------------
;------------------- Retardo milisegundos con 2 bucles anidados--------------
;----------------------------------------------------------------------------
miliseg ;-- Subrutina Retardo milisegundos
movwf contador2 ;cargamos contador2 con 200
bucle1 movlw d'249' ;y contador 1 con 249
movwf contador1 ;Aprox 200 ms
bucle2 nop ;No Operation (no hace nada,pasa un ciclo de
maquina)
decfsz contador1,1 ;Decrementamos contador 1
goto bucle2 ;Si contador1 distinto 0 repite operacion
decfsz contador2,1 ;Si contador1=0 decrementados contador2
goto bucle1 ;Si contador2 no es cero -> vamos a bucle1
return ;Si contador2=0 finaliza subrutina
;------------------- Retardo en segundos con 3 bucles anidados ----------------
;------------------------------------------------------------------------------
segundo ;-- Subrutina Retardo segundos
movwf contador3 ;cargamos contador3 con valor de
prog1,prog2,prog3
bucle3 movlw d'100' ;y contador 2 con 100
movwf contador2
bucle4 movlw d'249' ;cargamos contador1 con 249
movwf contador1
bucle5 nop ;NOP (un ciclo de maquina 1u segundo)
decfsz contador1,1
goto bucle5
decfsz contador2,1
goto bucle4
decfsz contador3,1
goto bucle3
return
;------------------- Final de subrutinas de retardo -----------------------------
end
1.2 Práctica: Con el circuito del ejercicio 1.1 grabar el pic con el ejercicio anterior
y comprobar su funcionamiento.
2. SALTOS INDEXADOS
EJEMPLO NOTA
EJEMPLO
;----------------------------------------------------
;-- Programa de salts indexats ---
;----------------------------------------------------
;-- El programa tria una eixida depenent ---
;-- de les entrades de la seguent forma ---
;-- utilizan't el registre pcl (contador PRG ---
;-- i la ordre addwf pcl,1 ---
;----------------------------------------------------
;-- La tabla es la seguent: ---
;-- 00 -> prg00 -> Eixida en el display 0 ---
;-- 01 -> prg01 -> Eixida 1 ---
;-- 10 -> prg02 -> Eixida 2 ---
;-- 11 -> prg03 -> Eixida 3 ---
;----------------------------------------------------
list p=16f84
; FIN DE PROGRAMA
;----------------------------------------------------
;-- Programa de salts indexats ---
;----------------------------------------------------
;-- El programa crea una tabla depenent ---
;-- de la entrada A0 de la seguent forma ---
;-- utilizan't el registre pcl (contador PRG ---
;-- i la ordre addwf pcl,1 ---
;----------------------------------------------------
;-- La sequència es: ---
;-- 0 -> prg00 -> Display gira a dretes ---
;-- 1 -> prg01 -> Display gira esquerres ---
;----------------------------------------------------
list p=16f84
2.1 Práctica: Con el circuito del ejercicio 1.1 grabar el pic con el ejercicio anterior
y comprobar su funcionamiento.
2.2 Práctica: Realizar un programa que tenga la siguiente tabla de verdad, grabar
en el microcontrolador y comprobar funcionamiento.
Entradas port A (RA0 RA1 Salidas port B (RB0 RB1 RB2 RB3 RB4 RB5
RA2) RB6 RB7)
000 10101010
001 01010101
010 00001111
011 11110000
100 11001100
101 00110011
110 00011100
111 11100001
2.3 Realiza un programa que tenga una tabla con la siguiente función: RA0 and
RA1 and RA2 or RA3
2.4 Realiza el ejercicio 2.1 pero con instrucciones rlf y rrf
3 Tablas
COMANDO NOTA
DT
Directiva define tabla (equivale a retlw k)
valor,valor,...
Ejemplo:
;----------------------------------------------------------
;-- Se desea implementar la siguiente tabla de verdad
; I2 I1 I0 / O3 O2 O1 O0
; -----------------------
; 0 0 0 0 0 1 0
; 0 0 1 1 1 0 1
; 0 1 0 0 1 1 0
; 0 1 1 0 0 0 1
; 1 0 0 1 1 1 1
; 1 0 1 1 1 0 0
; 1 1 0 0 0 1 1
; 1 1 1 0 0 0 0
; Entradas I2 I1 I0 al puerto A
; Salidas O3 O2 O1 O0 al puerto B
;-- Utilizamos el comando retlw
;----------------------------------------------------------
list p=16f84
org 0
;--------------- Configuración puertos --------------------
bsf h'03',5
clrf h'06'
movlw b'00011111'
movwf h'05'
bcf h'03',5
;---------------- Inicio programa --------------------------
inici movf h'05',0
andlw b'00000111' ;Sólo 3 últimos bits
call tabla ;llamamos subrutina tabla
movwf h'06' ;enviamos w al port B
goto inici ;volvemos a empezar
;------------------ Tabla -----------------------------------
tabla addwf H'02',1 ;Sumamos w y PCL (contador programa)
RETLW B'00000010' ;si porta = 000 W=00000010 y volvemos
con return
RETLW B'00001101' ;si porta = 001 W=00001101 y volvemos
RETLW B'00000110'
RETLW B'00000001'
RETLW B'00001111'
RETLW B'00001100'
RETLW B'00000011'
RETLW B'00000000' ;si porta = 1111 W=00000000
;--------------------------------------------------------------
END
;----------------------------------------------
;-- Utilización tablas mediante directiva DT --
;-- La sintaxis es DT valor,valor,valor, .....
;-- cada valor equivale a un literal cargado
;-- en w, es equivalente a la instrucción
;-- retlw valor
;-- El siguiente programa lee las entradas y
;-- saca el valor leido en binario mediante un
;-- display 7 segmentos
;----------------------------------------------
list p=16f84
org 0
;----------Configuración puertos --------------
bsf h'03',5 ;bank 1
clrf h'06' ;portb=00000000
movlw b'00011111' ;configurar port A
movwf h'05' ;como entradas
bcf h'03',5 ;bank 0
;------------------------------------------------
inici movf h'05',0 ;Leer port A
andlw b'00000111' ;tomamos sólo los 3 últimos bits
call tabla ;Llamada subrutina tabla
movwf h'06' ;Enviar w a port B
goto inici ;Bucle
;-------------------------------------------------
;-- Subrutina tabla
;-- Los datos corresponden a los valores hex para el
;-- display 7 segmentos
;-- los datos se cargan en w
;-------------------------------------------------
Ej 3.2 Crear una tabla con el abecedario disponible en un display y que se pueda
elegir la letra segun la entrada por el port A.
Ej 3.3 Realizar un programa que muestre por el display 'alcoi' letra a letra,utiliza
un contador y un retardo de 1 segundo
DIRECTIVAS
Directivas Significado