Sie sind auf Seite 1von 31

03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

uControl
Junio 03, 2013, 02:05:09

Bienvenido(a), Visitante. Por favor, ingresa o regstrate.


Perdiste tu email de activacin?
Siempre Ingresar
Ingresar con nombre de usuario, contrasea y duracin de la sesin

Buscar
IN IC IO A YU DA BU S C A R IN G RE S A R RE G IS TRA RS E

uControl > Articulos, circuitos, tutoriales y Revista uControl > Tutoriales, guias y cursos en
uControl > Mis primeros programas con PIC16F84A y PIC16F628A

anterior prximo
Pginas: [1] 2 3 Ir Abajo IM P RIM IR

Tema: Mis primeros programas con PIC16F84A y PIC16F628A (Ledo 115761


Autor
veces)
0 Usuarios y 2 Visitante s e stn vie ndo e ste te m a.

Leon Pic Mis primeros programas con PIC16F84A y PIC16F628A


Mode rador : Marzo 30, 2009, 12:45:48
dsPIC

Este tutorial, est creado por


De scone ctado Suky en el foro de Todopic.
Se x o:
Me nsaje s: 5113 Por pedido de l, voy a subir en nombre de l, este magnfico curso y lo ir
actualizando a la par.

Por favor, si tienen comentarios o sugerencias, hacerlas en este hilo creado


especialmente para ello, a fin de mantener este "limpio" y facil de leer.

C um ulonim bus

Mis primeros programas. PIC16F84A


y PIC16F628A

EL PIC16F84A
La idea de este tutorial es ayudar a los que recin estn empezando, aqu
mostraremos como comenzar. Usaremos en primer lugar el microcontrolador
PIC16F84A, porque es el que por lo general se usa en la enseanza.
Comenzaremos explicando como esta constituido, los terminales, manejo de
corrientes de los puertos, osciladores externos, circuito de reset, memoria de
programa y memoria de datos. Luego iremos a lo interesante, que es la
programacin, nuestros primeros programitas, de los cuales se tratar de
explicarlos detalladamente, el funcionamiento y los registros que se usan en
cada caso.-
Se abarcaron los temas como:

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 1/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

Mi Primer Programa, control de un led


Creacin de Demoras, Led titilando
Creacin de Tablas, Control Display 7 Segmentos
Direccionamiento Indirecto, Control Display 7 Segmentos
Control de varios Displays 7 Segmentos
Interrupciones, Registros y guardado temporario de STATUS y W
Interrupcin TMR0, modo Temporizador
Interrupcin TMR0, modo Contador
Interrupcin RB0, Control de Led
Interrupcin RB4 a RB7, Control Teclado Matricial
Control del LCD, Pantalla de Cristal Liquido
Comunicacin RS232

Todas las simulaciones hechas en proteus, aqui (Para el PIC16F84A)

EL PIC16F628A
Luego se explicar el uso del PIC16F628A, una introduccin a sus
caracteristicas y ejemplos de los mdulos que incorpora este PIC:

Introduccin
Timer1 + Ejemplo
Timer2 + Ejemplo
Mdulo de comunicacin serie (Usart) + Ejemplo
Comparadores analgicos + Ejemplo
Introduccin Mdulo CCP
Modo Captura
Modo Comparador
Modo PWM

Como hacer Cartel de Leds 7x32.-

Herramientas
Para realizar todo esto se necesitan las siguientes herramientas:
Software para escribir nuestro cdigo y compilar: MPLAB
Software para simular: Proteus
Una plaquita programadora.
Software para grabar nuestro PIC, se puede usar el WinPic800 o el Icprog
Aqu dejo un tutorial de como crear un proyecto en MPLAB, compilar y
simular. Un programador de PIC sencillo que pueden armar (Programador

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 2/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

JDM Serial)(circuito, PCB para hacer la plaqueta y una pequea


explicacin de cmo grabar con WinPIC800) y un tutorial para crear placas
de circuito impreso (PCB) por el mtodo de la plancha ---> Tutoriales

Y por supuesto, para probar nuestros programitas, un Protoboard,


PIC16F84A, PIC16F628A , un cristal de 4 MHz, un par de resistencias,
capacitores, leds, Display, LCD, teclado matricial, etc

DATASHEETS
DATASHEET del PIC16F84A
DATASHEET del PIC16F628A

ConfigPIC: Software utilitario para crear automticamente el cdigo de


configuracin de estos PICs, adems de tener otras herramientas que nos
permite calcular temporizaciones, Baud Rate, PWM, etc.

[/list]

16f84aGif.gif (12.7 KB - de scargado 63016 ve ce s.)

ltima modificacin: Octubre 29, 2009,


10:46:53 por Suky En lne a

Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.

Leon Pic Re: Mis primeros programas con PIC16F84A y PIC16F628A


Mode rador Respuesta #1 : Marzo 30, 2009, 12:49:24
dsPIC

De scone ctado PIC16F84A


Se x o:
Me nsaje s: 5113 Introduccin
El PIC16F84A esta fabricado en tecnologa CMOS, posee memoria FLASH, y
consumo bajo de potencia. Est compuesto bsicamente de una memoria
ROM (1024 palabras de memoria de programa), una memoria RAM (de acceso
aleatorio, 68 bytes), lneas de entrada y salida (2 Puertos) y una lgica de
control que coordina la interaccin de los dems bloques.
C um ulonim bus
Estos micros pertenecen a la gama media y dispones de un set de 35
instrucciones, tipo RISC (Computador con Set de Instrucciones Reducido)
pocas pero muy poderosas.-
www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 3/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

Algunas funciones especiales que dispone este PIC:


Temporizador programable (Timer). Si se quiere medir periodos de
tiempo entre eventos, generar temporizaciones o salidas con
frecuencia especfica, etc.
Perro Guardin o Watchdog. Consiste en un temporizador que, cuando
se desborda ya pasa por 0, provoca un reset automtico, utilizado
para sistemas que no tienen control de un supervisor, y al bloquearse
el micro se resetea. Si se utiliza el cdigo debe resetearlo antes de que
se desborde.
Memoria EEPROM de 64 bytes, para guardar datos que no se alteran a
pesar de quitar la alimentacin.
Interrupciones, cuando una seal externa, o una condicin interna
activa una lnea de interrupcin, dejando de lado la tarea que esta
ejecutando, atiende dicha interrupcin y luego contina con lo que
estaba haciendo.
Proteccin ante fallo de alimentacin. Se trata de un circuito que
resetea al micro cuando el voltaje Vdd es inferior al mnimo.
Estado de bajo consumo. Sleep. Si el micro debe esperar mucho tiempo
sin hacer nada, posee una instruccin especial, Sleep, que lo pasa al
estado de reposo. Al activarse una interrupcin se despierta y
reanuda su trabajo. (Reset externo, desbordamiento de Watchdog,
interrupcin por RB0, interrupcin por cambio de nivel en RB4 a RB7,
interrupcin por escritura completada en EEPROM)
Veamos el diagrama de pines, para ver como estn distribuidos sus pines.
Este microcontrolador cuenta con dos puertos configurables como estradas y
salidas, y consta de 18 pines los cuales se encuentran asignados de la
siguiente manera:

El puerto A tiene solo cinco pines, el pin 3, sea, RA4/TOCKI puede ser
configurado a su vez como entrada/salida o como temporizador/contador.
Cuando es salida se comporta como colecto abierto, por lo tanto debemos
poner una resistencia Pull-up a Vdd de 1 Kohm. Cuando se configura como
entrada, funciona como disparador Schmitt Trigger por lo que puede
reconocer seales con un poco de distorsin.
El puerto B tiene 8 pines que pueden ser configurados como entrada/salida.
RB0 puede programarse adems como entrada de interrupcin externa. Los
pines RB4 a RB7 pueden programarse para responder a interrupciones por
cambio de estado y los pines RB6 y RB7 se corresponden con lneas de
entrada de reloj y entrada de datos cuando esta en modo programacin.
MCLR/Vpp, es la entrada de reset si esta a nivel bajo, tambin es
habilitador de tensin de programacin. Cuando su tensin es Vdd el PIC
funciona normalmente.
Vss y Vdd, son los pines de masa y alimentacin. La tensin de alimentacin
esta comprendida entre los 2 y 5.5 Volt.
OSC1/CLKIN y OSC2/CLKOUT, pines de entrada externa de reloj y salida
de oscilador a cristal respectivamente.-

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 4/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

Capacidad de corriente de los puertos.


La mxima capacidad de corriente de cada uno de los pines de los puertos en
modo sumidero es de 25 mA y modo fuente de 20 mA. La mxima capacidad
de corriente total de los puestos es,
Puerto A: Modo sumidero 80 mA; Modo fuente 50 mA.
Puerto B: Modo sumidero 150 mA; Modo fuente 100 mA.

El Oscilador externo.
Es un circuito externo que le indica al microcontrolador la velocidad a la que
debe trabajar. Puede utilizar cuatro tipos distintos:
RC, Oscilador con resistencia y condensador (Poco preciso)
XT, Cristal de cuarzo.
HS, Cristal de alta velocidad
LP, Cristal de baja frecuencia y bajo consumo de potencia.
Al momento de programar un micro se debe especificar que tipo de oscilador
se usa.
Internamente la frecuencia del oscilador es dividida por 4, as que si temeos
un oscilador de 4 MHz, la frecuencia de trabajo es de 1 MHz, por lo que cada
instruccin se ejecuta cada 1 us.
Aqu utilizaremos un cristal XT de 4 MHz que debe ir acompaado de dos
condensadores:

Reset.
El PIC 16F84A posee un temporizador interno conectado al pin de reset, que
funciona cuando se da alimentacin al microcontrolador. Esto hace que al
encender el sistema el microcontrolador quede en reset por un tiempo
mientras se estabilizan todas las seales del circuito. Para tener control
sobre el reset se utiliza el siguiente circuito:

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 5/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

ltima modificacin: Julio 30, 2009, 02:20:20


por Suky En lne a

Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.

Leon Pic Re: Mis primeros programas con PIC16F84A y PIC16F628A


Mode rador Respuesta #2 : Marzo 30, 2009, 12:50:02
dsPIC

De scone ctado
Estructura interna del Microcontrolador.
Arquitectura del PIC, existen dos arquitecturas, la clsica de Von Neumann
Se x o: y la arquitectura Harvard, esta ultima es la que usan los PICs. Dispone de
Me nsaje s: 5113
dos memorias independientes, una que contiene solo instrucciones y la otra
solo contiene datos. Ambas disponen de sus respectivos buses de acceso y
es posible realizar operaciones de acceso simultneamente en ambas.

C um ulonim bus

Memoria del programa.


Aqu almacenamos nuestro programa o cdigo que debe ejecutar, en el
PIC16F84A es FLASH, es rpida, de bajo consumo y alta capacidad de
almacenamiento. Se divide en 2048 posiciones, pero este PIC solo tiene
implementadas 1024 posiciones, de 0x00 hasta 0x3FF.

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 6/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

Cuando ocurre un reset, el contador de programa (PC) apunta a la direccin


0x00, y el micro inicia nuevamente. Aqu se debe escribir todo lo relacionado
con la iniciacin del mismo, por ejemplo configuracin de puertos, etc.
Si ocurre una interrupcin PC apunta a la direccin 0x04, y aqu debemos
escribir el cdigo necesario para atender a dicha interrupcin.
Memoria RAM esttica.
Donde se encuentran los 24 registros especficos (SFR) y 68 registros de
propsito general (GPR). Se halla dividida en 2 Bancos de 128 bytes cada
uno.

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 7/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

Algo que se debe tener en cuenta es la pila o Stack, que consta de 8


posiciones, cada posicin contiene la direccin y datos de la instruccin que
se esta ejecutando, as cuando se ejecuta una llamada call o una
interrupcin, el PC sabe donde regresar. (Limitar las llamadas anidadas)

En lne a

Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.

Leon Pic Re: Mis primeros programas con PIC16F84A y PIC16F628A


Mode rador Respuesta #3 : Marzo 30, 2009, 12:52:18
dsPIC
www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 8/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

de nuestro cdigo:
De scone ctado
A continuacin vamos a desarrollar nuestro primer programa. Considero que
Se x o: se tiene conocimiento del lenguaje Assembler, si no es as se puede leer el
Me nsaje s: 5113 tutorial ASM desde cero de este mismo foro.
Este activar un led conectado a RB0 siempre que el interruptor conectado a
RA0 este cerrado. Para ello vamos a necesitar el siguiente circuito:

C um ulonim bus

En RA0 tenemos conectado un pulsador de forma que cuando lo pulsemos


se introduzca un cero lgico en el pin y cuando no lo pulsemos se introduzca
un uno lgico. Tenemos un Led con su correspondiente resistencia limitadora
de corriente en el pin RB0.

Diagrama de Flujo:

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 9/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

Primero que nada debemos especificar con que microcontrolador estamos


trabajando, esto lo realizamos es las dos primeras lneas:
Cdigo: (asm)
; **** Encabezado ****
list p=16F84A
#include P16F84A.inc

En el archive P16F84A.inc se encuentran las definiciones de las direcciones


de los registros especficos, los bits utilizados en cada registro y los fusibles
del micro.

Configuracin de fusibles. Hay ciertos aspectos del PIC que han de ser
activados o desactivados mediante hardware a la hora de programarlo. Esto
quiere decir que no se pueden volver a cambiar hasta que el chip no se
reprograme de nuevo. El PIC16F84A dispone de 4 fuses (los modelos
superiores tienen ms). Cada fuse activa o desactiva una opcin de
funcionamiento.
OSC: Este fuse controla el modo de oscilacin que usar el PIC para
funcionar. Como ya sabemos, el oscilador se puede configurar de 4 maneras
distintas, dependiendo de la velocidad y del tipo de circuito oscilador
empleado.
WDT: El famoso "perro guardin" del PIC se configura aqu. Esta es una
capacidad del microcontrolador de autorresetearse.
PWRT: Si activamos este fuse, lo que conseguimos es que se genere un
retardo en la inicializacin del microcontrolador.
CP: Activando este fuse tendremos la garanta de que el cdigo que
escribamos en el PIC no pueda ser ledo por otra persona, para que no nos lo
copien, modifiquen, etc. (Code Protection). Esto no impide que el PIC
funcione como siempre, ni que no se pueda sobrescribir su contenido
Cdigo: (asm)

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 10/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

Definicin de variables que utilizaremos en nuestro proyecto. En este caso


solo definiremos bits, por ejemplo Led y Pulsador.
Para organizar nuestro programa lo estructuraremos de la siguiente manera:
Nivel Directiva Operandos ; Comentarios
Cdigo: (asm)
;**** Definicion de variables ****
Led equ 0 ; Definimos Led como el bit cero de un registro, en este caso PORT
Pulsador equ 0 ; Definimos Pulsador como el bit 0, en este caso sera para PORTA

Configuracin de puertos.
Para la configuracin necesitamos los siguientes registros:
STATUS > 0x03; PORTA > 0x05; PORTB > 0x06; TRISA > 0x86 y TRISB >
0x86.
Por defecto los puertos quedan configurados como entradas de datos y si se
quiere cambiar hay que configurarlos. Esto se realiza con los registros TRISA
y TRISB, teniendo en cuenta que si se asigna un cero (0) a un pin, quedara
como salida y si se asigna un uno (1), quedara como entrada.
En nuestro caso se necesita colocar TRISA igual a 11111 (o se puede dejar
por default) y TRISB 11111110. Ahora bien, cuando el PIC arranca se
encuentra en el Banco 0, TRISA y TRISB se encuentran en el Banco 1,
entonces debemos cambiar de Banco. Esto se realiza con el bit RP0 del
registro STATUS. Si este se pone un cero a RP0, estaremos en el Banco 0. Si
se coloca un uno, estaremos en el Banco 1.
Registro de trabajo W: es el registro ms importante que tiene el
microcontrolador y es denominado ACUMULADOR. Este registro almacena
temporalmente uno de los datos que intervienen en la operacin de la Unidad
lgica y Aritmtica (ALU). ALU como indica su nombre, realiza las
operaciones aritmticas y lgicas previstas en el coleccin de instrucciones
del microcontrolador.

Cdigo: (asm)
;**** Configuracion de puertos ***
Reset org 0x00 ; Aqui comienza el micro.-
goto inicio ; Salto a inicio de mi programa.-
org 0x05 ; Origen del cdigo de programa.-
Inicio bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
movlw b'11111' ; Muevo 11111 a W.-
movwf TRISA ; Cargo en TRISA.-
movlw b'11111110'
movwf TRISB
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
bcf PORTB,Led ; Comienza apagado.-

Ya configurado nuestro PIC, vamos a realizar la rutina que ejecutara.


Cdigo: (asm)

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 11/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A
;**** Control de Led ****
Bucle btfsc PORTA,Pulsador ; Preguntamos si esta en 0 logico.-
goto Apagar ; Esta a 1 logico, Apagamos Led.-
bsf PORTB,Led ; Esta a 0 logico, Encendemos Led.-
goto Bucle ; Testeamos nuevamente la condicion del Pulsador.-

Apagar bcf PORTB,Led ;Apagamos Led.-


goto Bucle ; Testeamos nuevamente la condicion del Pulsador.-

end

Aqu solamente en un bucle infinito testeamos continuamente el estado del


pulsador, y segn su estado se encender o apagar el Led.-

ltima modificacin: Julio 30, 2009, 02:23:57


por Suky En lne a

Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.
; **** Encabezado ****
list p=16F84A
#include P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
Leon Pic ;****Re:
DefMis
iniciprimeros
on de variaprogramas
bles **** con PIC16F84A y PIC16F628A
Mode rador Led Respuesta e #4
qu: Marzo0 30, 2009,
; Def12:55:13
inimos Led como el bit cero de un registro, en este caso PORT
dsPIC Pulsador equ 0 ; Definimos Pulsador como el bit 0, en este caso sera para PORTA
;**** Configuracion de puertos ***
Programa completo:
Reset org 0x00 ; Aqui comienza el micro.-
De scone ctado Cdigo: (asm)
goto Inicio ; Salto a inicio de mi programa.-
org 0x05 ; Origen del codigo de programa.-
Se x o:
Me nsaje s: 5113 Inicio bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
movlw b'11111' ; Muevo 11111 a W.-
movwf TRISA ; Cargo en TRISA.-
movlw b'11111110'
movwf TRISB
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
bcf PORTB,Led ; Comienza apagado.-
;**** Control de Led ****
C um ulonim bus Bucle btfsc PORTA,Pulsador ; Preguntamos si esta en 0 logico.-
goto Apagar ; Esta a 1 logico, Apagamos Led.-
bsf PORTB,Led ; Esta a 0 logico, Encendemos Led.-
goto Bucle ; Testeamos nuevamente la condicion del Pulsador.-

Apagar bcf PORTB,Led ;Apagamos Led.-


goto Bucle ;Testeamos nuevamente la condicion del Pulsador.-

end

Bueno aqu ya tenemos nuestro programita terminado, solo falta compilarlo y


simularlo para detectar errores, esto esta mnimamente explicado en el
tutorial del Utilitario MPLAB adjuntado al principio.-
Se adjunta el circuito realizado en Proteus para simulacin.-

C ontrol Le d.rar (84.08 KB - de scargado 1128 ve ce s.)

En lne a

Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.

Leon Pic Re: Mis primeros programas con PIC16F84A y PIC16F628A


Mode rador Respuesta #5 : Marzo 30, 2009, 12:56:37
dsPIC

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 12/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

Creacin de Demoras:
De scone ctado
Ciclo de maquina:
Se x o:
Me nsaje s: 5113
Es la unidad bsica de tiempo que utiliza el microcontrolador y equivale a 4
ciclos de reloj. sea, si tenemos un oscilador de 4 MHz, el ciclo de reloj seria
de 250 ns y el ciclo maquina de 1 us.
Las instrucciones del microcontrolador necesitan 1 ciclo maquina excepto
algunas excepciones, como son los comandos que incluyen saltos (goto, call,
C um ulonim bus
btfss, btfsc, return, etc) que necesitan dos ciclos maquina.

Demoras mediante lazo simple

Cdigo: (asm)
Demora_xxus
movlw 0xXX ; Cargamos valor XX que controla duracin (1)
movwf Contador ; Iniciamos Contador (1)
Repeticion
Decfsz Contador ; Decrementa contador y si es cero sale (1 si no sale, 2 si sale)
goto Repeticion ; No es 0, repetimos (2)
return ; Regresamos de la subrutina (2)

Entre parntesis se muestra el nmero de ciclos que demora cada


instruccin.-
De manera que el nmero de ciclos de instruccin Tsub consumidos por la
rutina, incluyendo los 2 ciclos de la llamada (CALL) sern
Tsub = [2 + 1 + 1 + (0xXX - 1)*(1 + 2) + 2 + 2] ciclos = (3*0xXX + 5)
*Tcy
Donde Tcy es la duracin en segundos de un ciclo de instruccin. Utilizando
un oscilador de 4 MHz la mayor duracin posible es de 770 us, con 0xXX =
0xFF.-

Demoras mediante Lazos anidados

Para lograr demoras de mayor duracin deben utilizarse lazos anidados,


poniendo un lazo de demora dentro de otro.

Cdigo: (asm)
Demora_xx
movlw 0xXX ; (1)
movwf Contador1 ; (1)
Repeticion1
movlw 0xYY ; (1)
movwf Contador2 ; (1)
Repeticion2
decfsz Contador2,1 ; (1 si no sale, 2 si sale)
goto Repeticion2 ; (2)
decfsz Contador1,1 ; (1 si no sale, 2 si sale)
goto Repeticion1 ; (2)
return ; (2)

La duracin de esta rutina en ciclos de reloj ser


Tsub = 2 + 1 + 1 + (0xXX)*[1 + 1 + (0xYY - 1)*(1 + 2) + 2 + 1 + 2] + [1 +
1 + (0xYY - 1)*(1 + 2) + 2 + 2 + 2] ciclos
Lo cual se puede simplificar como sigue
Tsub = [0xXX*((0xYY - 1)*3 + 7) + 5] Tcy
En este caso el mximo que se puede conseguir es de aprox. 196
milisegundos.-
Bueno ahora que se entiende como se realizan las demoras, les adjunto un
www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 13/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

programita que obtiene el cdigo necesario para una pausa, ingresando el


valor de la misma y la frecuencia del oscilador utilizado.-

calde lay.zip (91.32 KB - de scargado 705 ve ce s.)

ltima modificacin: Julio 30, 2009, 02:21:06


por Suky En lne a

Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.

Leon Pic Re: Mis primeros programas con PIC16F84A y PIC16F628A


Mode rador Respuesta #6 : Marzo 30, 2009, 12:57:40
dsPIC

Ejemplo:
De scone ctado En este ejemplo se explicar como calcular demoras. Se har titilar un led
conectado a RB0 siempre que el interruptor conectado a RA0 este cerrado.
Se x o:
Me nsaje s: 5113 Diagrama de Flujo:

C um ulonim bus

Cdigo: (asm)

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 14/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A
goto Bucle ; Testeamos nuevamente la condicion del Pulsador

Apagar bcf PORTB,Led ;Apagamos Led.-


goto Bucle ; Testeamos nuevamente la condicion del Pulsador.-
;**** Demora ****
Demora_150ms
movlw 0xFF ;
movwf Contador1 ; Iniciamos contador1.-
Repeticion1
movlw 0xC3 ;
movwf Contador2 ; Iniciamos contador2
Repeticion2
decfsz Contador2,1 ; Decrementa Contador2 y si es 0 sale.-
goto Repeticion2 ; Si no es 0 repetimos ciclo.-
decfsz Contador1,1 ; Decrementa Contador1.-
goto Repeticion1 ; Si no es cero repetimos ciclo.-
return ; Regresa de la subrutina.-

end

Le d Titilando.rar (84.9 KB - de scargado 713 ve ce s.)

En lne a

Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.

Leon Pic Re: Mis primeros programas con PIC16F84A y PIC16F628A


Mode rador Respuesta #7 : Marzo 30, 2009, 01:00:03
dsPIC

De scone ctado
Creacin de Tablas:
Un Display es una coleccin de Leds ubicados de forma estratgica. Si se los
Se x o: agrupa uniendo sus ctodos ser de CTODO COMUN, o bien agrupando sus
Me nsaje s: 5113
nodos, un Display de ANODO COMUN.
Por otro lado estos Leds pueden ser fabricados en forma de Puntos o
Segmentos, tal es as que se encuentran Display de 7 segmentos, como los
de la imagen:

C um ulonim bus

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 15/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

El programa que realizaremos leer la cantidad de veces que se activa un


pulsador y mostraremos el resultado. Conectaremos el Display en forma
directa, es decir conectando el puerto B del micro a los pines del Display, y
luego encender cada uno de los segmentos del Display para visualizar el valor
correspondiente. Para ello crearemos una tabla que contenga los distintos
cdigos para el numero que necesitemos visualizar.

Es obvio que con un solo display solamente podremos contar de 0 a 9.


www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 16/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

Diagrama de Flujo:

Antes de continuar tratare de explicar algunos registros importantes:


El PC. Direccionamiento del programa: Especifica la direccin de la
instruccin que se ejecutar. Consta de 13 bits, con lo que es posible
direccionar hasta 8K palabras, pero en el 16F84A solo se implementa 1k.

La parte alta del contador de programa (PCH) no se puede acceder


directamente, ella debe cargarse desde los 5 bits ms bajos del registro
llamado PCLATCH (direccin 0x08).

En la creacin de tablas, la posicin a leer de la misma se realiza con el


control del registro PCL. Este registro es de 8 bits, por lo que direcciona solo
256 posiciones, por ello se debe tener en cuenta:
La posicin de la tabla en la memoria de programa.
El tamao de la tabla, si nuestra tabla tiene mas de 255 posiciones, si o
si debemos manejar los bits mas significativos de PC [PCLATCH]).

Para devolver el valor direccionado se utiliza retlw, esta instruccin devuelve


un valor en el acumulador al retornar de una subrutina. La creacin de la
tabla se har de la siguiente forma:
Cdigo: (asm)
Tabla
addwf PCL,f
retlw Valor0
retlw Valor1
retlw Valor2
retlw Valor3
; ....

Donde Valor0, Valor1, Valor2... etc. son los valores que queremos almacenar
en la tabla.
La estrategia a seguir para consultar algn valor de la tabla es cargar en el
acumulador (W) la direccin de la tabla donde se encuentra el valor que
quieres leer y despus llamar a la subrutina TABLA (con un CALL).
Advertencia: la carga de W no puede superar el nmero de valores de la

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 17/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

tabla, sino se estar ejecutando una instruccin errnea provocando un mal


funcionamiento del programa.-

Explicado lo necesario pasamos al cdigo del ejemplo:

Cdigo: (asm)
; **** Encabezado ****
list p=16F84A
#include P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;**** Definicion de variables ****
Contador equ 0x0C ; Registro para almacenar conteo
Contador1 equ 0x0D ; Registro utilizado en demora.-
Contador2 equ 0x0E ; Registro utilizado en demora.-
Pulsador equ 7 ; Definimos Pulsador como el bit 7, en este caso sera para
;**** Inicio del Micro ****
Reset org 0x00 ; Aqui comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-

;**** Tabla de conversion BCD a 7 Segmentos ****


; Se coloca al inicio para asegurar ubicacion en Pagina.-
org 0x05 ; Origen del codigo de tabla.-
BCD7SEG: ; retlw b'gfedcba' para display catodo comun
addwf PCL,1 ; Se incrementa el contador del programa.-
retlw b'0111111' ;0
Una manera
retlwms b'0cmoda
000110' de escribir
;1 la tabla de instrucciones RETLW puede
lograrsere tlw b'1011011'
usando la directiva DT;2
(Define Table) del ensamblador, la cual nos
retlw b'1001111' ;3
permite r definir
etlw unab'110tabla
0110' de datos
; 4 que ser sustituida por una lista de
instrucciones
retlw RETLW;
b'1101101as,
' la tabla
; 5 anterior puede quedar como sigue:
Cdigo: (asm)
retlw b'1111101' ;6
BCD7SEG:retlw b'0000111' ;r7etlw b'gfedcba' para display catodo comun
rd
aed
tw
lf
w P bC
'L1,
111111' ;S8e incrementa el contador del programa.-
rT
Det0
lx
w3F,b0'x10
16
0,
110
1x
15
'B, 0x4F
;,90x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F
clrf Contador ; Si llega 10, se resetea contador
retlw 0 bx
'30F
111111' ;0

;**** Programa principal ****


Control
;**** Conanti
figurarebote:
cin de puertos ****
En
Iniceliomomento
bsf Sde
TATpresionar
US,RP0 un
;Pbotn
asamospulsador
de Banco 0o acualquier
Banco 1.-conmutador
electromecnico
movlw b'1 es
000inevitable
0000' ;que
RB7 se produzca
como entrada yun pequeo
los arco
demas com elctrico
o salida.-
durantemelovwf TRISB
breve instante en que las placas del contacto se aproximan o se
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
alejan de sus
movlw puntos
b'011111de
1'conexin.
; Comienza en cero.-
movwf PORTB
clrf Contador
;**** Testeo de Pulsador ****
Testeo
btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
goto Testeo ; No, seguimos testeando.-
call Demora_20ms ; Eliminamos Efecto rebote
btfss PORTB,Pulsador ; Testeamos nuevamente.-
goto Testeo ; Falsa Alarma, seguimos testeando.-
incf Contador,1 ; Se ha pulsado, incrementamos contador.-
movfw Contador ; pasamos contador a W
call BCD7SEG ; Llamamos tabla.-
movwf PORTB ; Cargamos valor recibido por Tabla en PORTB
btfsc PORTB,Pulsador ; Esperamos a que se suelte el pulsador -**-
goto $-1 ; No, PCL - 1, --> btfss PORTA,Pulsador.-
call Demora_20ms ; Eliminamos efecto rebote.-
btfsc PORTB,Pulsador ; Testeamos nuevamente.-
goto $-4 ; No, Falsa alarma, volvemos a testear a que se suelte (**
goto Testeo ; Si, Testeamos nuevamente.-

;**** Demora ****


Demora_20ms
movlw 0xFF ;
La duracinmovwfde C este
ontado depende
r1 de la calidad
; Inicide amos los
con switches
tador1.- y la velocidad de
Repeticion1
www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 18/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

accionamiento, pero no dura ms de 20 milisegundos.


Se adjunta simulacin.-

C ontrol Display 7 Se gm e ntos.rar (95.19 KB - de scargado 951 ve ce s.)

ltima modificacin: Julio 30, 2009, 02:29:22


por Suky En lne a

Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.

Leon Pic Re: Mis primeros programas con PIC16F84A y PIC16F628A


Mode rador Respuesta #8 : Marzo 30, 2009, 01:00:50
dsPIC

De scone ctado
Otra forma de c
En la programacin de los microcontroladores PIC la mayora de las
Se x o: instrucciones emplean direccionamiento directo, pero tambin es posible que
Me nsaje s: 5113 operen en un modo de direccionamiento directo. Para el direccionamiento
indirecto se emplean dos registros especiales: el FSR y el INDF (este ultimo
no es un registro fsico). El registro FSR se emplea para sealar o apuntar
a una direccin de la memoria RAM cuyo contenido puede ser ledo o escrito
de forma indirecta empleando cualquier instruccin que use como operando al
registro INDF.
C um ulonim bus Esta forma de direccionamiento es particularmente til cuando se manejan
tablas o arreglos de datos.-

Directo vs Indirecto.

Cdigo: (asm)
; DIRECTO:
; Definimos registro en la memoria de datos.-
MyRegistro equ 0x10 ; Ubicado en 0x10.-

; Cargamos dato en el registro.-


movlw 0x8A ;
movwf MyRegistro ; MyRegistro = 0x8a.-
; Leemos dato del registro.-
movfw MyRegistro ; Movemos el valor que tenga MyRegistro a W.-
movwf PORTB ; Por ejemplo, lo cargamos en PORTB.-

; INDIRECTO:
; Cargamos dato en el registro.-
movlw 0x10 ;
movwf FSR ; Direccionamos Registro de datos ubicado en 0x10.-
movlw 0x8A ;
movwf INDF ; Cargamos registro direccionado con el valor 0x8A.-

; Leemos dato en el registro.-


movlw 0x10 ;
Utilizaremos el direccionamiento
movwf FSR Indirecto
; Direcciona para
mos Registro decrear labitabla
datos u de0xcontrol
cado en 10.- del
movfw INDF ; Movemos el valor que tenga el registro seleccionado a W.-
Display. Aqu no utilizaremos el pulsador, solo se har el contador automtico
movwf PORTB ; Por ejemplo, lo cargamos en PORTB.-
de 0 a 9.- Al iniciar el microcontrolador cargaremos el cdigo de 7 Segmentos
para controlar el Display en la memoria de Datos con direccionamiento
indirecto.
Luego, al realizar el conteo leeremos el cdigo correspondiente almacenado y
lo enviaremos al PORTB.-

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 19/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

Aqu utilizamos el registro STATUS nuevamente, pero para control de las


operaciones aritmticas. Nosotros guardaremos el cdigo de 7 Segmentos del
0 al 9, en los registros 0x10 a 0x19. Si nuestro contador nos direcciona el
registro ubicado en 0x1A, que seria el 10, lo reseteamos y direccionamos el
0, sea registro 0x10. Esto lo hacemos realizando la resta del registro
seleccionado y 0x1A, FSR 0x1A, y si el resultado es cero, reseteamos.
El bit Z (Zero) del registro STATUS, este indica si una operacin lgica o
aritmtica realizada da como resultado cero. Tambin tenemos el bit C
(Carry) (0), que en instrucciones aritmticas se activa cuando se presenta
un acarreo desde el bit mas significativo del resultado, el bit DC (Digit
Carry), que en operaciones aritmticas se activa si ocurre acarreo entre el
bit 3 y bit 4.-
Cdigo completo:
Cdigo: (asm)
; **** Encabezado ****
list p=16F84A
#include P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;**** Definicion de variables ****
Contador equ 0x0C ; Seleccionamos posicin en la memoria RAM (GPR) para guar
; registro utilizado para demora.-
Contador1 equ 0x0D ; Registro utilizado en demora.-
Contador2 equ 0x0E
Pulsador equ 7 ; Definimos Pulsador como el bit 0, en este caso ser para

Reset
org 0x00 ; Aqu comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
;**** Programa principal ****
;**** Configuracion de puertos ****
Inicio
bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
clrf TRISB ; PORTB como salida.-
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
call Config_Tabla ; Cargamos registros con Codigo de 7 segmentos.-
Dire ccionam
movfwie nto
IND Indire
F cto.rar (95.1
; LeKB
emo-sdecoscargado
digo de 7 532
Segve ce
mentos.)
s para el CERO.-
movwf PORTB ; Mostramos el CERO.-
;**** Testeo de Pulsador **** En lne a
Bucle
Je ss dijo,
cayo
ll soyD eelmC
orAMINO
a_190m ,sla VER
;DAD ya
Demor lapa
VIDA,
ra vinadie
sualizlle
arga Dial
splPADR
ay E si no e s por m i.
incf FSR,1 ; Incrementamos Puntero.-
movlw 0x1A ; Consulamos si se pide codigo para mostrar "10",
subwf FSR,0 ; si es asi reseteamos FSR, apunta a 0x10--> "0".-
btfss STATUS,Z ; Si Z=1 --> 0x1A - FSR = 0.-
Leon Pic Re:gMis
oto primeros
Muestro_Dprogramas
isplay ; No, m con
uestr PIC16F84A
o display.- y PIC16F628A
Mode rador Respuesta #9 : Marzo 30, 2009, 01:14:18 seteo puntero.-
movlw 0 x10 ; Si re
dsPIC
movwf FSR ;

De scone ctado
Muestro_Display
movfw INDF ; Leo Registro que apunta FSR.- Control de v
Para el control
movwf P de
ORT varios
B display la idea; Lo escamultiplexar
rgo en PORTB. la- seal enviada por el
Se x o: microcontrolador,
goto Bucl con
e l administraremos ; Cont el
inuencendido
o conteo.- de cada display y sus
Me nsaje s: 5113 segmentos (lo cual se hace por programa).
Para
;****ejemplificar
Demora **** haremos un contador automtico de 0 a 999:
El
Demhardware
ora_190ms necesario es el siguiente:
movlw 0xFF ;
movwf Contador1 ; Iniciamos contador1.-
Repeticion1
movlw 0xFF ;
C um ulonim bus movwf Contador2 ; Iniciamos contador2
Repeticion2
decfsz Contador2,1 ; Decrementa Contador2 y si es 0 sale.-
goto Repeticion2 ; Si no es 0 repetimos ciclo.-
decfsz Contador1,1 ; Decrementa Contador1.-
goto Repeticion1 ; Si no es cero repetimos ciclo.-
return ; Regresa de la subrutina.-
;**** Cargamos tabla en memoria ****
www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 20/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

Diagramas de Flujo:

Se observa que el Puerto B se utiliza para enviar los datos a mostrar en cada
display, mientras que por el Puerto A seleccionas el display que mostrar ese
dato. Supongamos que quiero mostrar "231", pues muy fcil, pongo el puerto
B en 0000110 (cdigo para el 1), y activo ahora el 3 transistor por un
periodo de tiempo corto, desactivamos este transistor, cargamos el puerto B
con 1001111 y activamos el 2 transistor por un tiempito, lo mismo hacemos
para mostrar 1. Repetimos esta misma secuencia mientras se quiera
mostrar este valor. La secuencia es tan rpida que el observador no nota el
momento en que cambias de display.
www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 21/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

Control de conteo:
Para realizar el conteo incrementamos continuamente Unidad, cuando est
llega a 10, las reseteamos a 0, e incrementamos en 1 Decena. La misma
operacin se realiza con Decena, al llegar a 10 se lleva a 0 y se incrementa
Centena.-
Cdigo: (asm)
; **** Encabezado ****
list p=16F84A
#include P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;**** Definicion de variables ****
Unidad equ 0x0C ; Guardamos conteo unidad
Decena equ 0x0D ;
Centena equ 0x0E ;
Contador1 equ 0x0F ; Registro utilizado en demora.-
Contador2 equ 0x10 ; Registro utilizado en demora.-
Contador equ 0x11 ; Control de Refresco de Display.-

MuestroU equ 2 ; Para control del 1 Display


MuestroD equ 1 ; Para control del 2 Display
MuestroC equ 0 ; Para control del 3 Display

;**** Inicio del Micro ****


Reset
org 0x00 ; Aqu comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
En este ejemplo se mantiene la visualizacin del mismo valor durante aprox.
300 ms, se puede determinar ya que utilizamos 3 demoras de 5 ms
;**** Tabla de conversion BCD a 7 Segmentos ****
despreciando
; Se coloca al los
inic ciclos
io parautilizados
asegurar u en los
bicaciocomandos,
n en Pagina.-que son aprox. 30 (30
us). Entonces
org por
0x05ciclo tenemos 15
; Origenms,
delyc
por
digo20
derepeticiones,
tabla.- 300 ms.-
BCD7SEG ; retlw b'gfedcba' para display catodo comun
addwf PCL,1 ; Se incrementa el contador del programa.-
DT 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F

;*C*** Prog
ontrol rama p
Varios rincipal **
Display.rar **
(102.11 KB - de scargado 961 ve ce s.)
;**** Configuracion de puertos ****
Inicio
En lne a
bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
clrf TRISA ; PORTA como salida
Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.
clrf TRISB ; PORTB como salida.-
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
clrf PORTA ; Desactivo todos los Displays
clrf Unidad ; Comienza en cero --> 0 0 0.-
Leon Pic Re: Mis primeros programas con PIC16F84A y PIC16F628A
c lr f De cen a
Mode rador clrf
Respuesta Cente:na
#10 Marzo 30, 2009, 01:15:03
dsPIC goto Actualizo_Display ; Esta rutina multiplexa los displays.-
;**** Testeo de Pulsador ****

De scone ctado
Decodificador BCD.
Bucle
incf Unidad,1 ; Incremeto Unidad.
La otra m posibilidad
ovlw d'10'
es utilizar un decodificador BCD como el 74LS47 o el
; Si es 10 reseteo e incremento Decena
Se x o: 74LS249, sub owfel CD4511.
Unidad,0 Estos ; integrados disponen de 4 entradas
Me nsaje s: 5113
correspondientes
btfss STAT aUSun
,Z cdigo; binario BCD, y 7 salidas que se conectan a un
Display.goto Actualizo_Display ; no es 10
clrf Unidad ; Si, reseteo.-
incf Decena,1 ; Incremento Decena.-
www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 22/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

C um ulonim bus

Lo importante de este integrado, es que posee 4 pines de entrada y 7 de


salida, mas unos cuantos de configuracin. El hecho es que, los 4 pines de
entrada (A, B, C y D) sern los que reciban el cdigo en binario enviado por
el micro. Una vez recibido el dato, el integrado se har cargo de decodificarlo
y enviarlo por los pines de salida (a, b, c, d, e, f y g) para mostrarlo en el
display. Lo que nos falta saber, es que dato deber enviar al decodificador.
DCBA Valor que muestra el Display
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9

En lne a

Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.

Leon Pic Re: Mis primeros programas con PIC16F84A y PIC16F628A


Mode rador Respuesta #11 : Marzo 30, 2009, 01:15:50
dsPIC

INTERRUPCIONES
De scone ctado

Se x o: Una de las caractersticas ms importante de los microcontroladores y que


Me nsaje s: 5113
mencionamos al inicio del tutorial, es que tienen la posibilidad de manejar
interrupciones. Se trata de un acontecimiento que hace que el micro deje de
www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 23/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

lado lo que se encuentra realizando, atienda ese suceso y luego regrese y


contine con lo suyo.
Hay dos tipos de interrupciones posibles, una es mediante una accin
externa (es decir por la activacin de uno de sus pines), la otra es interna
(por ejemplo cuando ocurre el desbordamiento de uno de sus registros)
C um ulonim bus

En el 16F84A hay 4 fuentes de interrupcin:


Por el pin RB0/INT, que regresa al PIC del modo SLEEP (interrupcin
externa).
Por los pines RB4 a RB7, configurados como entrada y en caso de que
alguno de ellos cambie de estado (interrupcin externa).
Por desbordamiento del registro TMR0, cuando este registro pasa de
255 a 0 en decimal (interrupcin interna).
Al completar la escritura de la EEPROM de datos (interrupcin interna).

Cada fuente de interrupcin esta controlada por 2 bits. Un bit local de


interrupciones (Terminado en E) de permiso o prohibicin de ejecucin. Si
esta en 0 bloquear la solicitud de interrupcin, y si esta en 1 permitir la
ejecucin. Un bit que acta como sealizador (Terminado en F) el cual es
activado (puesto a 1) si se ha producido la interrupcin. Adems existe 1 bit
de control global, el bit GIE (INTCON <7>) el cual si esta desactivado
bloquea todas las solicitudes de interrupcin.

Lo anterior descrito puede entenderse observando el diagrama lgico de la


siguiente figura:

El bit GIE se borra automticamente cuando se reconoce una interrupcin


para evitar que se produzca otra mientras se est atendiendo a la primera y
al retornar de la interrupcin con la instruccin RETFIE, el bit GIE se vuelve
a activar ponindose a 1. En cambio los bits sealizadores o banderas de
interrupcin deben ser puestos a cero por el tratamiento de la interrupcin
realizada por el usuario (Programador)
Cuando una interrupcin est habilitada (su bit local de habilitacin est
activado, el bit GIE est activado) y ocurre el evento que la activa, el valor

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 24/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

de PC se guarda en la PILA y en ste se carga el 0x04 (nico vector de


interrupcin). Es a partir de esta direccin que se debe colocar el
tratamiento de la interrupcin, detectando por medio de los bits banderas
cual de los eventos ha ocurrido y actuar segn sea el caso.

Nota: El nico registro que se salva en la PILA es PC, para preservar algn
otro registro debe ser el propio programa de atencin a la interrupcin el que
se encargue de salvar su estado al inicio de la rutina y de devolverlos al final
del mismo.

Resumiendo, las acciones que se realizan automticamente el


microcontrolador y las que el programador debe tener en cuenta en sus
programas son las siguientes:
Cuando se activa una posible causa de interrupcin, el flag
correspondiente se activa. Si el bit de permiso correspondiente est a
1 y el bit de habilitacin de todas las interrupciones (GIE) est a 1, se
produce la interrupcin.
Para evitar que se produzca otra interrupcin mientras se est
atendiendo a otra anterior, el bit GIE se pone a 0.
El valor del PC se guarda en la PILA
El PC se carga con el valor 0x04, que es el vector de interrupciones
El programador, debe comenzar la rutina de atencin a la interrupcin
con un salto a la posicin de memoria donde se encuentra el programa,
seguidamente se guardan todos los registros que puedan ser
modificados por esta, seguidamente si estn habilitadas varias vas de
interrupcin, se debe explorar el valor de las banderas para determinar
la causa de la interrupcin.
Dependiendo de la causa de la interrupcin, la rutina de interrupcin se
bifurca a la subrutina correspondiente.
Se deben devolver los valores que tenan los registros antes de
producirse la interrupcin y se deben borrar por software las banderas
que indican las fuentes de las interrupciones, antes del retorno al
programa principal.
Cuando se llega a la ltima instruccin de la rutina de interrupcin,
RETURN, se carga el PC con el valor que se guard inicialmente en la
PILA y el bit GIE se pone automticamente a 1.

Bits utilizados.
INTF para RB0/INT, bit 1 de INTCON, si es 1 ocurri interrupcin
externa
RBIF para los pines B4 a RB7, bit 0 de INTCON, si es 1 por lo menos un
pin cambio de estado
T0IF para TMR0, bit 2 de INTCON, si es 1 TMR0 desbordado
EEIF para la EEPROM, bit 4 de EECON1, si es 1 se ha completado
escritura
GIE, bit 7 de INTCON, si es 1 habilita todas las interrupciones
EEIE, bit 6 de INTCON, si es 1 se activa interrupciones de perifricos
T0IE, bit 5 de INTCON, si es 1 int. TMR0 activada
INTE, bit 4 de INTCON, si es 1 int. Externa activada
RBIE, bit 3, si es 1 int. Por RB4 a RB7 activada
Todos estos bits al resetearse o iniciarse el micro se encuentran en 0.

Rutina de Servicio de Interrupciones:


Primero debes guardar el contenido del registro W, el problema de mover W a
otro registro (haciendo uso de movf) es que esta instruccin corrompe la
bandera Z, modificando el registro de STATUS. Segn la hoja de datos
otorgada por Microchip, en uno de sus apartados recomienda una secuencia
www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 25/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

de cdigo que permite guardar y restaurar los registros sin modificarlos.

Cdigo: (asm)
;**** Rutina de servicio de Interrupcion ****
; Guardado de registro W y STATUS.-
Inicio_ISR
movwf W_Temp ; Copiamos W a un registro Temporario.-
swapf STATUS, W ;Invertimos los nibles del registro STATUS.-
movwf STATUS_Temp ; Guardamos STATUS en un registro temporal.-
ISR
; Atendemos la interrupcin.-
; Restauramos los valores de W y STATUS.-
Fin_ISR
swapf STATUS_Temp,W ; Invertimos lo nibles de STATUS_Temp.-
movwf STATUS
swapf W_Temp, f ; Invertimos los nibles y lo guardamos en el mismo registro.-
swapf W_Temp,W ; Invertimos los nibles nuevamente y lo guardamos en W.-
retfie ; Salimos de interrupcin.-

Los registros W_Temp y STATUS_Temp son registros alternativos para


guardar temporariamente sus valores correspondientes.-

ltima modificacin: Julio 30, 2009, 02:42:11


por Suky En lne a

Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.

Leon Pic Re: Mis primeros programas con PIC16F84A y PIC16F628A


Mode rador Respuesta #12 : Marzo 30, 2009, 01:16:40
dsPIC

De scone ctado
INTERRUPCION POR TMR0
El Timer 0 es un contador / temporizador de 8 bits. El registro principal de
Se x o: este mdulo es TMR0 (0x01). Este registro se incrementa continuamente a
Me nsaje s: 5113 una frecuencia seleccionable manejada por un preescalador y el reloj interno
Fosc/4 (modo temporizador) o bien, por un preescalador y una seal
externa (modo contador).
En la siguiente figura se muestra un diagrama de bloques de este mdulo, en
donde se indican los bits que afectan su operacin y la manera en que lo
hacen.
C um ulonim bus

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 26/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

El modo Temporizador
En el modo temporizador la seal de reloj que controla el incremento del
registro TMR0 es la frecuencia Fcy = Fosc/4, la cual puede ser dividida
opcionalmente por el preescalador. Este modo es seleccionado al limpiar el bit
T0CS (OPTION_REG<5>). En este modo si se realiza una escritura al
registro TMR0, su incremento es inhibido por los siguientes dos ciclos de
instruccin (Tcy) y si el preescalador est asignado se pierde la cuenta pero
no su asignacin.

El modo Contador
En el modo contador, la seal que controla los incrementos del registro TMR0
es una seal externa que proviene de la patita T0CKI poniendo el bit T0CS
en alto. Se puede seleccionar la transicin que provoca los incrementos
mediante el bit Timer0 Source Edge Select T0SE (OPTION_REG<4>),
limpiando este bit se selecciona la transicin de subida, mientras que al
ponerlo en alto se selecciona la de bajada.
Observacin: En este modo, la seal conectada a TOCKI es muestreada
durante los ciclos Q2 y Q4 del reloj interno, por ello es necesario que
permanezca en alto al menos por 2 Tosc ms un pequeo retardo de 20nseg
y lo mismo en bajo. (Es decir, seales demasiado rpidas no podrn ser
detectadas).

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 27/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

El preescalador
El preescalador es un divisor de frecuencia de mdulo seleccionable. Como se
puede ver en la figura anterior, el preescalador est compartido entre el
timer0 y el mdulo Watchdog, sin embargo slo puede conectarse a uno de
los dos y esto se establece mediante el bit PSA (OPTION_REG<3>), as,
con este bit en alto el preescalador es asignado al reloj del Watchdog,
mientras que con un nivel bajo en PSA el preescalador dividir la frecuencia
que maneja al Timer 0.
La seleccin del mdulo (valor de divisin de frecuencia) del preescalador se
puede realizar mediante los bits PS2,PS1,PS0 (OPTION_REG<2:0>) de
acuerdo a la siguiente tabla:
PS2 PS1 PS0 Divisor
000 1/2
001 1/4
010 1/8
011 1/16
100 1/32
101 1/64
110 1/128
111 1/256

ltima modificacin: Octubre 29, 2009,


10:53:06 por Suky En lne a

Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.

Leon Pic Re: Mis primeros programas con PIC16F84A y PIC16F628A


Mode rador Respuesta #13 : Marzo 30, 2009, 01:21:21
dsPIC

De scone ctado
Ejemplo modo temporizador.
Para calcular una temporizacin se necesita el tiempo de un ciclo de
Se x o: instruccin (es decir 1 microsegundo, si estas trabajando con un XT de 4
Me nsaje s: 5113 Mhz), el valor del Divisor de Frecuencia (el que seleccionabas con los bits
PS2, PS1 y PS0), y finalmente el complemento del valor cargado en TMR0 (es
decir 255-TMR0). Entonces tenemos: Temporizacin = Ciclo de
instruccin. (256-TMR0) .Divisor de Frecuencia
De este modo si queremos temporizar 4 ms con un divisor de frecuencia de
32, tendramos:
C um ulonim bus
TMR0 = 256 - ^[4000us / (1us x 32)]

TMR0 = 131

Vemos que la mxima temporizacin posible es con TMR0 = 0, y Divisor de


Frecuencia en 256, logrndose unos 65.5 ms aprox.

Para ejemplificar el uso de esta interrupcin haremos titilar un led conectado


al PIN RB0 cada 200 ms, para ello haremos una temporizacin con TMR0 de
50ms y contaremos 4 desbordes del mismo para lograr los 200 ms necesarios.
Lo interesante de usar interrupcin es que con el micro se puede estar
ejecutando cualquier tarea y no ocupar este tiempo en un bucle de demora.
www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 28/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

El hardware necesario es equivalente al primer ejemplo realizado.-


Diagrama de Flujo:

Cdigo: (asm)
; **** Encabezado ****
list p=16F84A
#include P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;**** Definicion de variables ****
Contador equ 0x0C ; Contador para detectar 4 desbordes de TMR0.-
W_Temp equ 0x0D ; Registro para guardar temporalmente W.-
STATUS_Temp equ 0x0E ; Registro para guardar temporalmente STATUS

Led equ 0 ; Definimos Led como el bit cero de un registro, en este c

;**** Inicio del Micro ****


Reset
org 0x00 ; Aqu comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
;**** Vector de Interrupcion ****
org 0x04 ; Atiendo Interrupcion.-
goto Inicio_ISR

; **** Programa Principal ****


;**** Configuracion de puertos ***
org 0x05 ; Origen del cdigo de programa.-
Una ayuda adicional
Inicio
El programita
bsf presentado
STATUS,RP0 en el; primer
Pasamospost,
de Bantiene
co 0 auna utilidad
Banco 1.- que nos
ayudarmoen
vlwel clculo
b'111111del
10' preescaler
; RB0 coy
movalor inicial
salida.- del Timer para obtener una
temporizacin
movwf deseada,
TRISB aparte de generar el cdigo.
movlw b'00000111' ; Se selecciona TMR0 modo temporizador y preescaler de 1/256.-
movwf OPTION_REG
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
bcf PORTB,Led ; El Led comienza apagado.-
movlw 0x3D ; Cargamos 61 en TMR0 para lograr aprox. 50ms.-
movwf TMR0
clrf Contador ; Iniciamos contador.-
movlw b'10100000' ; Habilitamos GIE y T0IE (interrupcin del TMR0)
movwf INTCON
;**** Bucle ****
Bucle
nop ; Aqui el micro puede ejecutar cualquier otra tarea
goto Bucle ; sin necesidad de utilizar tiempo en un bucle de demora.-

;**** Rutina de servicio de Interrupcion ****

;---> Aqui haremos copia de respaldo para mostrar como se hace aunque no es
; necesario ya que el micro no hace otra tarea mientras tanto <---

; Guardado de registro W y STATUS.-


Inicio_ISR
movwf W_Temp ; Copiamos W a un registro Temporario.-
swapf STATUS, W ;Invertimos los nibles del registro STATUS.-
movwf STATUS_Temp ; Guardamos STATUS en un registro temporal.-
;**** Interrupcion por TMR0 ****
ISR
btfss INTCON,T0IF ; Consultamos si es por TMR0.-
www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 29/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A

TMR 0 Modo Te m porizador.rar (84.78 KB - de scargado 629 ve ce s.)

ltima modificacin: Julio 30, 2009, 03:00:49


por Suky En lne a

Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.

Leon Pic Re: Mis primeros programas con PIC16F84A y PIC16F628A


Mode rador Respuesta #14 : Marzo 30, 2009, 01:22:22
dsPIC

De scone ctado
Ejemplo modo contador.
Se x o: El siguiente programa realiza el conteo del nmero de veces que produce una
Me nsaje s: 5113 transicin de bajo a alto en la patita T0CKI. El valor del contador se
incrementar una vez por cada dos transiciones, y al detectarse 10
cambiamos el estado del Led conectado a RB0.

C um ulonim bus

Diagrama de Flujo:

Cdigo: (asm)

www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 30/31
03/06/13 Mis primeros programas con PIC16F84A y PIC16F628A
; **** Encabezado ****
list p=16F84A
#include P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;**** Definicion de variables ****
Contador equ 0x0C ; Contador para detectar 4 desbordes de TMR0.-
W_Temp equ 0x0D ; Registro para guardar temporalmente W.-
STATUS_Temp equ 0x0E ; Registro para guardar temporalmete STATUS

Led equ 0 ; Definimos Led como el bit cero de un registro, e

;**** Inicio del Micro ****


Reset
org 0x00 ; Aqu comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
;**** Vector de Interrupcion ****
org 0x04 ; Atiendo Interrupcion.-
goto Inicio_ISR

; **** Programa Principal ****


;**** Configuracion de puertos ***
org 0x05 ; Origen del cdigo de programa.-
Inicio
bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
movlw b'11111110' ; RB0 como salida.-
movwf TRISB
movlw b'00100000' ; Se selecciona TMR0 modo Contador, transicion positiva
movwf OPTION_REG ; y preescaler de 1/2.-
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
bcf PORTB,Led ; El Led comienza apagado.-
movlw 0xFB ; Cargamos 251 en TMR0 para contar 10 pulsos en RA4/TOCKI.-
m ovwf TM R 0
TMR 0 Modo C ontador.rar (87.16 KB - de scargado 779 ve ce s.)
movlw b'10100000' ; Habilitamos GIE y T0IE (interrupcin del TMR0)
movwf INTCON
En lne a
;**** Bucle ****
Bucle
Je ss dijo, yo soy e l C AMINO , la VER DAD y la VIDA, nadie lle ga al PADR E si no e s por m i.
nop ; Aqui el micro puede ejecutar cualquier otra tarea
goto Bucle ; sin necesidad de utilizar tiempo en un bucle de demora.-

Pginas: [1] 2 3 Ir Arriba IM P RIM IR

anterior prximo
;**** Rutina de servicio de Interrupcion ****

;---> Aqui haremos copia de respaldo para mostrar como se hace aunque no es
Ir ; =>
a:nec Tutoriales,
esario ya que eguias y cursos
l micro no haceen
otruControl
a tarea mientras tanto <--- ir
; Guardado de registro W y STATUS.-
Inicio_ISR
movwf W_Temp ; Copiamos W a un registro Temporario.-
swapf STATUS, W ;Invertimos los nibles del registro STATUS.-
Powe
movw re
fd by
STASMF 1.1.18
TUS_Temp | SMF
; Gu 2011,
ardamos SSim
TATple
US eMachine
n un resgistro temporal.-
;**** Interrupcion p SMFAds for
or TMR0 **** Free Forums
ISR
btfss INTCON,T0IF ; Consultamos si es por TMR0.-
Pgina cre adageon
to0.113
Fise
n_gundos
ISR con 25
;Nconsultas.
o, entonce(Pre
s retty
staUR
urLs adds
amos 0.022s,
valores.- 3q)
btfss PORTB,Led ; Si, Controlamos Led.Si esta apagado, prendo y viseversa.-
goto Prendo_led
bcf PORTB,Led ; Apago Led.-
Actualizo_TMR0 ; Cargamos 251 en TMR0 para contar 10 pulsos en RA4/TOCKI.-
movlw 0xFB ; d'251'
movwf TMR0
bcf INTCON,T0IF ; Borro bandera de control de Interrupcion.-
goto Fin_ISR ; Restauro valores.-
Prendo_led
bsf PORTB,Led ; prendo Led.-
goto Actualizo_TMR0
; Restauramos los valores de W y STATUS.-
Fin_ISR
swapf STATUS_Temp,W ; Invertimos lo nibles de STATUS_Temp.-
movwf STATUS
www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 31/31

Das könnte Ihnen auch gefallen