CONCEPTOS BASICOS PARA LA
PROGRAMACION DE PICS.
“LA
CONSTANCIA VENCE LO QUE LA DICHA NO ALCANZA”
*PIC = CIRCUITO INTEGRADO
PROGRAMABLE
(MICROCHIP)
*QUE ES UN PROGRAMA?
ES UN CONJUNTO DE INSTRUCCIONES
INDIVIDUALES, QUE SE EJECUTAN SOLO
UNA A LA VEZ.
*QUE ES UN LENGUAJE DE
PROGRAMACION?
ES LA FORMA DE EXPRESAR LAS
INSTRUCCIONES DE LA PERSONA A LA
MAQUINA, LOS HAY:
-DE ALTO NIVEL: FACIL DE ENTENDER PARA
EL HUMANO PERO “DIFICIL” PARA LA
MAQUINA (PIC).
-DE BAJO NIVEL: FACIL PARA LA MAQUINA
(PIC)
PERO ALGO DIFICIL DE ENTENDER
PARA EL HUMANO.
-DE MAQUINA: EL QUE ALMACENA EL PIC
EN SU MEMORIA.
*DIAGRAMA DE FLUJO: ES UNA
FORMA
GRAFICA DE MOSTRAR LA SECUENCIA EN
QUE SE DESARROLLARAN LAS
INSTRUCCIONES.
*EDITAR: ESCRIBIR LAS
INSTRUCCIONES.
*COMPILAR: ES PASAR NUESTRAS
INSTRUCCIONES DADAS EN LENGUAJE DE
ALTO O BAJO NIVEL A LENGUAJE DE
MAQUINA.
*ASSEMBLER: ENSAMBLADOR;
LENGUAJE DE
BAJO NIVEL.
*BINARIO: SISTEMA DE
NUMERACION
BASADO EN SOLO DOS SIMBOLOS (0 Y 1).
*HEXADECIMAL: SISTEMA DE
NUMERACION
BASADO EN 16 SIMBOLOS (0-9 Y A-F).
*BIT: REGISTRO DE UN SOLO
SIMBOLO (0/1).
DONDE b0 PUEDE SER 0 o 1.
*BYTE: REGISTRO DE OCHO BITS.

*REGISTRO: ES UN “CASILLERO” DE
UN BYTE
DE LONGITUD, UBICADO EN LA MEMORIA
DE NUESTRO PIC DONDE PODEMOS
ALMACENAR VALORES.
*REGISTRO DE TRABAJO: “W”, REGISTRO
QUE PUEDE MODIFICAR NUESTRO CODIGO
DE MANERA DIRECTA.
*BANCO: CONJUNTO DE
REGISTROS, ANTES
DE HACER USO DE UN REGISTRO
ESPECIFICO DEBEMOS VERIFICAR QUE
ESTAMOS UBICADOS EN SU RESPECTIVO
BANCO DE MEMORIA O TRABAJO.
*BANDERA: BIT QUE SE CARGA CON
1
CUANDO SE PRESENTA UNA SITUACION
ESPECIFICA.
*VARIABLE: VALOR NUMERICO QUE
SE
MODIFICA CON LA EJECUCION DE UNA O
MÁS INSTRUCCIONES.
*DESBORDAMIENTO: ES CUANDO LA
VARIABLE QUE NECESITAMOS GUARDAR ES
MAYOR QUE EL REGISTRO DONDE LA
GUARDAREMOS (NO CABE).
*WATCH DOG: O PERRO GUARDIAN,
NOS
INDICA CUANDO HUBO UN
DESBORDAMIENTO EN ALGUNO DE LOS
REGISTROS, GENERANDO ASI UNA
INTERRUPCION.
*SEÑAL DE RELOJ: SEÑAL
PULASANTE
NECESARIA PARA QUE NUESTRO PIC
TRABAJE.
*OSCILADOR/CRISTAL: ES QUIEN
GENERA LA
SEÑAL DE RELOJ.
*INTERRUPCION: ES UNA SEÑAL
ESPECIFICA
QUE RECIBE NUESTRO PIC Y LE INDICA QUE
DEBE DETENERSE Y PASAR A EJECUTAR
UNAS
INSTRUCCIONES DEFINIDAS
PREVIAMENTE POR NOSOTROS, LA
INTERRUPCION PUEDE SER EXTERNA (PIN) O
INTERNA (CAMBIO EN UN REGISTRO)
*PUERTO: PINES A TRAVES DE LOS
CUALES SE
MUESTRA EL VALOR DE UN REGISTRO.
*PUNTERO: EL QUE SEÑALA O APUNTA
A LA
INSTRUCCIÓN QUE SE ESTA EJECUNTANDO
EN UN INSTANTE DETERMINADO.
*RUTINA: CONJUNTO DE
INSTRUCCIONES
ESCRITAS PARA
CUMPLIR UNA FUNCION
ESPECIFICA.
*RESET: ES LLEVAR EL APUNTADOR
AL INICIO
DEL CODIGO, OBLIGANDO AL PIC A
REINICIAR LA EJECUCION DEL CODIGO
DESDE EL PRINCIPIO.
PASOS BASICOS:
UN PIC TIENE DIFERENTES PINES,
MODULOS INTERNOS Y FORMAS DE OBTENER LA SEÑAL DE RELOJ, ES POR ESO QUE AL INICIAR LA EDICION DE NUESTRO CODIGO,
DEBEMOS INDICAR CUALES PINES VAMOS A USAR COMO ENTRADAS Y COMO SALIDAS, ACTIVAR
O DESACTIVAR LOS MODULOS QUE USAREMOS, DEFINIR COMO OBTENDREMOS LA SEÑAL DE
RELOJ, QUE TIPOS DE INTERRUPCION MANEJAREMOS, ENTRE OTROS.
DEBEMOS DEFINIR LAS VARIABLES QUE DENTRO DEL CODIGO
UTILIZAREMOS, ESTO SE HACE ASIGNANDOLE A
CADA UNA UN REGISTRO ESPECIFICO DEL PIC.
LA DIRECCION DE LAS FLECHAS
INDICAN SI EL PIN ES DE SALIDA O ENTRADA, O AMBOS.
GP0-GP5: PIN DE DATOS.
VDD-VSS: PINES DE
ALIMENTACION.
CLKIN-CLKOUT: ENTRADA–SALIDA
PARA LA SEÑAL DE RELOJ.
MCLR: PIN DE RESET.
AL EMPEZAR LA ESCRITURA DE NUESTRO
CODIGO:
PRIMERO: DEBEMOS INDICAR LA REFERENCIA
DEL PIC QUE USAREMOS, PARA PODER COMPILARLO.
SEGUNDO: CONFIGURAMOS EL PIC,
ACA LE INDICAMOS SI QUEREMOS PROTEGER NUESTRO CODIGO Y DATOS QUE ALMACENEMOS EN
LA MEMORIA, O SI PERMITIREMOS QUE
CUALQUIERA TOME EL PIC QUE PROGRAMAMOS Y EXTRAIGA LA INFORMACION QUE ALLI
DEJAMOS. INDICAMOS AL PIC CUANDO DEBE APLICAR UN RESET. SI HABILITAREMOS EL
WATCH DOG, Y DE DONDE OBTENDREMOS LA SEÑAL DE RELOJ.
TERCERO: DEFINIMOS LAS
VARIABLES QUE USAREMOS, ASIGNADOLES UN REGISTRO A CADA UNA. ALGUNAS
VARIABLES VIENEN DEFINIDAS PREVIAMENTE
POR EL FABRICANTE, EJEMPLO DE ESTO SON LOS PUERTOS DEFINIDOS COMO: GPIO, PTOA.
GPIOA ENTRE OTRAS.
CUARTO: SEÑALAMOS APARTIR DE
QUE DIRECCION (EN LA MEMORIA DEL PIC) EMPEZAREMOS A ECRIBIR EL CODIGO.
QUINTO: SI HABILITAMOS INTERRUPCIONES, LAS INSTRUCCIONES QUE SE
EJECUTARAN CUANDO ESTA SE PRESENTE INICIAN EN LA DIRECCION 004 DEL BLOQUE DE
MEMORIA DEL PIC. DEBEMOS TENER EN
CONSIDERACION ESTO.
DUARANTE EL DESARROLLO DE
NUESTRO CODIGO, DEBEMOS CONSIDERAR; CUANDO EL MISMO LO REQUIERA (RETARDOS DE
TIEMPO DE PRECISION) QUE UNA INSTRUCCIÓN SENCILLA SE EJECUTA EN UN TIEMPO
EQUIVALENTE A UN CICLO DE MAQUINA, (LAS DE SALTO GASTAN DOS CICLOS DE MAQUINA)
Y QUE UN CICLO DE MAQUINA EQUIVALE A CUATRO CICLOS DE LA SEÑAL DE RELOJ. EN LA
PRACTICA SI NUESTRA SEÑAL DE RELOJ ES DE 4MHZ SE TIENE:
FR= 4.000.000HZ
PR= 1/FR
PR= 0,000.000.25 SEG
PR= 0,25 MICROSEGUNDOS
FR = FRECUENCIA DE RELOJ
(HERZT)
PR = PERIODO DE RELOJ (SEGUNDOS,
TIEMPO QUE DURA UN CICLO DE RELOJ)
ENTONCES COMO UN CICLO DE
MAQUINA ES CUATRO VECES UNO DE RELOJ SE TIENE QUE:
PM = 0,000.001 SEG
PM = 1 MICROSEGUNDO
LO ANTERIOR INDICA QUE PARA LA
EJECUCION DE UNA INSTRUCCIÓN SIMPLE, NUESTRO PIC GASTARA 1USEG, Y PARA UNA INSTRUCCIÓN DE SALTO (GOTO O CALL)
GASTARA 2USEG.
INSTRUCCIONES
BASICAS.
PARA LA PROGARAMACION DE PIC,
EN TODA SU GAMA, SOLO SE MANEJAN 35 INSTRUCCIONES DIFERENTES, ACA PRESENTO LA
DESCRIPCION DE ALGUNAS.
EQU: PARA ASIGNACION DE REGISTROS.
TIEMPO
EQU 0X20; SEA TIEMPO EL
NOMBRE DE NUESTRA VARIABLE, ENTONCES
CADA VEZ QUE MODIFIQUEMOS EL “TIEMPO” EL
NUEVO VALOR SE ALMACENARA EN EL REGISTRO
NUMERO 20 DE NUESTRO PIC.
ORG: DEFINE A CUAL DIRECCION SEÑALARA NUESTRO
PUNTERO.
ORG
0X004; OSEA NUESTRO
PUNTERO SE UBICARA EN LA DIRECCION 004 DE PIC.
MOVLW: MUEVE UNA VALOR DEFINIDO AL REGISTRO “W”
MOVLW
B’00110011’: ALMACENO EL VALOR ‘00110011’ DEFINIDO EN BINARIO, EN
EL REGISTRO “W”.
MOVWF: MUEVO EL VALOR ALMACENADO EN EL
REGISTRO”W” AL REGISTRO QUE DEFINAMOS.
MOVWF
GPIO: MUEVO EL VALOR ALMACENADO EN EL REGISTRO”W” AL REGISTRO GPIO. SI CONSIDERAMOS QUE HABIAMOS
ALMACENADO “00110011” EN “W”
ENTONCES EN GPIO TENDREMOS
“00110011”.
NOP: NO HACE NADA, SOLO GASTAMOS
UN CICLO DE MAQUINA.
BCF REGISTRO,BIT_N; COLOCO UN CERO EN EL BIT_N DEL REGISTRO.
BSF REGISTRO,BIT_N; COLOCO UN SET(UNO) EN EL BIT_N DEL REGISTRO.
BCF GPIO, 2: COLOCO UN CERO EN
EL BIT NUMERO 2 DEL REGISTRO GPIO.
CALL: LLAMA UNA RUTINA
CALL RETARDO: LLAMO LA RUTINA
DEFINIDA COMO RETARDO.
RETURN: PERMITE RETORNAR DE UNA
RUTINA AL PUNTO DEL CODIGO DONDE SE ENCONTRABA CUANDO FUE LLAMADA.
DECFSZ REGISTRO, DIRECCION;
DECREMENTO REGISTRO EN UNO, Y
ALMACENO RESULTADO EN REGISTRO W SI DIRECCION ES CERO O EN EL MISMO REGISTRO SI
DIRECCION ES UNO.
INCFSZ REGISTRO,
DIRECCION;
INCREMENTO REGISTRO EN UNO, Y ALMACENO
RESULTADO EN REGISTRO W SI DIRECCION ES CERO O EN EL MISMO REGISTRO SI
DIRECCION ES UNO.
DECFSZ
TIEMPO,1; DECREMENTO LA
VARIABLE TIEMPO EN 1 Y ALMACENO RESULTADO EN LA MISMA VARIABLE TIEMPO.
CLRF REGISTRO; CLAREA O LIMPIA
EL REGISTRO.
GOTO: SALTO A UNA LINEA ESPECIFICA DEL CODIGO.
AHORA ESCRIBAMOS NUESTRO PRIMER CODIGO, ESTE PERMITIRA QUE UN
LED PARPADEE.
;
***********************************************************
list p=12f675 ; usare PIC 12F675
#include <p12f675.inc>
__CONFIG _CPD_OFF
& _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON
& _INTRC_OSC_NOCLKOUT
; Configuramos el pic
; _CP_OFF PROTECCION DE CODIGO DESACTIVADA
; _CPD_OFF PROTECCION DE DATOS DESACTIVADA
; _BODEN_OFF RESET POR BROWN_OUT DESACTIVADA,
RESET APLICADO SI SE BAJA VDD
; _MCLRE_OFF RESET POR PIN EXTERNO DESACTIVADO
; _WDT_OFF WATCH DOG DESACTIVADO
; _PWRTE_ON RETRASO AL RESET ACTIVADO, MATIENE
RESET MIENTRAS SE ESTABILIZA VDD
; _INTRC_OSC_NOCLKOUT OSCILADOR INTERNO ACTIVADO
;
-------------------------------------------------------
; Declaración de variables
globales.
; -------------------------------------------------------
count1 equ 0x20
count2 equ 0x21
count3 equ 0x22
;
-------------------------------------------------------
; Acá apuntara el vector PCL
cuando se de reset o se energice el pic.
; -------------------------------------------------------
org 0x00 ;
llevamos el puntero a la
Dirección 00 del
pic.
goto cuerpo ; saltamos a la línea llamada
“cuerpo”
; -------------------------------------------------------
cinco
;
-------------------------------------------------------
; retardo de cinco segundos
;
-------------------------------------------------------
Nop ;
consumimos un ciclo de instrucción
decfsz count1,f
; decremento el primerm
contador
goto cinco ;
regreso a cinco si count1
no es cero
movlw 0xff ; recargo el primer contador
movwf count1
decfsz count2,f
; decremento el segundo
contador
goto cinco ; regreso a cinco si count2
no es cero
movlw 0xff
; recargo count2
movwf count2
decfsz count3,f
; decremento el
tercer
contador
goto cinco ; saltare cuando count3 sea
cero
movlw 0x04 ;
este valor
movwf count3
return
;
--------------------------------------------------------
cuerpo
; -------------------------------------------------------
; en este punto se entra al
cuerpo del código.
;
-------------------------------------------------------
; inicializo los contadores de
retardos
movlw 0xff
movwf count1
movwf count2
movlw 0x11
movwf count3
; inicializo GPIO
bsf
STATUS,RP0 ;
entro al bank 1
movlw B'00001100'
movwf TRISIO ; configuro todos
los pines del pic
como salidas
call 3FFh ;
excepto gpo2 y gpo3
movwf OSCCAL
; calibro oscilador interno
con valor
de fabrica
clrf ANSEL ; los puertos trabajaran
solo señales
digitales
bcf STATUS,RP0 ; entro al bank 0
movlw b'00010000'
movwf
INTCON ; habilito las
interrupciones
movlw 07h
movwf
CMCON ; apago los comparadores
clrf GPIO ;
inicializo GPIO
ciclo
call cinco
movlw
b'00000001' ; prendo el led
movwf GPIO
call cinco
bsf
GPIO,0 ; apago el led
goto ciclo
end
EMPEZANDO LA
EDICION
PARA LA EDICION DE NUESTROS
CODIGOS, ES NECESARIO HACER USO DE UN SOFTWARE (MPLAB), ESTE NOS ES
SUMINISTRADO POR MICROCHIP, ACA DEJO LAS
PAUTAS BASICAS PARA NUESTRO PRIMER PROYECTO.
PARTIENDO DEL HECHO QUE YA LO
DESCARGAMOS DE LA RED Y SE ENCUENTRA INSTALADO EN NUESTRO PC, DAMOS CLIC EN EL
ICONO
SEGUIDAMENTE DEBERA APARECER
ESTA VENTANA.
PARA LLEGAR A NUESTRO OBJETIVO
FINAL QUE NO ES OTRO QUE LA PROGRAMACION
DE UN PIC, DEBEMOS ENTENDER QUE
NO BASTA CON ESCRIBIR EL CODIGO, SE DEBE DESARROLLAR TODO UN “PROYECTO”,
MEDIANTE EL CUAL A PARTIR DE NUESTRO CODIGO GENERA DIFERENTES ARCHIVOS, ENTRE
LOS QUE SE ENCUENTRA UN ARCHIVO .HEX, QUE ES EL QUE PLASMAREMOS EN LA MEMORIA
DEL PIC.
UNA VEZ VEAMOS EN PANTALLA LA
VENTANA DEL ENTORNO MPLAB IDE (FIGURA 7) DAMOS CLICK SOBRE LA PESTAÑA “proyect/proyect
wizard/next”. EN ESTE PUNTO SELECCIONAMOS EL PIC CON EL CUAL
TRABAJAREMOS, PARA ESTA GUIA EL 12F675.
SELECCIONADO EL PIC DE TRABAJO
DAMOS CLICK EN siguiente, LA VENTANA MOSTRADA (FIGURA 8) VISUALIZARA LAS
HERRAMIENTAS QUE EL PROYECTO USARA PARA LA EDICION Y COMPILACION, SI NO
APARECEN DEBERA VERIFICAR Y REDIRECCIONAR LA CARPETA QUE CONTIENE DICHAS
HERRAMIENTAS
DAMOS CLICK EN siguiente
Y DEBEREMOS INDICAR LA CARPETA DONDE GUARDAREMOS NUESTRO PROYECTO, POR
INDICACIONES DEL FABRICANTE ESTA
CARPETA DEBERA ESTA “CERCA” DE LA UNIDAD C, PARA DESARROLLO DE ESTA GUIA SE
CREO UNA CARPETA EN LA UNIDAD C LLAMADA “PROYECTOS” Y EN ESTA SE CREO LA
CARPETA DE NUESTRO PROYECTO LA CUAL SE
LLAMO “PARPADEO”. DE IGUAL FORMA SE DEBERA DAR NOMBRE AL PROYECTO,
PERSONALMENTE RECOMIENDO DARLE EL MISMO NOMBRE DE LA CARPETA, OSEA PROYECTO. SE
OBSERVARA EL PATALLAZO DE LA FIGURA 9.
EL SOFTWARE DA LA OPCION DE
AÑADIR A NUESTRO PROYECTO ARCHIVOS DE CODIGO YA EXISTENTES, DAR CLICK EN siguiente,
Y LUEGO EN finalizar.
EN ESTE PUNTO ESTAMOS LISTOS
PARA EMPEZAR LA EDICION DEL CODIGO. OBSERVAREMOS EL PANTALLAZO DE LA FIGURA 10,
DAR CLICK EN “file/new”, Y EMPECEMOS NUESTRO CODIGO, TERMINADA LA EDICION DAR
CLICK EN GUARDAR (EN LA CARPETA PARPADEO), DEBEMOS INDICAR EL NOMBRE QUE
DAREMOS AL CODIGO, PERSONALMENTE RECOMIENDO SEGUIR CON “PARPADEO” PERO DEBEMOS
AGREGARLE LA EXTENSION “.ASM” INDICANDO QUE ESTE ES UN CODIGO “ASSAMBLER” (ENSAMBLADOR).
NOTA: MI RECOMENDACIÓN DE USAR SIEMPRE EL MISMO NOMBRE
PARTE DEL HECHO QUE ESTAMOS HABLANDO DE LA MISMA INFORMACION, PERO EN
DIFERENTES “PRESENTACIONES”, SOLO CAMBIA LA EXTENSION.
PARA QUE NUESTRO CODIGO SEA
COMPILADO, DEBEMOS ANEXARLO AL PROYECTO, PARA ESTO DAMOS CLICK EN LA
PESTAÑA “view/proyect” Y SE
VISUALIZARA LA SIGUIENTE VENTANA:
EN “source files” DAMOS CLICK
DERECHO, APARECE “add files” Y ESCOGEMOS EL ARCHIVO “PARPADEO.ASM”
NOTA: CUANDO
ESTEMOS ESCRIBIENDO EL CODIGO, AL INICIO DE CADA LINEA (REGLON) SE DEBE
DEJAR UN ESPACIO, CUANDO LO QUE ESCRIBAMOS SEA UN COMENTARIO O ACLARACION, (NO
INSTRUCCIÓN) SE DEBE EMPEZAR POR UN “;” PARA NO GENERAR ERRORES DURANTE LA
COMPILACION.
UNA VEZ EDITADO Y ADICIONADO
AL PROYECTO, SE DEBERA COMPILAR EL CODIGO MEDIANTE LA PESTAÑA “proyect/build
all” O “CTRL+F10”, SI TODO MARCHA BIEN SALDRA UNA LINEA VERDE SEGUIDA
DEL MENSAJE “BUILD SUCCEEDED”
DE LO CONTRARIO SALDRA EN LETRAS ROJAS “BUILD FAILED”.
EN CASO DE PRESENTARSE ERRORES
REVISAMOS EL ACHIVO “PARPADEO.ERR” CONTENIDO EN LA CARPETA DEL PROYECTO DONDE
SE INDICARAN LAS UBICACIONES DE LOS ERRORES PRESENTADOS Y ALGUNAS ADVERTENCIAS
QUE PERMITIRIAN MEJORAR NUESTRO CODIGO
“QUEMANDO” EL
PIC
“QUEMANDO” HACE REFERENCIA A LA INSTALACION DEL CODIGO EN LA MEMORIA DEL PIC, PARA ESTO
RECURRIMOS A OTRO SOFTWARE, EL “PICKIT2” Y A SU TARJETA DE PROGRAMACION. LA
CUAL CONECTAMOS AL PC MEDIANTE PUERTO USB, DAMOS CLICK EN EL RESPECTIVO ICONO.
EN LA VENTANA MOSTRADA EN LA
FIGURA 11 DAMOS CLICK EN LA PESTAÑA “tool/check communication”, AUTOMATICAMENTE DEBERA RECONOCER NUESTRO
PIC, SI NO ES ASI PODREMOS DARLE LA OPCION “tool/use vpp first program entry”
Y NUEVAMENTE CHEQUEAMOS COMUNICACIÓN.
AL OBSERVAR LA REFERENCIA DE
NUESTRO PIC EN LA LINEA “DEVICE”
DAMOS CLICK EN “auto import hex + write device”
Y ESCOGEMOS EL ARCHIVO “PARPADEO.HEX”
Y HEMOS PROGRAMADO NUESTRO PIC,
SE VERA LA SIGUIENTE VENTANA
INDICANDO QUE HEMOS LOGRADO
NUESTRO OBJETIVO
POR: OSCAR AMAYA MERCHAN
BOGOTA - 25/09/2103












