ECG con BIOPAC MP36

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…