Está en la página 1de 13

PROGRAMACIN PIC (II)

Microcontrolador PIC 16F84


mail : enric.serra

0 - INTRODUCCIN.
Este documento es una continuacin al documento de programacin del PIC
16f84.
Este documento se puede copiar y utilizar siempre que se indique la procedencia
(Escola Professional Salesians Joan XXIII) y se indique su autor Enric Serra.
Todos los comentarios y bugs sern bien recibidos.

Listado de instrucciones:

1 SUBRUTINAS DE RETARDO.
Un retardo, es una forma de control de tiempo en la programacin del PIC,
Las instrucciones 'normales' utilizan un ciclo de mquina para ejecutarse, un ciclo
mquina es la unidad bsica de tiempo de ejecucin de un programa en un PIC y
depende de la velocidad del oscilador.
Hay instrucciones llamadas de salto como goto,return, call, btfss etc que necesitan
2 ciclos mquina para ejecutarse.
Si contamos los ciclos mquina de una determinada parte de instrucciones de un
programa, podremos controlar los tiempos de retardo.
Como sabemos que F=1/T, siendo F=frecuencia y T=tiempo, podemos determinar
cunto tiempo consumir una instruccin en el microcontrolador, sabiendo que
para ejecutar una instruccin el microcontrolador utiliza 4 pulsos de reloj.
Ej : Si un microcontrolador funciona a 4MHz, qu tardar en ejecutar una
instruccin?
F=1/4T -> T=1*4/F
Si F=4MHz
T=1/F = 1*4/4000000 =1useg
Es decir que para un reloj de 4 MHz, cada instruccin simple tardar 1 useg, y
para las instrucciones de salto tardar 2useg.

1.1 Prctica: 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 Prctica: Con el circuito del ejercicio 1.1 grabar el pic con el ejercicio anterior
y comprobar su funcionamiento.
1.3 Prctica: Modifica el programa para obtener 1 seg, 2 seg y 5 seg.
1.4 Modifica el programa para obtener 60 segundos (1 minuto)
2. SALTOS INDEXADOS
Los saltos indexados permiten realizar tablas de verdad o realizar menus a
subprogramas dependiendo de las entradas.
Para ello, se actua sobre el registro h'02' es decir el CONTADOR DE PROGRAMA'
o PCL.
La tcnica consiste en aadir un valor de desplazamiento al contador de programa
(este valor de desplazamiento se denomina 'offset')
mediante un comando de suma.
EJEMPLO

NOTA

addwf PCL,1

Suma al registro PCL (Contador de programa) el valor


de W

EJEMPLO
El programa genera un salto indexado utilizando el comando addwf h'02',1

de forma que mediante dos interruptores accedemos a 4 diferentes


subprogramas denominados prg00,prg01,prg02 y prg03. En cada
subprograma sacamos por el display el valor leido en el puerto de entrada
portA.
;---------------------------------------------------;-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

pcl
org

equ
0

h'02'

;Contador de programa

bsf
h'03',5
;Bank 1
clrf
h'06'
;Port B eixides
movlw b'00011111'
movwf h'05'
;Port A entrades
bcf
h'03',5
;Bank 0
;----------------------------------------------------inici movf h'05',0
; Llegim entrades
andlw b'00000011'
; Pillem dos ultims bits
addwf pcl,1
; Salt indexat amb PCL h'02'
salt goto prg00
; Inici salt indexat
goto
prg01
; Activacio menu
goto
prg02
goto
prg03
;-----------------------------------------------------prg00 movlw b'10111111'
;Eixida 0
movwf h'06'
;Enviar al portB
goto inici
prg01

movlw b'00000110'
movwf h'06'
goto inici

;Eixida 1

prg02

movlw b'11011011'
movwf h'06'
goto inici

;Eixida 2

prg03

movlw b'01001111'
movwf h'06'
goto inici

;Eixida 3

end
; FIN DE PROGRAMA

El siguiente programa utiliza la entrada de un interruptor de forma que


podemos desplazar los leds o un display a derechas o izquierdas,
dependiendo del valor de entrada.
;---------------------------------------------------;-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 sequncia es:
--;-0 -> prg00 -> Display gira a dretes
--;-1 -> prg01 -> Display gira esquerres
--;---------------------------------------------------list

p=16f84

pcl
conta1
conta2
porta
portb
org

equ
equ
equ
equ
equ
0

h'02'
h'10'
h'11'
h'05'
h'06'

;Contador de programa
;Contadors retard led
;--- //
---

bsf
h'03',5
;Bank 1
clrf
portb
;Port B eixides
movlw b'00011111'
movwf porta
;Port A entrades
bcf
h'03',5
;Bank 0
;----------------------------------------------------movlw h'00'
;Iniciatlizar els contadors
movwf conta1
;per al retard dels leds
movlw h'00'
;--//
movwf conta2
;--//
;----------------- Programa principal ---------------inici
movf porta,0
; Llegim entrades
andlw b'00000001'
; Pillem ultim bit
addwf pcl,1
; Salt indexat amb PCL h'02'
salt goto prg00
; Inici salt indexat pcl+0
goto prg01
; Activacio menu
pcl+1
;-------------------- Programa 00 ------------------------prg00
;Si el interruptor no esta polsat
movlw b'00000001'
;activem desplazament dreta

movwf portb
call
retard
;Cridem retard leds
movlw b'00000010'
movwf portb
call
retard
movlw b'00000100'
movwf portb
call
retard
movlw b'00001000'
movwf portb
call
retard
movlw b'00010000'
movwf portb
call
retard
movlw b'00100000'
movwf portb
call
retard
goto
inici
;-- Fi del programa 00 --------------;------------------ Programa 01 -----------------------------prg01
;Si interruptor activat
movlw b'00100000'
;activem desplazament esquerra
movwf portb
call
retard
;Cridem retards leds
movlw b'00010000'
movwf portb
call
retard
movlw b'00001000'
movwf portb
call
retard
movlw b'00000100'
movwf portb
call
retard
movlw b'00000010'
movwf portb
call
retard
movlw b'00000001'
movwf portb
call
retard
goto
inici ;-- Fi del programa 01 --------;---------------- Subrutina retard --------------------;---------------- Retard dels leds --------------------retard incfsz conta1,1
; Retard per als leds
goto retard
; Utilitza 2 contadors
incfsz conta2,1
; Amb un bucle
goto retard
return
;---------------- Fi de PROGRAMA ----------------------end
2.1 Prctica: Con el circuito del ejercicio 1.1 grabar el pic con el ejercicio anterior
y comprobar su funcionamiento.
2.2 Prctica: Realizar un programa que tenga la siguiente tabla de verdad, grabar
en el microcontrolador y comprobar funcionamiento.

Entradas port A (RA0 RA1


RA2)

Salidas port B (RB0 RB1 RB2 RB3 RB4 RB5


RB6 RB7)

000
001
010
011
100
101
110
111

10101010
01010101
00001111
11110000
11001100
00110011
00011100
11100001

2.3 Realiza un programa que tenga una tabla con la siguiente funcin: RA0 and
RA1 and RA2 or RA3
2.4 Realiza el ejercicio 2.1 pero con instrucciones rlf y rrf
3 Tablas
Una tabla de datos es una informacin grabada en el PIc que podemos
cargar en el registro W mediante la instruccin retlw k.
Las tablas se usan para guardar datos o funciones digitales.
Existen dos mtodos para utilizar las tablas o bien utilizamos el comando
retlw k o la directiva DT.
COMANDO

NOTA

RETLW K

Carga en W el valor K y vuelve al programa


despues de la llamada

DT
valor,valor,...

Directiva define tabla (equivale a retlw k)

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
;--------------- Configuracin 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'
;Slo 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

En el siguiente ejemplo se utiliza la directiva de compilacin DT (Define tabla) para


leer un puerto de entrada portA y sacar por el portB mediante un display el valor
leido en binario.
;---------------------------------------------;-- Utilizacin tablas mediante directiva DT -;-- La sintaxis es DT valor,valor,valor, .....
;-- cada valor equivale a un literal cargado
;-- en w, es equivalente a la instruccin
;-- 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
;----------Configuracin 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 slo 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
;------------------------------------------------tabla

addwf h'02',1
;Sumamos el valor del portA al PCL
dt
h'3f',h'06',h'5b',h'4f',h'66',h'6d',h'7d',h'07',h'7f'
return
;-----------------------------------------------------------------;-- Segn el valor sumado del port A saltar a un valor definido en
;-- la tabla DT,de forma si es 0->3f si es 1->06 si es 2->5b etc
;-- y devuelve el valor en w
;------------------------------------------------------------------end

Ej 3.1 Realizar mediante tablas la funcion OR de 4 entradas.


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
Una directiva del ensamblador no es una instruccin por si misma, pero
muchas veces facilita la labor de programacin.
A continuacin se sealan alguna directivas y funciones especficas a la
hora de programar el microcontrolador.
Para ms informacin se puede consultar (en ingls) la guia de usuario
del ensamblador MPASM

Directivas Significado
DT

Define Tabla Ej DT b'00001111',b'00110011',b'00001110'...

END

Fin de programa

EQU

Definicin de constante Ej porta EQU h'05'

INCLUDE

Permite incluir ficheros con definiciones o subrutinas Ej INCLUDE


<P16F84A.INC>

ORG

Origen de los datos del programa

#DEFINE

Define una etiqueta que sustituye a un texto Ej #DEFINE entrada


porta,1

LIST

Listado de opciones del ensamblador Ej LIST p=16f84

WATCHDOG (WDT)(Literalmente Perro Guardin) se encarga de vigilar el correcto


funcionamiento del sistema, de forma que revisa cada x tiempo que todo funcione
normalmente, si no es as provoca un reset. es una de las opciones de la directiva
_CONFIG
Otra opcin interesante a la hora de grabar el microcontrolador es habilitar
PWRTE de forma que impedimos la lectura de los datos en el microcontrolador y
protegemos datos como software.

También podría gustarte