Sep 122013

 
Pin Out del PIC16F84

Pin Out del PIC16F84

Código fuente en C para hacer parpadear un LED con un PIC 16F84A

 #include  <16F84A.h>
 #fuses XT,NOWDT
 #use delay ( clock = 4000000)
 #BYTE TRISB = 0x86
 #BYTE PORTB = 0x06
 #BYTE OPTION_reg = 0x81

 void main() {
      bit_clear(OPTION_REG,7);
      bit_clear(TRISB,0);
      while(1) {
         bit_set(PORTB,0);
         delay_ms(500);
         bit_clear(PORTB,0);
         delay_ms(500);
      }
  }

Este pequeño programa es el equivalente de los Hola mundo, es muy sencillo y tiene como misión controlar una salida del puerto B0 del PIC16F84, a continuación lo comentaremos linea a linea.

  • En la primera linea se le indica al programa el PIC con el que se va a trabajar en este caso el PIC16F84.
  • Seguidamente configuramos el oscilador de cristal y desactivamos el Watchdog.
  • Especificamos la frecuencia del oscilador a 4 MHZ.
  • Definimos registros de proposito especifico (SFR) como BYTE (banco 1) dirección 0x86 TRISB.
  • PORT B como BYTE, especificamos su dirección 0x06.
  • Al poner a cero el bit 7 del registro OPTION_REG, habilitamos las resistencias de Pull UP.
  • Pone a cero el bit 1 de PORTB, B0 queda configurado como salida.
  • Entramos en el bucle infinito controlado por el while, ya que la condición se cumplirá siempre.
  • Encendemos el LED.
  • Llamamos a la rutina Delay que nos generara un retardo de 500 milisegundos.
  • Apagamos el LED.
  • Llamamos a la rutina Delay que nos generara un retardo de 500 milisegundos.
  • Y por último volvemos al inicio del bucle while repitiendo todo este ciclo indefinidamente.

 

PIC16F84 activando un LED

PIC16F84 activando un LED



Sep 012013

 

Para establecer la comunicación con los distintos periféricos que podríamos utilizar en conjunto con el microcontrolador (sensores, memorias externas, puertos, etc). En esta página daremos una pequeña introducción a los buses seriales más conocidos. Cuando hablemos de interfaces 2-wire o 3-wire nos referiremos al número de lineas de control. Adicionalmente a estas líneas de control generalmente necesitaremos una tierra común, la cual puede ser el plano de tierra del circuito impreso (PCB) o un cable distinto si comunicamos 2 tarjetas alimentadas en forma independiente.

Los buses seriales son ampliamente utilizados para comunicar microcontroladores con memorias EEPROM, conversores A/D y muchos otros periféricos. Los sistemas de buses seriales también son ampliamente utilizados para implementar buses de control dentro de equipos como televisores, equipos de música y teléfonos celulares.

La mayor ventaja de utilizar buses seriales es el pequeño número de cables necesarios para establecer la comunicación. La mayor desventaja es la compensación entre la velocidad de comunicación y el número de líneas que utilizaremos. Los procesadores puede gastar mucho tiempo en la comunicación con un dispositivo serial, en consecuencia es difícil encontrar dispositivos con tasas de transferencias mayores a 500kbps.

El Bus I2C

El I2C (Inter Integrated Circuits) es un bus de comunicaciones serial síncrono de dos líneas que fue originalmente desarrollado por Philips Semiconductors (ahora nxp semiconductors) desde los inicios de los ‘80. Hoy es un estándar aceptado y respaldado por los fabricantes de dispositivos semiconductores.

El bus I2C permite la comunicación entre múltiples dispositivos (en teoría más de 1000), todos conectados paralelamente a las dos líneas. Las transferencias de datos siempre se realizan entre dos dispositivos a la vez y en una relación maestro – esclavo.

La ventaja de este bus es que sólo necesita de 2 lineas (clock y data) para una comunicación full duplex entre multiples dispositivos. La interfaz típicamente corre a bajas velocidades (100kHz a 400khz) Con I2C, cada dispositivo en el bus tiene una dirección de memoria única. El dispositivo puede trabajar como receptor y/o transmisor dependiendo de como haya sido configurado.

El bus I2C fue implementado para maximizar la eficiencia del hardware y la simplicidad del circuito. La interfaz I2C es una simple interfaz maestro/esclavo. Como se mencionó anteriormente la simplicidad del bus radica en el diseño de 2 cables (SDA y SCL) y el formato del protocolo. La comunicación bidireccional se ve facilitada ya que las líneas tienen solo dos estados; active-low o passive-high. El protocolo del bus I2C soporta detección de colisiones, sincronización de reloj y hand-shaking para multiples dispositivos conectados en el bus. El reloj es siempre generado por la unidad maestra, pero el esclavo puede mantener la línea abajo para generar un estado de espera. En la mayoría de los sistemas en donde se utilizan microcontroladores, éste es el maestro y los dispositivos externos son los esclavos.

El máximo número de unidades que pueden conectarse en un bus I2C está definido por la máxima capacitancia de la línea; 400pF, y el límite de 16k para la dirección del dispositivo; la capacitancia típica de un dispositivo es de 10pF. El protocolo I2C tiene 127 direcciones disponibles. La visión original fue asignar direcciones de acuerdo a la funcionalidad del dispositivo, pero cuando Philips comenzó a vender microcontroladores con I2C, la dirección podía ser programada, eliminando la necesidad de que Philips asignara una dirección válida.

El dispositivo que controla la transferencia controlando el reloj es llamado maestro y el dispositivo que es controlado por el maestro es llamado esclavo. El maestro puede transmitir o recibir señales desde o hacia un esclavo o controlar el reloj para que dos esclavos puedan comunicarse entre si. El bus I2C soporta más de un maestro conectado al mismo bus.

Para comenzar la comunicación el dispositivo maestro (típicamente un microcontrolador) pone en el bus la dirección del dispositivo con el que se quiere comunicar. Todos los dispositivos monitorean el bus para determinar si el maestro esta enviando su dirección. Solo el dispositivo con la dirección correcta puede comunicarse con el maestro.

El dispositivo maestro I2C es generalmente implementado como un controlador independiente el cual está integrado en un microcontrolador (implementación por hardware). También se puede implementar por software programandolo en un microcontrolador. Ambas opciones son perfectamente posibles en un bus típico, pero los sistemas multi-master son generalmente implementados en hardware ya que es muy dificultoso controlar el timing del bus por software.

Los datos pueden ser transferidos a una velocidad que supera los 100kbps en el modo standard y sobre los 400kbps en el modo Fast, y sobre 3.4Mbps en el modo High Speed. En el modo Standard se utilizan 7-bit para la direccionar los dispositivos en los otros modos los dispositivos esclavos pueden utilizar 7 o 10bits.

Bus I2C

Bus I2C

Lo bueno de este bus como se aprecia en la imagen, es que requiere sólo 4 pines para hacer trabajar los periféricos:

  • Vcc (+5V)
  • GND
  • SDA (TX Data)
  • SCL (RX Data)

Bus SPI

El bus SPI es una interfaz serial 4-wire utilizada por muchos microprocesadores y chips perifericos. El Serial Peripheral Interface (SPI) es la forma standard de transmitir datos asincornos en microprocesadores Motorola. Provee soporte para redes de bajo y medio ancho de banda (1 Megabaud) entre aquellos dispositivos que soportan el protocolo.

El bus SPI es basicamente una interfaz asíncrona simple para conectar dispositivos externos de baja velocidad usando una cantidad mínima de cables. Este bus fue definido por Motorola en la línea de microcontroladores MC68HCxx. Un reloj asíncrono pone datos seriales desde y hacia el microcontrolador en bloques de 8 bits. El SPI es típicamente utilizado en dispositivos mobiles.

Este bus es también del tipo maestro/esclavo. Cuando dos dispositivos se comunican, uno será el maestro y el otro el esclavo. El maestro maneja el reloj. Cuando se utiliza SPI, los datos son simultaneamente transmitidos y recibidos esto establece una comunicación full-duplex.
Los nombres que Motorola asignó a las señales son los siguientes:

  • SCLK Para el reloj, el cual es siempre manejado por el dispositivo maestro
  • MISO Master In Slave Out data.
  • MOSI Master Out Slave In data.
  • CS Chip Select Permite seleccionar distintos dispositivos conectados a un mismo bus. Cada dispositivo conectado al bus necesita su propia señal CS. Por ejemplo si se tienen 10 dispositivos conectados al mismo bus, entonces es necesario utilizar 10 líneas de CS distintas, además de las líneas compartidas del reloj SCLK y las de datos MISO y MOSI.
Bus SPI

Bus SPI

 

 

 

 

 

 

Microwire

Microwire es una interfaz serial standard definida por National Instruments. El protocolo Microwire es esencialmente un subconjunto del bus SPI

Maxim 3-Wire

La interfaz Maxim 3-wire se puede encontrar en dispositivos como el DS1620 y algunos otros IC’s de Maxim. Los datos que fluyen desde y hacia el DS1620 son multiplexados en solo una línea (DQ) mientras que en SPI se utilizan 2 líneas distintas(MISO y MOSI).

Maxim/Dallas 1-Wire

El bus 1-wire fue desarrollado por Dallas/Maxim. Este permite utilizar solo 1 cable con la señal la cual lleva tanto los datos como la alimentación esto permite reducir los costos de los dispositivos y simplificar la transferencia de datos. Un solo cable es necesario adicionalmente de la tierra del circuito. Una red típica es construida utilizando un cable para alimentación y datos y una línea de tierra. El sistema es sensible al timing de las señales para su correcta operación.



Ago 312013

 

Muchos microcontroladores o PIC tienen un periférico llamado Conversor Análogico Digital, también es conocido como ADC por las siglas de su nombre en inglés, Analog to Digital Converter. Este dispositivo sumamente útil convierte un voltaje análogico, ésto es un cierto nivel de voltaje común y corriente, en un número binario que puede ser manipulado en un programa.

Debido a que muchos sensores entregan los valores que leen como voltajes análogicos el uso de conversores análogicos digital es algo muy común, por no mencionar el hecho que vivimos en un mundo analógico y es nuestra lógica digital la que constituye una abstracción que nos permite manipular información obtenida muchas veces por ADCs.

Si por ejemplo se quiere saber el valor de un nivel leído por un sensor, primero debe buscarse la relación entre la lectura y el voltaje entregado por el sensor en el datasheet del mismo, luego este voltaje análogico debe ser convertido a bits usando el conversor análogico digital, pero para saber que valor de voltaje significa este número binario debemos hacer un pequeño cálculo para convertir este número binario en un voltaje.

Como se calcula el valor analógico

Para realizar el cálculo del que hemos hablado primero debemos conocer dos números que dependen de cómo estemos haciendo nuestro circuito, éstos son el voltaje a que corre el sistema, normalmente 3.3V o 5V y el rango de valores que puede entregar nuestro conversor, esta última cantidad es algo mas extraña, pero es simple de comprender si vamos a la naturaleza de un número binario: Si se tiene por ejemplo un número binario de 4 bits, se ve que puede tener por cada dígito dos valores, luego como son 4 dígitos el número total de valores será:

2 * 2 * 2 * 2 = 24

Puede verse que esto sirve para cualquier número binario, por lo que si se tiene un conversor de, por ejemplo 8 bits, se podrán representar 256 valores distintos (2 elevado a 8).

Ahora que comprendemos las cantidades que necesitamos, sabemos también que son sumamente fáciles de obtener y podremos calcular de manera simple el voltaje medido usando la ecuación que describe el funcionamiento de un conversor análogico digital.

Nbinario = (Vanalógico * Tvalores) / Vsistema

En esta ecuación Nbinario es el número binario que puede ser leído del conversor, Vanalogo es el voltaje análogico existente en el pin de entrada al conversor, Tvalores el total rango de valores que se puede representar con el conversor y Vsistema es el voltaje de funcionamiento del circuito. Si por ejemplo queremos saber la relación para un sistema corriendo a 5V y con un conversor digital-análogico de 8 bits, tendremos:

Nbinario = (Vanalógico * 256) / 5000

¿Porqué utilizamos 5000 en lugar de 5 en el voltaje de operación? Porque es mejor expresar el voltaje en milivolts, de esta manera los voltajes leídos serán números enteros con una buena precisión.

Veamos finalmente como obtener el voltaje análogo leído si se tiene la lectura del número binario entregado por el conversor, para ello primero recordamos que un número binario puede ser visto también como un número decimal, entonces lo ocuparemos de esta manera para evitarnos enredos innecesarios. Además debemos “dar vuelta” nuestra ecuación para expresar el voltaje análogico en función del número binario leído. Con ello la ecuación queda:

Vanalógico = (Vsistema * Nbinario) / Tvalores

Supongamos entonces que nuestro conversor anterior nos entrega un valor de 148, se tendrá entonces que el voltaje análogico existente en ese momento en el pin de entrada es:

Vanalógico = (Vsistema * Nbinario) / Tvalores = (5000 * 148) / 256 = 2890.625 V

Como nota final notemos que el voltaje resultó fraccionario y de hecho es mas cercano a 2891, pero nosotros lo truncamos a 2890. Esto se ha hecho deliberadamente para recordar que la aritmética entera de los computadores siempre trunca un número, no lo redondea.

ADC0804 pins

ADC0804 pins

En los microcontroladores o microprocesadores que no disponen de un convertidor analógico/digital pero si disponen de un bus de datos exterior, se puede usar el ADC0804, un circuito integrado que nos ofrece un convertidor de 8 bits y un tiempo de acceso de unos 135 nS.

Este convertidor es de los mas usados para aplicaciones de conversión analógica a digital.