lunes, 14 de julio de 2014

Aprenda a programar ud mismo



CONCEPTOS BASICOS PARA LA PROGRAMACION DE PICS.
“LA CONSTANCIA VENCE LO QUE LA DICHA NO ALCANZA”

EL SIGUIENTE DOCUMENTO PRETENDE HACER SENCILLO EL PRIMER ACERCAMIENTO AL CAMPO DE LA PROGRAMACION DE PICS, POR LO CUAL SE HACE USO DE UN LENGUAJE POCO TECNICO PARA UNA COMPRENSION MAS SENCILLA.

*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