PIC16F84A. Introduccion

PIC16F84

El microcontrolador (µC) PIC16F84A es un dispositivo programable que se compone de una computadora digital, una unidad de memoria de datos, una unidad de memoria de programa y puertos de entrada/salida  en un circuito integrado, funciona como un controlador de periféricos en un sistema mínimo. El µC depende de una alimentación de al menos 5V y 0V en sus entradas de Vdd y Vss respectivamente para su operación (el consumo del µC depende de las cargas de los puertos y de la frecuencia de trabajo), requiere  de una señal de reloj que le indique la frecuencia de trabajo, está señal la introducimos a través de un oscilador de cristal de cuarzo XTal de 4Mhz en los pines OSC1 y OSC2,  y una alimentación al pin MCLR, que es un pin de reset que activa al microcontrolador. El funcionamiento del µC está determinado por un programa almacenado en su memoria Flash ROM y puede programarse más de una vez para cambiar su estado y su comportamiento,  lo que lo convierte al µC en una pieza esencial en el rápido desarrollo de aplicaciones electrónicas.

En este post desarrolle un programa (para la materia de Microcontroladores en el colegio) para el control de un crucero de 4 semáforos, Monte la configuración básica para el funcionamiento del PIC16F84 en el protoboard junto con un par de indicadores led que representaran 2 semáforos -tomando en cuenta que el par de semáforos de una misma vía funcionan de la misma forma-. Utilize la herramienta de software MPLAB para crear el código ejecutable (código hex) y pase este código al microcontrolador a través de la utilidad IcProg.

El diseño del sistema debe tener las siguientes característica: (donde cada cuadro es una unidad de tiempo, en mi ejemplo ocupe segundos como unidad de tiempo)

La solucion se centra en el programa de control que gobernara la secuencia de encendido de los indicadores LED en el semáforo y sus tiempos de espera entre cada cambio de luz, así que me decidí concentrar en el modelo que representará éstas funciones antes de empezar a escribir código en ensamblador. Mi idea principal era que a partir de este modelo poder definir un algoritmo que cumpliera los objetivos y además tuviera soporte para futuras modificaciones lo que le agregaría mayor escalabilidad al programa. Este fue mi algoritmo que ocupe:

Y pasandolo a algo paresido a código ensamblador:

loop:

PORTB  00010001

delay( 6 seg )

PORTB  00010000

delay( 1 seg )

PORTB  00010001

delay( 1 seg )

PORTB  00010000

delay( 1 seg )

PORTB  00010001

delay( 1 seg )

PORTB  00001001

delay( 3 seg )

PORTB  00100100

delay( 6 seg )

PORTB  00100000

delay( 1 seg )

PORTB  00100100

delay( 1 seg )

PORTB  00100000

delay( 1 seg )

PORTB  00100100

delay( 1 seg )

PORTB  00100010

delay( 3 seg )

goto loop

Codigo Ensamblador

;PROGRAMA SEMAFORO.ASM

;MIGUEL ALONSO ;alonsodub.wordpress.com

LIST P=16F84A

INCLUDE “P16F84A.INC”

org 0000h

main:

clrf

PORTB

bsf

STATUS,RP0

movlw

0x00

movwf

TRISB

bcf

STATUS,RP0

loop:

movlw

b’00010001′

movwf

PORTB

call delay6seg

movlw

b’00000001′

movwf

PORTB

call delay1seg

movlw

b’00010001′

movwf

PORTB

call delay1seg

movlw

b’00000001′

movwf

PORTB

call delay1seg

movlw

b’00010001′

movwf

PORTB

call delay1seg

movlw

b’0001001′

movwf

PORTB

call delay3seg

movlw

b’0100100′

movwf

PORTB

call delay6seg

movlw

b’0100000′

movwf

PORTB

call delay1seg

movlw

b’0100100′

movwf

PORTB

call delay1seg

movlw

b’0100000′

movwf

PORTB

call delay1seg

movlw

b’0100100′

movwf

PORTB

call delay1seg

movlw

b’0100010′

movwf

PORTB

call delay3seg

goto loop

delay6seg

movlw

d’60’

goto delay

delay3seg

movlw

d’30’

goto delay

delay1seg

movlw

d’10’

goto delay

delay

movwf

0C

loop1

movlw

d’100′

movwf

0D

loop2

movlw

d’249′

movwf

0E

loop3

nop

decfsz

0E,F

goto loop3

decfsz

0D,F

goto loop2

decfsz

0C,F

goto loop1

return

end

Hago supocision que el lector sabe algo de programacion en ensamblador, y en especial conoce el juego de instrucciones para el microcontrolador PIC16F84A (que es el que ocupe) . Ademas supongo que conoce las herramientas de programacion y grabacion de estos microcontroladores (MALAB y IcProg). De igual manera dejo algunos recursos clave para que no sea muy dificil a los lectores principiantes darse una idea general de la utilizacion de estos microcontroladores. Despues agrego unas guias para la utilizacion de las herramientas de software  para el ensamblado y grabacion de los PIC´s. Saludos!

P.D. Los archivos estan en formato doc de windows, hay que pasarlos a un bloc de notas y guardarlos como Semaforo.asm y Semaforo.hex respectivamente para poder usarlos en las utilidades MPLAB y IcProg.

Semaforo_asm Semaforo_hex

Usando IcProg

Les suguiero buscar una guia mas detallada, yo solo les voy a mostrar los puntos mas basicos de esta utilidad.  No pude dejarles este programa en el blog, pero si gustan pasenme su correo y se los mando por mail =)

 

5 comentarios en “PIC16F84A. Introduccion

  1. es que yo tengo un problema no puedo aser que enciendan 2 semaforos al mismo tiempo pero con diferente configuracion en solo pic16f84a

    mi codigo es este :::

    LIST P=16F84a ;Se emplea el PIC16F84A
    RADIX HEX

    ;ETIQUETAS DEL PROGRAMA

    W EQU 0x00
    F EQU 0X01
    Z EQU 0x02
    TMR0_OPT EQU 0x01

    ESTADO EQU 0x03

    INTCON EQU 0x0B

    PUERTAA EQU 0x05

    PUERTAB EQU 0x06

    AUX EQU 0x0C

    TEMPO1 EQU 0x0E

    ;PROGRAMA PRINCIPAL

    ORG 0
    goto INICIO
    ORG 5
    INICIO bsf ESTADO,5
    movlw b’00000011′
    movwf PUERTAA
    clrf PUERTAB
    movlw b’00000111′
    movwf TMR0_OPT
    bcf ESTADO,5
    clrf PUERTAA
    clrf PUERTAB

    BUCLE call DELAY2S

    movf PUERTAA,W
    movwf AUX

    xorlw b’00000011′

    btfsc ESTADO,Z
    goto TRAT_1_1

    ;RUTINA PARA LA COMBINACION I2=1 I1=1

    TRAT_1_1 bsf PUERTAB,4 ;Se enciende el LED de RB4(rojo)

    call DELAY_1_medio_minuto ;Se espera los segundos adecuados segun I1 e I2
    bcf PUERTAB,4 ;Se apaga el LED rojo
    bsf PUERTAB,5 ;Se enciende el LED RB5(ambar)
    call DELAY_medio_minuto ;Se espera los segundos adecuados segun I1 e I2
    bcf PUERTAB,5 ;Se apaga el LED ambar
    bsf PUERTAB,6 ;Se enciende el LED RB6(verde)
    call DELAY_medio_minuto ;Se espera los segundos adecuados segun I1 e I2
    bcf PUERTAB,6 ;Se apaga el LED verde

    ;nuevo ciclo
    bsf PUERTAB,4 ;Se enciende el LED de RB4(rojo)
    call DELAY_2_minuto ;Se espera los segundos adecuados segun I1 e I2
    bcf PUERTAB,4 ;Se apaga el LED rojo
    bsf PUERTAB,5 ;Se enciende el LED RB5(ambar)
    call DELAY_medio_minuto ;Se espera los segundos adecuados segun I1 e I2
    bcf PUERTAB,5 ;Se apaga el LED ambar
    bsf PUERTAB,6 ;Se enciende el LED RB6(verde)
    call DELAY_medio_minuto ;Se espera los segundos adecuados segun I1 e I2
    bcf PUERTAB,6 ;Se apaga el LED verde

    ;segundo semaforo
    bsf PUERTAB,1 ;Se enciende el LED de RB1(rojo)
    call DELAY_2_minuto ;Se espera los segundos adecuados segun I1 e I2
    bcf PUERTAB,1 ;Se apaga el LED rojo
    bsf PUERTAB,2 ;Se enciende el LED RB2(ambar)
    call DELAY_medio_minuto ;Se espera los segundos adecuados segun I1 e I2
    bcf PUERTAB,2 ;Se apaga el LED ambar
    bsf PUERTAB,3 ;Se enciende el LED RB3(verde)
    call DELAY_medio_minuto ;Se espera los segundos adecuados segun I1 e I2
    bcf PUERTAB,3 ;Se apaga el LED verde
    bsf PUERTAB,1 ;Se enciende el LED de RB4(rojo)
    goto FIN

    FIN goto BUCLE

    ;Bucle para repetir el tratamiento completo

    ;RUTINA AUXILIAR DE DELAY

    DELAY10 bcf INTCON,2 ;Borra el flag de estado del TMR0
    movlw 0xD9
    movwf TMR0_OPT ;Carga del TMR0 para que cuente 39

    DELAY10_1 btfss INTCON,2 ;Espera el desbordamiento del TMR0
    goto DELAY10_1
    decfsz TEMPO1,F
    goto DELAY10
    return

    ;RUTINA DE DELAY DE UN SEGUNDO

    DELAY1S movlw 0x64
    movwf TEMPO1 ;Carga la variable TEMPO1, que sera
    ;decrementada
    call DELAY10 ;en la rutina a la que se llama
    return

    ;RUTINA DE DELAY DE DOS SEGUNDOS

    DELAY2S call DELAY1S
    call DELAY1S
    return

    ;RUTINA DE DELAY DE CINCO SEGUNDOS

    DELAY5S call DELAY2S
    call DELAY2S
    call DELAY1S
    return

    ;RUTINA DE DELAY DE OCHO SEGUNDOS

    DELAY8S call DELAY5S
    call DELAY2S
    call DELAY1S
    return

    ;RUTINA DE DELAY DE DIEZ SEGUNDOS

    DELAY10S call DELAY5S
    call DELAY5S
    return

    ;RUTINA DE DELAY DE medio SEGUNDO

    DELAY_medio_minuto
    call DELAY10S
    call DELAY10S
    call DELAY10S
    return

    ;RUTINA DE DELAY DE un minuto SEGUNDOS

    DELAY_1_minuto call DELAY_medio_minuto
    call DELAY_medio_minuto
    return
    ;RUTINA DE DELAY DE un minuto y medio SEGUNDOS

    DELAY_1_medio_minuto call DELAY_1_minuto
    call DELAY_medio_minuto
    return

    ;RUTINA DE DELAY DE dos minutos y medio SEGUNDOS

    DELAY_2_minuto call DELAY_1_minuto
    call DELAY_1_minuto
    return
    END

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s