mis primeros programas con pic16f84a y pic16f628a.pdf

Upload: eduardo-ayala

Post on 29-Oct-2015

1.416 views

Category:

Documents


13 download

TRANSCRIPT

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 1/31

    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

    INIC IO A YUDA BUSCAR INGRESAR REGISTRARSE

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

    Pginas: [1] 2 3 Ir Abajo

    anterior prximo

    IMPRIMIR

    AutorTema: Mis primeros programas con PIC16F84A y PIC16F628A (Ledo 115761veces)

    0 Usuarios y 2 Visitantes estn viendo este tema.

    Leon PicModeradordsPIC

    Desconectado

    Sexo: Mensajes: 5113

    Cumulonimbus

    Mis primeros programas con PIC16F84A y PIC16F628A : Marzo 30, 2009, 12:45:48

    Este tutorial, est creado porSuky en el foro de Todopic.

    Por pedido de l, voy a subir en nombre de l, este magnfico curso y lo iractualizando a la par.

    Por favor, si tienen comentarios o sugerencias, hacerlas en este hilo creadoespecialmente para ello, a fin de mantener este "limpio" y facil de leer.

    Mis primeros programas. PIC16F84A

    y PIC16F628A

    EL PIC16F84ALa idea de este tutorial es ayudar a los que recin estn empezando, aqumostraremos como comenzar. Usaremos en primer lugar el microcontroladorPIC16F84A, porque es el que por lo general se usa en la enseanza.Comenzaremos explicando como esta constituido, los terminales, manejo decorrientes de los puertos, osciladores externos, circuito de reset, memoria deprograma y memoria de datos. Luego iremos a lo interesante, que es laprogramacin, nuestros primeros programitas, de los cuales se tratar deexplicarlos detalladamente, el funcionamiento y los registros que se usan encada caso.-Se abarcaron los temas como:

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 2/31

    Mi Primer Programa, control de un ledCreacin de Demoras, Led titilandoCreacin de Tablas, Control Display 7 SegmentosDireccionamiento Indirecto, Control Display 7 SegmentosControl de varios Displays 7 SegmentosInterrupciones, Registros y guardado temporario de STATUS y WInterrupcin TMR0, modo TemporizadorInterrupcin TMR0, modo ContadorInterrupcin RB0, Control de LedInterrupcin RB4 a RB7, Control Teclado MatricialControl del LCD, Pantalla de Cristal LiquidoComunicacin RS232

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

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

    IntroduccinTimer1 + EjemploTimer2 + EjemploMdulo de comunicacin serie (Usart) + EjemploComparadores analgicos + EjemploIntroduccin Mdulo CCPModo CapturaModo ComparadorModo 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 ysimular. Un programador de PIC sencillo que pueden armar (Programador

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 3/31

    JDM Serial)(circuito, PCB para hacer la plaqueta y una pequeaexplicacin de cmo grabar con WinPIC800) y un tutorial para crear placasde 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

    DATASHEETSDATASHEET del PIC16F84A DATASHEET del PIC16F628A

    ConfigPIC: Software utilitario para crear automticamente el cdigo deconfiguracin de estos PICs, adems de tener otras herramientas que nospermite calcular temporizaciones, Baud Rate, PWM, etc.

    [/list]

    16f84aGif.gif (12.7 KB - descargado 63016 veces.)

    ltima modificacin: Octubre 29, 2009,10:46:53 por Suky En lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Desconectado

    Sexo: Mensajes: 5113

    Cumulonimbus

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #1 : Marzo 30, 2009, 12:49:24

    PIC16F84A

    IntroduccinEl PIC16F84A esta fabricado en tecnologa CMOS, posee memoria FLASH, yconsumo bajo de potencia. Est compuesto bsicamente de una memoriaROM (1024 palabras de memoria de programa), una memoria RAM (de accesoaleatorio, 68 bytes), lneas de entrada y salida (2 Puertos) y una lgica decontrol que coordina la interaccin de los dems bloques.Estos micros pertenecen a la gama media y dispones de un set de 35instrucciones, tipo RISC (Computador con Set de Instrucciones Reducido)pocas pero muy poderosas.-

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 4/31

    Algunas funciones especiales que dispone este PIC:Temporizador programable (Timer). Si se quiere medir periodos detiempo entre eventos, generar temporizaciones o salidas confrecuencia especfica, etc.Perro Guardin o Watchdog. Consiste en un temporizador que, cuandose desborda ya pasa por 0, provoca un reset automtico, utilizadopara sistemas que no tienen control de un supervisor, y al bloquearseel micro se resetea. Si se utiliza el cdigo debe resetearlo antes de quese desborde.Memoria EEPROM de 64 bytes, para guardar datos que no se alteran apesar de quitar la alimentacin.Interrupciones, cuando una seal externa, o una condicin internaactiva una lnea de interrupcin, dejando de lado la tarea que estaejecutando, atiende dicha interrupcin y luego contina con lo queestaba haciendo.Proteccin ante fallo de alimentacin. Se trata de un circuito queresetea al micro cuando el voltaje Vdd es inferior al mnimo.Estado de bajo consumo. Sleep. Si el micro debe esperar mucho tiemposin hacer nada, posee una instruccin especial, Sleep, que lo pasa alestado de reposo. Al activarse una interrupcin se despierta yreanuda 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 ysalidas, y consta de 18 pines los cuales se encuentran asignados de lasiguiente manera:

    El puerto A tiene solo cinco pines, el pin 3, sea, RA4/TOCKI puede serconfigurado a su vez como entrada/salida o como temporizador/contador.Cuando es salida se comporta como colecto abierto, por lo tanto debemosponer una resistencia Pull-up a Vdd de 1 Kohm. Cuando se configura comoentrada, funciona como disparador Schmitt Trigger por lo que puedereconocer 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. Lospines RB4 a RB7 pueden programarse para responder a interrupciones porcambio de estado y los pines RB6 y RB7 se corresponden con lneas deentrada de reloj y entrada de datos cuando esta en modo programacin.MCLR/Vpp, es la entrada de reset si esta a nivel bajo, tambin eshabilitador de tensin de programacin. Cuando su tensin es Vdd el PICfunciona normalmente.Vss y Vdd, son los pines de masa y alimentacin. La tensin de alimentacinesta comprendida entre los 2 y 5.5 Volt.OSC1/CLKIN y OSC2/CLKOUT, pines de entrada externa de reloj y salidade oscilador a cristal respectivamente.-

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 5/31

    Capacidad de corriente de los puertos.La mxima capacidad de corriente de cada uno de los pines de los puertos enmodo sumidero es de 25 mA y modo fuente de 20 mA. La mxima capacidadde 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 quedebe trabajar. Puede utilizar cuatro tipos distintos:RC, Oscilador con resistencia y condensador (Poco preciso)XT, Cristal de cuarzo.HS, Cristal de alta velocidadLP, Cristal de baja frecuencia y bajo consumo de potencia.Al momento de programar un micro se debe especificar que tipo de osciladorse usa.Internamente la frecuencia del oscilador es dividida por 4, as que si temeosun oscilador de 4 MHz, la frecuencia de trabajo es de 1 MHz, por lo que cadainstruccin se ejecuta cada 1 us.Aqu utilizaremos un cristal XT de 4 MHz que debe ir acompaado de doscondensadores:

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

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 6/31

    ltima modificacin: Julio 30, 2009, 02:20:20por Suky En lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Desconectado

    Sexo: Mensajes: 5113

    Cumulonimbus

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #2 : Marzo 30, 2009, 12:50:02

    Estructura interna del Microcontrolador.Arquitectura del PIC, existen dos arquitecturas, la clsica de Von Neumanny la arquitectura Harvard, esta ultima es la que usan los PICs. Dispone dedos memorias independientes, una que contiene solo instrucciones y la otrasolo contiene datos. Ambas disponen de sus respectivos buses de acceso yes posible realizar operaciones de acceso simultneamente en ambas.

    Memoria del programa. Aqu almacenamos nuestro programa o cdigo que debe ejecutar, en elPIC16F84A es FLASH, es rpida, de bajo consumo y alta capacidad dealmacenamiento. Se divide en 2048 posiciones, pero este PIC solo tieneimplementadas 1024 posiciones, de 0x00 hasta 0x3FF.

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 7/31

    Cuando ocurre un reset, el contador de programa (PC) apunta a la direccin0x00, y el micro inicia nuevamente. Aqu se debe escribir todo lo relacionadocon la iniciacin del mismo, por ejemplo configuracin de puertos, etc.Si ocurre una interrupcin PC apunta a la direccin 0x04, y aqu debemosescribir el cdigo necesario para atender a dicha interrupcin.Memoria RAM esttica. Donde se encuentran los 24 registros especficos (SFR) y 68 registros depropsito general (GPR). Se halla dividida en 2 Bancos de 128 bytes cadauno.

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 8/31

    Algo que se debe tener en cuenta es la pila o Stack, que consta de 8posiciones, cada posicin contiene la direccin y datos de la instruccin quese esta ejecutando, as cuando se ejecuta una llamada call o unainterrupcin, el PC sabe donde regresar. (Limitar las llamadas anidadas)

    En lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #3 : Marzo 30, 2009, 12:52:18

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkges 9/31

    Desconectado

    Sexo: Mensajes: 5113

    Cumulonimbus

    Comenzando con la creacin de nuestro cdigo:A continuacin vamos a desarrollar nuestro primer programa. Considero quese tiene conocimiento del lenguaje Assembler, si no es as se puede leer eltutorial ASM desde cero de este mismo foro.Este activar un led conectado a RB0 siempre que el interruptor conectado aRA0 este cerrado. Para ello vamos a necesitar el siguiente circuito:

    En RA0 tenemos conectado un pulsador de forma que cuando lo pulsemosse introduzca un cero lgico en el pin y cuando no lo pulsemos se introduzcaun uno lgico. Tenemos un Led con su correspondiente resistencia limitadorade corriente en el pin RB0.

    Diagrama de Flujo:

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 10/31

    Primero que nada debemos especificar con que microcontrolador estamostrabajando, 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 direccionesde los registros especficos, los bits utilizados en cada registro y los fusiblesdel micro.

    Configuracin de fusibles. Hay ciertos aspectos del PIC que han de seractivados o desactivados mediante hardware a la hora de programarlo. Estoquiere decir que no se pueden volver a cambiar hasta que el chip no sereprograme de nuevo. El PIC16F84A dispone de 4 fuses (los modelossuperiores tienen ms). Cada fuse activa o desactiva una opcin defuncionamiento.OSC: Este fuse controla el modo de oscilacin que usar el PIC parafuncionar. Como ya sabemos, el oscilador se puede configurar de 4 manerasdistintas, dependiendo de la velocidad y del tipo de circuito osciladorempleado.WDT: El famoso "perro guardin" del PIC se configura aqu. Esta es unacapacidad del microcontrolador de autorresetearse.PWRT: Si activamos este fuse, lo que conseguimos es que se genere unretardo en la inicializacin del microcontrolador.CP: Activando este fuse tendremos la garanta de que el cdigo queescribamos en el PIC no pueda ser ledo por otra persona, para que no nos locopien, modifiquen, etc. (Code Protection). Esto no impide que el PICfuncione como siempre, ni que no se pueda sobrescribir su contenidoCdigo: (asm)

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 11/31

    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

    Definicin de variables que utilizaremos en nuestro proyecto. En este casosolo definiremos bits, por ejemplo Led y Pulsador.Para organizar nuestro programa lo estructuraremos de la siguiente manera:Nivel Directiva Operandos ; ComentariosCdigo: (asm)

    ;**** Definicion de variables ****

    Led equ 0 ; Definimos Led como el bit cero de un registro, en este caso PORTB.-

    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 sequiere cambiar hay que configurarlos. Esto se realiza con los registros TRISAy TRISB, teniendo en cuenta que si se asigna un cero (0) a un pin, quedaracomo salida y si se asigna un uno (1), quedara como entrada.En nuestro caso se necesita colocar TRISA igual a 11111 (o se puede dejarpor default) y TRISB 11111110. Ahora bien, cuando el PIC arranca seencuentra 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 delregistro STATUS. Si este se pone un cero a RP0, estaremos en el Banco 0. Sise coloca un uno, estaremos en el Banco 1.Registro de trabajo W: es el registro ms importante que tiene elmicrocontrolador y es denominado ACUMULADOR. Este registro almacenatemporalmente uno de los datos que intervienen en la operacin de la Unidadlgica y Aritmtica (ALU). ALU como indica su nombre, realiza lasoperaciones aritmticas y lgicas previstas en el coleccin de instruccionesdel 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)

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 12/31

    ;**** 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 delpulsador, y segn su estado se encender o apagar el Led.-

    ltima modificacin: Julio 30, 2009, 02:23:57por Suky En lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Desconectado

    Sexo: Mensajes: 5113

    Cumulonimbus

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #4 : Marzo 30, 2009, 12:55:13

    Programa completo:Cdigo: (asm)

    ; **** Encabezado ****

    list p=16F84A

    #include P16F84A.inc

    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

    ;**** Definicion de variables ****

    Led equ 0 ; Definimos Led como el bit cero de un registro, en este caso PORTB.-

    Pulsador equ 0 ; Definimos Pulsador como el bit 0, en este caso sera para PORTA

    ;**** Configuracion de puertos ***

    Reset org 0x00 ; Aqui comienza el micro.-

    goto Inicio ; Salto a inicio de mi programa.-

    org 0x05 ; Origen del codigo 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.-

    ;**** 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

    Bueno aqu ya tenemos nuestro programita terminado, solo falta compilarlo ysimularlo para detectar errores, esto esta mnimamente explicado en eltutorial del Utilitario MPLAB adjuntado al principio.-Se adjunta el circuito realizado en Proteus para simulacin.-

    Control Led.rar (84.08 KB - descargado 1128 veces.)

    En lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #5 : Marzo 30, 2009, 12:56:37

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 13/31

    Desconectado

    Sexo: Mensajes: 5113

    Cumulonimbus

    Creacin de Demoras:

    Ciclo de maquina:

    Es la unidad bsica de tiempo que utiliza el microcontrolador y equivale a 4ciclos de reloj. sea, si tenemos un oscilador de 4 MHz, el ciclo de reloj seriade 250 ns y el ciclo maquina de 1 us.Las instrucciones del microcontrolador necesitan 1 ciclo maquina exceptoalgunas excepciones, como son los comandos que incluyen saltos (goto, call,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 cadainstruccin.-De manera que el nmero de ciclos de instruccin Tsub consumidos por larutina, incluyendo los 2 ciclos de la llamada (CALL) sernTsub = [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. Utilizandoun 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 serTsub = 2 + 1 + 1 + (0xXX)*[1 + 1 + (0xYY - 1)*(1 + 2) + 2 + 1 + 2] + [1 +1 + (0xYY - 1)*(1 + 2) + 2 + 2 + 2] ciclosLo cual se puede simplificar como sigueTsub = [0xXX*((0xYY - 1)*3 + 7) + 5] TcyEn este caso el mximo que se puede conseguir es de aprox. 196milisegundos.-Bueno ahora que se entiende como se realizan las demoras, les adjunto un

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 14/31

    programita que obtiene el cdigo necesario para una pausa, ingresando elvalor de la misma y la frecuencia del oscilador utilizado.-

    caldelay.zip (91.32 KB - descargado 705 veces.)

    ltima modificacin: Julio 30, 2009, 02:21:06por Suky En lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Desconectado

    Sexo: Mensajes: 5113

    Cumulonimbus

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #6 : Marzo 30, 2009, 12:57:40

    Ejemplo: En este ejemplo se explicar como calcular demoras. Se har titilar un ledconectado a RB0 siempre que el interruptor conectado a RA0 este cerrado. Diagrama de Flujo:

    Cdigo: (asm)

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 15/31

    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

    Led Titilando.rar (84.9 KB - descargado 713 veces.)

    En lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Desconectado

    Sexo: Mensajes: 5113

    Cumulonimbus

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #7 : Marzo 30, 2009, 01:00:03

    Creacin de Tablas: Control de un Display de 7 Segmentos.Un Display es una coleccin de Leds ubicados de forma estratgica. Si se losagrupa uniendo sus ctodos ser de CTODO COMUN, o bien agrupando susnodos, un Display de ANODO COMUN. Por otro lado estos Leds pueden ser fabricados en forma de Puntos oSegmentos, tal es as que se encuentran Display de 7 segmentos, como losde la imagen:

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 16/31

    El programa que realizaremos leer la cantidad de veces que se activa unpulsador y mostraremos el resultado. Conectaremos el Display en formadirecta, es decir conectando el puerto B del micro a los pines del Display, yluego encender cada uno de los segmentos del Display para visualizar el valorcorrespondiente. Para ello crearemos una tabla que contenga los distintoscdigos para el numero que necesitemos visualizar.

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

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 17/31

    Diagrama de Flujo:

    Antes de continuar tratare de explicar algunos registros importantes:El PC. Direccionamiento del programa: Especifica la direccin de lainstruccin que se ejecutar. Consta de 13 bits, con lo que es posibledireccionar hasta 8K palabras, pero en el 16F84A solo se implementa 1k.

    La parte alta del contador de programa (PCH) no se puede accederdirectamente, ella debe cargarse desde los 5 bits ms bajos del registrollamado PCLATCH (direccin 0x08).

    En la creacin de tablas, la posicin a leer de la misma se realiza con elcontrol del registro PCL. Este registro es de 8 bits, por lo que direcciona solo256 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 osi debemos manejar los bits mas significativos de PC [PCLATCH]).

    Para devolver el valor direccionado se utiliza retlw, esta instruccin devuelveun valor en el acumulador al retornar de una subrutina. La creacin de latabla 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 almacenaren la tabla.La estrategia a seguir para consultar algn valor de la tabla es cargar en elacumulador (W) la direccin de la tabla donde se encuentra el valor quequieres 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

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 18/31

    tabla, sino se estar ejecutando una instruccin errnea provocando un malfuncionamiento 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 PORTB

    ;**** 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

    retlw b'0000110' ; 1

    retlw b'1011011' ; 2

    retlw b'1001111' ; 3

    retlw b'1100110' ; 4

    retlw b'1101101' ; 5

    retlw b'1111101' ; 6

    retlw b'0000111' ; 7

    retlw b'1111111' ; 8

    retlw b'1101111' ; 9

    clrf Contador ; Si llega 10, se resetea contador

    retlw b'0111111' ; 0

    ;**** Programa principal ****

    ;**** Configuracin de puertos ****

    Inicio bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-

    movlw b'10000000' ; RB7 como entrada y los demas como salida.-

    movwf TRISB

    bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0

    movlw b'0111111' ; 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 ;

    movwf Contador1 ; Iniciamos contador1.-

    Repeticion1

    Una manera ms cmoda de escribir la tabla de instrucciones RETLW puedelograrse usando la directiva DT (Define Table) del ensamblador, la cual nospermite definir una tabla de datos que ser sustituida por una lista deinstrucciones RETLW; as, la tabla anterior puede quedar como sigue:Cdigo: (asm)

    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

    clrf Contador

    retlw 0x3F

    Control anti rebote:En el momento de presionar un botn pulsador o cualquier conmutadorelectromecnico es inevitable que se produzca un pequeo arco elctricodurante el breve instante en que las placas del contacto se aproximan o sealejan de sus puntos de conexin.

    La duracin de este depende de la calidad de los switches y la velocidad de

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 19/31

    accionamiento, pero no dura ms de 20 milisegundos. Se adjunta simulacin.-

    Control Display 7 Segmentos.rar (95.19 KB - descargado 951 veces.)

    ltima modificacin: Julio 30, 2009, 02:29:22por Suky En lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Desconectado

    Sexo: Mensajes: 5113

    Cumulonimbus

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #8 : Marzo 30, 2009, 01:00:50

    Otra forma de crear una tabla. Direccionamiento Indirecto.-En la programacin de los microcontroladores PIC la mayora de lasinstrucciones emplean direccionamiento directo, pero tambin es posible queoperen en un modo de direccionamiento directo. Para el direccionamientoindirecto se emplean dos registros especiales: el FSR y el INDF (este ultimono es un registro fsico). El registro FSR se emplea para sealar o apuntara una direccin de la memoria RAM cuyo contenido puede ser ledo o escritode forma indirecta empleando cualquier instruccin que use como operando alregistro INDF.Esta forma de direccionamiento es particularmente til cuando se manejantablas 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 ;

    movwf FSR ; Direccionamos Registro de datos ubicado en 0x10.-

    movfw INDF ; Movemos el valor que tenga el registro seleccionado a W.-

    movwf PORTB ; Por ejemplo, lo cargamos en PORTB.-

    Utilizaremos el direccionamiento Indirecto para crear la tabla de control delDisplay. Aqu no utilizaremos el pulsador, solo se har el contador automticode 0 a 9.- Al iniciar el microcontrolador cargaremos el cdigo de 7 Segmentospara controlar el Display en la memoria de Datos con direccionamientoindirecto. Luego, al realizar el conteo leeremos el cdigo correspondiente almacenado ylo enviaremos al PORTB.-

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 20/31

    Aqu utilizamos el registro STATUS nuevamente, pero para control de lasoperaciones aritmticas. Nosotros guardaremos el cdigo de 7 Segmentos del0 al 9, en los registros 0x10 a 0x19. Si nuestro contador nos direcciona elregistro ubicado en 0x1A, que seria el 10, lo reseteamos y direccionamos el0, sea registro 0x10. Esto lo hacemos realizando la resta del registroseleccionado y 0x1A, FSR 0x1A, y si el resultado es cero, reseteamos.El bit Z (Zero) del registro STATUS, este indica si una operacin lgica oaritmtica realizada da como resultado cero. Tambin tenemos el bit C(Carry) (0), que en instrucciones aritmticas se activa cuando se presentaun acarreo desde el bit mas significativo del resultado, el bit DC (DigitCarry), que en operaciones aritmticas se activa si ocurre acarreo entre elbit 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 guardar

    ; 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 PORTA

    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.-

    movfw INDF ; Leemos codigo de 7 Segmentos para el CERO.-

    movwf PORTB ; Mostramos el CERO.-

    ;**** Testeo de Pulsador ****

    Bucle

    call Demora_190ms ; Demora para visualizar Display

    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.-

    goto Muestro_Display ; No, muestro display.-

    movlw 0x10 ; Si reseteo puntero.-

    movwf FSR ;

    Muestro_Display

    movfw INDF ; Leo Registro que apunta FSR.-

    movwf PORTB ; Lo cargo en PORTB.-

    goto Bucle ; Continuo conteo.-

    ;**** Demora ****

    Demora_190ms

    movlw 0xFF ;

    movwf Contador1 ; Iniciamos contador1.-

    Repeticion1

    movlw 0xFF ;

    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 ****

    Direccionamiento Indirecto.rar (95.1 KB - descargado 532 veces.)

    En lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Desconectado

    Sexo: Mensajes: 5113

    Cumulonimbus

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #9 : Marzo 30, 2009, 01:14:18

    Control de varios DisplayPara el control de varios display la idea es multiplexar la seal enviada por elmicrocontrolador, con l administraremos el encendido de cada display y sussegmentos (lo cual se hace por programa). Para ejemplificar haremos un contador automtico de 0 a 999:El hardware necesario es el siguiente:

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 21/31

    Diagramas de Flujo:

    Se observa que el Puerto B se utiliza para enviar los datos a mostrar en cadadisplay, mientras que por el Puerto A seleccionas el display que mostrar esedato. Supongamos que quiero mostrar "231", pues muy fcil, pongo el puertoB en 0000110 (cdigo para el 1), y activo ahora el 3 transistor por unperiodo de tiempo corto, desactivamos este transistor, cargamos el puerto Bcon 1001111 y activamos el 2 transistor por un tiempito, lo mismo hacemospara mostrar 1. Repetimos esta misma secuencia mientras se quieramostrar este valor. La secuencia es tan rpida que el observador no nota elmomento en que cambias de display.

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 22/31

    Control de conteo:Para realizar el conteo incrementamos continuamente Unidad, cuando estllega a 10, las reseteamos a 0, e incrementamos en 1 Decena. La mismaoperacin se realiza con Decena, al llegar a 10 se lleva a 0 y se incrementaCentena.-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.-

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

    ; Se coloca al inicio para asegurar ubicacion en Pagina.-

    org 0x05 ; Origen del cdigo de tabla.-

    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

    ;**** Programa principal ****

    ;**** Configuracion de puertos ****

    Inicio

    bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-

    clrf TRISA ; PORTA como salida

    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.-

    clrf Decena

    clrf Centena

    goto Actualizo_Display ; Esta rutina multiplexa los displays.-

    ;**** Testeo de Pulsador ****

    Bucle

    incf Unidad,1 ; Incremeto Unidad.

    movlw d'10' ; Si es 10 reseteo e incremento Decena

    subwf Unidad,0 ;

    btfss STATUS,Z ;

    goto Actualizo_Display ; no es 10

    clrf Unidad ; Si, reseteo.-

    incf Decena,1 ; Incremento Decena.-

    En este ejemplo se mantiene la visualizacin del mismo valor durante aprox.300 ms, se puede determinar ya que utilizamos 3 demoras de 5 msdespreciando los ciclos utilizados en los comandos, que son aprox. 30 (30us). Entonces por ciclo tenemos 15 ms, y por 20 repeticiones, 300 ms.-

    Control Varios Display.rar (102.11 KB - descargado 961 veces.)

    En lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Desconectado

    Sexo: Mensajes: 5113

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #10 : Marzo 30, 2009, 01:15:03

    Decodificador BCD.La otra posibilidad es utilizar un decodificador BCD como el 74LS47 o el74LS249, o el CD4511. Estos integrados disponen de 4 entradascorrespondientes a un cdigo binario BCD, y 7 salidas que se conectan a unDisplay.

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 23/31

    Cumulonimbus

    Lo importante de este integrado, es que posee 4 pines de entrada y 7 desalida, mas unos cuantos de configuracin. El hecho es que, los 4 pines deentrada (A, B, C y D) sern los que reciban el cdigo en binario enviado porel micro. Una vez recibido el dato, el integrado se har cargo de decodificarloy enviarlo por los pines de salida (a, b, c, d, e, f y g) para mostrarlo en eldisplay. 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 lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Desconectado

    Sexo: Mensajes: 5113

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #11 : Marzo 30, 2009, 01:15:50

    INTERRUPCIONESUna de las caractersticas ms importante de los microcontroladores y quemencionamos al inicio del tutorial, es que tienen la posibilidad de manejarinterrupciones. Se trata de un acontecimiento que hace que el micro deje de

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 24/31

    Cumulonimbus

    lado lo que se encuentra realizando, atienda ese suceso y luego regrese ycontine con lo suyo.Hay dos tipos de interrupciones posibles, una es mediante una accinexterna (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)

    En el 16F84A hay 4 fuentes de interrupcin:Por el pin RB0/INT, que regresa al PIC del modo SLEEP (interrupcinexterna).Por los pines RB4 a RB7, configurados como entrada y en caso de quealguno de ellos cambie de estado (interrupcin externa).Por desbordamiento del registro TMR0, cuando este registro pasa de255 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 deinterrupciones (Terminado en E) de permiso o prohibicin de ejecucin. Siesta en 0 bloquear la solicitud de interrupcin, y si esta en 1 permitir laejecucin. Un bit que acta como sealizador (Terminado en F) el cual esactivado (puesto a 1) si se ha producido la interrupcin. Adems existe 1 bitde control global, el bit GIE (INTCON ) el cual si esta desactivadobloquea todas las solicitudes de interrupcin.

    Lo anterior descrito puede entenderse observando el diagrama lgico de lasiguiente figura:

    El bit GIE se borra automticamente cuando se reconoce una interrupcinpara evitar que se produzca otra mientras se est atendiendo a la primera yal retornar de la interrupcin con la instruccin RETFIE, el bit GIE se vuelvea activar ponindose a 1. En cambio los bits sealizadores o banderas deinterrupcin deben ser puestos a cero por el tratamiento de la interrupcinrealizada por el usuario (Programador)Cuando una interrupcin est habilitada (su bit local de habilitacin estactivado, el bit GIE est activado) y ocurre el evento que la activa, el valor

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 25/31

    de PC se guarda en la PILA y en ste se carga el 0x04 (nico vector deinterrupcin). Es a partir de esta direccin que se debe colocar eltratamiento de la interrupcin, detectando por medio de los bits banderascual 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 algnotro registro debe ser el propio programa de atencin a la interrupcin el quese encargue de salvar su estado al inicio de la rutina y de devolverlos al finaldel mismo.

    Resumiendo, las acciones que se realizan automticamente elmicrocontrolador y las que el programador debe tener en cuenta en susprogramas son las siguientes:

    Cuando se activa una posible causa de interrupcin, el flagcorrespondiente se activa. Si el bit de permiso correspondiente est a1 y el bit de habilitacin de todas las interrupciones (GIE) est a 1, seproduce la interrupcin.Para evitar que se produzca otra interrupcin mientras se estatendiendo a otra anterior, el bit GIE se pone a 0.El valor del PC se guarda en la PILAEl PC se carga con el valor 0x04, que es el vector de interrupcionesEl programador, debe comenzar la rutina de atencin a la interrupcincon un salto a la posicin de memoria donde se encuentra el programa,seguidamente se guardan todos los registros que puedan sermodificados por esta, seguidamente si estn habilitadas varias vas deinterrupcin, se debe explorar el valor de las banderas para determinarla causa de la interrupcin.Dependiendo de la causa de la interrupcin, la rutina de interrupcin sebifurca a la subrutina correspondiente.Se deben devolver los valores que tenan los registros antes deproducirse la interrupcin y se deben borrar por software las banderasque indican las fuentes de las interrupciones, antes del retorno alprograma 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 laPILA y el bit GIE se pone automticamente a 1.

    Bits utilizados.INTF para RB0/INT, bit 1 de INTCON, si es 1 ocurri interrupcinexternaRBIF para los pines B4 a RB7, bit 0 de INTCON, si es 1 por lo menos unpin cambio de estadoT0IF para TMR0, bit 2 de INTCON, si es 1 TMR0 desbordadoEEIF para la EEPROM, bit 4 de EECON1, si es 1 se ha completadoescrituraGIE, bit 7 de INTCON, si es 1 habilita todas las interrupcionesEEIE, bit 6 de INTCON, si es 1 se activa interrupciones de perifricosT0IE, bit 5 de INTCON, si es 1 int. TMR0 activadaINTE, bit 4 de INTCON, si es 1 int. Externa activadaRBIE, 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 aotro registro (haciendo uso de movf) es que esta instruccin corrompe labandera Z, modificando el registro de STATUS. Segn la hoja de datosotorgada por Microchip, en uno de sus apartados recomienda una secuencia

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 26/31

    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 paraguardar temporariamente sus valores correspondientes.-

    ltima modificacin: Julio 30, 2009, 02:42:11por Suky En lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Desconectado

    Sexo: Mensajes: 5113

    Cumulonimbus

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #12 : Marzo 30, 2009, 01:16:40

    INTERRUPCION POR TMR0El Timer 0 es un contador / temporizador de 8 bits. El registro principal deeste mdulo es TMR0 (0x01). Este registro se incrementa continuamente auna frecuencia seleccionable manejada por un preescalador y el reloj internoFosc/4 (modo temporizador) o bien, por un preescalador y una sealexterna (modo contador). En la siguiente figura se muestra un diagrama de bloques de este mdulo, endonde se indican los bits que afectan su operacin y la manera en que lohacen.

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 27/31

    El modo TemporizadorEn el modo temporizador la seal de reloj que controla el incremento delregistro TMR0 es la frecuencia Fcy = Fosc/4, la cual puede ser divididaopcionalmente por el preescalador. Este modo es seleccionado al limpiar el bitT0CS (OPTION_REG). En este modo si se realiza una escritura alregistro TMR0, su incremento es inhibido por los siguientes dos ciclos deinstruccin (Tcy) y si el preescalador est asignado se pierde la cuenta perono su asignacin.

    El modo ContadorEn el modo contador, la seal que controla los incrementos del registro TMR0es una seal externa que proviene de la patita T0CKI poniendo el bit T0CSen alto. Se puede seleccionar la transicin que provoca los incrementosmediante el bit Timer0 Source Edge Select T0SE (OPTION_REG),limpiando este bit se selecciona la transicin de subida, mientras que alponerlo en alto se selecciona la de bajada.Observacin: En este modo, la seal conectada a TOCKI es muestreadadurante los ciclos Q2 y Q4 del reloj interno, por ello es necesario quepermanezca en alto al menos por 2 Tosc ms un pequeo retardo de 20nsegy lo mismo en bajo. (Es decir, seales demasiado rpidas no podrn serdetectadas).

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 28/31

    El preescaladorEl preescalador es un divisor de frecuencia de mdulo seleccionable. Como sepuede ver en la figura anterior, el preescalador est compartido entre eltimer0 y el mdulo Watchdog, sin embargo slo puede conectarse a uno delos dos y esto se establece mediante el bit PSA (OPTION_REG), 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 frecuenciaque maneja al Timer 0.La seleccin del mdulo (valor de divisin de frecuencia) del preescalador sepuede realizar mediante los bits PS2,PS1,PS0 (OPTION_REG) deacuerdo 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 lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Desconectado

    Sexo: Mensajes: 5113

    Cumulonimbus

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #13 : Marzo 30, 2009, 01:21:21

    Ejemplo modo temporizador. Para calcular una temporizacin se necesita el tiempo de un ciclo deinstruccin (es decir 1 microsegundo, si estas trabajando con un XT de 4Mhz), el valor del Divisor de Frecuencia (el que seleccionabas con los bitsPS2, PS1 y PS0), y finalmente el complemento del valor cargado en TMR0 (esdecir 255-TMR0). Entonces tenemos: Temporizacin = Ciclo deinstruccin. (256-TMR0) .Divisor de FrecuenciaDe este modo si queremos temporizar 4 ms con un divisor de frecuencia de32, tendramos:

    TMR0 = 256 - [^4000us / (1us x 32)]

    TMR0 = 131

    Vemos que la mxima temporizacin posible es con TMR0 = 0, y Divisor deFrecuencia en 256, logrndose unos 65.5 ms aprox.

    Para ejemplificar el uso de esta interrupcin haremos titilar un led conectadoal PIN RB0 cada 200 ms, para ello haremos una temporizacin con TMR0 de50ms y contaremos 4 desbordes del mismo para lograr los 200 ms necesarios.Lo interesante de usar interrupcin es que con el micro se puede estarejecutando cualquier tarea y no ocupar este tiempo en un bucle de demora.

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 29/31

    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 caso PORTB.-

    ;**** 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'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

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 30/31

    TMR0 Modo Temporizador.rar (84.78 KB - descargado 629 veces.)

    ltima modificacin: Julio 30, 2009, 03:00:49por Suky En lnea

    Jess dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

    Leon PicModeradordsPIC

    Desconectado

    Sexo: Mensajes: 5113

    Cumulonimbus

    Re: Mis primeros programas con PIC16F84A y PIC16F628A Respuesta #14 : Marzo 30, 2009, 01:22:22

    Ejemplo modo contador.

    El siguiente programa realiza el conteo del nmero de veces que produce unatransicin de bajo a alto en la patita T0CKI. El valor del contador seincrementar una vez por cada dos transiciones, y al detectarse 10cambiamos el estado del Led conectado a RB0.

    Diagrama de Flujo:

    Cdigo: (asm)

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

    www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/?PHPSESSID=6hvnibq0r09kvuigkmkge 31/31

    ; **** 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, en este caso PORTB.-

    ;**** 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.-

    movwf TMR0

    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 Tutoriales, guias y cursos en uControl ir

    Powered by SMF 1.1.18 | SMF 2011, Simple Machines

    SMFAds for Free Forums

    Pgina creada en 0.113 segundos con 25 consultas. (Pretty URLs adds 0.022s, 3q)