SE – uC: PIC16F84A – Proyecto Final

Requisitos del Programa

El proyecto final consiste en un sistema que controle el giro de una cámara de vigilancia, utilizando cuatro sensores infrarrojos para detectar movimiento, haciendo que la cámara gire recorriendo la menor distancia al sensor que se activó. El uC debe dormir cuando no exista actividad en algún sensor.

El sistema debe quedar de la siguiente manera:

Diseño Hardware

El primer sensor (S0) se utilizara para calibrar el sistema a su posición inicial cada vez que el sistema sea encendido, para asegurar un punto inicial de partida e ira conectado al pin RB3. El resto de los sensores (S1-S4) se utilizaran para detectar movimiento en los cuatro puntos establecidos en el diagrama general, estos estarán conectados en los pines RB4-RB7 correspondientemente.

Los lasers tendrán independencia total ya que cuentan con sus propias baterías. Los fototransistores nos darán “0” en su estado normal y “1” cuando sean interrumpidos.

El uC debe dormir al estar inactivo el sistema, utilizaremos un LED para indicar si se encuentra activo el cual ira conectado en el pin RA4. Para despertar el uC debemos generar una interrupción externa cuando algún sensor se active, debido a que las interrupciones del PORTB están bugeadas tendremos que generar la interrupción por el pin RB0/INT utilizando tres compuertas “OR” quedando la siguiente ecuación: RB0\INT = S1+S2+S3+S4, se utilizara el integrado 74LS32.

Utilizaremos un motor de pasos bipolar de dos bobinas, los cuales son cuatro cables de conexión. Para controlar este tipo de motor se utiliza un puente H por cada bobina, para facilitarnos esta tarea utilizaremos el driver LM293D el cual brinda una corriente de 600mA por canal y cuenta con cuatro canales. El voltaje en las bobinas será de Vs=3v y el voltaje lógico será de Vss=5v. Los cables de las bobinas (B0-B3) irán conectado a los pines RA0-RA3 correspondientemente.

Con todo lo comentado anteriormente procedemos a realizar el diagrama esquemático quedando de la siguiente manera:

Diseño Software

Lo primero a desarrollar son las rutinas para controlar el motor de pasos bipolar las cuales estarán en el archivo MOTOR_PAP.INC. Su diagrama de flujo es el siguiente:

Ahora procedemos a realizar el diagrama de bloque y flujo del programa principal:

Los registros y banderas que se utilizaran son los siguientes:

Todos los cálculos del sistema se realizaran en la rutina de interrupción, el diagrama de bloque es el siguiente:

Considerando todos los detalles el diagrama de flujo completo de la interrupción es el siguiente:

Código Fuente

Continuar leyendo…

SE – uC: PIC16F84A – Práctica #10

Requisitos del Programa

Realizar un programa que entre en modo SLEEP y se despierte cada vez que el WDT genere una interrupción, el tiempo para despertar el MCU dependerá del valor de tres bits del PORTA [2:0] utilizando un dipswitch y aumente una cuenta que se mostrara por el PORTB.

Planeación

Primero definiré los puertos de entrada y salida:

Entradas: PORTA [2:0]

Salidas: PORTB

Lo primero es configurar el WDT en el OPTION_REG:

OPTION_REG = 1000 1000 + 0000 0 RA2 RA1 RA0 = 0x88 + RA2-RA0

Para dormir el MCU se utiliza la instrucción SLEEP y se despertara automáticamente cuando el WDT se desborde.

Los tiempos pre-establecidos del WDT por la pre-escala son de 18ms [1:1] hasta 2.3s [1:128].

Diagrama de Flujo

Código Fuente

Continuar leyendo…

SE – uC: PIC16F84A – Práctica #9

Requisitos del Programa

Realizar un programa que cuente los eventos externos generados por un interruptor utilizando el TMR0 y los muestre en dos dígitos de siete segmentos utilizando solamente el PORTB.

Planeación

Primero definiré los puertos de entrada y salida:

Entradas: PORTA [4]

Salidas: PORTA [1:0], PORTB

La cuenta será de cero a noventa y nueve, por lo que tenemos que resetear el contador al llegar a cien.

También debemos separar el número de la cuenta en código BCD, donde cada parte (unidades, decenas y centenas) tiene su propio código de ocho bits para mostrarlos en los dos dígitos de siete segmentos.

Para mostrar dos números diferentes en dos dígitos de siete segmentos utilizaremos la técnica de multiplexor, la cual consiste en activar uno u otro digito durante un tiempo para que la persona logre visualizar el valor, el pseudocódigo es el siguiente:

1- Apagar ambos dígitos

2- Cargar el valor de unidades en el PORTB

3- Activar el digito 0 y esperar X ms

4- Apagar el digito 0

5- Cargar el valor de decenas en el PORTB

6- Activar el digito 1 y esperar X ms

7- Apagar el digito 1

8- Regresar al paso 2

Se debe tener en consideración el rebote mecánico que genera el interruptor. Este problema se puede solucionar por hardware o software, en nuestro caso será por hardware debido a que no utilizaremos la técnica de “polling” para revisar el estado del interruptor por que utilizaremos el TMR0 como contador.

Para utilizar el TMR0 como contador tenemos que configurarlo en el registro OPTION_REG con los siguientes valores:

[7]/RBPU = 1 Resistencias de Pull-Up desactivadas.

[6]INTEDG=X No importa ya que no utilizaremos interrupciones.

[5]T0CS=1 Incrementar en la transición del pin RA4/T0CKI (TMR0 como contador).

[4]TOSE=0 Incrementar en la transición bajo-alto.

[3]PSA=1 Pre escala asignada al WDT.

[2:0]PS2:PS0=X No importa, ya que no se utilizara pre escala.

OPTION_REG = 0xA8

Diagrama de Flujo

Código Fuente

Continuar leyendo…

SE – uC: PIC16F84A – Práctica #8

Requisitos del Programa

Realizar un programa que lea cuatro bits del puerto A y muestre su valor en un digito de siete segmentos.

Planeación

Primero definiré los puertos de entrada y salida:

Entradas: PORTA[4:0]

Salidas: PORTB

Para realizar este programa utilizaremos una tabla con el valor correspondiente en siete segmentos.

Diagrama de Flujo

Código Fuente

Continuar leyendo…

SE – uC: PIC16F84A – Práctica #7

Requisitos del Programa

Realizar un programa que genere una onda cuadrada con un periodo de 100ms, 75ms en 5v y 25ms en 0v. Utilizando el TMR0 con su bandera de interrupción para medir el tiempo.

Planeación

Primero definiré los puertos de entrada y salida:

Entradas: NA

Salidas: PORTB.0

Para realizar este programa necesitamos utilizar y configurar el TMR0 para realizar la medición del tiempo. Para configurar el TMR0 se utiliza el registro OPTION_REG donde lo establecí de la siguiente manera:

T0CS= 0 Timer (No contador)

T0SE= X No importa su valor

PSA= 0 Pre escala activada

PS2-PS0 = 000 Escala = 1:2

Entonces OPTION_REG = 1000 0000 = 0x80

Para calcular cuantas veces se debe desbordar el TMR0 lo calcule de la siguiente manera:

Diagrama de Flujo

Código Fuente

Continuar leyendo…

SE – uC: PIC16F84A – Práctica #6

Requisitos del Programa

Realizar un programa que realice un corrimiento de LEDs de 8-bits, si el interruptor se encuentra presionado el corrimiento será a la izquierda, de lo contrario será a la derecha.

Planeación

Primero definiré los puertos de entrada y salida:

Entradas: PORTA.0

Salidas: PORTB

Para realizar este programa necesitamos un retraso entre cada “polling” del interruptor para poder visualizar el valor del contador en los LEDs, como en los requisitos no esta definido yo lo estableceré en un segundo.

Este programa es muy sencillo de realizar, ya que solo debemos revisar si el botón esta presionado en cada ciclo y realizar el corrimiento a la derecha o izquierda según el estado del botón.

Diagrama de Flujo

Código Fuente

Continuar leyendo…

SE – uC: PIC16F84A – Práctica #5

Requisitos del Programa

Realizar un programa que cuente de cero a quince, que decremente si un interruptor se encuentra presionado e incremente si no se encuentra presionado.

Planeación

Primero definiré los puertos de entrada y salida:

Entradas: PORTA.0

Salidas: PORTB

Para realizar este programa necesitamos un retraso entre cada “polling” del interruptor para poder visualizar el valor del contador en los LEDs, como en los requisitos no esta definido yo lo estableceré en un segundo.

Como el rango valido va de cero a quince debemos revisar el contador en cada ciclo, si hay un decremento de cero el valor del registro se va a 255 por lo que debemos cargarle quince nuevamente. En los ciclos de incrementos debemos revisar si llega a dieciséis, en este caso debemos cargarle cero nuevamente.

Diagrama de Flujo

Código Fuente

Continuar leyendo…

SE – uC: PIC16F84A – Práctica #4

Requisitos del Programa

Realizar un programa que monitorice el estado de un botón y lo muestre en un LED.

Planeación

Primero definiré los puertos de entrada y salida:

Entradas: PORTA

Salidas: PORTB

La forma más fácil de resolver este problema sería: PORTB = PORTA, pero como el problema establece que debemos monitorizar el estado del botón utilizaremos la técnica de “polling” que consiste en un ciclo infinito.

Diagrama de Flujo

Código Fuente

Continuar leyendo…

SE – uC: PIC16F84A – Práctica #3

Requisitos del Programa

Realizar un programa que compare dos valores de cuatro bits cada uno, obtenidos de un puerto y con tres LEDs en otro puerto de salida indique si A > B, A < B o A = B.

Planeación

Primero definiré los puertos de entrada y salida:

Entradas: PORTB | A=4b-MSB | B=4b-LSB |

Salidas: PORTA | 2b-A>B | 1b-A<B | 0b-A=B |

Para realizar la comparación tenemos que hacer una resta A – B y se utilizaran las banderas Z y DC del registro STATUS para verificar si A > B, A < B, A = B.

Diagrama de Flujo

Código Fuente

Continuar leyendo…

SE – uC: PIC16F84A – Práctica #2

Descripción del Programa

Programa que almacena 0x11 en quince posiciones continuas de memoria de datos utilizando direccionamiento indirecto. Empezando en la dirección 0x10.

Para realizar este programa utilizaremos un contador para incrementar la posición de memoria y llevar la cuenta de las quince posiciones donde escribiremos el dato 0x11.

Para utilizar el direccionamiento indirecto debemos poner la dirección inicial en el registro FSR e ir incrementándolo y para escribir el dato en esa posición de memoria debemos utilizar el registro INDF.

Diagrama de Flujo

Código Fuente

Continuar leyendo…